Start development on 386BSD 0.0
[unix-history] / .ref-BSD-4_3_Net_2 / usr / src / contrib / isode / others / quipu / photo / old / faxtopbm.c
CommitLineData
32150d70
C
1/* faxtopbm.c - FAX to pbm filter */
2
3#ifndef lint
4static char *rcsid = "$Header: /f/osi/others/quipu/photo/RCS/faxtopbm.c,v 7.0 89/11/23 22:01:41 mrose Rel $";
5#endif
6
7/*
8 * $Header: /f/osi/others/quipu/photo/RCS/faxtopbm.c,v 7.0 89/11/23 22:01:41 mrose Rel $
9 *
10 *
11 * $Log: faxtopbm.c,v $
12 * Revision 7.0 89/11/23 22:01:41 mrose
13 * Release 6.0
14 *
15 */
16
17/*
18 * NOTICE
19 *
20 * Acquisition, use, and distribution of this module and related
21 * materials are subject to the restrictions of a license agreement.
22 * Consult the Preface in the User's Manual for the full terms of
23 * this agreement.
24 *
25 */
26
27
28#include <stdio.h>
29#include "psap.h"
30#include "pbm/pbm.h"
31
32/* \f */
33
34static int passno;
35
36static bit black, white;
37
38/* \f MAIN */
39
40/* ARGSUSED */
41
42main (argc, argv, envp)
43int argc;
44char **argv,
45 **envp;
46{
47 char *cp,
48 *file;
49 FILE *fp;
50 PE pe;
51 PS ps;
52
53 black = PBM_BLACK, white = PBM_WHITE;
54
55 file = NULLCP, fp = stdin;
56 for (argv++; cp = *argv; argv++)
57 if (*cp == '-') {
58 if (cp[1] == NULL)
59 goto usage;
60
61 if (strncmp (cp, "-reversebits", strlen (cp)) == 0) {
62 black = PBM_WHITE, white = PBM_BLACK;
63 continue;
64 }
65 goto usage;
66 }
67 else
68 if (file) {
69usage: ;
70 fprintf (stderr, "usage: faxtopbm [file]\n"), exit (1);
71 }
72 else
73 if ((fp = fopen (file = cp, "r")) == NULL)
74 perror (file), exit (1);
75
76 if ((ps = ps_alloc (std_open)) == NULLPS)
77 fprintf (stderr, "ps_alloc: you lose\n"), exit (1);
78 if (std_setup (ps, fp) == NOTOK)
79 ps_die (ps, "std_setup");
80 if ((pe = ps2pe (ps)) == NULLPE)
81 ps_die (ps, "ps2pe");
82 if (pe_pullup (pe) == NOTOK)
83 pe_die (pe, "pe_pullup");
84 if (prim2bit (pe) == NULLPE)
85 pe_die (pe, "prim2bit");
86
87 for (passno = 1; passno < 3; passno++)
88 if (decode_t4 (pe -> pe_prim, file, ps_get_abs (pe)) == NOTOK)
89 fprintf (stderr, "\n"), exit (1);
90
91 pe_free (pe);
92 ps_free (ps);
93
94 exit (0);
95}
96
97/* \f ERRORS */
98
99static ps_die (ps, s)
100register PS ps;
101register char *s;
102{
103 fprintf (stderr, "%s: %s\n", s, ps_error (ps -> ps_errno));
104 exit (1);
105}
106
107
108static pe_die (pe, s)
109register PE pe;
110register char *s;
111{
112 fprintf (stderr, "%s: %s\n", s, pe_error (pe -> pe_errno));
113 exit (1);
114}
115
116/* \f PHOTO */
117
118static int x, y, maxx;
119
120static bit *bitrow, *bP;
121
122
123/* ARGSUSED */
124
125photo_start(name)
126char *name;
127{
128 if (passno == 1)
129 maxx = 0;
130 x = y = 0;
131
132 return OK;
133}
134
135
136/* ARGSUSED */
137
138photo_end (name)
139char *name;
140{
141 if (passno == 1) {
142 register int i;
143
144 x = maxx, y--;
145
146 pbm_writepbminit (stdout, maxx, y);
147 bitrow = pbm_allocrow (maxx);
148
149 for (i = maxx, bP = bitrow; i-- > 0; )
150 *bP++ = white;
151 bP = bitrow;
152 }
153 else
154 pbm_freerow (bitrow);
155
156 return OK;
157}
158
159
160photo_black (length)
161int length;
162{
163 if (passno == 2) {
164 register int i;
165
166 for (i = length; i > 0; i--)
167 *bP++ = black;
168 }
169
170 x += length;
171
172 return OK;
173}
174
175
176photo_white (length)
177int length;
178{
179 if (passno == 2)
180 bP += length;
181
182 x += length;
183
184 return OK;
185}
186
187
188/* ARGSUSED */
189
190photo_line_end (line)
191caddr_t line;
192{
193 if (passno == 1) {
194 if (x > maxx)
195 maxx = x;
196 }
197 else {
198 register int i;
199
200 pbm_writepbmrow (stdout, bitrow, maxx);
201
202 for (i = maxx, bP = bitrow; i-- > 0; )
203 *bP++ = white;
204 bP = bitrow;
205 }
206
207 x = 0, y++;
208
209 return OK;
210}