|
@@ -182,6 +182,64 @@ int64_t get_time(void) {
|
182
|
182
|
return ts.tv_sec * 1000000ll + ts.tv_nsec / 1000;
|
183
|
183
|
}
|
184
|
184
|
|
|
185
|
+#if defined(__APPLE__) || defined(__ANDROID__)
|
|
186
|
+ssize_t getdelim(char **linep, size_t *np, int delim, FILE *stream)
|
|
187
|
+{
|
|
188
|
+ int ch;
|
|
189
|
+ size_t new_len;
|
|
190
|
+ ssize_t i = 0;
|
|
191
|
+ char *line, *new_line;
|
|
192
|
+
|
|
193
|
+ // Invalid input
|
|
194
|
+ if (!linep || !np) {
|
|
195
|
+ errno = EINVAL;
|
|
196
|
+ return -1;
|
|
197
|
+ }
|
|
198
|
+
|
|
199
|
+ if (*linep == NULL || *np == 0) {
|
|
200
|
+ *np = 1024;
|
|
201
|
+ *linep = calloc(1, *np);
|
|
202
|
+ if (*linep == NULL)
|
|
203
|
+ return -1;
|
|
204
|
+ }
|
|
205
|
+ line = *linep;
|
|
206
|
+
|
|
207
|
+ while ((ch = getc(stream)) != EOF) {
|
|
208
|
+ if ((size_t)i > *np) {
|
|
209
|
+ // Need more space
|
|
210
|
+ new_len = *np + 1024;
|
|
211
|
+ new_line = realloc(*linep, new_len);
|
|
212
|
+ if (!new_line)
|
|
213
|
+ return -1;
|
|
214
|
+ *np = new_len;
|
|
215
|
+ *linep = new_line;
|
|
216
|
+ }
|
|
217
|
+
|
|
218
|
+ line[i] = ch;
|
|
219
|
+ if (ch == delim)
|
|
220
|
+ break;
|
|
221
|
+ i += 1;
|
|
222
|
+ }
|
|
223
|
+
|
|
224
|
+ if ((size_t)i > *np) {
|
|
225
|
+ // Need more space
|
|
226
|
+ new_len = i + 2;
|
|
227
|
+ new_line = realloc(*linep, new_len);
|
|
228
|
+ if (!new_line)
|
|
229
|
+ return -1;
|
|
230
|
+ *np = new_len;
|
|
231
|
+ *linep = new_line;
|
|
232
|
+ }
|
|
233
|
+ line[i + 1] = '\0';
|
|
234
|
+
|
|
235
|
+ return i > 0 ? i : -1;
|
|
236
|
+}
|
|
237
|
+
|
|
238
|
+ssize_t getline(char **linep, size_t *np, FILE *stream) {
|
|
239
|
+ return getdelim(linep, np, '\n', stream);
|
|
240
|
+}
|
|
241
|
+#endif
|
|
242
|
+
|
185
|
243
|
unsigned int file_hex2buf(char *filename, uint8_t *buffer, unsigned int buf_size) {
|
186
|
244
|
FILE *f = fopen(filename, "r");
|
187
|
245
|
if (!f) {
|