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