Completed TODO: Rigid Endian
Just used the endian.h functions to convert host endian to and from big endian.
This commit is contained in:
17
lib/base.c
17
lib/base.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
36
todo.org
36
todo.org
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user