/* trunc.c - Remove trailing white space from a file. In addition * * perform some simple formatting. Options include lm (left * * margin), lc (leftmost column to copy), rc (rightmost column * * to copy), mc (convert CR's to LF's), and md (delete CR's). * * * * trunc [-|][-lm n][-lc n][-rc n] [ ...] * * * * trunc (C) 1988 by Gary L. Brant * * * * :ts=8 */ #define MAXLINE 1000 #include int lc = 0, /* leftmost column to copy */ lm = 0, /* left margin to insert */ rc = 0; /* rightmost column to copy */ int m = 0; /* conversion flag for ^M's */ int flag = 0; /* indicates CR seen and conversion mode on */ int head = 0; void fputs (), putc (); main (argc, argv) /*remove trailing blanks and tabs from source lines */ int argc; char *argv[]; { int i = 0, j; char ch, *pch; FILE *ifile, *fopen (); while ((++i < argc) && (argv[i][0] == '-')) { j = 1; switch (ch = argv[i][j++]) { case 'l': if ((ch = argv[i][j]) == 'c' && i < argc - 1) { lc = convert (argv[++i]); if (lc > 0) lc--; } else if (ch = 'm' && i < argc - 1) lm = convert (argv[++i]); else badarg (); break; case 'm': if ((ch = argv[i][j]) == 'd') m = 1; else if (ch == 'c') m = 2; break; case 'r': if ((ch = argv[i][j]) == 'c' && i < argc - 1) rc = convert (argv[++i]); else badarg (); break; default: badarg (); break; } } if (rc == 0) rc = MAXLINE - 1 - lm; if (lc > rc || rc - lc + lm >= MAXLINE) badarg (); while (i < argc) { ++head; if ((ifile = fopen ((pch = argv[i++]), "r")) == NULL) { fputs ("trunc: cant open ", stderr); fputs (pch, stderr); putc ('\n', stderr); exit (20); } else copy (ifile); } if (head == 0) copy (stdin); } /* copy - copy file, remove trailing white space and format as we go */ /* inspired by example in: K & R, P. 61 */ copy (ifile) FILE *ifile; { int irc, n = 0; char line[MAXLINE]; irc = rc + lm - lc; while (n < lm) line[n++] = ' '; while ((n = getline (ifile, &line[lm], MAXLINE-1-lm)) > 0) { register int in = (lm + n < irc) ? lm + n : irc; while (in-- >= lm) if (line[in] != ' ' && line[in] != '\t' && line[in] != '\n') break; if (in < lm) { putc ('\n', stdout); if (flag) { flag = 0; putc ('\n', stdout); } } else { if (flag != 0) { line[++in] = '\n'; flag = 0; } line[++in] = '\n'; line[++in] = '\0'; fputs (line, stdout); } } } /* get line into s, return length * inspired by example in: K & R, P. 67 */ getline (ifile, s, lim) FILE *ifile; char s[]; int lim; { register int c, i, j; i = 0; j = lc; /* leftmost columns to ignore */ while (i < lim && (c = getc (ifile)) != EOF && c != '\n') { if (c == '\r') { if (m == 1) continue; else if (m == 2) { flag = 1; continue; } } if (j-- <= 0) s[i++] = c; } if (c == '\n') s[i++] = c; s[i] = '\0'; return (i); } /* convert - convert numeric command-line arguments to binary * * returns -1 if non-numeric data encountered */ convert (argv) char *argv; { register long i = 0; register char ch; register int j=0; while ((ch = argv[j++]) != '\0') if (ch >= '0' && ch <= '9') { i *= 10; i += ch - '0'; } else return (-1); return (i); } /* badarg - complain about bad argument */ badarg () { fputs ("bad args\n", stderr); exit (20); } _wb_parse () { }