--- a/src/reader.h Sun Aug 01 18:25:21 2010 +0200
+++ b/src/reader.h Sun Aug 01 23:54:08 2010 +0200
@@ -59,6 +59,7 @@
/* relative offset. */
void reader_skip (struct reader *reader, uint32_t offset);
void reader_skip64 (struct reader *reader, uint64_t offset);
+static inline void reader_skip_uleb128 (struct reader *reader);
void reader_initialize (struct reader *reader, uint8_t *buffer, uint32_t size);
@@ -109,6 +110,33 @@
return result;
}
+static inline void reader_skip_uleb128 (struct reader *reader)
+{
+ uint8_t byte;
+ uint8_t shift;
+ uint8_t *buffer;
+ if (reader->size < reader->current + 9) {
+ reader_read_uleb128_slow (reader);
+ return;
+ }
+ shift = 0;
+ buffer = &reader->buffer[reader->current];
+ do {
+ byte = *buffer;
+ buffer++;
+ shift += 7;
+ } while (byte & 0x80 &&
+ /* a LEB128 unsigned number is at most 9 bytes long. */
+ shift < (7*9));
+ if (byte & 0x80) {
+ /* This means the LEB128 number was not valid.
+ * ie: the last (9th) byte did not have the high-order bit zeroed.
+ */
+ reader->status = -1;
+ }
+ reader->current += shift / 7;
+}
+
#ifdef __cplusplus
}