Completed TODO: Rigid Endian

Just used the endian.h functions to convert host endian to and from
big endian.
This commit is contained in:
2024-04-09 15:10:40 +06:30
parent 6df6dce153
commit afb48b65b9
2 changed files with 29 additions and 24 deletions

View File

@@ -10,30 +10,35 @@
* Description: Implementation of basic library functions * Description: Implementation of basic library functions
*/ */
#include <endian.h>
#include <string.h> #include <string.h>
#include "./base.h" #include "./base.h"
hword convert_bytes_to_hword(byte *bytes) hword convert_bytes_to_hword(byte *bytes)
{ {
hword h = 0; hword be_h = 0;
memcpy(&h, bytes, HWORD_SIZE); memcpy(&be_h, bytes, HWORD_SIZE);
hword h = be32toh(be_h);
return h; return h;
} }
void convert_hword_to_bytes(hword w, byte *bytes) void convert_hword_to_bytes(hword w, byte *bytes)
{ {
memcpy(bytes, &w, HWORD_SIZE); hword be_h = htobe32(w);
memcpy(bytes, &be_h, HWORD_SIZE);
} }
void convert_word_to_bytes(word w, byte *bytes) void convert_word_to_bytes(word w, byte *bytes)
{ {
memcpy(bytes, &w, WORD_SIZE); word be_w = htobe64(w);
memcpy(bytes, &be_w, WORD_SIZE);
} }
word convert_bytes_to_word(byte *bytes) word convert_bytes_to_word(byte *bytes)
{ {
word w = 0; word be_w = 0;
memcpy(&w, bytes, WORD_SIZE); memcpy(&be_w, bytes, WORD_SIZE);
word w = be64toh(be_w);
return w; return w;
} }

View File

@@ -15,24 +15,6 @@
*** TODO VM [0%] *** TODO VM [0%]
**** TODO vm/runtime.h **** TODO vm/runtime.h
** TODO Specification ** TODO Specification
* TODO Rigid endian :LIB:
Say a program is compiled on a little endian machine. The resultant
bytecode file, as a result of using C's internal functions, will use
little endian.
This file, when distributed to other computers, will not work on those
that use big endian.
This is a massive problem; I would like bytecode compiled on one
computer to work on any other one. Therefore we have to enforce big
endian. This refactor is limited to only LIB as a result of only the
~convert_*~ functions being used in the runtime to convert between
byte buffers (usually read from the bytecode file directly or from
memory to use in the stack).
2024-04-09: Found the ~hto_e~ functions under =endian.h= that provide
both way host to specific endian conversion of shorts, half words and
words. This will make it super simple to just convert.
* TODO Preprocessing directives :ASM: * TODO Preprocessing directives :ASM:
Like in FASM or NASM where we can give certain helpful instructions to Like in FASM or NASM where we can give certain helpful instructions to
the assembler. I'd use the ~%~ symbol to designate preprocessor the assembler. I'd use the ~%~ symbol to designate preprocessor
@@ -272,3 +254,21 @@ constant potentially
#+end_src #+end_src
which when referred to (by ~$print-1~) would insert the bytecode given which when referred to (by ~$print-1~) would insert the bytecode given
inline. inline.
** DONE Rigid endian :LIB:
Say a program is compiled on a little endian machine. The resultant
bytecode file, as a result of using C's internal functions, will use
little endian.
This file, when distributed to other computers, will not work on those
that use big endian.
This is a massive problem; I would like bytecode compiled on one
computer to work on any other one. Therefore we have to enforce big
endian. This refactor is limited to only LIB as a result of only the
~convert_*~ functions being used in the runtime to convert between
byte buffers (usually read from the bytecode file directly or from
memory to use in the stack).
2024-04-09: Found the ~hto_e~ functions under =endian.h= that provide
both way host to specific endian conversion of shorts, half words and
words. This will make it super simple to just convert.