#include #include #include char *progname; char *word = NULL; int xflag = 0; void usage(void) { fprintf(stderr, "Usage: %s [-c WORD [-x]] [FILE...]\n", progname); exit(1); } char * readlongline(FILE *fp) { static char *bufp; static int size = 8; /* a realistic value would be 80+2 (LF & NUL) */ char *cp; int offset = 0; if (!bufp) { if (!(bufp = malloc(size))) { fprintf(stderr, "Out of mem\n"); exit(1); } } *bufp = '\0'; cp = bufp; while (fgets(cp, size-offset, fp)) { cp += strlen(cp) - 1; if (*cp == '\n') { *cp = '\0'; return bufp; } size *= 2; if (!(bufp = realloc(bufp, size))) { fprintf(stderr, "Out of mem\n"); exit(1); } offset = strlen(bufp); cp = bufp + offset; } return (*bufp) ? bufp : NULL; /* possibly incomplete last line */ } void rev_line(char *line) { char *cp = line; char *ep = line + strlen(line) - 1; char tmp; while (cp < ep) { tmp = *cp; *cp = *ep; *ep = tmp; cp++; ep--; } } void processfile(FILE *fp) { char *line; while ((line = readlongline(fp))) { if (!word || (xflag != (strstr(line, word)!=NULL))) { rev_line(line); } printf("%s\n", line); } } int main(int argc, char *argv[]) { char *cp; FILE *fp; progname = argv[0]; argc--; argv++; /* remove program name */ for (; *argv && **argv=='-'; argc--,argv++) { cp = *argv + 1; if (!*cp) { /* ``-'' is no option but use stdin as first file */ break; } switch (*cp) { case 'x': if (cp[1]) { fprintf(stderr, "Unknown option `-%s'\n", cp); usage(); } xflag = 1; break; case 'c': if (cp[1]) { word = cp + 1; } else if (*++argv) { word = *argv; argc--; } else { usage(); } break; default: usage(); } } if (!*argv) { processfile(stdin); return 0; } for (; *argv; argv++,argc--) { if (strcmp(*argv, "-") == 0) { processfile(stdin); } else { if (!(fp = fopen(*argv, "r"))) { fprintf(stderr,"Could not open `%s'\n", *argv); continue; } processfile(fp); fclose(fp); } } return 0; }