home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 238_01 / interp.c < prev    next >
Text File  |  1987-07-28  |  16KB  |  586 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <setjmp.h>
  4. #include <stdarg.h>
  5.  
  6. /*==============================================================*
  7.  *                                                              *
  8.  *  This program is used to interpret GRAD functions in         *
  9.  *      restricted C syntax of function call.                   *
  10.  *  The method used is recursive descend.                       *
  11.  *                                                              *
  12.  *==============================================================*/
  13.  
  14. #define unreadc(ch) ungetc(ch,infile)
  15.  
  16. /* maximum number of parameter for a single function */
  17. #define MAXPARM 9
  18.  
  19. #define Boolean int
  20. #define TRUE 1
  21. #define FALSE 0
  22. #define ERROR (-1)
  23.  
  24. enum Ptype {
  25.     UNDEFINED, INTG, STRG
  26. };
  27.  
  28. struct funcdesc {
  29.     char *name;
  30.     enum Ptype rettype;
  31.     int nuparm;
  32.     enum Ptype parmstype[MAXPARM];
  33. };
  34.  
  35. /* The function names must arrange in ascending order */
  36. struct funcdesc FUNCTIONS[] =
  37.     { { "Arc1",     UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  38.       { "Arc2",     UNDEFINED, 5, { INTG, INTG, INTG, INTG, INTG } },
  39.       { "ArcPoint", UNDEFINED, 4, { INTG, INTG, INTG, INTG } },
  40.       { "BlockCopy",  INTG, 8,
  41.                     { INTG, INTG, INTG, INTG, INTG, INTG, INTG, INTG } },
  42.       { "BlockLoad",  INTG, 3, { INTG, INTG, STRG } },
  43.       { "BlockSave",  UNDEFINED, 5, { INTG, INTG, STRG, INTG, INTG } },
  44.       { "Box",      UNDEFINED, 6, { INTG, INTG, INTG, INTG, INTG, INTG } } ,
  45.       { "Circle",   UNDEFINED, 3, { INTG, INTG, INTG } } ,
  46.       { "CreateFrame", INTG, 2, { INTG, INTG } } ,
  47.       { "Dot",      UNDEFINED, 2, { INTG, INTG } } ,
  48.       { "Draw",     UNDEFINED, 3, { STRG, INTG, INTG } },
  49.       { "Earc1",    UNDEFINED, 5, { INTG, INTG, INTG, INTG, INTG } } ,
  50.       { "Earc2",    UNDEFINED, 6, { INTG, INTG, INTG, INTG, INTG, INTG } },
  51.       { "Ellipse",  UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  52.       { "EnvRsto",  UNDEFINED, 2, { INTG, INTG } },
  53.       { "EnvSave",  INTG, 1, { INTG } },
  54.       { "FillCircle", UNDEFINED, 3, { INTG, INTG, INTG } },
  55.       { "FillEllipse",UNDEFINED, 4, { INTG, INTG, INTG, INTG } },
  56.       { "HorzLine", UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  57.       { "Line",     UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  58.       { "LoadFont", INTG, 1, { STRG } } ,
  59.       { "NextXY",   UNDEFINED, 2, { INTG, INTG } },
  60.       { "PatternFill", UNDEFINED, 4, { INTG, INTG, STRG, INTG } },
  61.       { "PlotType", INTG, 1, { INTG } } ,
  62.       { "PrintFrame", UNDEFINED, 5, { INTG, STRG, INTG, INTG, INTG } } ,
  63.       { "PrintPage",  UNDEFINED, 0 },
  64.       { "ReadStr",    UNDEFINED, 7,
  65.                           { STRG, INTG, INTG, INTG, INTG, INTG, INTG } },
  66.       { "Rectangle",  UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  67.       { "RelOrg",   UNDEFINED, 2, { INTG, INTG } } ,
  68.       { "RemvFont", INTG, 1, { INTG } } ,
  69.       { "RemvFrame", INTG, 1, { INTG } } ,
  70.       { "ResetWin", UNDEFINED, 0 } ,
  71.       { "SelectFont",  INTG, 1, { INTG } },
  72.       { "SelectFrame", INTG, 1, { INTG } } ,
  73.       { "SetOrg",   UNDEFINED, 2, { INTG, INTG } } ,
  74.       { "SetStyle", UNDEFINED, 1, { INTG } } ,
  75.       { "SetWin",   UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  76.       { "SolidFill",   UNDEFINED, 2, { INTG, INTG } },
  77.       { "VertLine", UNDEFINED, 4, { INTG, INTG, INTG, INTG } },
  78.       { "WriteStr", UNDEFINED, 7, { INTG, INTG, INTG, INTG, STRG, INTG, INTG }},
  79.       { "XHLine",   INTG, 5, { INTG, INTG, INTG, INTG, INTG } }
  80.  };
  81.  
  82. #define NFUNC (sizeof(FUNCTIONS) / sizeof(struct funcdesc))
  83.  
  84. char *ERRMSG[]= {
  85.     "Undefined Error Number\n",
  86.     "Variable/Function name expected\n",
  87.     "Variable name %s not found\n",
  88.     "Function name or expression expected\n",
  89.     "Function name %s not found\n",
  90.     "'(' expected after function name\n",
  91.     "Type if parameter %d is different from definition\n",
  92.     "')' expected after the parameters of a function\n",
  93.     "Less parameter than expected\n",
  94.     "End of string not detected before end of line\n",
  95.     "',' expected after a parameter\n",
  96.     "'C' or 'L' expected after '['\n",
  97.     "']' expected after a line or column specification\n",
  98.     "Identifier Expected\n"
  99. };
  100.  
  101. #define NUOFERROR (sizeof(ERRMSG) / sizeof(char *))
  102.  
  103. char LINE[160];
  104.  
  105. int PATTERN[]={
  106.     0x5555, 0xaaaa, 0x5555, 0xaaaa,
  107.     0x5555, 0xaaaa, 0x5555, 0xaaaa,
  108.     0x5555, 0xaaaa, 0x5555, 0xaaaa,
  109.     0x5555, 0xaaaa, 0x5555, 0xaaaa,
  110.     0x8888, 0x4444, 0x2222, 0x1111,
  111.     0x8888, 0x4444, 0x2222, 0x1111,
  112.     0x8888, 0x4444, 0x2222, 0x1111,
  113.     0x8888, 0x4444, 0x2222, 0x1111,
  114.     0x1111, 0x2222, 0x4444, 0x8888,
  115.     0x1111, 0x2222, 0x4444, 0x8888,
  116.     0x1111, 0x2222, 0x4444, 0x8888,
  117.     0x1111, 0x2222, 0x4444, 0x8888
  118. };
  119.  
  120. struct pval {
  121.     enum Ptype parmtype;
  122.     union {
  123.         int u_int;
  124.         char *u_strg;
  125.     } v;
  126. };
  127.  
  128. struct pval RETVAL, *expr();
  129.  
  130. char IDNAME[12], CHARS[512], *PSPTR;
  131.  
  132. #define NUOFVAR 21
  133.  
  134. int nuofvar=NUOFVAR;
  135. char VARNAME[NUOFVAR][12]={
  136.     "pattern1", "pattern2", "pattern3",
  137.     "line",
  138.     "font1", "font2", "font3", "font4",
  139.     "frame1", "frame2", "frame3",
  140.     "temp1", "temp2", "temp3",
  141.     "x1", "x2", "y1", "y2",
  142.     "env1", "env2", "env3"
  143. };
  144.  
  145. struct pval VARTABLE[NUOFVAR];
  146.  
  147. int COL_OFFSET=0, ROW_OFFSET=0, LINE_HEIGHT=12, CHAR_WIDTH=12;
  148.  
  149. jmp_buf EOF_JMP, SYNERR_JMP;
  150.  
  151. int EOF_FLAG=0;
  152.  
  153. FILE *infile;
  154.  
  155. main(argc,argv)
  156. int argc;
  157. char *argv[];
  158. {
  159.     int ret;
  160.     FILE *fopen();
  161.  
  162.     if (argc <= 1) {
  163.         fprintf(stderr,"Usage: interp commandfile\n");
  164.         exit(1);
  165.     }
  166.     if ((infile=fopen(*(++argv), "r")) == (FILE *) NULL) {
  167.         fprintf(stderr,"interp: File not found\n");
  168.         exit(1);
  169.     }
  170.     GRADinit();         /* GRAD initialization function */
  171.     initvars();         /* initialize internal variables */
  172.     setgraph();         /* set graphics mode */
  173.  
  174.     if (setjmp(EOF_JMP) != 0) {
  175.         /* return here on End_Of_File */
  176.         fclose(infile);
  177.         if (EOF_FLAG) { 
  178.             printf("interp: Unexpected End Of File !\n");
  179.         }
  180.         getch();
  181.         settext();
  182.         cleanup(EOF_FLAG);
  183.         exit(0);
  184.     }
  185.     setjmp(SYNERR_JMP);
  186.     /* return here on syntax error */
  187.     for (;;) {
  188.         EOF_FLAG=0;
  189.         stmt();
  190.     }
  191. }
  192.  
  193. /*------------------------------------------------------*
  194.  *    read a single character from input file.          *
  195.  *    A string of comment is treated as a single space  *
  196.  *    Comments can be nested.                           *
  197.  *------------------------------------------------------*/
  198. readc0()
  199. {
  200.     int ch;
  201.  
  202.     if ((ch=getc(infile)) == EOF) {
  203.         longjmp(EOF_JMP,1);
  204.     }
  205.     if (ch != '/') return(ch);
  206.     if ((ch=getc(infile)) == EOF) {
  207.         longjmp(EOF_JMP,1);
  208.     }
  209.     if (ch != '*') {
  210.         ungetc(ch,infile);
  211.         return('/');
  212.     }
  213.     /* begining of comment */
  214.     for (;;) {
  215.         if ((ch=readc0()) == '*') {
  216.             while((ch=readc0()) == '*') ;
  217.             if (ch=='/') return(' ');
  218.         }
  219.     }
  220. }
  221.  
  222. /* skip all control characters except tab (0x09) and return (0x0d) */
  223. /* but they will be returned as space (0x20)                       */
  224. readc1()
  225. {
  226.     int ch;
  227.  
  228.     do {
  229.         ch=readc0();
  230.         if (isspace(ch)) return(' ');
  231.     } while (ch < 0x20);
  232.     return(ch);
  233. }
  234.  
  235. /* read first non-blank character from input file */
  236. readc2()
  237. {
  238.     int ch;
  239.  
  240.     do {
  241.         ch=readc1();
  242.     } while (ch==' ');
  243.     EOF_FLAG=1;
  244.     return(ch);
  245. }
  246.  
  247. /* procdure to interpret a statement */
  248. /* { } means optional, | means or
  249.  
  250.    STMT := [ VARIABLE = ] FUNCTION
  251.    VARIABLE := identifier
  252.    FUNCTION := identifier ( PARAMETERS ) ;
  253.    PARAMETERS := PARAMETER , PARAMETERS | PARAMETER
  254.    PARAMETER := EXPRESSION
  255. */
  256. stmt()
  257. {
  258.     int ch, varidx,funcidx, nuparmoffunc, nparm;
  259.     struct pval *valptr, parmlist[MAXPARM];
  260.  
  261.     PSPTR=CHARS;
  262.     varidx=-1;    /* init */
  263.     if (!identifier()) {   /* is first token an identifier */
  264.         synerr(1);         /* syntax error 1 */
  265.     }
  266.     ch=readc2();
  267.     if (ch=='=') {
  268.         if ((varidx=findvar(I