Next: The Library Object Constructors, Previous: The Resource Management, Up: Executive Assembler Introduction [Index]
Most of the program execution errors will be reported by the aime libraries. An error reporter construct is required by the error reporting libaime routines.
The error report introducing routine:
static int line_flat(void *context) { struct context_type *context_data; context_data = context; fflush(stdout); fputs(context_data->self, stderr); fputs(":", stderr); if (context_data->program) { fputs(" ", stderr); fputs(context_data->program, stderr); fputs(":", stderr); } if (1) { int (*line)(struct context_type *, unsigned *); line = context_data->line; if (line) { unsigned copy, miss;
Display the line number:
line(context, ©); seek_line(context, copy, &miss); fprintf(stderr, " %u:", miss + 1); } } fputs(" ", stderr); return 0; }
The error report constructor routine:
static int push_flat(void *context, const char *data, unsigned size) { fwrite(data, size, 1, stderr); return 0; }
The error report poster routine:
static int post_flat(void *context) {
Set the "error reported" flag:
((struct context_type *) context)->error = 1; fputs("\n", stderr); return 0; }
The errors not reported during program execution are reported later by the standalone interpreter:
static int flush_error(struct context_type *context_data, const char *program) {
Check whether the error was reported already:
if (context_data->error) { } else { fflush(stdout); fprintf(stderr, "%s:", context_data->self); if (program) { fprintf(stderr, " %s:", program); } if (1) { int (*line)(struct context_type *, unsigned *); line = context_data->line; if (line) { unsigned copy, miss;
Display the line number:
line(context_data, ©); seek_line(context_data, copy, &miss); fprintf(stderr, " %u:", miss + 1); } } fprintf(stderr, " cannot execute program\n"); } return 17; }
The function calculating the source line number corresponding the error:
static int seek_line(struct context_type *context_data, unsigned copy, unsigned *miss) { const char *data; unsigned line = 0; data = context_data->data; while (copy) { if (*data == '\n') { line++; } copy--; data++; } *miss = line; return 0; }
Next: The Library Object Constructors, Previous: The Resource Management, Up: Executive Assembler Introduction [Index]