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 }