date and time created 85/03/01 17:03:21 by jaap
authorJaap Akkerhuis <jaap@ucbvax.Berkeley.EDU>
Sat, 2 Mar 1985 09:03:21 +0000 (01:03 -0800)
committerJaap Akkerhuis <jaap@ucbvax.Berkeley.EDU>
Sat, 2 Mar 1985 09:03:21 +0000 (01:03 -0800)
SCCS-vsn: local/ditroff/ditroff.okeeffe/ideal/idfilt/idsort.c 1.1

usr/src/local/ditroff/ditroff.okeeffe/ideal/idfilt/idsort.c [new file with mode: 0644]

diff --git a/usr/src/local/ditroff/ditroff.okeeffe/ideal/idfilt/idsort.c b/usr/src/local/ditroff/ditroff.okeeffe/ideal/idfilt/idsort.c
new file mode 100644 (file)
index 0000000..a95acfe
--- /dev/null
@@ -0,0 +1,232 @@
+#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
+               );
+}