diff options
Diffstat (limited to 'src/program.c')
-rw-r--r-- | src/program.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/src/program.c b/src/program.c index 5c07c5d..1a53b53 100644 --- a/src/program.c +++ b/src/program.c @@ -186,31 +186,26 @@ static usize bytes_left_to_read(amal_program *self) { } static CHECK_RESULT int amal_program_read_header(amal_program *self) { - u32 magic_number; - u8 major_version; - u8 minor_version; - u8 patch_version; + BytecodeHeader header; - if(bytes_left_to_read(self) < sizeof(u32) + sizeof(u8) * 3) + if(bytes_left_to_read(self) < sizeof(header)) return AMAL_PROGRAM_INVALID_HEADER; - am_memcpy(&magic_number, &self->data.data[self->read_index], sizeof(magic_number)); - self->read_index += sizeof(u32); - am_memcpy(&major_version, &self->data.data[self->read_index], sizeof(major_version)); - self->read_index += sizeof(u8); - am_memcpy(&minor_version, &self->data.data[self->read_index], sizeof(minor_version)); - self->read_index += sizeof(u8); - am_memcpy(&patch_version, &self->data.data[self->read_index], sizeof(patch_version)); - self->read_index += sizeof(u8); + am_memcpy(&header, self->data.data + self->read_index, sizeof(header)); + self->read_index += sizeof(header); +#ifdef AMAL_BIG_ENDIAN + header.magic_number = byteswap32(header.magic_number); + #error TODO: Support big endian for program decoding +#endif - if(magic_number != AMAL_BYTECODE_MAGIC_NUMBER) + if(header.magic_number != AMAL_BYTECODE_MAGIC_NUMBER) return AMAL_PROGRAM_INVALID_MAGIC_NUMBER; /* A program is only incompatible if the major version is newer than the version that is used to run it. TODO: Implement backwards compatible reads, starting from when the program bytecode breaks backwards compatibility */ - if(major_version > AMAL_BYTECODE_MAJOR_VERSION) + if(header.major_version > AMAL_BYTECODE_MAJOR_VERSION) return AMAL_PROGRAM_INCOMPATIBLE; return AMAL_PROGRAM_OK; |