home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
-
- #include <stdio.h>
- #include <strings.h>
- #include "parse.h"
-
- long restable, idtable;
-
- void inittables()
- {
- restable = newtable(1000);
- idtable = newtable(2000);
-
- addentry(restable, ".geometry", _geometry);
- addentry(restable, ".vertex", _vertex);
- addentry(restable, ".line", _line);
- addentry(restable, ".circle", _circle);
- addentry(restable, ".conic", _conic);
- addentry(restable, ".bezier", _bezier);
- addentry(restable, ".ratio", _ratio);
- addentry(restable, ".length", _length);
- addentry(restable, ".angle", _angle);
- addentry(restable, ".vertpath", _vertpath);
- addentry(restable, ".animation", _animation);
- addentry(restable, ".ray12", _ray12);
- addentry(restable, ".longline", _longline);
- addentry(restable, ".segment", _segment);
- addentry(restable, ".diamond", _diamond);
- addentry(restable, ".plus", _plus);
- addentry(restable, ".cross", _cross);
- addentry(restable, ".nomark", _nomark);
- addentry(restable, ".soliddiamond", _soliddiamond);
- addentry(restable, ".black", _black);
- addentry(restable, ".red", _red);
- addentry(restable, ".green", _green);
- addentry(restable, ".blue", _blue);
- addentry(restable, ".yellow", _yellow);
- addentry(restable, ".cyan", _cyan);
- addentry(restable, ".magenta", _magenta);
- addentry(restable, ".white", _white);
- addentry(restable, ".invisible", _invisible);
- addentry(restable, ".smear", _smear);
- addentry(restable, ".blink", _blink);
- addentry(restable, ".c0", _c0);
- addentry(restable, ".c1", _c1);
- addentry(restable, ".c2", _c2);
- addentry(restable, ".c3", _c3);
- addentry(restable, ".c4", _c4);
- addentry(restable, ".c5", _c5);
- addentry(restable, ".c6", _c6);
- addentry(restable, ".c7", _c7);
- addentry(restable, ".c8", _c8);
- addentry(restable, ".c9", _c9);
- addentry(restable, ".c10", _c10);
- addentry(restable, ".c11", _c11);
- addentry(restable, ".c12", _c12);
- addentry(restable, ".c13", _c13);
- addentry(restable, ".c14", _c14);
- addentry(restable, ".c15", _c15);
- addentry(restable, ".c16", _c16);
- addentry(restable, ".c17", _c17);
- addentry(restable, ".c18", _c18);
- addentry(restable, ".c19", _c19);
- addentry(restable, ".c20", _c20);
- addentry(restable, ".c21", _c21);
- addentry(restable, ".c22", _c22);
- addentry(restable, ".c23", _c23);
- addentry(restable, ".c24", _c24);
- addentry(restable, ".c25", _c25);
- addentry(restable, ".c26", _c26);
- addentry(restable, ".c27", _c27);
- addentry(restable, ".c28", _c28);
- addentry(restable, ".c29", _c29);
- addentry(restable, ".c30", _c30);
- addentry(restable, ".c31", _c31);
- addentry(restable, ".L0", _l0);
- addentry(restable, ".L1", _l1);
- addentry(restable, ".L2", _l2);
- addentry(restable, ".L3", _l3);
- addentry(restable, ".L4", _l4);
- addentry(restable, ".L5", _l5);
- addentry(restable, ".L6", _l6);
- addentry(restable, ".L7", _l7);
- addentry(restable, ".L8", _l8);
- addentry(restable, ".L9", _l9);
- addentry(restable, ".L10", _l10);
- addentry(restable, ".L11", _l11);
- addentry(restable, ".L12", _l12);
- addentry(restable, ".L13", _l13);
- addentry(restable, ".L14", _l14);
- addentry(restable, ".L15", _l15);
- addentry(restable, ".L16", _l16);
- addentry(restable, ".L17", _l17);
- addentry(restable, ".L18", _l18);
- addentry(restable, ".L19", _l19);
- addentry(restable, ".L20", _l20);
- addentry(restable, ".L21", _l21);
- addentry(restable, ".L22", _l22);
- addentry(restable, ".L23", _l23);
- addentry(restable, ".L24", _l24);
- addentry(restable, ".L25", _l25);
- addentry(restable, ".L26", _l26);
- addentry(restable, ".L27", _l27);
- addentry(restable, ".L28", _l28);
- addentry(restable, ".L29", _l29);
- addentry(restable, ".L30", _l30);
- addentry(restable, ".L31", _l31);
- addentry(restable, ".free", _free);
- addentry(restable, ".vonl", _vonl);
- addentry(restable, ".vonc", _vonc);
- addentry(restable, ".v.ll", _v_ll);
- addentry(restable, ".v.vvmid", _v_vvmid);
- addentry(restable, ".v.lc", _v_lc);
- addentry(restable, ".v.cc", _v_cc);
- addentry(restable, ".v.vvratio", _v_vvratio);
- addentry(restable, ".v.avv", _v_avv);
- addentry(restable, ".v.ccenter", _v_ccenter);
- addentry(restable, ".v.lvmirror", _v_lvmirror);
- addentry(restable, ".l.vv", _l_vv);
- addentry(restable, ".l.vlperp", _l_vlperp);
- addentry(restable, ".l.vlpar", _l_vlpar);
- addentry(restable, ".l.vc", _l_vc);
- addentry(restable, ".l.ccext", _l_ccext);
- addentry(restable, ".l.ccint", _l_ccint);
- addentry(restable, ".c.vv", _c_vv);
- addentry(restable, ".c.vvv", _c_vvv);
- addentry(restable, ".c.lll", _c_lll);
- addentry(restable, ".c.vlen", _c_vlen);
- addentry(restable, ".c.ccinv", _c_ccinv);
- addentry(restable, ".c.lcinv", _c_lcinv);
- addentry(restable, ".bez.vvvv", _bez_vvvv);
- addentry(restable, ".ratio.vvv", _ratio_vvv);
- addentry(restable, ".len.vv", _len_vv);
- addentry(restable, ".len.plus", _len_plus);
- addentry(restable, ".len.minus", _len_minus);
- addentry(restable, ".len.f", _len_f);
- addentry(restable, ".len.times", _len_times);
- addentry(restable, ".len.divide", _len_divide);
- addentry(restable, ".a.vvv", _a_vvv);
- addentry(restable, ".vpath", _vpath);
- addentry(restable, ".animate", _animate);
- addentry(restable, ".conic.vvvvv", _conic_vvvvv);
- addentry(restable, ".text", _text);
- addentry(restable, ".vonconic", _vonconic);
- addentry(restable, ".l.conicv", _l_conicv);
- addentry(restable, ".v.vcinv", _v_vcinv);
- addentry(restable, ".conic.lllll", _conic_lllll);
- addentry(restable, ".v.lconic", _v_lconic);
- addentry(restable, ".macro", _macro);
- }
-
- enum resclass {
- GEOMETRY, PRIMITIVE, LINETYPE, VERTEXTYPE, COLOR, LAYER,
- MAKEVERTEX, MAKELINE, MAKECIRCLE, MAKEBEZIER, MAKELENGTH,
- MAKEANGLE, MAKETEXT, MAKEVPATH, MAKEANIMATE, MAKERATIO,
- MAKECOMMENT, MAKECONIC, MACRO,
- };
-
- static long minortype;
-
- long reswordtype(reservedword rw)
- {
- switch (rw) {
- case _float: case _int2: case _int4: case _none:
- parseerror("Bad reserved word\n");
- return GEOMETRY;
- case _geometry:
- minortype = 0; return GEOMETRY;
- case _vertex:
- minortype = 1; return PRIMITIVE;
- case _line:
- minortype = 2; return PRIMITIVE;
- case _circle:
- minortype = 3; return PRIMITIVE;
- case _bezier:
- minortype = 5; return PRIMITIVE;
- case _angle:
- minortype = 6; return PRIMITIVE;
- case _ratio:
- minortype = 7; return PRIMITIVE;
- case _length:
- minortype = 8; return PRIMITIVE;
- case _vertpath:
- minortype = 9; return PRIMITIVE;
- case _animation:
- minortype = 10; return PRIMITIVE;
- case _conic:
- minortype = 11; return PRIMITIVE;
- case _ray12:
- minortype = 1; return LINETYPE;
- case _longline:
- minortype = 2; return LINETYPE;
- case _segment:
- minortype = 3; return LINETYPE;
- case _diamond:
- minortype = 1; return VERTEXTYPE;
- case _plus:
- minortype = 2; return VERTEXTYPE;
- case _cross:
- minortype = 3; return VERTEXTYPE;
- case _nomark:
- minortype = 4; return VERTEXTYPE;
- case _soliddiamond:
- minortype = 5; return VERTEXTYPE;
- case _black:
- minortype = 0; return COLOR;
- case _red:
- minortype = 1; return COLOR;
- case _green:
- minortype = 2; return COLOR;
- case _blue:
- minortype = 4; return COLOR;
- case _yellow:
- minortype = 3; return COLOR;
- case _cyan:
- minortype = 6; return COLOR;
- case _magenta:
- minortype = 5; return COLOR;
- case _white:
- minortype = 7; return COLOR;
- case _invisible:
- minortype = -1; return COLOR;
- case _smear:
- minortype = -2; return COLOR;
- case _blink:
- minortype = -3; return COLOR;
- case _c0: case _c1: case _c2: case _c3: case _c4:
- case _c5: case _c6: case _c7: case _c8: case _c9:
- case _c10: case _c11: case _c12: case _c13: case _c14:
- case _c15: case _c16: case _c17: case _c18: case _c19:
- case _c20: case _c21: case _c22: case _c23: case _c24:
- case _c25: case _c26: case _c27: case _c28: case _c29:
- case _c30: case _c31:
- minortype = (long)rw - (long)_c0;
- return COLOR;
- case _l0: case _l1: case _l2: case _l3: case _l4: case _l5:
- case _l6: case _l7: case _l8: case _l9: case _l10: case _l11:
- case _l12: case _l13: case _l14: case _l15: case _l16: case _l17:
- case _l18: case _l19: case _l20: case _l21: case _l22: case _l23:
- case _l24: case _l25: case _l26: case _l27: case _l28: case _l29:
- case _l30: case _l31:
- minortype = (long)rw - (long)_l0;
- return LAYER;
- case _free:
- minortype = 1; return MAKEVERTEX;
- case _vonl:
- minortype = 2; return MAKEVERTEX;
- case _vonc:
- minortype = 3; return MAKEVERTEX;
- case _v_ll:
- minortype = 4; return MAKEVERTEX;
- case _v_vvmid:
- minortype = 5; return MAKEVERTEX;
- case _v_lc:
- minortype = 6; return MAKEVERTEX;
- case _v_cc:
- minortype = 7; return MAKEVERTEX;
- case _v_vvratio:
- minortype = 8; return MAKEVERTEX;
- case _v_avv:
- minortype = 9; return MAKEVERTEX;
- case _v_ccenter:
- minortype = 10; return MAKEVERTEX;
- case _v_lvmirror:
- minortype = 11; return MAKEVERTEX;
- case _vonconic:
- minortype = 12; return MAKEVERTEX;
- case _v_vcinv:
- minortype = 13; return MAKEVERTEX;
- case _v_lconic:
- minortype = 14; return MAKEVERTEX;
- case _l_vv:
- minortype = 1; return MAKELINE;
- case _l_vlperp:
- minortype = 2; return MAKELINE;
- case _l_vlpar:
- minortype = 3; return MAKELINE;
- case _l_vc:
- minortype = 4; return MAKELINE;
- case _l_ccext:
- minortype = 5; return MAKELINE;
- case _l_ccint:
- minortype = 6; return MAKELINE;
- case _l_conicv:
- minortype = 7; return MAKELINE;
- case _c_vv:
- minortype = 1; return MAKECIRCLE;
- case _c_vvv:
- minortype = 2; return MAKECIRCLE;
- case _c_vlen:
- minortype = 3; return MAKECIRCLE;
- case _c_lll:
- minortype = 4; return MAKECIRCLE;
- case _c_ccinv:
- minortype = 5; return MAKECIRCLE;
- case _c_lcinv:
- minortype = 6; return MAKECIRCLE;
- case _bez_vvvv:
- minortype = 1; return MAKEBEZIER;
- case _ratio_vvv:
- minortype = 1; return MAKERATIO;
- case _len_vv:
- minortype = 1; return MAKELENGTH;
- case _len_plus:
- minortype = 2; return MAKELENGTH;
- case _len_minus:
- minortype = 3; return MAKELENGTH;
- case _len_f:
- minortype = 4; return MAKELENGTH;
- case _len_times:
- minortype = 5; return MAKELENGTH;
- case _len_divide:
- minortype = 6; return MAKELENGTH;
- case _a_vvv:
- minortype = 1; return MAKEANGLE;
- case _vpath:
- minortype = 0; return MAKEVPATH;
- case _animate:
- minortype = 0; return MAKEANIMATE;
- case _text:
- minortype = 0; return MAKETEXT;
- case _comment:
- minortype = 0; return MAKECOMMENT;
- case _conic_vvvvv:
- minortype = 1; return MAKECONIC;
- case _conic_lllll:
- minortype = 2; return MAKECONIC;
- case _macro:
- minortype = 0; return MACRO;
- }
- }
-
- FILE *globalfp;
-
- long readstring()
- {
- if (gettoken(globalfp) == Str) return 1;
- parseerror("Expected string");
- return 0;
- }
-
- long readfloat()
- {
- tokentype t;
-
- if ((t = gettoken(globalfp)) == Float) return 1;
- if (t == Integer) {
- floattoken = longtoken;
- return 1;
- }
- parseerror("Expected float");
- return 0;
- }
-
- long readinteger()
- {
- if (gettoken(globalfp) == Integer) return 1;
- parseerror("Expected integer");
- return 0;
- }
-
- long readsemicolon()
- {
- if (gettoken(globalfp) == Semicolon) return 1;
- parseerror("Expected ';'");
- return 0;
- }
-
- long readopen()
- {
- if (gettoken(globalfp) == Open) return 1;
- parseerror("Expected '('");
- return 0;
- }
-
- long readclose()
- {
- if (gettoken(globalfp) == Close) return 1;
- parseerror("Expected ')'");
- return 0;
- }
-
- long readopencurly()
- {
- if (gettoken(globalfp) == OpenCurly) return 1;
- parseerror("Expected '{'");
- return 0;
- }
-
- long readclosecurly()
- {
- if (gettoken(globalfp) == CloseCurly) return 1;
- parseerror("Expected '}'");
- return 0;
- }
-
- long readequal()
- {
- if (gettoken(globalfp) == Equal) return 1;
- parseerror("Expected '='");
- return 0;
- }
-
- long readcomma()
- {
- if (gettoken(globalfp) == Comma) return 1;
- parseerror("Expected ','");
- return 0;
- }
-
- long readreserved()
- {
- if (gettoken(globalfp) != Reserved) {
- parseerror("Expected reserved word");
- return 0;
- }
- if (lookup(restable, texttoken) == 0) {
- char str[200];
- sprintf(str, "unrecognized reserved word: %s", texttoken);
- parseerror(str);
- return 0;
- }
- return 1;
- }
-
- long readidentifier()
- {
- if (gettoken(globalfp) == Identifier) return 1;
- parseerror("Expected identifier");
- return 0;
- }
-
- // default property values:
-
- long defcolor, deflayers;
- reservedword deflinetype, defverttype;
- char defname[100];
-
- void setdefaultproperties()
- {
- defcolor = 7; // white
- deflayers = 0xffffffff; // all layers
- deflinetype = _segment;
- defverttype = _diamond;
- defname[0] = (char)0; // no name
- }
-
- long parseproperties()
- {
- symtableentry *s;
-
- while (1) switch (gettoken(globalfp)) {
- case Comma:
- switch (gettoken(globalfp)) {
- case Reserved:
- s = lookup(restable, texttoken);
- if (s == 0) {
- parseerror("unrecognized reserved word");
- return 0;
- }
- switch(reswordtype(s->value)) {
- case COLOR:
- defcolor = minortype;
- break;
- case LINETYPE:
- switch(minortype) {
- case 1:
- deflinetype = _ray12;
- break;
- case 2:
- deflinetype = _longline;
- break;
- case 3:
- deflinetype = _segment;
- break;
- }
- break;
- case VERTEXTYPE:
- switch(minortype) {
- case 1:
- defverttype = _diamond;
- break;
- case 2:
- defverttype = _plus;
- break;
- case 3:
- defverttype = _cross;
- break;
- case 4:
- defverttype = _nomark;
- break;
- case 5:
- defverttype = _soliddiamond;
- break;
- }
- break;
- case LAYER:
- if (deflayers == 0xffffffff) deflayers = 0;
- deflayers |= (1 << minortype);
- break;
- default:
- parseerror("bad properties");
- return 0;
- }
- break;
- case Str:
- strcpy(defname, texttoken);
- break;
- default:
- parseerror("bad properties");
- return 0;
- }
- break;
- case Close:
- if (readsemicolon() == 0) return 0;
- return 1;
- default:
- parseerror("bad properties");
- return 0;
- }
- }
-
- symtableentry *readvertex()
- {
- symtableentry *s;
-
- if (readidentifier() == 0 || (s = lookup(idtable, texttoken)) == 0) {
- parseerror("expected vertex");
- return (symtableentry *)0;
- }
- if (s->value != _vertex) {
- parseerror("expected vertex");
- return (symtableentry *)0;
- }
- return s;
- }
-
- symtableentry *readline()
- {
- symtableentry *s;
-
- if (readidentifier() == 0 || (s = lookup(idtable, texttoken)) == 0) {
- parseerror("expected line");
- return (symtableentry *)0;
- }
- if (s->value != _line) {
- parseerror("expected line");
- return (symtableentry *)0;
- }
- return s;
- }
-
- symtableentry *readcircle()
- {
- symtableentry *s;
-
- if (readidentifier() == 0 || (s = lookup(idtable, texttoken)) == 0) {
- parseerror("expected circle");
- return (symtableentry *)0;
- }
- if (s->value != _circle) {
- parseerror("expected circle");
- return (symtableentry *)0;
- }
- return s;
- }
-
- symtableentry *readconic()
- {
- symtableentry *s;
-
- if (readidentifier() == 0 || (s = lookup(idtable, texttoken)) == 0) {
- parseerror("expected conic");
- return (symtableentry *)0;
- }
- if (s->value != _conic) {
- parseerror("expected conic");
- return (symtableentry *)0;
- }
- return s;
- }
-
- symtableentry *readlength()
- {
- symtableentry *s;
-
- if (readidentifier() == 0 || (s = lookup(idtable, texttoken)) == 0) {
- parseerror("expected length");
- return (symtableentry *)0;
- }
- if (s->value != _length) {
- parseerror("expected length");
- return (symtableentry *)0;
- }
- return s;
- }
-
- primitive *addprim(reservedword type, primitive *c1, primitive *c2,
- primitive *c3, primitive *c4, primitive *c5,
- constrainttype c, symtableentry *s)
- {
- primitive *p;
-
- switch (type) {
- case _vertex:
- p = new vertex;
- ((vertex *)p)->type = defverttype;
- break;
- case _line:
- p = new line;
- ((line *)p)->type = deflinetype;
- break;
- case _circle:
- p = new circle;
- break;
- case _length:
- p = new length;
- break;
- case _bezier:
- p = new bezier;
- break;
- case _comment:
- p = new comment;
- break;
- case _text:
- p = new text;
- break;
- case _conic:
- p = new conic;
- break;
- default:
- fprintf(stderr, "bad primitive type\n");
- return 0;
- }
- strcpy(p->name, defname);
- p->Color = defcolor;
- p->layers = deflayers;
- p->c.p1 = c1;
- p->c.p2 = c2;
- p->c.p3 = c3;
- p->c.p4 = c4;
- p->c.p5 = c5;
- p->c.type = c;
- s->p = p;
- p->st = s;
- addprimitive(p);
- return p;
- }
-
- struct parseinfo {
- reservedword rw[6];
- reservedword type;
- constrainttype ctype;
- } prselist[] = {
- {_float,_float,_none,_none,_none,_none,_vertex,VERTFREE}, // 0
- {_vertex,_vertex,_none,_none,_none,_none,_vertex,VERTVERTVERTMID},
- {_line,_line,_none,_none,_none,_none,_vertex,VERTLINELINE},
- {_vertex,_circle,_none,_none,_none,_none,_vertex,VERTCIRCVERTINV},
- {_line,_circle,_int2,_none,_none,_none,_vertex,VERTLINECIRC1},
- {_circle,_circle,_int2,_none,_none,_none,_vertex,VERTCIRCCIRC1}, // 5
- {_line,_vertex,_none,_none,_none,_none,_vertex,VERTLINEVERTMIRROR},
- {_vertex,_vertex,_length,_none,_none,_none,_vertex,VERTVERTVERTRATIO},
- {_length,_vertex,_vertex,_none,_none,_none,_vertex,VERTANGLEVERTVERT},
- {_circle,_none,_none,_none,_none,_none,_vertex,VERTCIRCCENTER},
- {_line,_float,_float,_none,_none,_none,_vertex,VERTONLINE}, // 10
- {_circle,_float,_float,_none,_none,_none,_vertex,VERTONCIRCLE},
- {_conic,_float,_float,_none,_none,_none,_vertex,VERTONCONIC},
- {_vertex,_vertex,_none,_none,_none,_none,_line,LINEVERTVERT},
- {_vertex,_line,_none,_none,_none,_none,_line,LINEVERTLINEPERP},
- {_vertex,_line,_none,_none,_none,_none,_line,LINEVERTLINEPAR}, // 15
- {_vertex,_circle,_int2,_none,_none,_none,_line,LINEVERTCIRC1},
- {_circle,_circle,_int2,_none,_none,_none,_line,LINECIRCCIRCEXT1},
- {_circle,_circle,_int2,_none,_none,_none,_line,LINECIRCCIRCINT1},
- {_conic,_vertex,_int2,_none,_none,_none,_line,LINETANGENTCONIC1},
- {_vertex,_vertex,_none,_none,_none,_none,_circle,CIRCVERTVERT}, // 20
- {_circle,_circle,_none,_none,_none,_none,_circle,CIRCCIRCCIRCINV},
- {_line,_circle,_none,_none,_none,_none,_circle,CIRCLINECIRCINV},
- {_vertex,_length,_none,_none,_none,_none,_circle,CIRCVERTLEN},
- {_vertex,_vertex,_vertex,_none,_none,_none,_circle,CIRCVERTVERTVERT},
- {_line,_line,_line,_int4,_none,_none,_circle,CIRCLINELINELINE1}, // 25
- {_vertex,_vertex,_vertex,_vertex,_none,_none,_bezier,BEZVERTVERTVERTVERT},
- {_vertex,_vertex,_vertex,_vertex,_vertex,_none,_conic,CONICFIVEVERT},
- {_vertex,_vertex,_vertex,_none,_none,_none,_length,RATIOVERTVERTVERT},
- {_vertex,_vertex,_none,_none,_none,_none,_length,LENVERTVERT},
- {_float,_none,_none,_none,_none,_none,_length,LENFLOAT}, // 30
- {_length,_length,_none,_none,_none,_none,_length,LENPLUSLENLEN},
- {_length,_length,_none,_none,_none,_none,_length,LENMINUSLENLEN},
- {_length,_length,_none,_none,_none,_none,_length,LENTIMESLENLEN},
- {_length,_length,_none,_none,_none,_none,_length,LENDIVLENLEN},
- {_float,_none,_none,_none,_none,_none,_length,ANGLEFLOAT}, // 35
- {_vertex,_vertex,_vertex,_none,_none,_none,_length,ANGLEVERTVERTVERT},
- {_length,_length,_none,_none,_none,_none,_length,ANGLEANGLELEN},
- {_length,_none,_none,_none,_none,_none,_length,ANGLEANGLETRISECT},
- {_line,_line,_line,_line,_line,_none,_conic,CONICFIVELINE},
- {_line,_conic,_int2,_none,_none,_none,_vertex,VERTLINECONIC1}, // 40
- };
-
- long parsealine(long n, char *name)
- {
- float f1 = 1.0e30, f2 = 1.0e30;
- symtableentry *s, *sl[5];
- long slistptr = 0;
- primitive *p;
- parseinfo *pi = &prselist[n];
- long intadjust = 0;
-
- sl[0] = sl[1] = sl[2] = sl[3] = sl[4] = 0;
- if (readopen() == 0) return 0;
- for (long i = 0; i < 6; i++) {
- switch (pi->rw[i]) {
- case _none:
- setdefaultproperties();
- if (parseproperties() == 0) return 0;
- s = addentry(idtable, name, pi->type);
- p = addprim(pi->type, sl[0] ? sl[0]->p : 0,
- sl[1] ? sl[1]->p : 0, sl[2] ? sl[2]->p : 0,
- sl[3] ? sl[3]->p : 0, sl[4] ? sl[4]->p : 0,
- intadjust ? constrainttype((long)(pi->ctype) + intadjust - 1) : pi->ctype, s);
- if (p == 0) return 0;
- if (f2 < 1.0e30) {
- ((vertex *)p)->xw = f1;
- ((vertex *)p)->yw = f2;
- ((vertex *)p)->w = 1.0;
- } else if (f1 < 1.0e30) {
- // Warning: this is used for angle and
- // for length. It counts on the 'value'
- // field being in the same place in both
- // structures.
- ((length *)p)->value = f1;
- }
- return 1;
- case _int2:
- if (readinteger() == 0) return 0;
- intadjust = longtoken;
- if (intadjust != 1 && intadjust != 2) {
- parseerror("Type must be 1 or 2");
- return 0;
- }
- if ((i < 5) && pi->rw[i+1] != _none) {
- if (readcomma() == 0) return 0;
- }
- break;
- case _int4:
- if (readinteger() == 0) return 0;
- intadjust = longtoken;
- if (intadjust != 1 && intadjust != 2 &&
- intadjust != 3 && intadjust != 4) {
- parseerror("Type must be 1, 2, 3, or 4");
- return 0;
- }
- if ((i < 5) && pi->rw[i+1] != _none) {
- if (readcomma() == 0) return 0;
- }
- break;
- case _float:
- if (readfloat() == 0) return 0;
- if (f1 < 1.0e30) f2 = floattoken; else f1 = floattoken;
- if ((i < 5) && pi->rw[i+1] != _none) {
- if (readcomma() == 0) return 0;
- }
- break;
- case _vertex:
- sl[slistptr] = readvertex();
- if (sl[slistptr++] == 0) return 0;
- if ((i < 5) && pi->rw[i+1] != _none) {
- if (readcomma() == 0) return 0;
- }
- break;
- case _line:
- sl[slistptr] = readline();
- if (sl[slistptr++] == 0) return 0;
- if ((i < 5) && pi->rw[i+1] != _none) {
- if (readcomma() == 0) return 0;
- }
- break;
- case _circle:
- sl[slistptr] = readcircle();
- if (sl[slistptr++] == 0) return 0;
- if ((i < 5) && pi->rw[i+1] != _none) {
- if (readcomma() == 0) return 0;
- }
- break;
- case _conic:
- sl[slistptr] = readconic();
- if (sl[slistptr++] == 0) return 0;
- if ((i < 5) && pi->rw[i+1] != _none) {
- if (readcomma() == 0) return 0;
- }
- break;
- case _length:
- sl[slistptr] = readlength();
- if (sl[slistptr++] == 0) return 0;
- if ((i < 5) && pi->rw[i+1] != _none) {
- if (readcomma() == 0) return 0;
- }
- break;
- }
- }
- }
-
- long readmacrodef()
- {
- tokentype t;
- symtableentry *s;
- char str[100];
-
- t = gettoken(globalfp);
- if (t != Identifier) { parseerror("bad macro name"); return 0; }
- s = lookup(idtable, texttoken);
- if (s) { sprintf(str, "%s already defined", texttoken);
- parseerror(str); return 0; }
- addentry(idtable, texttoken, _macro);
- if (readopen()==0) return 0;
- /* XXX */
- if (readclose()==0) return 0;
- if (readopencurly()== 0) return 0;
- if (readclosecurly() == 0) return 0;
- }
-
- long parsereserved()
- {
- char tmp[200];
- text *t;
- symtableentry *s;
-
- s = lookup(restable, texttoken);
- if (s == 0) {
- parseerror("bad initial token");
- return 0;
- }
- switch(reswordtype(s->value)) {
- case MAKETEXT:
- if (readopen() == 0) return 0;
- if (readstring() == 0) return 0;
- strcpy(tmp, texttoken);
- setdefaultproperties();
- if (parseproperties() == 0) return 0;
- s = addentry(idtable, "", _text);
- t = (text *)addprim(_text, 0, 0, 0, 0, 0, NULLCONSTRAINT, s);
- strcpy(t->str, tmp);
- return 1;
- case GEOMETRY:
- if (0 == readstring()) return 0;
- if (0 == readsemicolon()) return 0;
- return 1;
- case MACRO:
- return readmacrodef();
- default:
- parseerror("missing identifier");
- return 0;
- }
- }
-
- long parsemakevertex(char *vertname, long mtype)
- {
- switch(mtype) {
- case 1: // free
- return parsealine(0, vertname);
- case 2: // vonl
- return parsealine(10, vertname);
- case 3: // vonc
- return parsealine(11, vertname);
- case 4: // v_ll
- return parsealine(2, vertname);
- case 5: // v_vvmid
- return parsealine(1, vertname);
- case 6: // v_lc
- return parsealine(4, vertname);
- case 7: // v_cc
- return parsealine(5, vertname);
- case 8: // v_vvratio
- return parsealine(7, vertname);
- case 9: // v_avv
- return parsealine(8, vertname);
- case 10:
- return parsealine(9, vertname);
- case 11:
- return parsealine(6, vertname);
- case 12:
- return parsealine(12, vertname);
- case 13:
- return parsealine(3, vertname);
- case 14:
- return parsealine(40, vertname);
- default:
- return 0;
- }
- }
-
- long parsemakeline(char *linename, long mtype)
- {
- switch(mtype) {
- case 1: // l_vv
- return parsealine(13, linename);
- case 2: // l_vlperp
- return parsealine(14, linename);
- case 3: // l_vlpar
- return parsealine(15, linename);
- case 4: // l_vc
- return parsealine(16, linename);
- case 5: // l_ccext
- return parsealine(17, linename);
- case 6: // l_ccint
- return parsealine(18, linename);
- case 7: // l_conicv
- return parsealine(19, linename);
- default:
- return 0;
- }
- }
-
- long parsemakecircle(char *circname, long mtype)
- {
- switch(mtype) {
- case 1: // c_vv
- return parsealine(20, circname);
- case 2: // c_vvv
- return parsealine(24, circname);
- case 3: // c_vlen
- return parsealine(23, circname);
- case 4: // c_lll
- return parsealine(25, circname);
- case 5:
- return parsealine(21, circname);
- case 6:
- return parsealine(22, circname);
- default:
- return 0;
- }
- }
-
- long parsemakebezier(char *bezname, long mtype)
- {
- switch (mtype) {
- case 1:
- return parsealine(26, bezname);
- default:
- return 0;
- }
- }
-
- long parsemakelength(char *lenname, long mtype)
- {
- switch (mtype) {
- case 1: // len_vv
- return parsealine(29, lenname);
- case 2: // len_plus
- return parsealine(31, lenname);
- case 3: // len_minus
- return parsealine(32, lenname);
- case 4: // len_f
- return parsealine(30, lenname);
- case 5: // len_times
- return parsealine(33, lenname);
- case 6: // len_divide
- return parsealine(34, lenname);
- default:
- return 0;
- }
- }
-
- long parsemakeangle(char *angname, long mtype)
- {
- switch (mtype) {
- case 1: // a_vvv
- return parsealine(36, angname);
- }
- return 0;
- }
-
- long parsemakeratio(char *ratname, long mtype)
- {
- switch (mtype) {
- case 1:
- return parsealine(28, ratname);
- default:
- return 0;
- }
- }
-
- long parsemakeconic(char *conicname, long mtype)
- {
- switch (mtype) {
- case 1:
- return parsealine(27, conicname);
- case 2:
- return parsealine(39, conicname);
- default:
- return 0;
- }
- }
-
- long parseidentifier()
- {
- symtableentry *s;
- char str[200];
- reservedword rw;
-
- // should be a new identifier
- if (s = lookup(idtable, texttoken)) {
- sprintf(str, "%s already declared", texttoken);
- parseerror(str);
- return 0;
- }
- strcpy(str, texttoken); // ugly!
- if (readequal() == 0) return 0;
- if (readreserved() == 0) return 0;
- s = lookup(restable, texttoken);
- rw = s->value;
- switch (reswordtype(rw)) {
- case MAKEVERTEX:
- return parsemakevertex(str, minortype);
- case MAKELINE:
- return parsemakeline(str, minortype);
- case MAKECIRCLE:
- return parsemakecircle(str, minortype);
- case MAKEBEZIER:
- return parsemakebezier(str, minortype);
- case MAKELENGTH:
- return parsemakelength(str, minortype);
- case MAKERATIO:
- return parsemakeratio(str, minortype);
- case MAKEANGLE:
- return parsemakeangle(str, minortype);
- case MAKEVPATH:
- break;
- case MAKEANIMATE:
- break;
- case MAKECONIC:
- return parsemakeconic(str, minortype);
- default:
- sprintf(str, "wacko constructor: %s", texttoken);
- return 0;
- }
- return 1;
- }
-
- long parsecomment()
- {
- comment *t;
- symtableentry *s;
-
- s = addentry(idtable, "", _comment);
- t = (comment *)addprim(_comment, 0, 0, 0, 0, 0, NULLCONSTRAINT, s);
- if (t == 0) return 0;
- strncpy(t->str, texttoken, 149);
- return 1;
- }
-
- long parseline()
- {
- switch (gettoken(globalfp)) {
- case Comment:
- if (parsecomment()) return 1;
- return 0;
- case Reserved:
- if (parsereserved()) return 1;
- return 0;
- case Identifier:
- if (parseidentifier()) return 1;
- return 0;
- case Eof:
- return -1;
- case Error:
- return 0;
- case Open:
- case Close:
- case Semicolon:
- case Comma:
- case Equal:
- case Integer:
- case Float:
- case Str:
- case OpenCurly:
- case CloseCurly:
- parseerror("Unexpected token");
- return 0;
- }
- }
-
- long parsefile(FILE *fp)
- {
- globalfp = fp;
- long k;
-
- while (1) {
- if ((k = parseline()) == 0) return 0;
- if (k == -1) return 1;
- }
- }
-