void error_ex(TCCState *s1, int is_warning, const char *fmt, va_list ap) { char buf[2048]; BufferedFile **f; buf[0] = '\0'; if (file) { for (f = s1->include_stack; f < s1->include_stack_ptr; f++) { strcat_printf(buf, sizeof(buf), "In file included from %s:%d:\n", (*f)->filename, (*f)->line_num); } if (file->line_num > 0) { strcat_printf(buf, sizeof(buf), "%s:%d: ", file->filename, file->line_num); } else { strcat_printf(buf, sizeof(buf), "%s: ", file->filename); } } else { strcat_printf(buf, sizeof(buf), "cc: "); } if (is_warning) { strcat_printf(buf, sizeof(buf), "warning: "); } strcat_vprintf(buf, sizeof(buf), fmt, ap); if (!s1->error_func) { // Default case: stderr fprintf(stderr, "%s\n", buf); } else { s1->error_func(s1->error_opaque, buf); } if (!is_warning || s1->warn_error) s1->nb_errors++; }
PUB_FUNC void strcat_printf(char *buf, int buf_size, const char *fmt, ...) { va_list ap; va_start (ap, fmt); strcat_vprintf (buf, buf_size, fmt, ap); va_end (ap); }
static void error1(TCCState *s1, int is_warning, const char *fmt, va_list ap) { char buf[2048]; BufferedFile **pf, *f; buf[0] = '\0'; /* use upper file if inline ":asm:" or token ":paste:" */ for (f = file; f && f->filename[0] == ':'; f = f->prev) { ; } if (f) { for (pf = s1->include_stack; pf < s1->include_stack_ptr; pf++) { strcat_printf (buf, sizeof(buf), "In file included from %s:%d:\n", (*pf)->filename, (*pf)->line_num); } if (f->line_num > 0) { strcat_printf (buf, sizeof(buf), "%s:%d: ", f->filename, f->line_num); } else { strcat_printf (buf, sizeof(buf), "%s: ", f->filename); } } else { strcat_printf (buf, sizeof(buf), "tcc: "); } if (is_warning) { strcat_printf (buf, sizeof(buf), "warning: "); } else { strcat_printf (buf, sizeof(buf), "error: "); } strcat_vprintf (buf, sizeof(buf), fmt, ap); if (!s1->error_func) { /* default case: stderr */ fprintf (stderr, "%s\n", buf); } else { s1->error_func (s1->error_opaque, buf); } if (!is_warning || s1->warn_error) { s1->nb_errors++; } }