1 #ifndef lint
2 static char *sccsid = "idsort.c (CWI) 1.1 85/03/01";
3 #endif
4 #include "idfilt.h"
5
6 FILE *infile;
7 FILE *tempfile;
8 char *filename;
9 int lineno = 0;
10
11 float maxx, maxy;
12 float minx, miny;
13 float width = 4.0;
14 float colwid = 6.0;
15 float xscale;
16
17 boolean maxxset, maxyset;
18 boolean minxset, minyset;
19 boolean widset, colset;
20 boolean boundset;
21
22 boolean veryfirst = TRUE;
23
main(argc,argv)24 main (argc, argv)
25 int argc;
26 char *argv[];
27 {
28 while (argc > 1 && argv[1][0] == '-') {
29 fprintf (stderr, "ideal filter: unknown flag %c\n", argv[1][1]);
30 argc--;
31 argv++;
32 }
33 if (argc < 2) {
34 infile = stdin;
35 lineno = 0;
36 interpret (infile);
37 } else {
38 while (argc-- > 1) {
39 if (!(infile = fopen (*++argv, "r"))) {
40 fprintf (stderr, "ideal sorter: can't open %s\n", *argv);
41 exit (1);
42 }
43 filename = *argv;
44 lineno = 0;
45 interpret (infile);
46 fclose (infile);
47 }
48 }
49 exit (0);
50 }
51
interpret(infile)52 interpret (infile)
53 register FILE *infile;
54 {
55 char buf[250];
56
57 int numitems;
58 char cmd[10];
59 int i[10];
60 float f[30];
61 char *string;
62 boolean indots;
63
64
65 indots = FALSE;
66 while (fgets (buf, sizeof buf, infile)) {
67 if (!indots) {
68 fputs (buf, stdout);
69 if (strncmp(buf,".IS",3) == 0) {
70 indots = TRUE;
71 maxxset = minxset = maxyset = minyset = FALSE;
72 colset = boundset = widset = FALSE;
73 boundset = FALSE;
74 tempfile = fopen ("jUnKfOo", "w");
75 }
76 } else {
77 if (strncmp(buf,"...line",7)) {
78 if (!strncmp(buf,".IE",3) || !strncmp(buf,".IF",3)) {
79 idendE ();
80 indots = FALSE;
81 }
82 fputs (buf, stdout);
83 if (!boundset) {
84 if (strcmp (cmd, "...maxx") == 0) {
85 sscanf (buf, "%s %f", cmd, &f[0]);
86 idmaxx (f[0]);
87 } else if (strcmp (cmd, "...maxy") == 0) {
88 sscanf (buf, "%s %f", cmd, &f[0]);
89 idmaxy (f[0]);
90 } else if (strcmp (cmd, "...minx") == 0) {
91 sscanf (buf, "%s %f", cmd, &f[0]);
92 idminx (f[0]);
93 } else if (strcmp (cmd, "...miny") == 0) {
94 sscanf (buf, "%s %f", cmd, &f[0]);
95 idminy (f[0]);
96 } else if (strcmp (cmd, "...width") == 0) {
97 sscanf (buf, "%s %f", cmd, &f[0]);
98 idwidth (f[0]);
99 } else if (strcmp (cmd, "...colwid") == 0) {
100 sscanf (buf, "%s %f", cmd, &f[0]);
101 idcolwid (f[0]);
102 } else if (strcmp (cmd, "...obbox") == 0) {
103 if (!veryfirst) {
104 maxxset = maxyset = TRUE;
105 minxset = minyset = TRUE;
106 boundset = TRUE;
107 }
108 } else {
109 idendbound ();
110 veryfirst = FALSE;
111 }
112 }
113 } else {
114 if (!boundset)
115 idendbound();
116 sscanf (buf, "%s %f %f %f %f", cmd, &f[0], &f[1], &f[2], &f[3]);
117 idline (f[0], f[1], f[2], f[3]);
118 }
119 }
120 }
121 }
122
idmaxx(x)123 void idmaxx (x)
124 float x;
125 {
126 if (!maxxset) {
127 maxx = x;
128 maxxset = TRUE;
129 }
130 }
131
idmaxy(y)132 void idmaxy (y)
133 float y;
134 {
135 if (!maxyset) {
136 maxy = y;
137 maxyset = TRUE;
138 }
139 }
140
idminx(x)141 void idminx (x)
142 float x;
143 {
144 if (!minxset) {
145 minx = x;
146 minxset = TRUE;
147 }
148 }
149
idminy(y)150 void idminy (y)
151 float y;
152 {
153 if (!minyset) {
154 miny = y;
155 minyset = TRUE;
156 }
157 }
158
idwidth(wid)159 void idwidth (wid)
160 float wid;
161 {
162 if (!widset) {
163 width = wid;
164 widset = TRUE;
165 }
166 }
167
idcolwid(wid)168 void idcolwid (wid)
169 float wid;
170 {
171 if (!colset) {
172 colwid = wid;
173 colset = TRUE;
174 }
175 }
176
idendbound()177 void idendbound ()
178 {
179 if (boundset)
180 return;
181 idminx (-6.0);
182 idmaxy (6.0);
183 idmaxx (6.0);
184 idminy (-6.0);
185 if (maxx - minx < 0.2) {
186 maxx += 1;
187 minx -= 1;
188 }
189 if (maxy - miny < 0.2) {
190 maxy += 1;
191 miny -= 1;
192 }
193 xscale = width*972.0/(maxx - minx);
194 boundset = TRUE;
195 }
196
idendE()197 void idendE ()
198 {
199 char c;
200 fclose (tempfile);
201 system ("sort +2 -r -o jUnKfOo jUnKfOo");
202 tempfile = fopen ("jUnKfOo", "r");
203 while ((c = getc(tempfile)) != EOF)
204 putchar(c);
205 fclose (tempfile);
206 system ("rm jUnKfOo");
207 }
208
209
idline(x1,y1,x2,y2)210 void idline (x1, y1, x2, y2)
211 float x1, y1, x2, y2;
212 {
213 double t;
214 int numsegs, i;
215 if (y1 < y2 ) {
216 t = x1;
217 x1 = x2;
218 x2 = t;
219 t = y1;
220 y1 = y2;
221 y2 = t;
222 }
223 numsegs = xscale*abs(y2-y1)/250;
224 if (numsegs <= 0) numsegs = 1;
225 for (i = 0; i < numsegs; i ++)
226 fprintf (tempfile, "...line %f %f %f %f\n",
227 x1 + i*(x2-x1)/numsegs,
228 y1 + i*(y2-y1)/numsegs,
229 x1 + (i+1)*(x2-x1)/numsegs,
230 y1 + (i+1)*(y2-y1)/numsegs
231 );
232 }
233