URI:
       tmain.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tmain.c (3591B)
       ---
            1 #define _BSD_SOURCE 1        /* strdup, mkstemp */
            2 #define _DEFAULT_SOURCE 1
            3 #include <stdio.h>
            4 #include <signal.h>
            5 #include <math.h>
            6 #include <stdlib.h>
            7 #include <unistd.h>
            8 #include <string.h>
            9 #include "grap.h"
           10 #include "y.tab.h"
           11 
           12 int        dbg        = 0;
           13 
           14 #ifndef GRAPDEFINES
           15 #define GRAPDEFINES "#9/lib/grap.defines"
           16 #endif
           17 char        *lib_defines;
           18 
           19 int        lib        = 1;                /* 1 to include lib_defines */
           20 FILE        *tfd        = NULL;
           21 char        *tempfile;
           22 
           23 int        synerr        = 0;
           24 int        codegen        = 0;                   /* 1=>output for this picture; 0=>no output */
           25 char        *cmdname;
           26 
           27 Obj        *objlist = NULL;        /* all names stored here */
           28 
           29 #define        BIG        1e30
           30 Point        ptmin        = { NULL, -BIG, -BIG };
           31 Point        ptmax        = { NULL, BIG, BIG };
           32 
           33 char        *version = "version Dec 30, 1995";
           34 
           35 extern int yyparse(void);
           36 extern void setdefaults(void);
           37 extern void getdata(void);
           38 
           39 /* extern        int        unlink(char *); */ /* in unistd.h */
           40 
           41 int
           42 main(int argc, char *argv[])
           43 {
           44         extern void onintr(int), fpecatch(int);
           45 
           46         lib_defines = unsharp(GRAPDEFINES);
           47 
           48         if (signal(SIGINT, SIG_IGN) != SIG_IGN)
           49                 signal(SIGINT, onintr);
           50         signal(SIGFPE, fpecatch);
           51         cmdname = argv[0];
           52         tempfile = strdup("grap.XXXXXX");
           53         mkstemp(tempfile);
           54         while (argc > 1 && *argv[1] == '-') {
           55                 switch (argv[1][1]) {
           56                 case 'd':
           57                         dbg = 1;
           58                         tfd = stdout;
           59                         strcpy(tempfile, "grap.temp");
           60                         unlink(tempfile);
           61                         fprintf(stderr, "%s\n", version);
           62                         break;
           63                 case 'l':        /* turn off /usr/lib inclusion */
           64                         lib = 0;
           65                         break;
           66                 }
           67                 argc--;
           68                 argv++;
           69         }
           70         setdefaults();
           71         curfile = infile;
           72         if (argc <= 1) {
           73                 curfile->fin = stdin;
           74                 curfile->fname = tostring("-");
           75                 pushsrc(File, curfile->fname);
           76                 getdata();
           77         } else
           78                 while (argc-- > 1) {
           79                         if ((curfile->fin = fopen(*++argv, "r")) == NULL) {
           80                                 fprintf(stderr, "grap: can't open %s\n", *argv);
           81                                 onintr(0);
           82                         }
           83                         curfile->fname = tostring(*argv);
           84                         pushsrc(File, curfile->fname);
           85                         getdata();
           86                         fclose(curfile->fin);
           87                         free(curfile->fname);
           88                 }
           89         if (!dbg)
           90                 unlink(tempfile);
           91         exit(0);
           92 }
           93 
           94 void onintr(int n)
           95 {
           96         if(n){}
           97         if(!dbg)
           98                 unlink(tempfile);
           99         exit(1);
          100 }
          101 
          102 void fpecatch(int n)
          103 {
          104         ERROR "floating point exception" WARNING;
          105         onintr(n);
          106 }
          107 
          108 char *grow(char *ptr, char *name, int num, int size)        /* make array bigger */
          109 {
          110         char *p;
          111 
          112         if (ptr == NULL)
          113                 p = malloc(num * size);
          114         else
          115                 p = realloc(ptr, num * size);
          116         if (p == NULL)
          117                 ERROR "can't grow %s to %d", name, num * size FATAL;
          118         return p;
          119 }
          120 
          121 static struct {
          122         char        *name;
          123         double        val;
          124 } defaults[] ={
          125         { "frameht", FRAMEHT },
          126         { "framewid", FRAMEWID },
          127         { "ticklen", TICKLEN },
          128         { "slop", SLOP },
          129         { NULL, 0 }
          130 };
          131 
          132 void setdefaults(void)        /* set default sizes for variables */
          133 {
          134         int i;
          135         Obj *p;
          136 
          137         for (i = 0; defaults[i].name != NULL; i++) {
          138                 p = lookup(defaults[i].name, 1);
          139                 setvar(p, defaults[i].val);
          140         }
          141 }
          142 
          143 void getdata(void)                /* read input */
          144 {
          145         register FILE *fin;
          146         char buf[1000], buf1[100];
          147         int ln;
          148 
          149         fin = curfile->fin;
          150         curfile->lineno = 0;
          151         printf(".lf 1 %s\n", curfile->fname);
          152         while (fgets(buf, sizeof buf, fin) != NULL) {
          153                 curfile->lineno++;
          154                 if (*buf == '.' && *(buf+1) == 'G' && *(buf+2) == '1') {
          155                         setup();
          156                         fprintf(stdout, ".PS%s", &buf[3]);        /* maps .G1 [w] to .PS w */
          157                         printf("scale = 1\n");        /* defends against cip users */
          158                         printf(".lf %d\n", curfile->lineno+1);
          159                         yyparse();
          160                         fprintf(stdout, ".PE\n");
          161                         printf(".lf %d\n", curfile->lineno+1);
          162                         fflush(stdout);
          163                 } else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') {
          164                         if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) {
          165                                 free(curfile->fname);
          166                                 printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1));
          167                         } else
          168                                 printf(".lf %d\n", curfile->lineno = ln);
          169                 } else
          170                         fputs(buf, stdout);
          171         }
          172 }