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