Skip to content

Commit 8f2a76f

Browse files
author
Noam Preil
committed
Remove scas_abort
1 parent a0e7e79 commit 8f2a76f

11 files changed

Lines changed: 152 additions & 86 deletions

File tree

common/expression.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include <string.h>
77

88
#include "list.h"
9-
#include "io.h"
109
#include "stack.h"
1110
#include "expression.h"
1211
#include "log.h"
@@ -84,7 +83,10 @@ void fwrite_tokens(FILE *f, tokenized_expression_t *expression) {
8483

8584
tokenized_expression_t *fread_tokenized_expression(FILE *f) {
8685
uint32_t len;
87-
scas_read(&len, sizeof(uint32_t), 1, f);
86+
if (fread (&len, 1, sizeof(uint32_t), f) != sizeof(uint32_t)) {
87+
scas_log(L_ERROR, "Failed to read expression length from file");
88+
return NULL;
89+
}
8890
tokenized_expression_t *expression = malloc(sizeof(tokenized_expression_t));
8991
expression->tokens = create_list();
9092
expression->symbols = NULL;
@@ -96,7 +98,12 @@ tokenized_expression_t *fread_tokenized_expression(FILE *f) {
9698
token->symbol = read_line(f);
9799
break;
98100
case NUMBER:
99-
scas_read(&token->number, sizeof(uint64_t), 1, f);
101+
if (fread(&token->number, 1, sizeof(uint64_t), f) != sizeof(uint64_t)) {
102+
scas_log(L_ERROR, "Failed to read token number from file");
103+
free(token);
104+
free_expression(expression);
105+
return NULL;
106+
}
100107
break;
101108
case OPERATOR:
102109
token->operator = fgetc(f);

common/io.c

Lines changed: 0 additions & 12 deletions
This file was deleted.

common/objects.c

Lines changed: 90 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include <stdint.h>
55
#include <string.h>
66
#include <errno.h>
7-
#include "io.h"
87
#include "list.h"
98
#include "stack.h"
109
#include "expression.h"
@@ -257,42 +256,79 @@ area_t *read_area(FILE *f) {
257256
scas_log(L_DEBUG, "Reading area '%s' from file", name);
258257
free(name);
259258
uint32_t symbols, immediates;
260-
scas_read(&symbols, sizeof(uint32_t), 1, f);
259+
if (fread(&symbols, 1, sizeof(uint32_t), f) != sizeof(uint32_t)) {
260+
scas_log(L_ERROR, "Failed to read area from file");
261+
area_free(area);
262+
return NULL;
263+
}
261264
uint32_t len;
262265
for (uint32_t i = 0; i < symbols; ++i) {
263266
symbol_t *sym = malloc(sizeof(symbol_t));
264267
sym->exported = fgetc(f);
265-
scas_read(&len, sizeof(uint32_t), 1, f);
268+
if (fread(&len, sizeof(uint32_t), 1, f) != 1) {
269+
scas_log(L_ERROR, "TODO FIXME");
270+
return NULL;
271+
}
266272
sym->name = calloc(len + 1, sizeof(char));
267-
scas_read(sym->name, sizeof(char), len, f);
268-
scas_read(&sym->value, sizeof(uint64_t), 1, f);
269-
scas_read(&sym->defined_address, sizeof(uint64_t), 1, f);
273+
if (fread(sym->name, 1, len, f) != len) {
274+
scas_log(L_ERROR, "TODO FIXME");
275+
return NULL;
276+
}
277+
if (fread(&sym->value, 1, sizeof(uint64_t), f) != sizeof(uint64_t)) {
278+
scas_log(L_ERROR, "TODO FIXME");
279+
return NULL;
280+
}
281+
if (fread(&sym->defined_address, 1, sizeof(uint64_t), f) != sizeof(uint64_t)) {
282+
scas_log(L_ERROR, "TODO FIXME");
283+
return NULL;
284+
}
270285
sym->type = SYMBOL_LABEL;
271286
list_add(area->symbols, sym);
272287
scas_log(L_DEBUG, "Read symbol '%s' with value 0x%08X%08X", sym->name, (uint32_t)(sym->value >> 32), (uint32_t)sym->value);
273288
}
274289
/* TODO: Imports */
275-
scas_read(&immediates, sizeof(uint32_t), 1, f);
290+
if (fread(&immediates, 1, sizeof(uint32_t), f) != sizeof(uint32_t)) {
291+
scas_log(L_ERROR, "TODO FIXME");
292+
return NULL;
293+
}
276294
for (uint32_t i = 0; i < immediates; ++i) {
277295
late_immediate_t *imm = malloc(sizeof(late_immediate_t));
278296
imm->type = fgetc(f);
279297
imm->width = fgetc(f);
280-
scas_read(&imm->instruction_address, sizeof(uint64_t), 1, f);
281-
scas_read(&imm->base_address, sizeof(uint64_t), 1, f);
282-
scas_read(&imm->address, sizeof(uint64_t), 1, f);
298+
if (fread(&imm->instruction_address, sizeof(uint64_t), 1, f) != 1) {
299+
scas_log(L_ERROR, "TODO FIXME");
300+
return NULL;
301+
}
302+
if (fread(&imm->base_address, sizeof(uint64_t), 1, f) != 1) {
303+
scas_log(L_ERROR, "TODO FIXME");
304+
return NULL;
305+
}
306+
if (fread(&imm->address, sizeof(uint64_t), 1, f) != 1) {
307+
scas_log(L_ERROR, "TODO FIXME");
308+
return NULL;
309+
}
283310
imm->expression = fread_tokenized_expression(f);
284311
list_add(area->late_immediates, imm);
285312
scas_log(L_DEBUG, "Read immediate value at 0x%08X (width: %d)", imm->address, imm->width);
286313
}
287-
scas_read(&area->data_length, sizeof(uint64_t), 1, f);
314+
if (fread(&area->data_length, sizeof(uint64_t), 1, f) != 1) {
315+
scas_log(L_ERROR, "TODO FIXME");
316+
return NULL;
317+
}
288318
area->data_capacity = area->data_length;
289319
free(area->data);
290320
area->data = malloc((int)area->data_length);
291-
scas_read(area->data, sizeof(uint8_t), (int)area->data_length, f);
321+
if (fread(area->data, sizeof(uint8_t), (int)area->data_length, f) != 1) {
322+
scas_log(L_ERROR, "TODO FIXME");
323+
return NULL;
324+
}
292325
scas_log(L_DEBUG, "Read %d bytes of machine code", area->data_length);
293326

294327
uint64_t meta_length, meta_key;
295-
scas_read(&meta_length, sizeof(uint64_t), 1, f);
328+
if (fread(&meta_length, sizeof(uint64_t), 1, f) != 1) {
329+
scas_log(L_ERROR, "TODO FIXME");
330+
return NULL;
331+
}
296332
meta_length = (int)meta_length;
297333
scas_log(L_DEBUG, "Reading %d metadata entries", meta_length);
298334
for (uint64_t i = 0; i < meta_length; ++i) {
@@ -301,29 +337,53 @@ area_t *read_area(FILE *f) {
301337
meta_key = fgetc(f);
302338
meta->key = malloc(meta_key + 1);
303339
meta->key[meta_key] = 0;
304-
scas_read(meta->key, sizeof(char), meta_key, f);
305-
scas_read(&meta->value_length, sizeof(uint64_t), 1, f);
340+
if (fread(meta->key, sizeof(char), meta_key, f) != 1) {
341+
scas_log(L_ERROR, "TODO FIXME");
342+
return NULL;
343+
}
344+
if (fread(&meta->value_length, sizeof(uint64_t), 1, f) != 1) {
345+
scas_log(L_ERROR, "TODO FIXME");
346+
return NULL;
347+
}
306348
meta->value = malloc(meta->value_length + 1);
307349
meta->value[meta->value_length] = 0;
308-
scas_read(meta->value, sizeof(char), meta->value_length, f);
350+
if (fread(meta->value, sizeof(char), meta->value_length, f) != 1) {
351+
scas_log(L_ERROR, "TODO FIXME");
352+
return NULL;
353+
}
309354
list_add(area->metadata, meta);
310355
scas_log(L_DEBUG, "Read metadata %s with value length %d", meta->key, meta->value_length);
311356
}
312357

313358
uint64_t fileno, lineno;
314-
scas_read(&fileno, sizeof(uint64_t), 1, f);
359+
if (fread(&fileno, sizeof(uint64_t), 1, f) != 1) {
360+
scas_log(L_ERROR, "TODO FIXME");
361+
return NULL;
362+
}
315363
fileno = (int)fileno;
316364
for (uint64_t i = 0; i < fileno; ++i) {
317365
source_map_t *map = malloc(sizeof(source_map_t));
318366
map->file_name = read_line(f);
319367
map->entries = create_list();
320-
scas_read(&lineno, sizeof(uint64_t), 1, f);
368+
if (fread(&lineno, sizeof(uint64_t), 1, f) != 1) {
369+
scas_log(L_ERROR, "TODO FIXME");
370+
return NULL;
371+
}
321372
scas_log(L_DEBUG, "Reading source map for '%s', %d entries", map->file_name, lineno);
322373
for (uint64_t j = 0; j < lineno; ++j) {
323374
source_map_entry_t *entry = malloc(sizeof(source_map_entry_t));
324-
scas_read(&entry->line_number, sizeof(uint64_t), 1, f);
325-
scas_read(&entry->address, sizeof(uint64_t), 1, f);
326-
scas_read(&entry->length, sizeof(uint64_t), 1, f);
375+
if (fread(&entry->line_number, sizeof(uint64_t), 1, f) != 1) {
376+
scas_log(L_ERROR, "TODO FIXME");
377+
return NULL;
378+
}
379+
if (fread(&entry->address, sizeof(uint64_t), 1, f) != 1) {
380+
scas_log(L_ERROR, "TODO FIXME");
381+
return NULL;
382+
}
383+
if (fread(&entry->length, sizeof(uint64_t), 1, f) != 1) {
384+
scas_log(L_ERROR, "TODO FIXME");
385+
return NULL;
386+
}
327387
entry->source_code = read_line(f);
328388
list_add(map->entries, entry);
329389
scas_log(L_DEBUG, "Read entry at 0x%08X%08X (line %d): %s", (uint32_t)(entry->address >> 32), (uint32_t)entry->address, entry->line_number, entry->source_code);
@@ -334,18 +394,23 @@ area_t *read_area(FILE *f) {
334394
}
335395

336396
object_t *freadobj(FILE *f, const char *name) {
337-
object_t *o = create_object();
338397
char magic[7];
339398
int len = fread(magic, sizeof(char), 7, f);
340399
if (len != 7 || strncmp("SCASOBJ", magic, 7) != 0) {
341-
scas_abort("'%s' is not a valid object file.", name);
400+
scas_log(L_ERROR, "'%s' is not a valid object file.", name);
401+
return NULL;
342402
}
343403
int ver = fgetc(f);
344404
if (ver != SCASOBJ_VERSION) {
345-
scas_abort("'%s' was built with an incompatible version of scas.", name);
405+
scas_log(L_ERROR, "'%s' was built with an incompatible version of scas.", name);
406+
return NULL;
346407
}
347408
uint32_t area_count;
348-
scas_read(&area_count, sizeof(uint32_t), 1, f);
409+
if (fread(&area_count, sizeof(uint32_t), 1, f) != 1) {
410+
scas_log(L_ERROR, "TODO FIXME");
411+
return NULL;
412+
}
413+
object_t *o = create_object();
349414
for (uint32_t i = 0; i < area_count; ++i) {
350415
list_add(o->areas, read_area(f));
351416
}

include/io.h

Lines changed: 0 additions & 3 deletions
This file was deleted.

include/log.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ typedef enum {
77

88
void scas_log_init(scas_log_importance_t verbosity);
99
void scas_log(scas_log_importance_t verbosity, char* format, ...);
10-
void scas_abort(char* format, ...);
1110
void scas_log_indent();
1211
void scas_log_deindent();
1312
void scas_log_set_colors(bool enabled);

log.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,6 @@ void scas_log_deindent() {
3737
}
3838
}
3939

40-
void scas_abort(char *format, ...) {
41-
fprintf(stderr, "ERROR: ");
42-
va_list args;
43-
va_start(args, format);
44-
vfprintf(stderr, format, args);
45-
va_end(args);
46-
fprintf(stderr, "\n");
47-
#ifdef EMSCRIPTEN
48-
EM_ASM(
49-
throw 'aborting';
50-
);
51-
#else
52-
exit(1);
53-
#endif
54-
}
55-
5640
void scas_log(scas_log_importance_t verbosity, char* format, ...) {
5741
if (verbosity <= v && verbosity >= 0) {
5842
size_t c = verbosity;

scas/flags.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ int format_compare(const void *_a, const void *_b) {
3030
return strcasecmp(a->name, b->name);
3131
}
3232

33-
void parse_flag(const char *flag) {
33+
bool parse_flag(const char *flag) {
3434
flag += 2;
3535
char *name, *value;
3636
value = strchr(flag, '=');
@@ -73,18 +73,21 @@ void parse_flag(const char *flag) {
7373
sizeof(output_formats) / sizeof(struct output_format),
7474
sizeof(struct output_format), format_compare);
7575
if (!res) {
76-
scas_abort("Unknown output format %s", value);
76+
scas_log(L_ERROR, "Unknown output format %s", value);
77+
return false;
7778
}
7879
scas_runtime.options.output_format = res->writer;
7980
scas_runtime.output_extension = res->name;
8081
} else if (strcmp("8xp-name", name) == 0) {
8182
if (strlen(value) > 8) {
82-
scas_abort("-f8xp-name must be 8 characters or fewer.");
83+
scas_log(L_ERROR, "-f8xp-name must be 8 characters or fewer.");
84+
return false;
8385
}
8486
char *v = value;
8587
while (*v) {
8688
if (!isupper(*v) || !isascii(*v)) {
87-
scas_abort("-f8xp-name must be all uppercase ASCII.");
89+
scas_log(L_ERROR, "-f8xp-name must be all uppercase ASCII.");
90+
return false;
8891
}
8992
v++;
9093
}
@@ -100,19 +103,23 @@ void parse_flag(const char *flag) {
100103
} else if (strcmp("origin", name) == 0) {
101104
tokenized_expression_t *e = parse_expression(value);
102105
if (!e) {
103-
scas_abort("Unable to parse -forigin=%s", value);
106+
scas_log(L_ERROR, "Unable to parse -forigin=%s", value);
107+
return false;
104108
}
105109
list_t *s = create_list();
106110
int _;
107111
char *__;
108112
uint64_t res = evaluate_expression(e, s, &_, &__);
109113
if (_) {
110-
scas_abort("Unable to evaluate -forigin=%s", value);
114+
scas_log(L_ERROR, "Unable to evaluate -forigin=%s", value);
115+
return false;
111116
}
112117
scas_runtime.options.origin = res;
113118
} else {
114-
scas_abort("Unknown flag %s", name);
119+
scas_log(L_ERROR, "Unknown flag %s", name);
120+
return false;
115121
}
116122

117123
free(name);
124+
return true;
118125
}

scas/flags.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ struct output_format {
33
format_writer writer;
44
};
55

6-
void parse_flag(const char *flag);
6+
bool parse_flag(const char *flag);
77

0 commit comments

Comments
 (0)