1 /* $NetBSD: colrm.c,v 1.5 1997/10/18 13:00:20 lukem Exp $ */ 2 3 /*- 4 * Copyright (c) 1991, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <sys/cdefs.h> 37 #ifndef lint 38 __COPYRIGHT("@(#) Copyright (c) 1991, 1993\n\ 39 The Regents of the University of California. All rights reserved.\n"); 40 #endif /* not lint */ 41 42 #ifndef lint 43 #if 0 44 static char sccsid[] = "@(#)colrm.c 8.2 (Berkeley) 5/4/95"; 45 #endif 46 __RCSID("$NetBSD: colrm.c,v 1.5 1997/10/18 13:00:20 lukem Exp $"); 47 #endif /* not lint */ 48 49 #include <sys/types.h> 50 51 #include <err.h> 52 #include <errno.h> 53 #include <limits.h> 54 #include <stdio.h> 55 #include <stdlib.h> 56 #include <string.h> 57 #include <unistd.h> 58 59 #define TAB 8 60 61 void check __P((FILE *)); 62 int main __P((int, char **)); 63 void usage __P((void)); 64 65 int 66 main(argc, argv) 67 int argc; 68 char *argv[]; 69 { 70 u_long column, start, stop; 71 int ch; 72 char *p; 73 74 while ((ch = getopt(argc, argv, "")) != -1) 75 switch(ch) { 76 case '?': 77 default: 78 usage(); 79 } 80 argc -= optind; 81 argv += optind; 82 83 start = stop = 0; 84 switch(argc) { 85 case 2: 86 stop = strtol(argv[1], &p, 10); 87 if (stop <= 0 || *p) 88 errx(1, "illegal column -- %s", argv[1]); 89 /* FALLTHROUGH */ 90 case 1: 91 start = strtol(argv[0], &p, 10); 92 if (start <= 0 || *p) 93 errx(1, "illegal column -- %s", argv[0]); 94 break; 95 case 0: 96 break; 97 default: 98 usage(); 99 } 100 101 if (stop && start > stop) 102 err(1, "illegal start and stop columns"); 103 104 for (column = 0;;) { 105 switch (ch = getchar()) { 106 case EOF: 107 check(stdin); 108 break; 109 case '\b': 110 if (column) 111 --column; 112 break; 113 case '\n': 114 column = 0; 115 break; 116 case '\t': 117 column = (column + TAB) & ~(TAB - 1); 118 break; 119 default: 120 ++column; 121 break; 122 } 123 124 if ((!start || column < start || (stop && column > stop)) && 125 putchar(ch) == EOF) 126 check(stdout); 127 } 128 } 129 130 void 131 check(stream) 132 FILE *stream; 133 { 134 if (feof(stream)) 135 exit(0); 136 if (ferror(stream)) 137 err(1, "%s", stream == stdin ? "stdin" : "stdout"); 138 } 139 140 void 141 usage() 142 { 143 (void)fprintf(stderr, "usage: colrm [start [stop]]\n"); 144 exit(1); 145 } 146