#include #include #include void indicate_file_area(FILE* fd, size_t line, size_t column, size_t span) { const char margin[] = " "; char buf[1024] = { '\0' }; char *s = buf; char c = '\0'; rewind(fd); while (line && !feof(fd) && fgets(buf, sizeof(buf), fd)) { s = buf; while (*s) { if (*(s++) == '\n') { line--; } } } s = buf; while (*s == '\t' || *s == ' ') { s++; } fputs(margin, stderr); fputs(s, stderr); /* corner case (still needed?) - buf was just return */ if (strlen(buf) == 1 && buf[0] == '\n') { fputc('\n', stderr); } fputs(margin, stderr); for (column--; column; column--) { fputc(' ', stderr); } c = span == 1 ? '^' : '"'; for (; span; span--) { fputc(c, stderr); } fputc('\n', stderr); }