/* * bsfilt.c - a colcrt-like processor for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include #ifdef UNIX # ifdef USG #include # else /* not USG */ #include # endif /* USG */ #else /* not UNIX */ #include #endif /* UNIX */ #include #include "ansi.h" #define MAXLL 2048 /* ridiculous maximum line length */ int Dash = 1; /* underline with dashes */ int Dp = 0; /* dash pending */ int Lc = 0; /* line count */ char *Pname; /* program name */ unsigned char Ulb[MAXLL]; /* underline buffer */ int Ulx = 0; /* underline buffer index */ _PROTOTYPE(void Putchar,(int ch)); main(argc, argv) int argc; char *argv[]; { int ax = 1; /* argument index */ unsigned char c; /* character buffer */ FILE *fs; /* file stream */ int nf = 0; /* number of files processed */ unsigned char pc; /* previous character */ int under = 0; /* underline */ /* * Save program name. */ if ((Pname = strrchr(argv[0], '/')) != NULL) Pname++; else if ((Pname = strrchr(argv[0], '\\')) != NULL) Pname++; else Pname = argv[0]; /* * Process options. */ if (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) { /* * "-U" - underline with dashes. */ case 'U': Dash = 0; under = 1; break; /* * "-" - do no underlining at all. */ case '\0': Dash = under = 0; break; default: (void) fprintf(stderr, "%s usage: [-] [-U] [file]\n", Pname); exit(1); } ax++; } /* * Process files. Read standard input if no files names. */ while (ax < argc || nf == 0) { if (ax >= argc) fs = stdin; else { #ifdef UNIX if ((fs = fopen(argv[ax], "r")) == NULL) #else if ((fs = fopen(argv[ax], "rt")) == NULL) #endif { (void) fprintf(stderr, "%s: can't open %s\n", Pname, argv[ax]); exit(1); } ax++; } nf++; /* * Read input a character at a time. */ for (pc = '\0';;) { c = (unsigned char)fgetc(fs); if (feof(fs)) break; switch(c) { case '\n': if (pc) Putchar((int)pc); Putchar('\n'); pc = '\0'; break; case '\b': if (pc == '_') { if (under) { putchar(pc); putchar('\b'); } else if (Dash) Dp = 1; } pc = '\0'; break; default: if (pc) Putchar((int)pc); pc = c; } } if (pc) { Putchar((int)pc); Putchar((int)'\n'); } } exit(0); } /* * Putchar(ch) - put a character with possible underlining */ void Putchar(ch) int ch; { int i; /* temporary index */ if ((unsigned char)ch == '\n') { /* * Handle end of line. */ putchar('\n'); if (Ulx) { while (Ulx && Ulb[Ulx-1] == ' ') Ulx--; if (Ulx) { for (i = 0; i < Ulx; i++) putchar(Ulb[i]); putchar('\n'); } } Dp = Ulx = 0; Lc++; return; } /* * Put "normal" character. */ putchar((unsigned char)ch); if (Dash) { /* * Handle dash-type underlining. */ if (Ulx >= MAXLL) { (void) fprintf(stderr, "%s: underline for line %d > %d characters\n", Pname, Lc, MAXLL); exit(1); } Ulb[Ulx++] = Dp ? '-' : ' '; Dp = 0; } }