Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <stdio.h>
#include <signal.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "grap.h"
#include "y.tab.h"

int     dbg     = 0;

#ifndef GRAPDEFINES
#define GRAPDEFINES "/sys/lib/grap.defines"
#endif
char    *lib_defines    = GRAPDEFINES;

int     lib     = 1;            /* 1 to include lib_defines */
FILE    *tfd    = NULL;
char    tempfile[L_tmpnam];

int     synerr  = 0;
int     codegen = 0;            /* 1=>output for this picture; 0=>no output */
char    *cmdname;

Obj     *objlist = NULL;        /* all names stored here */

#define BIG     1e30
Point   ptmin   = { NULL, -BIG, -BIG };
Point   ptmax   = { NULL, BIG, BIG };

char    *version = "version Dec 30, 1995";

extern int yyparse(void);
extern void setdefaults(void);
extern void getdata(void);
extern  int     unlink(char *);

void
main(int argc, char *argv[])
{
        extern void onintr(int), fpecatch(int);

        if (signal(SIGINT, SIG_IGN) != SIG_IGN)
                signal(SIGINT, onintr);
        signal(SIGFPE, fpecatch);
        cmdname = argv[0];
        tmpnam(tempfile);
        while (argc > 1 && *argv[1] == '-') {
                switch (argv[1][1]) {
                case 'd':
                        dbg = 1;
                        tfd = stdout;
                        strcpy(tempfile, "grap.temp");
                        unlink(tempfile);
                        fprintf(stderr, "%s\n", version);
                        break;
                case 'l':       /* turn off /usr/lib inclusion */
                        lib = 0;
                        break;
                }
                argc--;
                argv++;
        }
        setdefaults();
        curfile = infile;
        if (argc <= 1) {
                curfile->fin = stdin;
                curfile->fname = tostring("-");
                pushsrc(File, curfile->fname);
                getdata();
        } else
                while (argc-- > 1) {
                        if ((curfile->fin = fopen(*++argv, "r")) == NULL) {
                                fprintf(stderr, "grap: can't open %s\n", *argv);
                                onintr(0);
                        }
                        curfile->fname = tostring(*argv);
                        pushsrc(File, curfile->fname);
                        getdata();
                        fclose(curfile->fin);
                        free(curfile->fname);
                }
        if (!dbg)
                unlink(tempfile);
        exit(0);
}

void onintr(int n)
{
        n;
        if (!dbg)
                unlink(tempfile);
        exit(1);
}

void fpecatch(int n)
{
        ERROR "floating point exception" WARNING;
        onintr(n);
}

char *grow(char *ptr, char *name, int num, int size)    /* make array bigger */
{
        char *p;

        if (ptr == NULL)
                p = malloc(num * size);
        else
                p = realloc(ptr, num * size);
        if (p == NULL)
                ERROR "can't grow %s to %d", name, num * size FATAL;
        return p;
}

static struct {
        char    *name;
        double  val;
} defaults[] ={
        "frameht", FRAMEHT,
        "framewid", FRAMEWID,
        "ticklen", TICKLEN,
        "slop", SLOP,
        NULL, 0
};

void setdefaults(void)  /* set default sizes for variables */
{
        int i;
        Obj *p;

        for (i = 0; defaults[i].name != NULL; i++) {
                p = lookup(defaults[i].name, 1);
                setvar(p, defaults[i].val);
        }
}

void getdata(void)              /* read input */
{
        register FILE *fin;
        char buf[1000], buf1[100];
        int ln;

        fin = curfile->fin;
        curfile->lineno = 0;
        printf(".lf 1 %s\n", curfile->fname);
        while (fgets(buf, sizeof buf, fin) != NULL) {
                curfile->lineno++;
                if (*buf == '.' && *(buf+1) == 'G' && *(buf+2) == '1') {
                        setup();
                        fprintf(stdout, ".PS%s", &buf[3]);      /* maps .G1 [w] to .PS w */
                        printf("scale = 1\n");  /* defends against cip users */
                        printf(".lf %d\n", curfile->lineno+1);
                        yyparse();
                        fprintf(stdout, ".PE\n");
                        printf(".lf %d\n", curfile->lineno+1);
                        fflush(stdout);
                } else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') {
                        if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) {
                                free(curfile->fname);
                                printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1));
                        } else
                                printf(".lf %d\n", curfile->lineno = ln);
                } else
                        fputs(buf, stdout);
        }
}