211 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *	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 <abe@mace.cc.purdue.edu>,  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 <stdio.h>
 | |
| 
 | |
| #ifdef UNIX
 | |
| # ifdef USG
 | |
| #include <string.h>
 | |
| # else	/* not USG */
 | |
| #include <strings.h>
 | |
| # endif	/* USG */
 | |
| #else	/* not UNIX */
 | |
| #include <string.h>
 | |
| #endif	/* UNIX */
 | |
| 
 | |
| #include <sys/types.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 */
 | |
| 
 | |
| 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;
 | |
| 	}
 | |
| }
 | 
