#include mowgli_error_context_t *mec; void process_data(const char *filename) { mowgli_error_context_push(mec, "While processing file '%s'", filename); char buf[65535]; FILE *f; int line_number = 0; if (filename == NULL) mowgli_error_context_display_with_error(mec, ":\n * ", "no filename provided"); else { mowgli_error_context_push(mec, "While reading file '%s'", filename); if ((f = fopen(filename, "rb")) == NULL) mowgli_error_context_display_with_error(mec, ":\n * ", strerror(errno)); mowgli_error_context_pop(mec); } while(fgets(buf, 65535, f) != NULL) { line_number++; mowgli_error_context_push(mec, "While parsing line %d of file '%s'", line_number, filename); if (strncasecmp(buf, "#e ", 3) == 0) mowgli_error_context_display_with_error(mec, ":\n * ", buf + 3); if (strncasecmp(buf, "#w ", 3) == 0) { mowgli_error_context_display(mec, ":\n * "); printf("Warning: %s\n", buf + 3); mowgli_error_context_pop(mec); continue; } if (strncasecmp(buf, "#i ", 3) == 0) { buf[strlen(buf) - 1] = '\0'; mowgli_error_context_push(mec, "While including file '%s' from line %d of file '%s'", buf + 3, line_number, filename); process_data(buf + 3); mowgli_error_context_pop(mec); mowgli_error_context_pop(mec); continue; } if (strncasecmp(buf, "#", 1) == 0) mowgli_error_context_display_with_error(mec, ":\n * ", "Unknown directive."); mowgli_error_context_pop(mec); printf("%s", buf); } mowgli_error_context_pop(mec); } int main(int argc, char *argv[]) { mowgli_init(); mec = mowgli_error_context_create(); mowgli_error_context_push(mec, "In program %s", argv[0]); process_data(argv[1]); mowgli_error_context_destroy(mec); return 0; }