1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdarg.h>
5 #include <stdint.h>
6 
7 #include "shadowdive/internal/writer.h"
8 #include "shadowdive/internal/memwriter.h"
9 
10 #define GROW 64
11 
12 #define CHECK_SIZE \
13     if(writer->real_len < writer->data_len + len) { \
14         size_t newsize = writer->real_len + len + GROW; \
15         writer->buf = realloc(writer->buf, newsize); \
16         writer->real_len = newsize; \
17     }
18 
sd_mwriter_open()19 sd_mwriter* sd_mwriter_open() {
20     sd_mwriter *mwriter = malloc(sizeof(sd_mwriter));
21     memset(mwriter, 0, sizeof(sd_mwriter));
22     mwriter->buf = malloc(GROW);
23     mwriter->real_len = GROW;
24     return mwriter;
25 }
26 
sd_mwriter_save(const sd_mwriter * src,sd_writer * dst)27 void sd_mwriter_save(const sd_mwriter *src, sd_writer *dst) {
28     sd_write_buf(dst, src->buf, src->data_len);
29 }
30 
sd_mwriter_close(sd_mwriter * writer)31 void sd_mwriter_close(sd_mwriter *writer) {
32     if(writer == NULL) return;
33     free(writer->buf);
34     free(writer);
35 }
36 
sd_mwriter_pos(const sd_mwriter * writer)37 long sd_mwriter_pos(const sd_mwriter *writer) {
38     return writer->data_len;
39 }
40 
sd_mwriter_xor(sd_mwriter * writer,uint8_t key)41 void sd_mwriter_xor(sd_mwriter *writer, uint8_t key) {
42     for(long k = 0; k < writer->data_len; k++) {
43         writer->buf[k] = key++ ^ writer->buf[k];
44     }
45 }
46 
sd_mwrite_buf(sd_mwriter * writer,const char * buf,int len)47 void sd_mwrite_buf(sd_mwriter *writer, const char *buf, int len) {
48     CHECK_SIZE
49     memcpy(writer->buf + writer->data_len, buf, len);
50     writer->data_len += len;
51 }
52 
sd_mwrite_ubyte(sd_mwriter * writer,uint8_t value)53 void sd_mwrite_ubyte(sd_mwriter *writer, uint8_t value) {
54     sd_mwrite_buf(writer, (char*)&value, 1);
55 }
56 
sd_mwrite_uword(sd_mwriter * writer,uint16_t value)57 void sd_mwrite_uword(sd_mwriter *writer, uint16_t value) {
58     sd_mwrite_buf(writer, (char*)&value, 2);
59 }
60 
sd_mwrite_udword(sd_mwriter * writer,uint32_t value)61 void sd_mwrite_udword(sd_mwriter *writer, uint32_t value) {
62     sd_mwrite_buf(writer, (char*)&value, 4);
63 }
64 
sd_mwrite_byte(sd_mwriter * writer,int8_t value)65 void sd_mwrite_byte(sd_mwriter *writer, int8_t value) {
66     sd_mwrite_buf(writer, (char*)&value, 1);
67 }
68 
sd_mwrite_word(sd_mwriter * writer,int16_t value)69 void sd_mwrite_word(sd_mwriter *writer, int16_t value) {
70     sd_mwrite_buf(writer, (char*)&value, 2);
71 }
72 
sd_mwrite_dword(sd_mwriter * writer,int32_t value)73 void sd_mwrite_dword(sd_mwriter *writer, int32_t value) {
74     sd_mwrite_buf(writer, (char*)&value, 4);
75 }
76 
sd_mwrite_float(sd_mwriter * writer,float value)77 void sd_mwrite_float(sd_mwriter *writer, float value) {
78     sd_mwrite_buf(writer, (char*)&value, sizeof(float));
79 }
80 
sd_mwrite_fill(sd_mwriter * writer,char content,int len)81 void sd_mwrite_fill(sd_mwriter *writer, char content, int len) {
82     CHECK_SIZE
83     memset(writer->buf + writer->data_len, content, len);
84     writer->data_len += len;
85 }
86