bzr branch
http://gegoxaren.bato24.eu/bzr/%2Bjunk/codegen
1
by Gustav Hartvigsson
Beep Boop, nothin yet. |
1 |
#include "utils.h" |
2 |
||
3 |
||
4 |
||
5 |
ptr_t
|
|
6 |
malloc0 (size_t sz) { |
|
7 |
ptr_t retval = malloc (sz); |
|
8 |
if (retval != NULL) { |
|
9 |
memset (retval, 0, sz); |
|
10 |
} |
|
11 |
return retval; |
|
12 |
} |
|
13 |
||
14 |
str_t
|
|
15 |
string_vacuum (str_t s) { |
|
16 |
str_t out_buff; |
|
17 |
int index, i; |
|
18 |
||
19 |
index = -1; |
|
20 |
i = 0; |
|
21 |
for (auto c = s[i]; c != '\0'; c = s[i++]) { |
|
22 |
if (c != ' ' && c != '\n' && c != '\t' && c != '\r') { |
|
23 |
index = i; |
|
24 |
} |
|
25 |
} |
|
26 |
s[index + 1] = '\0'; |
|
27 |
out_buff = realloc (s, strlen (s) + 1); |
|
28 |
return out_buff; |
|
29 |
}
|
|
30 |
||
31 |
str_t
|
|
32 |
string_concat_list_nl (str_t* list) { |
|
33 |
ptr_t tmp; |
|
34 |
str_t buff = malloc0 (strlen (*list) * sizeof (list)); |
|
35 |
if (buff == NULL) { |
|
36 |
err_print ("buffer is for some reason Null, this is an error.\n"); |
|
37 |
goto error1; |
|
38 |
} |
|
39 |
for (str_t s = *list; s != NULL; s = *++list) { |
|
40 |
if (sizeof (buff) <= strlen (buff) + strlen (s) + 1 ) { |
|
41 |
size_t next_size = strlen (buff) + strlen (s) + 1; |
|
42 |
fprintf (stdout, "nz: %zu\n", next_size); |
|
43 |
tmp = realloc (buff, next_size); |
|
44 |
if (tmp == NULL || errno == ENOMEM) { |
|
45 |
goto error2; |
|
46 |
} |
|
47 |
} |
|
48 |
strcat (buff, "\n"); |
|
49 |
strcat (buff, s); |
|
50 |
} |
|
51 |
buff = string_vacuum (buff); |
|
52 |
return buff; |
|
53 |
||
54 |
error2: |
|
55 |
free (tmp); |
|
56 |
error1: |
|
57 |
free (buff); |
|
58 |
return NULL; |
|
59 |
}
|
|
60 |
||
61 |
void
|
|
62 |
err_print (str_t fmt, ...) { |
|
63 |
va_list vlst; |
|
64 |
va_start (vlst, fmt); |
|
65 |
vfprintf (stderr, fmt, vlst); |
|
66 |
va_end (vlst); |
|
67 |
}
|
|
68 |
||
69 |
||
70 |
/* ************************************************************************** */
|
|
71 |
||
72 |
struct ByteStream { |
|
73 |
byte * bytes; |
|
74 |
size_t length; |
|
75 |
long int current; |
|
76 |
};
|
|
77 |
||
78 |
ByteStream * |
|
79 |
byte_stream_new (size_t length) { |
|
80 |
ByteStream * retval = malloc0 (sizeof (ByteStream)); |
|
81 |
|
|
82 |
if (retval == NULL) { |
|
83 |
err_print ("Something went wrong with allocating the ByteStream. Have you run out of memory?\n"); |
|
84 |
goto error1; |
|
85 |
} |
|
86 |
||
87 |
retval->bytes = malloc0 (length); |
|
88 |
if (retval->bytes == NULL) { |
|
89 |
err_print ("Cound not allocate ByteStream buffer. Have you run out of memory?\n"); |
|
90 |
goto error2; |
|
91 |
} |
|
92 |
||
93 |
retval->length = length; |
|
94 |
retval->current = 0; |
|
95 |
||
96 |
return retval; |
|
97 |
||
98 |
error2: |
|
99 |
free (retval); |
|
100 |
error1: |
|
101 |
return NULL; |
|
102 |
}
|
|
103 |
||
104 |
ByteStream * |
|
105 |
byte_stream_new_from_file (UNUSED FILE * f) { |
|
106 |
NOT_IMPLEMENTED; |
|
107 |
return NULL; |
|
108 |
}
|
|
109 |
||
110 |
||
111 |
void
|
|
112 |
byte_stream_seek (ByteStream * bstream, long int offset, SEEK_OFFSET origin) { |
|
113 |
switch (origin) { |
|
114 |
case (SEEK_OFFSET_SET): |
|
115 |
assert (offset > 0 && "Offset must be positive when using SEEK_OFFSET_SET."); |
|
116 |
bstream->current = offset; |
|
117 |
return; |
|
118 |
case (SEEK_OFFSET_CUR): |
|
119 |
assert (((long) bstream->length >= (bstream->current + offset)) && |
|
120 |
((bstream->current + offset) >= 0) && |
|
121 |
"Trying to seek outside range valid range."); |
|
122 |
bstream->current += offset; |
|
123 |
return; |
|
124 |
case (SEEK_OFFSET_END): |
|
125 |
assert (offset < 0 && "Offset must be negative when using SEEK_OFFSET_END."); |
|
126 |
bstream->current = bstream->length - offset; |
|
127 |
return; |
|
128 |
default: |
|
129 |
assert (false && "How did you end up here?"); |
|
130 |
} |
|
131 |
}
|
|
132 |
||
133 |
size_t
|
|
134 |
byte_stream_read (ByteStream * bstream, OUT ptr_t ptr, size_t size, size_t count) { |
|
135 |
/* Based on the Minix implementation: https://stackoverflow.com/a/8590471 */ |
|
136 |
byte * cp = ptr; |
|
137 |
byte * bytes = bstream->bytes; |
|
138 |
size_t length = bstream->length; |
|
139 |
int c; |
|
140 |
size_t node = 0; |
|
141 |
size_t s; |
|
142 |
||
143 |
// Set the pointer correctly. |
|
144 |
bytes += bstream->current; |
|
145 |
||
146 |
if (size) { |
|
147 |
while (node < count) { |
|
148 |
s = 0; |
|
149 |
do { |
|
150 |
if ((s + (node * size)) <= length) { |
|
151 |
c = *bytes++; |
|
152 |
*cp++ = c; |
|
153 |
// update read byte. |
|
154 |
bstream->current++; |
|
155 |
} |
|
156 |
s++; |
|
157 |
} while (s <= size); |
|
158 |
node++; |
|
159 |
} |
|
160 |
} |
|
161 |
||
162 |
return node; |
|
163 |
}
|
|
164 |
||
165 |
size_t
|
|
166 |
byte_stream_write (ByteStream * bstream, IN ptr_t ptr, size_t size, size_t count) { |
|
167 |
byte * cp = ptr; |
|
168 |
byte * bytes = bstream->bytes; |
|
169 |
int c; |
|
170 |
size_t node = 0; |
|
171 |
size_t s; |
|
172 |
size_t length = bstream->length; |
|
173 |
size_t read_length = size * count; |
|
174 |
size_t current = bstream->current; |
|
175 |
||
176 |
||
177 |
if ((read_length + current) >= length) { |
|
178 |
ptr_t tmp = realloc (bstream->bytes, read_length + current); |
|
179 |
if (tmp == NULL) { |
|
180 |
err_print ("Could not reallocate ByteStream buffer. Have you run out of memory?\n"); |
|
181 |
goto error; |
|
182 |
} |
|
183 |
|
|
184 |
else bstream->bytes = tmp; |
|
185 |
} |
|
186 |
||
187 |
if (size) { |
|
188 |
while (node < count) { |
|
189 |
s = 0; |
|
190 |
do { |
|
191 |
if ((s + (node * size)) <= read_length) { |
|
192 |
c = *cp++; |
|
193 |
*bytes++ = c; |
|
194 |
} |
|
195 |
s++; |
|
196 |
} while (s <= size); |
|
197 |
node++; |
|
198 |
current += s; |
|
199 |
} |
|
200 |
} |
|
201 |
|
|
202 |
error: |
|
203 |
return node; |
|
204 |
}
|
|
205 |
||
206 |
size_t
|
|
207 |
byte_stream_length (ByteStream * bstream) { |
|
208 |
return bstream->length; |
|
209 |
}
|