#include #include #include #include int scanfile(FILE *fp, const char *fn) { wint_t i; wint_t buf[256]; unsigned long ofs = 0uL; memset(buf, 0, sizeof buf); while (1) { i = fgetwc(fp); if (i == WEOF) { unsigned long cur; if (errno != EILSEQ) break; fprintf(stderr, "EILSEQ %s:%lu\n", fn, ofs); for (cur = (ofs > 255) ? (ofs - 255) : 0; cur <= ofs; cur++) { putwc(buf[cur % 256], stderr); } putwc(L'\n', stderr); return 1; } buf[ofs % 256] = i; ofs++; } return 0; } int main(int argc, char **argv) { int r = -1; FILE *fp; int i; errno = 0; for (i = 1; argv[i]; i++) { fp = fopen(argv[i], "rt"); r = scanfile(fp, argv[i]); fclose(fp); if (r > 0) return r; } if (r == -1) { r = scanfile(stdin, "(stdin)"); } return r; }