aboutsummaryrefslogtreecommitdiff
path: root/src/program.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/program.c')
-rw-r--r--src/program.c25
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;