kit

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

rewrite.c (2459B)


      1 #include "obj/rewrite.h"
      2 
      3 #include <string.h>
      4 
      5 KitStatus obj_rewrite_init(ObjRewrite* r, const KitContext* ctx, KitSlice name,
      6                            const KitSlice* input) {
      7   if (!r || !ctx || !ctx->heap || !input || (!input->data && input->len))
      8     return KIT_INVALID;
      9   memset(r, 0, sizeof *r);
     10   r->ctx = ctx;
     11   r->name = name;
     12   r->input = input->data;
     13   r->len = input->len;
     14   r->bytes = (u8*)ctx->heap->alloc(ctx->heap, r->len ? r->len : 1u, 1u);
     15   if (!r->bytes) return KIT_NOMEM;
     16   if (r->len) memcpy(r->bytes, r->input, r->len);
     17   return KIT_OK;
     18 }
     19 
     20 void obj_rewrite_discard(ObjRewrite* r) {
     21   if (!r || !r->bytes) return;
     22   r->ctx->heap->free(r->ctx->heap, r->bytes, r->len ? r->len : 1u);
     23   r->bytes = NULL;
     24 }
     25 
     26 KitStatus obj_rewrite_commit(ObjRewrite* r, KitWriter* out,
     27                              KitLinkedRewriteReport* report_out) {
     28   KitStatus st;
     29   if (!r || !r->bytes || !out) return KIT_INVALID;
     30   st = r->len ? kit_writer_write(out, r->bytes, r->len) : KIT_OK;
     31   if (st == KIT_OK) st = kit_writer_status(out);
     32   if (st == KIT_OK && report_out) *report_out = r->report;
     33   obj_rewrite_discard(r);
     34   return st == KIT_OK ? KIT_OK : KIT_IO;
     35 }
     36 
     37 int obj_rw_range(size_t len, u64 off, u64 size) {
     38   return off <= (u64)len && size <= (u64)len - off;
     39 }
     40 
     41 u16 obj_rw_u16(const u8* p, int be) {
     42   return be ? (u16)(((u16)p[0] << 8) | p[1])
     43             : (u16)((u16)p[0] | ((u16)p[1] << 8));
     44 }
     45 
     46 u32 obj_rw_u32(const u8* p, int be) {
     47   if (be)
     48     return ((u32)p[0] << 24) | ((u32)p[1] << 16) | ((u32)p[2] << 8) |
     49            (u32)p[3];
     50   return (u32)p[0] | ((u32)p[1] << 8) | ((u32)p[2] << 16) |
     51          ((u32)p[3] << 24);
     52 }
     53 
     54 u64 obj_rw_u64(const u8* p, int be) {
     55   u32 a = obj_rw_u32(p, be);
     56   u32 b = obj_rw_u32(p + 4, be);
     57   return be ? ((u64)a << 32) | b : (u64)a | ((u64)b << 32);
     58 }
     59 
     60 void obj_rw_put_u16(u8* p, u16 v, int be) {
     61   if (be) {
     62     p[0] = (u8)(v >> 8);
     63     p[1] = (u8)v;
     64   } else {
     65     p[0] = (u8)v;
     66     p[1] = (u8)(v >> 8);
     67   }
     68 }
     69 
     70 void obj_rw_put_u32(u8* p, u32 v, int be) {
     71   if (be) {
     72     p[0] = (u8)(v >> 24);
     73     p[1] = (u8)(v >> 16);
     74     p[2] = (u8)(v >> 8);
     75     p[3] = (u8)v;
     76   } else {
     77     p[0] = (u8)v;
     78     p[1] = (u8)(v >> 8);
     79     p[2] = (u8)(v >> 16);
     80     p[3] = (u8)(v >> 24);
     81   }
     82 }
     83 
     84 void obj_rw_put_u64(u8* p, u64 v, int be) {
     85   if (be) {
     86     obj_rw_put_u32(p, (u32)(v >> 32), 1);
     87     obj_rw_put_u32(p + 4, (u32)v, 1);
     88   } else {
     89     obj_rw_put_u32(p, (u32)v, 0);
     90     obj_rw_put_u32(p + 4, (u32)(v >> 32), 0);
     91   }
     92 }