]> cygwin.com Git - cygwin-apps/cygutils.git/blob - src/colrm/colrm.c
Fixes for cygstart; bump version number and documentation
[cygwin-apps/cygutils.git] / src / colrm / colrm.c
1 /*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the University nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30 /*
31 * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
32 * added Native Language Support
33 * 1999-09-19 Bruno Haible <haible@clisp.cons.org>
34 * modified to work correctly in multi-byte locales
35 * 2002-07-12 Charles Wilson <cwilson@ece.gatech.edu>
36 * modified to work on cygwin; integrated into cygutils package
37 */
38
39 #if HAVE_CONFIG_H
40 #include "config.h"
41 #endif
42 #include "common.h"
43
44 /* included by common.h *//*
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <locale.h>
48 */
49
50 #ifndef LOCALEDIR
51 #define LOCALEDIR "/usr/share/locale"
52 #endif
53
54 #ifdef HAVE_LOCALE_H
55 # include <locale.h>
56 #endif
57 #if !HAVE_SETLOCALE
58 # undef setlocale(a, b)
59 # define setlocale(a, b) /* empty */
60 #endif
61
62 #include "widechar.h"
63
64 /*
65 COLRM removes unwanted columns from a file
66 Jeff Schriebman UC Berkeley 11-74
67 */
68
69 int
70 main(int argc, char **argv)
71 {
72 register int ct, first, last;
73 register wint_t c;
74 int i, w;
75 int padding;
76
77 setlocale(LC_ALL, "");
78
79 first = 0;
80 last = 0;
81 if (argc > 1)
82 first = atoi(*++argv);
83 if (argc > 2)
84 last = atoi(*++argv);
85
86 start:
87 ct = 0;
88 loop1:
89 c = getwc(stdin);
90 if (feof(stdin))
91 goto fin;
92 if (c == '\t')
93 w = ((ct + 8) & ~7) - ct;
94 else if (c == '\b')
95 w = (ct ? ct - 1 : 0) - ct;
96 else {
97 w = wcwidth(c);
98 if (w < 0)
99 w = 0;
100 }
101 ct += w;
102 if (c == '\n') {
103 putwc(c, stdout);
104 goto start;
105 }
106 if (!first || ct < first) {
107 putwc(c, stdout);
108 goto loop1;
109 }
110 for (i = ct-w+1; i < first; i++)
111 putwc(' ', stdout);
112
113 /* Loop getting rid of characters */
114 while (!last || ct < last) {
115 c = getwc(stdin);
116 if (feof(stdin))
117 goto fin;
118 if (c == '\n') {
119 putwc(c, stdout);
120 goto start;
121 }
122 if (c == '\t')
123 ct = (ct + 8) & ~7;
124 else if (c == '\b')
125 ct = ct ? ct - 1 : 0;
126 else {
127 w = wcwidth(c);
128 if (w < 0)
129 w = 0;
130 ct += w;
131 }
132 }
133
134 padding = 0;
135
136 /* Output last of the line */
137 for (;;) {
138 c = getwc(stdin);
139 if (feof(stdin))
140 break;
141 if (c == '\n') {
142 putwc(c, stdout);
143 goto start;
144 }
145 if (padding == 0 && last < ct) {
146 for (i = last; i <ct; i++)
147 putwc(' ', stdout);
148 padding = 1;
149 }
150 putwc(c, stdout);
151 }
152 fin:
153 fflush(stdout);
154 if (ferror(stdout) || fclose(stdout))
155 return 1;
156 return 0;
157 }
This page took 0.041526 seconds and 5 git commands to generate.