kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

bytes.h (1975B)


      1 #ifndef KIT_BYTES_H
      2 #define KIT_BYTES_H
      3 
      4 /* Byte read/write helpers โ€” canonical for encoding multi-byte integers
      5  * into byte buffers. ELF, AArch64 instruction emission, relocation
      6  * patches all use little-endian. The only big-endian site is ar archive
      7  * symbol-index headers (POSIX ar(5) ยง"Archive symbol table"). */
      8 
      9 #include "core/core.h"
     10 
     11 static inline u16 rd_u16_le(const u8* p) {
     12   return (u16)((u32)p[0] | ((u32)p[1] << 8));
     13 }
     14 
     15 static inline u32 rd_u32_le(const u8* p) {
     16   return (u32)p[0] | ((u32)p[1] << 8) | ((u32)p[2] << 16) | ((u32)p[3] << 24);
     17 }
     18 
     19 static inline u64 rd_u64_le(const u8* p) {
     20   return (u64)rd_u32_le(p) | ((u64)rd_u32_le(p + 4) << 32);
     21 }
     22 
     23 static inline void wr_u16_le(u8* p, u16 v) {
     24   p[0] = (u8)(v);
     25   p[1] = (u8)(v >> 8);
     26 }
     27 
     28 static inline void wr_u32_le(u8* p, u32 v) {
     29   p[0] = (u8)(v);
     30   p[1] = (u8)(v >> 8);
     31   p[2] = (u8)(v >> 16);
     32   p[3] = (u8)(v >> 24);
     33 }
     34 
     35 static inline void wr_u64_le(u8* p, u64 v) {
     36   wr_u32_le(p, (u32)(v));
     37   wr_u32_le(p + 4, (u32)(v >> 32));
     38 }
     39 
     40 /* Big-endian โ€” ar symbol index. */
     41 
     42 static inline u32 rd_u32_be(const u8* p) {
     43   return ((u32)p[0] << 24) | ((u32)p[1] << 16) | ((u32)p[2] << 8) | (u32)p[3];
     44 }
     45 
     46 static inline void wr_u32_be(u8* p, u32 v) {
     47   p[0] = (u8)(v >> 24);
     48   p[1] = (u8)(v >> 16);
     49   p[2] = (u8)(v >> 8);
     50   p[3] = (u8)(v);
     51 }
     52 
     53 /* Writer-bridging little-endian emit helpers โ€” stage to a stack buffer
     54  * via the wr_*_le primitives above, then push the bytes through a
     55  * Writer. ELF / COFF / Mach-O object emitters all share these. */
     56 
     57 static inline void writer_u8_le(Writer* w, u32 v) {
     58   u8 b = (u8)v;
     59   kit_writer_write(w, &b, 1);
     60 }
     61 
     62 static inline void writer_u16_le(Writer* w, u32 v) {
     63   u8 b[2];
     64   wr_u16_le(b, (u16)v);
     65   kit_writer_write(w, b, 2);
     66 }
     67 
     68 static inline void writer_u32_le(Writer* w, u32 v) {
     69   u8 b[4];
     70   wr_u32_le(b, v);
     71   kit_writer_write(w, b, 4);
     72 }
     73 
     74 static inline void writer_u64_le(Writer* w, u64 v) {
     75   u8 b[8];
     76   wr_u64_le(b, v);
     77   kit_writer_write(w, b, 8);
     78 }
     79 
     80 #endif