Skip to content

Commit 13f8d8e

Browse files
author
Noam Preil
committed
Simplify logging interface
1 parent 454bc3d commit 13f8d8e

File tree

8 files changed

+55
-59
lines changed

8 files changed

+55
-59
lines changed

assembler/assembler.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ int try_match_instruction(struct assembler_state *state, char **_line) {
421421
return 0;
422422
} else {
423423
scas_log(L_DEBUG, "Matched string '%s' to instruction '%s'", line, match->instruction->match);
424-
scas_log_indent();
424+
scas_log_indent += 1;
425425
uint64_t instruction = match->instruction->value;
426426
for (unsigned int i = 0; i < match->operands->length; ++i) {
427427
operand_ref_t *ref = match->operands->items[i];
@@ -522,7 +522,7 @@ int try_match_instruction(struct assembler_state *state, char **_line) {
522522
}
523523
append_to_area(state->current_area, state->instruction_buffer, bytes_width);
524524
state->PC += bytes_width;
525-
scas_log_deindent();
525+
scas_log_indent -= 1;
526526
match_free(match);
527527
}
528528
return 1;

assembler/directives.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,9 +1503,9 @@ int try_handle_directive(struct assembler_state *state, char **line) {
15031503
(char *)stack_peek(state->file_name_stack), *(int *)stack_peek(state->line_number_stack));
15041504
int argc;
15051505
char **argv = split_directive(*line + strlen(d->match) + 1, &argc, d->delimiter);
1506-
scas_log_indent();
1506+
scas_log_indent += 1;
15071507
int ret = d->function(state, argv, argc);
1508-
scas_log_deindent();
1508+
scas_log_indent -= 1;
15091509
for (int i = 0; i < argc; i += 1) {
15101510
free(argv[i]);
15111511
}

include/log.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ typedef enum {
55
L_DEBUG = 3,
66
} scas_log_importance_t;
77

8-
void scas_log_init(scas_log_importance_t verbosity);
98
void scas_log(scas_log_importance_t verbosity, char* format, ...);
10-
void scas_log_indent();
11-
void scas_log_deindent();
12-
void scas_log_set_colors(bool enabled);
139

10+
extern bool scas_log_colorize;
11+
extern scas_log_importance_t scas_log_verbosity;
12+
extern unsigned scas_log_indent;

linker/linker.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ symbol_t *find_symbol(list_t *symbols, char *name) {
3535

3636
void resolve_immediate_values(list_t *symbols, area_t *area, list_t *errors) {
3737
scas_log(L_DEBUG, "Resolving immediate values for area '%s' at %08X", area->name, area->final_address);
38-
scas_log_indent();
38+
scas_log_indent += 1;
3939
for (unsigned int i = 0; i < area->late_immediates->length; ++i) {
4040
late_immediate_t *imm = area->late_immediates->items[i];
4141
imm->instruction_address += area->final_address;
@@ -92,7 +92,7 @@ void resolve_immediate_values(list_t *symbols, area_t *area, list_t *errors) {
9292
}
9393
}
9494
}
95-
scas_log_deindent();
95+
scas_log_indent -= 1;
9696
}
9797

9898
/* z80 only (and possibly ez80) */

log.c

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88
#include <emscripten.h>
99
#endif
1010

11-
static scas_log_importance_t v = 0;
12-
static unsigned indent = 0;
13-
static bool colored = true;
11+
void scas_log_default(const char *msg) {
12+
fprintf(stderr, "%s", msg);
13+
}
14+
15+
scas_log_importance_t scas_log_verbosity = 0;
16+
unsigned scas_log_indent = 0;
17+
bool scas_log_colorize = true;
18+
void (*scas_log_function)(const char *) = scas_log_default;
1419

1520
const char *verbosity_colors[] = {
1621
"", // L_SILENT
@@ -19,42 +24,34 @@ const char *verbosity_colors[] = {
1924
"\x1B[1;30m", // L_DEBUG
2025
};
2126

22-
void scas_log_init(scas_log_importance_t verbosity) {
23-
v = verbosity;
24-
}
25-
26-
void scas_log_set_colors(bool _colored) {
27-
colored = _colored;
28-
}
29-
30-
void scas_log_indent() {
31-
++indent;
32-
}
33-
34-
void scas_log_deindent() {
35-
if (indent > 0) {
36-
--indent;
37-
}
38-
}
39-
4027
void scas_log(scas_log_importance_t verbosity, char* format, ...) {
41-
if (verbosity <= v && verbosity >= 0) {
42-
size_t c = verbosity;
43-
if (c > sizeof(verbosity_colors) / sizeof(char *)) {
44-
c = sizeof(verbosity_colors) / sizeof(char *) - 1;
45-
}
46-
if (colored) {
47-
fprintf(stderr, "%s", verbosity_colors[c]);
48-
}
49-
if (verbosity == L_DEBUG || verbosity == L_INFO) {
50-
for (unsigned i = 0; i < indent; ++i) {
51-
fprintf(stderr, " ");
28+
if (scas_log_function) {
29+
if (verbosity <= scas_log_verbosity && verbosity >= 0) {
30+
size_t c = verbosity;
31+
if (c > sizeof(verbosity_colors) / sizeof(char *)) {
32+
c = sizeof(verbosity_colors) / sizeof(char *) - 1;
33+
}
34+
if (scas_log_colorize) {
35+
scas_log_function(verbosity_colors[c]);
36+
}
37+
if (verbosity == L_DEBUG || verbosity == L_INFO) {
38+
for (unsigned i = 0; i < scas_log_indent; ++i) {
39+
scas_log_function(" ");
40+
}
41+
}
42+
va_list args;
43+
va_start(args, format);
44+
int length = vsnprintf(NULL, 0, format, args);
45+
va_end(args);
46+
if (length > 0) {
47+
va_start(args, format);
48+
char *buf = malloc(length + 1);
49+
vsnprintf(buf, length, format, args);
50+
va_end(args);
51+
scas_log_function(buf);
52+
free(buf);
53+
scas_log_function(scas_log_colorize ? "\n\x1B[0m" : "\n");
5254
}
5355
}
54-
va_list args;
55-
va_start(args, format);
56-
vfprintf(stderr, format, args);
57-
va_end(args);
58-
fprintf(stderr, "%s\n", colored ? "\x1B[0m" : "");
5956
}
6057
}

scas/main.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ void init_scas_runtime() {
4343
strcpy(scas_runtime.include_path, "./");
4444
}
4545
scas_runtime.linker_script = NULL;
46-
scas_runtime.verbosity = L_SILENT;
4746

4847
scas_runtime.options.explicit_export = false;
4948
// TODO: reenable
@@ -166,7 +165,7 @@ void parse_arguments(int argc, char **argv) {
166165
int j;
167166
for (j = 1; argv[i][j] != '\0'; ++j) {
168167
if (argv[i][j] == 'v') {
169-
scas_runtime.verbosity++;
168+
scas_log_verbosity++;
170169
} else {
171170
scas_log(L_ERROR, "Invalid option %s", argv[i]);
172171
exit(1);
@@ -263,8 +262,8 @@ list_t *split_include_path() {
263262

264263
int main(int argc, char **argv) {
265264
init_scas_runtime();
265+
scas_log_verbosity = L_SILENT;
266266
parse_arguments(argc, argv);
267-
scas_log_init(scas_runtime.verbosity);
268267
validate_scas_runtime();
269268
instruction_set_t *instruction_set = find_inst();
270269
if (instruction_set == NULL) {
@@ -279,7 +278,7 @@ int main(int argc, char **argv) {
279278
list_t *objects = create_list();
280279
for (unsigned int i = 0; i < scas_runtime.input_files->length; ++i) {
281280
scas_log(L_INFO, "Assembling input file: '%s'", scas_runtime.input_names->items[i]);
282-
scas_log_indent();
281+
scas_log_indent += 1;
283282
FILE *f = scas_runtime.input_files->items[i];
284283
char magic[7];
285284
bool is_object = false;
@@ -308,7 +307,7 @@ int main(int argc, char **argv) {
308307
errors->length, warnings->length, scas_runtime.input_names->items[i]);
309308
}
310309
list_add(objects, o);
311-
scas_log_deindent();
310+
scas_log_indent -= 1;
312311
}
313312

314313
if ((scas_runtime.jobs & LINK) == LINK) {

scdump/main.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void dump_area(area_t *a) {
7676
for (unsigned int i = 0; i < a->source_map->length; ++i) {
7777
source_map_t *map = a->source_map->items[i];
7878
scas_log(L_INFO, "Source file '%s'", map->file_name);
79-
scas_log_indent();
79+
scas_log_indent += 1;
8080
for (unsigned int j = 0; j < map->entries->length; ++j) {
8181
source_map_entry_t *entry = map->entries->items[j];
8282
symbol_t *label = find_label(entry->address, a);
@@ -90,19 +90,19 @@ void dump_area(area_t *a) {
9090
map->file_name, entry->line_number,
9191
entry->source_code);
9292
}
93-
scas_log_deindent();
93+
scas_log_indent -= 1;
9494
}
9595
}
9696
if (runtime.dump_private_symbols || runtime.dump_public_symbols) {
9797
/* TODO: Distinguish between private/public */
9898
scas_log(L_INFO, "Symbols defined:");
99-
scas_log_indent();
99+
scas_log_indent += 1;
100100
for (unsigned int i = 0; i < a->symbols->length; ++i) {
101101
symbol_t *sym = a->symbols->items[i];
102102
scas_log(L_INFO, "'%s' == 0x%08X (%s)", sym->name, sym->value,
103103
sym->type == SYMBOL_LABEL ? "Label" : "Equate");
104104
}
105-
scas_log_deindent();
105+
scas_log_indent -= 1;
106106
}
107107
if (runtime.dump_references) {
108108
scas_log(L_INFO, "Unresolved references:");
@@ -130,8 +130,8 @@ int main(int argc, char **argv) {
130130
if (!parse_arguments(argc, argv)) {
131131
return 1;
132132
}
133-
scas_log_init(L_INFO);
134-
scas_log_set_colors(false);
133+
scas_log_verbosity = L_INFO;
134+
scas_log_colorize = false;
135135
for (unsigned int i = 0; i < runtime.input_files->length; ++i) {
136136
FILE *f;
137137
if (strcasecmp(runtime.input_files->items[i], "-") == 0) {

scwrap/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ int main(int argc, char **argv) {
3737
if (!parse_arguments(argc, argv)) {
3838
return 1;
3939
}
40-
scas_log_init(L_INFO);
40+
41+
scas_log_verbosity = L_INFO;
4142

4243
object_t *o = create_object();
4344
area_t *a = create_area("DATA");

0 commit comments

Comments
 (0)