+#ifndef lint
+static char *sccsid = "idsort.c (CWI) 1.1 85/03/01";
+#endif
+#include "idfilt.h"
+
+FILE *infile;
+FILE *tempfile;
+char *filename;
+int lineno = 0;
+
+float maxx, maxy;
+float minx, miny;
+float width = 4.0;
+float colwid = 6.0;
+float xscale;
+
+boolean maxxset, maxyset;
+boolean minxset, minyset;
+boolean widset, colset;
+boolean boundset;
+
+boolean veryfirst = TRUE;
+
+main (argc, argv)
+int argc;
+char *argv[];
+{
+ while (argc > 1 && argv[1][0] == '-') {
+ fprintf (stderr, "ideal filter: unknown flag %c\n", argv[1][1]);
+ argc--;
+ argv++;
+ }
+ if (argc < 2) {
+ infile = stdin;
+ lineno = 0;
+ interpret (infile);
+ } else {
+ while (argc-- > 1) {
+ if (!(infile = fopen (*++argv, "r"))) {
+ fprintf (stderr, "ideal sorter: can't open %s\n", *argv);
+ exit (1);
+ }
+ filename = *argv;
+ lineno = 0;
+ interpret (infile);
+ fclose (infile);
+ }
+ }
+ exit (0);
+}
+
+interpret (infile)
+register FILE *infile;
+{
+ char buf[250];
+
+ int numitems;
+ char cmd[10];
+ int i[10];
+ float f[30];
+ char *string;
+ boolean indots;
+
+
+ indots = FALSE;
+ while (fgets (buf, sizeof buf, infile)) {
+ if (!indots) {
+ fputs (buf, stdout);
+ if (strncmp(buf,".IS",3) == 0) {
+ indots = TRUE;
+ maxxset = minxset = maxyset = minyset = FALSE;
+ colset = boundset = widset = FALSE;
+ boundset = FALSE;
+ tempfile = fopen ("jUnKfOo", "w");
+ }
+ } else {
+ if (strncmp(buf,"...line",7)) {
+ if (!strncmp(buf,".IE",3) || !strncmp(buf,".IF",3)) {
+ idendE ();
+ indots = FALSE;
+ }
+ fputs (buf, stdout);
+ if (!boundset) {
+ if (strcmp (cmd, "...maxx") == 0) {
+ sscanf (buf, "%s %f", cmd, &f[0]);
+ idmaxx (f[0]);
+ } else if (strcmp (cmd, "...maxy") == 0) {
+ sscanf (buf, "%s %f", cmd, &f[0]);
+ idmaxy (f[0]);
+ } else if (strcmp (cmd, "...minx") == 0) {
+ sscanf (buf, "%s %f", cmd, &f[0]);
+ idminx (f[0]);
+ } else if (strcmp (cmd, "...miny") == 0) {
+ sscanf (buf, "%s %f", cmd, &f[0]);
+ idminy (f[0]);
+ } else if (strcmp (cmd, "...width") == 0) {
+ sscanf (buf, "%s %f", cmd, &f[0]);
+ idwidth (f[0]);
+ } else if (strcmp (cmd, "...colwid") == 0) {
+ sscanf (buf, "%s %f", cmd, &f[0]);
+ idcolwid (f[0]);
+ } else if (strcmp (cmd, "...obbox") == 0) {
+ if (!veryfirst) {
+ maxxset = maxyset = TRUE;
+ minxset = minyset = TRUE;
+ boundset = TRUE;
+ }
+ } else {
+ idendbound ();
+ veryfirst = FALSE;
+ }
+ }
+ } else {
+ if (!boundset)
+ idendbound();
+ sscanf (buf, "%s %f %f %f %f", cmd, &f[0], &f[1], &f[2], &f[3]);
+ idline (f[0], f[1], f[2], f[3]);
+ }
+ }
+ }
+}
+
+void idmaxx (x)
+float x;
+{
+ if (!maxxset) {
+ maxx = x;
+ maxxset = TRUE;
+ }
+}
+
+void idmaxy (y)
+float y;
+{
+ if (!maxyset) {
+ maxy = y;
+ maxyset = TRUE;
+ }
+}
+
+void idminx (x)
+float x;
+{
+ if (!minxset) {
+ minx = x;
+ minxset = TRUE;
+ }
+}
+
+void idminy (y)
+float y;
+{
+ if (!minyset) {
+ miny = y;
+ minyset = TRUE;
+ }
+}
+
+void idwidth (wid)
+float wid;
+{
+ if (!widset) {
+ width = wid;
+ widset = TRUE;
+ }
+}
+
+void idcolwid (wid)
+float wid;
+{
+ if (!colset) {
+ colwid = wid;
+ colset = TRUE;
+ }
+}
+
+void idendbound ()
+{
+ if (boundset)
+ return;
+ idminx (-6.0);
+ idmaxy (6.0);
+ idmaxx (6.0);
+ idminy (-6.0);
+ if (maxx - minx < 0.2) {
+ maxx += 1;
+ minx -= 1;
+ }
+ if (maxy - miny < 0.2) {
+ maxy += 1;
+ miny -= 1;
+ }
+ xscale = width*972.0/(maxx - minx);
+ boundset = TRUE;
+}
+
+void idendE ()
+{
+ char c;
+ fclose (tempfile);
+ system ("sort +2 -r -o jUnKfOo jUnKfOo");
+ tempfile = fopen ("jUnKfOo", "r");
+ while ((c = getc(tempfile)) != EOF)
+ putchar(c);
+ fclose (tempfile);
+ system ("rm jUnKfOo");
+}
+
+
+void idline (x1, y1, x2, y2)
+float x1, y1, x2, y2;
+{
+ double t;
+ int numsegs, i;
+ if (y1 < y2 ) {
+ t = x1;
+ x1 = x2;
+ x2 = t;
+ t = y1;
+ y1 = y2;
+ y2 = t;
+ }
+ numsegs = xscale*abs(y2-y1)/250;
+ if (numsegs <= 0) numsegs = 1;
+ for (i = 0; i < numsegs; i ++)
+ fprintf (tempfile, "...line %f %f %f %f\n",
+ x1 + i*(x2-x1)/numsegs,
+ y1 + i*(y2-y1)/numsegs,
+ x1 + (i+1)*(x2-x1)/numsegs,
+ y1 + (i+1)*(y2-y1)/numsegs
+ );
+}