2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * 1999-02-22 Arkadiusz MiĆkiewicz <misiek@pld.ORG.PL>
36 * added Native Language Support
37 * 1999-09-19 Bruno Haible <haible@clisp.cons.org>
38 * modified to work correctly in multi-byte locales
43 #include <unistd.h> /* for close() */
50 #include "closestream.h"
52 int plus(wchar_t c
, wchar_t d
);
53 void move(int l
, int m
);
55 static void __attribute__ ((__noreturn__
)) usage(FILE * out
);
58 * colcrt - replaces col for crts with new nroff esp. when using tbl.
59 * Bill Joy UCB July 14, 1977
61 * This filter uses a screen buffer, 267 half-lines by 132 columns.
62 * It interprets the up and down sequences generated by the new
63 * nroff when used with tbl and by \u \d and \r.
64 * General overstriking doesn't work correctly.
65 * Underlining is split onto multiple lines, etc.
67 * Option - suppresses all underlining.
68 * Option -2 forces printing of all half lines.
71 wchar_t page
[267][132];
81 int main(int argc
, char **argv
) {
84 enum { NO_UL_OPTION
= CHAR_MAX
+ 1 };
86 static const struct option longopts
[] = {
87 { "no-underlining", no_argument
, 0, NO_UL_OPTION
},
88 { "half-lines", no_argument
, 0, '2' },
89 { "version", no_argument
, 0, 'V' },
90 { "help", no_argument
, 0, 'h' },
94 setlocale(LC_ALL
, "");
95 bindtextdomain(PACKAGE
, LOCALEDIR
);
99 /* Take care of lonely hyphen option. */
100 for (i
= 0; i
< argc
; i
++)
101 if (argv
[i
][0] == '-' && argv
[i
][1] == '\0') {
104 memmove(argv
+ i
, argv
+ i
+ 1,
105 sizeof(char *) * (argc
- i
));
109 while ((opt
= getopt_long(argc
, argv
, "2Vh", longopts
, NULL
)) != -1)
118 printf(UTIL_LINUX_VERSION
);
130 if (!(f
= fopen(argv
[0], "r"))) {
132 err(EXIT_FAILURE
, "%s", argv
[0]);
147 void colcrt(FILE *f
) {
201 if (outcol
+ w
> 132) {
205 cp
= &page
[outline
][outcol
];
215 for (i
= 0; i
< w
; i
++)
217 dp
= cp
- (outcol
- w
);
218 for (cp
--; cp
>= dp
&& *cp
== 0; cp
--)
221 if (plus(c
, *cp
) || plus(*cp
, c
))
223 else if (*cp
== ' ' || *cp
== 0) {
224 for (i
= 1; i
< w
; i
++)
225 if (cp
[i
] != ' ' && cp
[i
] != 0)
227 for (i
= 0; i
< w
; i
++)
236 int plus(wchar_t c
, wchar_t d
)
239 return (c
== '|' && (d
== '-' || d
== '_'));
247 register wchar_t *cp
;
257 for (i
= first
| 1; i
< l
; i
++) {
261 for (i
= first
; i
< l
; i
++) {
263 if (printall
== 0 && lastomit
== 0 && *cp
== 0) {
269 if ((w
= wcwidth(*cp
)) > 0) {
277 memmove(page
, page
[ol
], (267 - ol
) * 132 * sizeof(wchar_t));
278 memset(page
[267 - ol
], '\0', ol
* 132 * sizeof(wchar_t));
284 void move(int l
, int m
)
286 register wchar_t *cp
, *dp
;
288 for (cp
= page
[l
], dp
= page
[m
]; *cp
; cp
++, dp
++) {
291 if (*dp
!= ' ' && *dp
!= '|' && *dp
!= 0)
301 for (cp
= page
[l
], dp
= page
[m
]; *cp
; cp
++, dp
++)
310 static void __attribute__ ((__noreturn__
)) usage(FILE * out
)
314 " %s [options] [file ...]\n"), program_invocation_short_name
);
317 _(" -, --no-underlining suppress all underlining\n"
318 " -2, --half-lines print all half-lines\n"
319 " -V, --version output version information and exit\n"
320 " -h, --help display this help and exit\n\n"));
322 fprintf(out
, USAGE_MAN_TAIL("colcrt(1)"));
323 exit(out
== stderr
? EXIT_FAILURE
: EXIT_SUCCESS
);