Add elf_read_next_u*

For stream-like reading of ELF data.
diff --git a/ltrace-elf.c b/ltrace-elf.c
index d9dac5e..b2e6e07 100644
--- a/ltrace-elf.c
+++ b/ltrace-elf.c
@@ -244,6 +244,24 @@
 
 #undef DEF_READER
 
+#define DEF_READER(NAME, SIZE)						\
+	int								\
+	NAME(Elf_Data *data, GElf_Xword *offset, uint##SIZE##_t *retp)	\
+	{								\
+		int rc = elf_read_u##SIZE(data, *offset, retp);		\
+		if (rc < 0)						\
+			return rc;					\
+		*offset += SIZE / 8;					\
+		return 0;						\
+	}
+
+DEF_READER(elf_read_next_u8, 8)
+DEF_READER(elf_read_next_u16, 16)
+DEF_READER(elf_read_next_u32, 32)
+DEF_READER(elf_read_next_u64, 64)
+
+#undef DEF_READER
+
 int
 open_elf(struct ltelf *lte, const char *filename)
 {
diff --git a/ltrace-elf.h b/ltrace-elf.h
index a50ad8a..a520e63 100644
--- a/ltrace-elf.h
+++ b/ltrace-elf.h
@@ -116,6 +116,13 @@
 int elf_read_u32(Elf_Data *data, GElf_Xword offset, uint32_t *retp);
 int elf_read_u64(Elf_Data *data, GElf_Xword offset, uint64_t *retp);
 
+/* These are same as above, but update *OFFSET with the width
+ * of read datum.  */
+int elf_read_next_u8(Elf_Data *data, GElf_Xword *offset, uint8_t *retp);
+int elf_read_next_u16(Elf_Data *data, GElf_Xword *offset, uint16_t *retp);
+int elf_read_next_u32(Elf_Data *data, GElf_Xword *offset, uint32_t *retp);
+int elf_read_next_u64(Elf_Data *data, GElf_Xword *offset, uint64_t *retp);
+
 #if __WORDSIZE == 32
 #define PRI_ELF_ADDR		PRIx32
 #define GELF_ADDR_CAST(x)	(void *)(uint32_t)(x)