1 /* $NetBSD: fpr.c,v 1.9 2011/09/04 20:26:17 joerg Exp $ */
4 * Copyright (c) 1989, 1993
5 * The Regents of the University of California. All rights reserved.
7 * This code is derived from software contributed to Berkeley by
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 #include <sys/cdefs.h>
37 __COPYRIGHT("@(#) Copyright (c) 1989, 1993\
38 The Regents of the University of California. All rights reserved.");
43 static char sccsid
[] = "@(#)fpr.c 8.1 (Berkeley) 6/6/93";
45 __RCSID("$NetBSD: fpr.c,v 1.9 2011/09/04 20:26:17 joerg Exp $");
85 static void flush(void);
86 static void get_text(void);
87 static void init(void);
88 __dead
static void nospace(void);
89 static void savech(int);
92 main(int argc
, char **argv
)
103 switch (ch
= getchar()) {
108 ungetc((int) EOL
, stdin
);
131 switch (ch
= getchar()) {
139 ungetc((int) EOL
, stdin
);
154 for (i
= 0; i
< length
; i
++)
167 fprintf(stderr
, "Illegal carriage control - %d line%s.\n",
168 errorcount
, errorcount
== 1 ? "" : "s");
182 sp
= malloc((unsigned) maxpos
);
189 line
= calloc(maxcol
, sizeof(COLUMN
));
193 cend
= line
+ (maxcol
- 1);
195 cp
->width
= INITWIDTH
;
196 sp
= calloc(INITWIDTH
, sizeof(char));
217 switch (ch
= getchar()) {
223 pos
= (1 + i
/ TABSIZE
) * TABSIZE
;
225 n
= realloc(text
, (unsigned)(pos
+ 10));
256 n
= realloc(text
, (unsigned)(i
+ 10));
291 newline
= realloc(line
, (unsigned) (col
+ 10) * sizeof(COLUMN
));
298 cend
= line
+ (maxcol
- 1);
300 cp
->width
= INITWIDTH
;
302 sp
= calloc(INITWIDTH
, sizeof(char));
310 newcount
= cp
->count
+ 1;
311 if (newcount
> cp
->width
) {
312 cp
->width
= newcount
;
313 sp
= realloc(cp
->str
, (unsigned) newcount
* sizeof(char));
318 cp
->count
= newcount
;
319 cp
->str
[newcount
- 1] = ch
;
335 while (i
> 0 && text
[i
- 1] == BLANK
)
338 for (i
= 0; i
< length
; i
++)
343 for (i
= 0; i
< length
; i
++)
347 while (anchor
<= highcol
) {
348 height
= line
[anchor
].count
;
352 } else if (height
== 1) {
353 putchar(*(line
[anchor
].str
));
354 line
[anchor
].count
= 0;
358 while (i
< highcol
&& line
[i
+ 1].count
> 1)
360 for (j
= anchor
; j
<= i
; j
++) {
361 height
= line
[j
].count
- 1;
362 putchar(line
[j
].str
[height
]);
363 line
[j
].count
= height
;
365 for (j
= anchor
; j
<= i
; j
++)
377 errx(1, "Storage limit exceeded.");