#include #include #include #include #include uint64_t read_leb128_u(int _fd, int max_size) { uint8_t read_bytes = 0U; uint8_t byte = 0; uint64_t result = 0U; uint32_t shift = 0U; do { read(_fd, &byte, 1);read_bytes++;read_bytes++; result |= (byte & 0x7f) << shift; shift += 7; } while(((byte & 0x80) != 0) && (read_bytes < max_size)); return result; } int64_t read_leb128_s(int _fd, int max_size) { uint8_t byte; uint8_t read_bytes = 0U; uint8_t last_byte; int64_t result = 0; uint32_t shift = 0U; read(_fd, &byte, 1); do { read(_fd, &byte, 1);read_bytes++; result |= (byte & 0x7f) << shift; last_byte = byte; shift += 7; } while(((byte & 0x80) != 0) && read_bytes < max_size); if ((last_byte & 0x40) != 0) result |= -(1 << shift); return result; } #define READ_VAR_UINT_1(FD) read_leb128_u(FD, 1) #define READ_VAR_UINT_7(FD) read_leb128_u(FD, 1) #define READ_VAR_UINT_32(FD) read_leb128_u(FD, 5) #define READ_VAR_INT_1(FD) read_leb128_s(FD, 1) #define READ_VAR_INT_7(FD) read_leb128_s(FD, 1) #define READ_VAR_INT_32(FD) read_leb128_s(FD, 5) #pragma weak main int main (int argc, char** argv) { int wasm = open("./test.wasm", O_RDONLY); uint64_t test_u = 0U; int64_t test_s = 0; unsigned char test_byte; unsigned char byte; uint32_t word; uint32_t counter = 0U; read(wasm, &word, 8); printf("test_byte:%08x\n", word); lseek(wasm, 9, SEEK_SET); read(wasm, &word, 8); printf("test_byte:%08x\n", word); lseek(wasm, 9, SEEK_SET); test_u = READ_VAR_UINT_32(wasm); printf("read u res is: %lu.\n", test_u); lseek(wasm, 0, SEEK_SET); while(read(wasm, &word, sizeof(uint32_t))) { //printf("%d:%02x\t", counter, word); counter++; } printf("\n"); return 0; }