home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / demos / gpc / bif_lex.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-17  |  45.3 KB  |  1,405 lines

  1. /* $XConsortium: bif_lex.c,v 5.3 91/06/17 19:52:19 rws Exp $ */
  2. /***********************************************************
  3. Copyright (c) 1989,1990, 1991 by Sun Microsystems, Inc. and the X Consortium at M.I.T.
  4.  
  5.                         All Rights Reserved
  6.  
  7. Permission to use, copy, modify, and distribute this software and its
  8. documentation for any purpose and without fee is hereby granted,
  9. provided that the above copyright notice appear in all copies and that
  10. both that copyright notice and this permission notice appear in
  11. supporting documentation, and that the names of Sun Microsystems,
  12. the X Consortium, and MIT not be used in advertising or publicity
  13. pertaining to distribution of the software without specific, written
  14. prior permission.
  15.  
  16. SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  17. INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
  18. SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
  19. DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  21. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  22. SOFTWARE.
  23.  
  24. ******************************************************************/
  25.  
  26. /*--------------------------------------------------------------------*\
  27. |
  28. |  Copyright (C) 1989,1990, 1991, National Computer Graphics Association
  29. |
  30. |  Permission is granted to any individual or institution to use, copy, or
  31. |  redistribute this software so long as it is not sold for profit, provided
  32. |  this copyright notice is retained.
  33. |
  34. |                         Developed for the
  35. |                National Computer Graphics Association
  36. |                         2722 Merrilee Drive
  37. |                         Fairfax, VA  22031
  38. |                           (703) 698-9600
  39. |
  40. |                                by
  41. |                 SimGraphics Engineering Corporation
  42. |                    1137 Huntington Drive  Unit A
  43. |                      South Pasadena, CA  91030
  44. |                           (213) 255-0900
  45. |---------------------------------------------------------------------
  46. |
  47. | Author        :    mjf / SimGraphics Engineering Corportation
  48. |
  49. | File          :    bif_lex.c
  50. | Date          :    3/12/89
  51. | Project       :    GPC / PLB
  52. | Description   :    
  53. | Status    :    Version 1.0
  54. |
  55. |            Most lex parsing is working.
  56. |            NOTE: The number parser does not currently check
  57. |            for errors created by the misuse of + and - such
  58. |            as ++3+45.3e+8+9
  59. |
  60. | Revisions     :    
  61. |
  62. |       2/90            MFC Tektronix, Inc.: PEX-SI API implementation.
  63. |
  64. |       5/90            MFC Tektronix, Inc.: PEX-SI API Binding change.
  65. |
  66. |      12/90            MFC Tektronix, Inc.: PEX-SI PEX5R1 Release.
  67. |
  68. \*--------------------------------------------------------------------*/
  69.  
  70. /*---------------------------------------------------------------------*\
  71. |Include files
  72. \*---------------------------------------------------------------------*/
  73. #define MAIN_FUNCTION
  74. #define REMOVE_UNDERSCORES
  75. #include <stdio.h>
  76. #include <string.h>
  77. #include <ctype.h>
  78.  
  79. #define STRLENGTH 80
  80. typedef char StringType[STRLENGTH];
  81. #include "biftypes.h"
  82. #include "bifparse.h"
  83. #include "globals.h"
  84. #include "ph_map.h"
  85. #include "brfexption.h"
  86. #ifdef USING_PHIGS
  87. #include <X11/Xlib.h>
  88. #include <X11/Xresource.h>
  89. #endif /* USING_PHIGS */
  90.  
  91. #ifdef STAND_ALONE
  92. #include "bifparse.h"
  93. #endif /* ifdef STAND_ALONE */
  94. /*---------------------------------------------------------------------*\
  95. |Local #define
  96. \*---------------------------------------------------------------------*/
  97. #ifndef FALSE
  98. #define FALSE 0
  99. #endif /* ifndef FALSE */
  100. #ifndef TRUE
  101. #define TRUE (!FALSE)
  102. #endif /* ifndef TRUE */
  103.  
  104. #define EXCEPTION_HANDLER 1
  105.  
  106. #define bNONE -1/* Guaranteed not to be a character type                */
  107. #define bEF 0   /* end of file value  (not EOF)                         */
  108. #define bNL 1   /* end of line                                          */
  109. #define bSP 2   /* white space                                          */
  110. #define bCT 3   /* Comment mark   "%"                                   */
  111. #define bDQ 4   /* Double quote                                         */
  112. #define bSQ 5   /* Single quote                                         */
  113. #define bOB 6   /* Open   bracket "{"                                   */
  114. #define bCB 7   /* Closed bracket "}"                                   */
  115. #define bSC 8   /* Semi colen     ";"                                   */
  116. #define bEe 9   /* Cap "E" or low "e"                                   */
  117. #define bAI 10  /* ASCII printable except any called out seperately     */
  118. #define bNM 11  /* Numbers        "0" to "9" and "."                    */
  119. #define bOT 12  /* Eight bit extended charactors                        */
  120. #define bOP 13  /* Open perentasy                                       */
  121. #define bCP 14  /* Close perantisy                                      */
  122. #define bCC 15  /* Unused controle codes                                */
  123. #define bTOP 16 /* One grater then the last character group             */
  124.  
  125. #define NORMAL_TERMINATION 0 /* as defined in yacc documentation */
  126. #define UNRECOVERABLE 1      /* as defined in yacc documentation */
  127. #define bEOF  0
  128. #ifdef STAND_ALONE
  129. /* NOTE: yylval is defined by yacc when not STAND_ALONE */
  130.  
  131. #define LONG    255
  132. #define REAL    254
  133. #define QSTRING  253
  134. #define READ_GEOMETRY_FILE     252
  135. #define BEGIN_TEST             251
  136. #define END_TEST               250
  137. #define CALL_STRUCTURE         249
  138. #define MARKER                 248
  139. #define UNRECOGNIZED_KEYWORD   247
  140. #ifndef BUFFERLENGTH
  141. #define BUFFERLENGTH 255
  142. #endif /* ifndef BUFFERLENGTH */
  143. #endif /* ifdef STAND_ALONE */
  144.  
  145.  
  146. /* ---------------------------------------------------------------------*\
  147. | Local MACROS                                                           |
  148. \*--------------------------------------------------------------------- */
  149. #define CLOSE_ST_TOKEN { \
  150. val_str[indx++] = '\0';\
  151. yylex_info->yacc_pack_not_done = FALSE;\
  152. yylex_info->last_char_unused   = TRUE;}
  153.  
  154. #define CLOSE_FL_TOKEN \
  155. CLOSE_ST_TOKEN;\
  156. sscanf(val_str,"%lf",&temp_float);\
  157. *val_float = temp_float;
  158.  
  159.  
  160. #define CLOSE_LI_TOKEN \
  161. CLOSE_ST_TOKEN;\
  162. sscanf(val_str,"%ld",&temp_long);\
  163. *val_long = temp_long;
  164.  
  165. /* ---------------------------------------------------------------------*\
  166. | Local global variables                                                 |
  167. \*--------------------------------------------------------------------- */
  168. typedef void VoidFunc();
  169. typedef VoidFunc *VoidFuncPtr;
  170. typedef int IntFunc();
  171. typedef IntFunc *IntFuncPtr;
  172. typedef struct
  173. {
  174.     int     kw_token;
  175.     char    *kw_string;
  176. } Keyword_table;
  177.  
  178. #ifdef STAND_ALONE
  179. /* NOTE: yylval is defined by yacc when not STAND_ALONE */
  180. typedef char StringType[BUFFERLENGTH];
  181. typedef union   {
  182.     long            l;
  183.     double          f;
  184.     StringType      str;
  185.     } YYSTYPE;
  186. YYSTYPE yylval;
  187. #endif /* ifdef STAND_ALONE */
  188.  
  189. typedef struct
  190. {
  191.     int     ch1, ch1_group, yacc_pack_not_done,
  192.         new_yacc_pack,  last_char_unused,
  193.         return_code,    init_flag, line_no;
  194.         VoidFuncPtr last_manager;
  195.         char    *filenm;
  196.     YYSTYPE *yylval;
  197. } Yylex_info;
  198.  
  199. int        workid;
  200.  
  201. FILE *active_file, *last_file = NULL;
  202. char input_filenm[128], last_filenm[128];
  203. int lineno,last_lineno;
  204. /* ---------------------------------------------------------------------*\
  205. | Contents:                                                              |
  206. \*--------------------------------------------------------------------- */
  207. #ifdef FULL_FUNCT_PROTO_TYPE
  208. /* ---------------------------------------------------------------------*/
  209. int yyparse(void);
  210. void main(int,char**);
  211. int yylex(void);
  212. void start_yacc_pack    (Yylex_info*);
  213. void continue_yacc_pack (Yylex_info*);
  214. void eof_manager        (Yylex_info*);
  215. void keyw_manager       (Yylex_info*);
  216. void string_manager     (Yylex_info*);
  217. void number_manager     (Yylex_info*);
  218. void comment_manager    (Yylex_info*);
  219. void line_manager       (Yylex_info*);
  220. void space_manager      (Yylex_info*);
  221. void junk_manager       (Yylex_info*);
  222. int  find_keyword       (char*);
  223. /* ---------------------------------------------------------------------*/
  224. #else /* ifdef FULL_FUNCT_PROTO_TYPE */
  225. /* ---------------------------------------------------------------------*/
  226. int yyparse();
  227. void main();
  228. int yylex();
  229. void start_yacc_pack();
  230. void continue_yacc_pack();
  231. void eof_manager();
  232. void keyw_manager();
  233. void string_manager();
  234. void number_manager();
  235. void comment_manager();
  236. void line_manager();
  237. void space_manager();
  238. void junk_manager();
  239. /* ---------------------------------------------------------------------*/
  240. #endif /* ifdef FULL_FUNCT_PROTO_TYPE */
  241.  
  242.  
  243. /* ---------------------------------------------------------------------*\
  244. | BEGIN PROCEDURE CODE                                                   |
  245. \*--------------------------------------------------------------------- */
  246.  
  247. Usage()
  248. {
  249.     fprintf(stderr,
  250.         "usage:\n        %s [-options ...] verb_file_name(s)\n\n",
  251.         Prog_name);
  252.     fprintf(stderr,"where options include:\n");
  253. #ifdef USING_PHIGS
  254.     fprintf(stderr,
  255.         "    -display displaystring         X server to connect to\n");
  256.     fprintf(stderr,
  257.         "    -geometry geomstring           size and location\n");
  258.     fprintf(stderr,
  259.         "    -bd color                      border color\n");
  260.     fprintf(stderr,
  261.         "    -bg color                      background color\n");
  262.     fprintf(stderr,
  263.         "    -bw pixels                     border width\n");
  264.     fprintf(stderr,
  265.         "    -hlhsr mode                    one of the following:\n");
  266.     fprintf(stderr,
  267.         "                            NONE ZBUFF PAINTERS SCANLINE LINE\n");
  268.     fprintf(stderr,
  269.         "    -buff mode                     one of the following:\n");
  270.     fprintf(stderr,
  271.         "                                       SINGLE DOUBLE\n");
  272. #endif /* USING_PHIGS */
  273.     fprintf(stderr,
  274.         "    -h                             this message\n");
  275.     exit(1);
  276. }
  277.  
  278.     
  279. /*----------------------------------------------------------------------*\
  280. | Procedure: void main(int,char**);                                      |
  281. |------------------------------------------------------------------------|
  282. | Description:  Opens file(s) passed in argv.  Calls yyparse onec for each
  283. |        file. 
  284. |------------------------------------------------------------------------|
  285. | Return:  0 when complete with all inupt                                |
  286. |          anything else when not complete with input                    |
  287. \*----------------------------------------------------------------------*/
  288. void main(argc,argv)
  289. int argc;
  290. char **argv;
  291. {
  292.         int i,exit_code;
  293.  
  294.     printf("\n");
  295.         exit_code = NORMAL_TERMINATION;
  296.     if (Prog_name = strrchr(argv[0],'/'))
  297.         Prog_name++;
  298.     else 
  299.         Prog_name = argv[0];
  300.  
  301. #ifdef USING_PHIGS
  302.     Argc = argc;  /* Save original copies for init_bench */
  303.     Argv = argv;
  304.     XrmInitialize();
  305.     XrmParseCommand(&gpc_res_db, opTable, NUM_OPTIONS, Prog_name,
  306.             &argc, argv);
  307. #endif /* USING_PHIGS */
  308.  
  309. #ifdef EXTERNALNOTE
  310.         /* added for exception reporting */
  311. #endif
  312. #ifdef EXCEPTION_HANDLER
  313.         BRF_define_exceptions();        /* load exception tables */
  314.         plb_exception = 0; /* init the global error variable */
  315.         num_exception= 0; /* init the global error counter */
  316. #endif
  317.  
  318.     active_file = (FILE *)NULL;
  319.     for(i=1;i<argc;i++)
  320.     {
  321.         char *arg = argv[i];
  322.         
  323.         if (arg[0] == '-') {
  324.         switch (arg[1]) {
  325.           case 'h':
  326.             Usage();
  327.           default:
  328.             Usage();
  329.         }
  330.         }
  331.  
  332.         active_file = fopen(argv[i],"r");
  333.         lineno = 1;
  334.         if (active_file == NULL )
  335.         {
  336.         fprintf(stderr,
  337.             "FATAL ERROR: unable to open file %s for reading\n",
  338.             argv[i]);
  339.         exit_code = UNRECOVERABLE;
  340.         break;
  341.         } else
  342.         {
  343.         strcpy(input_filenm,argv[i]); 
  344.         if ( (exit_code = yyparse()) ==
  345.             UNRECOVERABLE )
  346.         {
  347.             break;
  348.         }
  349.         }
  350.     }
  351.     if (!active_file && (exit_code == NORMAL_TERMINATION))
  352.         Usage();
  353.     bif_closewk();
  354.     exit(exit_code);
  355. }
  356.  
  357. /*----------------------------------------------------------------------*\
  358. | Procedure: int yylex(void)                                             |
  359. |------------------------------------------------------------------------|
  360. | Description:  Performs lexical analysis for the file pointed to by the
  361. |        global variable active_file. 
  362. |------------------------------------------------------------------------|
  363. | Return:  0 when complete with all inupt                                |
  364. |          anything else is a token for yyparse.  A listings of all tokens
  365. |       can be found in bifparse.y
  366. \*----------------------------------------------------------------------*/
  367. int yylex()
  368. {
  369. static int char_table[256] = {
  370. bSP,bSP,bSP,bSP,  bSP,bSP,bSP,bSP,  bSP,bSP,bNL,bNL,  bNL,bNL,bSP,bSP,
  371. bSP,bSP,bSP,bSP,  bSP,bSP,bSP,bSP,  bSP,bSP,bSP,bSP,  bSP,bSP,bSP,bSP,
  372. bSP,bAI,bDQ,bAI,  bAI,bCT,bAI,bSQ,  bOP,bCP,bAI,bNM,  bAI,bNM,bNM,bAI,
  373. bNM,bNM,bNM,bNM,  bNM,bNM,bNM,bNM,  bNM,bNM,bAI,bSC,  bAI,bAI,bAI,bAI,
  374.  
  375. bAI,bAI,bAI,bAI,  bAI,bEe,bAI,bAI,  bAI,bAI,bAI,bAI,  bAI,bAI,bAI,bAI,
  376. bAI,bAI,bAI,bAI,  bAI,bAI,bAI,bAI,  bAI,bAI,bAI,bAI,  bAI,bAI,bAI,bAI,
  377. bAI,bAI,bAI,bAI,  bAI,bEe,bAI,bAI,  bAI,bAI,bAI,bAI,  bAI,bAI,bAI,bAI,
  378. bAI,bAI,bAI,bAI,  bAI,bAI,bAI,bAI,  bAI,bAI,bAI,bOB,  bAI,bCB,bAI,bOT,
  379.  
  380. bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,
  381. bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,
  382. bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,
  383. bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,
  384.  
  385. bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,
  386. bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,
  387. bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,
  388. bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT,  bOT,bOT,bOT,bOT  };
  389.  
  390.     static Yylex_info yylex_info =
  391.     {
  392.         NULL,  NULL,  NULL,
  393.         NULL,  NULL,
  394.         NULL,  NULL,  NULL,
  395.         NULL,
  396.         "no_file",
  397.         &yylval
  398.     };
  399.     static first_time_used = TRUE;
  400.  
  401.     if (first_time_used)
  402.     {
  403.         first_time_used = FALSE;
  404.         yylex_info.return_code        = FIRST_FILE;
  405.     } else
  406.     {
  407.         yylex_info.last_char_unused    = FALSE;
  408.         yylex_info.new_yacc_pack        = TRUE;
  409.         yylex_info.yacc_pack_not_done   = TRUE;
  410.         yylex_info.return_code          = 1;
  411.         yylex_info.line_no = lineno;
  412.         yylex_info.filenm  = input_filenm;
  413.         while ( yylex_info.yacc_pack_not_done )
  414.         {
  415.             yylex_info.last_char_unused    = FALSE;
  416.             yylex_info.ch1 = fgetc(active_file);
  417. #ifdef EXTERNALNOTE
  418.                     /* WORKING: active_file needs more
  419.                        intigration to develope the stack
  420.                        workings and interactions of the
  421.                        *_yack_pack procedures */
  422. #endif /* ifdef EXTERNALNOTE */
  423.             if ( yylex_info.ch1 == EOF ) yylex_info.ch1_group = bEF;
  424.             else
  425.             yylex_info.ch1_group = char_table[yylex_info.ch1];
  426.             if (yylex_info.new_yacc_pack)
  427.             {
  428.                 start_yacc_pack(    &yylex_info );
  429.             }
  430.             else
  431.             {
  432.                 continue_yacc_pack( &yylex_info );
  433.             }
  434.             if (yylex_info.last_char_unused)
  435.             {
  436.                 ungetc(yylex_info.ch1,active_file);
  437.             }
  438.         }
  439.     
  440.         lineno = yylex_info.line_no;
  441.     }
  442.     return(yylex_info.return_code);
  443. }
  444.  
  445. /*----------------------------------------------------------------------*\
  446. | Procedure: void start_yacc_pack(Yylex_info*)
  447. |------------------------------------------------------------------------|
  448. | Description: Calls the appropriate token manager if no token manager is
  449. |        currently active.
  450. |------------------------------------------------------------------------|
  451. | Return:  void                                                          |
  452. \*----------------------------------------------------------------------*/
  453. void start_yacc_pack( yylex_info )
  454. Yylex_info *yylex_info;
  455. {
  456.  
  457. static VoidFuncPtr maniger_table[] =
  458. {
  459. eof_manager    ,/* end of file                                          */
  460. line_manager   ,/* end of line                                          */
  461. space_manager  ,/* white space                                          */
  462. comment_manager,/* Comment mark   "%"                                   */
  463. string_manager ,/* Double quote                                         */
  464. string_manager ,/* Single quote                                         */
  465. keyw_manager   ,/* Open   bracket "{"                                   */
  466. keyw_manager   ,/* Closed bracket "}"                                   */
  467. keyw_manager   ,/* Semi colen     ";"                                   */
  468. keyw_manager   ,/* Cap "E" or low "e"                                   */
  469. keyw_manager   ,/* ASCII printable except any called out seperately     */
  470. number_manager ,/* Numbers        "0" to "9" and "."                    */
  471. junk_manager   ,/* Eight bit extended charactors                        */
  472. keyw_manager   ,/* Open perentasy                                       */
  473. keyw_manager   ,/* Close perantisy                                      */
  474. junk_manager    /* Unused controle codes                                */
  475. };
  476.  
  477. VoidFuncPtr last_manager;
  478.  
  479.     yylex_info->new_yacc_pack = FALSE;
  480.     yylex_info->init_flag = TRUE;
  481.     last_manager = maniger_table[yylex_info->ch1_group];
  482.     (*last_manager)( yylex_info );
  483.     yylex_info->last_manager = last_manager;
  484. }
  485.  
  486. /*----------------------------------------------------------------------*\
  487. | Procedure: void continue_yacc_pack(Yylex_info*)                        |
  488. |------------------------------------------------------------------------|
  489. | Description: Calls the active token manager
  490. |------------------------------------------------------------------------|
  491. | Return:  void                                                          |
  492. \*----------------------------------------------------------------------*/
  493. void continue_yacc_pack( yylex_info )
  494. Yylex_info *yylex_info;
  495. {
  496. VoidFuncPtr last_manager;
  497.  
  498.     yylex_info->init_flag = FALSE;
  499.     last_manager = yylex_info->last_manager;
  500.     (*last_manager)( yylex_info );
  501. }
  502.  
  503. /*----------------------------------------------------------------------*\
  504. | Procedure: void eof_manager(Yylex_info*)                               |
  505. |------------------------------------------------------------------------|
  506. | Description:                                                           |
  507. |------------------------------------------------------------------------|
  508. | Return:  void                                                          |
  509. \*----------------------------------------------------------------------*/
  510. /*----------------------------------------------------------------------*\
  511. | WORKING: This routine currently alters global variables directly.  This
  512. |        will be corrected in future releases.
  513. \*----------------------------------------------------------------------*/
  514. void eof_manager( yylex_info )
  515. Yylex_info *yylex_info;
  516. {
  517.     if ( last_file == NULL )
  518.     {
  519.         yylex_info->yacc_pack_not_done = FALSE;
  520.         yylex_info->return_code = bEOF;
  521.     } else
  522.     {
  523.         if ( fclose(active_file) != 0 )
  524.         {
  525.             fprintf(stderr,"Error: closing file %s\n",input_filenm);
  526.             exit(-1);
  527.         }
  528.         active_file = last_file;
  529.         last_file   = NULL;
  530.         yylex_info->line_no = last_lineno;
  531.         strcpy(yylex_info->filenm,last_filenm); 
  532.         yylex_info->yacc_pack_not_done = FALSE;
  533.         yylex_info->return_code = END_GEOM_FILE;
  534.     }
  535. }
  536. /*----------------------------------------------------------------------*\
  537. | Procedure: void keyw_manager(Yylex_info*)                              |
  538. |------------------------------------------------------------------------|
  539. | Description:                                                           |
  540. |------------------------------------------------------------------------|
  541. | Return:  void                                                          |
  542. \*----------------------------------------------------------------------*/
  543. void keyw_manager( yylex_info )
  544. Yylex_info *yylex_info;
  545. {
  546. static indx;
  547. char *val_str;
  548.     val_str = yylex_info->yylval->str;
  549.     if (yylex_info->init_flag == TRUE)
  550.     {
  551.         switch(yylex_info->ch1_group)
  552.         {
  553.         case bOB :  /* Open   bracket "{"      */
  554.         case bCB :  /* Closed bracket "}"      */
  555.         case bSC :  /* Semi colen     ";"      */
  556.             val_str[0] = (char)yylex_info->ch1;
  557.             val_str[1] = '\0';
  558.             yylex_info->return_code    = yylex_info->ch1;
  559.             yylex_info->yacc_pack_not_done = FALSE;
  560.             break;
  561.         case bEe :  /* Cap "E" or low "e"      */
  562.         case bAI :  /* ASCII printable ...     */
  563.         case bOP :  /* Open perentasy          */
  564.         case bCP :  /* Close perantisy         */
  565.             indx=0;
  566.             val_str[indx++] = (char)yylex_info->ch1;
  567.             break;
  568.         default  :
  569.             yylex_info->new_yacc_pack = TRUE;
  570.             fprintf(stderr,
  571.                 "Program logic error in keyw_manager\n");
  572. #ifdef EXTERNALNOTE
  573.         Possible place for branch to exception handler.
  574. #endif /* ifdef EXTERNALNOTE */
  575.             break;
  576.         }
  577.     } else
  578.     {
  579.         switch(yylex_info->ch1_group)
  580.         {
  581.         case bEF :  /* end of file             */
  582.         case bNL :  /* end of line             */
  583.         case bSP :  /* white space             */
  584.         case bCT :  /* Comment mark   "%"      */
  585.         case bDQ :  /* Double quote            */
  586.         case bSQ :  /* Single quote            */
  587.         case bOB :  /* Open   bracket "{"      */
  588.         case bCB :  /* Closed bracket "}"      */
  589.         case bSC :  /* Semi colen     ";"      */
  590.         case bOT :  /* Eight bit extended      */
  591.         case bCC :  /* Unused controle codes   */
  592.             CLOSE_ST_TOKEN;
  593.             yylex_info->return_code =
  594.                 find_keyword(val_str);
  595.             break;
  596.  
  597.         case bEe :  /* Cap "E" or low "e"      */
  598.         case bAI :  /* ASCII printable ...     */
  599.         case bNM :  /* Numbers "0"-"9" and "." */
  600.         case bOP :  /* Open perentasy          */
  601.         case bCP :  /* Close perantisy         */
  602.             val_str[indx++] = (char)yylex_info->ch1;
  603.             break;
  604.         default  :
  605.             fprintf(stderr,
  606.                 "Program logic error in keyw_manager\n");
  607. #ifdef EXTERNALNOTE
  608.         Possible place for branch to exception handler.
  609. #endif /* ifdef EXTERNALNOTE */
  610.             break;
  611.         }
  612.     }
  613. }
  614. /*----------------------------------------------------------------------*\
  615. | Procedure: void string_manager(Yylex_info*)                            |
  616. |------------------------------------------------------------------------|
  617. | Description:                                                           |
  618. |------------------------------------------------------------------------|
  619. | Return:  void                                                          |
  620. \*----------------------------------------------------------------------*/
  621. void string_manager( yylex_info )
  622. Yylex_info *yylex_info;
  623. {
  624. static indx;
  625. static start_qtype;
  626. static status;
  627. char *val_str;
  628.     val_str = yylex_info->yylval->str;
  629.     if (yylex_info->init_flag == TRUE)
  630.     {
  631.         switch(yylex_info->ch1_group)
  632.         {
  633.         case bDQ :  /* Double quote            */
  634.             start_qtype = bDQ;
  635.             status = bNONE;
  636.             indx=0;
  637.             break;
  638.         case bSQ :  /* Single quote            */
  639.             start_qtype = bSQ;
  640.             status = bNONE;
  641.             indx=0;
  642.             break;
  643.         default  :
  644.             yylex_info->new_yacc_pack = TRUE;
  645.             fprintf(stderr,
  646.                 "Program logic error in string_manager\n");
  647. #ifdef EXTERNALNOTE
  648.         Possible place for branch to exception handler.
  649. #endif /* ifdef EXTERNALNOTE */
  650.             break;
  651.         }
  652.     } else
  653.     {
  654.         switch(yylex_info->ch1_group)
  655.         {
  656.         case bEF :  /* end of file             */
  657.             if (status == bNONE)
  658.             {
  659.                 fprintf(stderr,
  660.                  "WARNING: %s:%d: EOF encountered while a string was open\n",
  661.                  yylex_info->filenm, yylex_info->line_no);
  662.             }
  663.             CLOSE_ST_TOKEN;
  664.             yylex_info->return_code        = QSTRING;
  665.             break;
  666.         case bNL :  /* end of line             */
  667.         case bSP :  /* white space             */
  668.         case bCT :  /* Comment mark   "%"      */
  669.         case bOB :  /* Open   bracket "{"      */
  670.         case bCB :  /* Closed bracket "}"      */
  671.         case bSC :  /* Semi colen     ";"      */
  672.         case bEe :  /* Cap "E" or low "e"      */
  673.         case bAI :  /* ASCII printable ...     */
  674.         case bNM :  /* Numbers "0"-"9" and "." */
  675.         case bOP :  /* Open perentasy          */
  676.         case bCP :  /* Close perantisy         */
  677.             if (status == bNONE)
  678.             {
  679.                 if (yylex_info->ch1_group == bNL)
  680.                     yylex_info->line_no++;
  681.                 val_str[indx++] = (char)yylex_info->ch1;
  682.             }else
  683.             {
  684.                 CLOSE_ST_TOKEN;
  685.                 yylex_info->return_code        = QSTRING;
  686.             }
  687.             break;
  688.  
  689.         case bOT :  /* Eight bit extended      */
  690.         case bCC :  /* Unused controle codes   */
  691.             if (status == bNONE)
  692.             {
  693.                 fprintf(stderr,
  694.                  "WARNING: %s:%d: Unprintable characters in string ignored\n",
  695.                  yylex_info->filenm,yylex_info->line_no);
  696.             }else
  697.             {
  698.                 CLOSE_ST_TOKEN;
  699.                 yylex_info->return_code        = QSTRING;
  700.             }
  701.             break;
  702.  
  703.         case bDQ :  /* Double quote            */
  704.             switch(status)
  705.             {
  706.             case bNONE :
  707.                 if(start_qtype==bDQ) status = bDQ;
  708.                 else
  709.                    val_str[indx++] = (char)yylex_info->ch1;
  710.                 break;
  711.             case bDQ   :
  712.                 status = bNONE;
  713.                 val_str[indx++] = (char)yylex_info->ch1;
  714.                 break;
  715.             case bSQ   :
  716.                 CLOSE_ST_TOKEN;
  717.                 yylex_info->return_code        = QSTRING;
  718.                 break;
  719.             }
  720.             break;
  721.         case bSQ :  /* Single quote            */
  722.             switch(status)
  723.             {
  724.             case bNONE :
  725.                 if(start_qtype==bSQ) status = bSQ;
  726.                 else
  727.                    val_str[indx++] = (char)yylex_info->ch1;
  728.                 break;
  729.             case bSQ   :
  730.                 status = bNONE;
  731.                 val_str[indx++] = (char)yylex_info->ch1;
  732.                 break;
  733.             case bDQ   :
  734.                 CLOSE_ST_TOKEN;
  735.                 yylex_info->return_code        = QSTRING;
  736.                 break;
  737.             }
  738.             break;
  739.         default  :
  740.             fprintf(stderr,"Program logic error in keyw_manager\n");
  741. #ifdef EXTERNALNOTE
  742.         Possible place for branch to exception handler.
  743. #endif /* ifdef EXTERNALNOTE */
  744.             break;
  745.         }
  746.     }
  747. }
  748. /*----------------------------------------------------------------------*\
  749. | Procedure: void number_manager(Yylex_info*)                            |
  750. |------------------------------------------------------------------------|
  751. | Description:                                                           |
  752. |------------------------------------------------------------------------|
  753. | Return:  void                                                          |
  754. \*----------------------------------------------------------------------*/
  755. void number_manager( yylex_info )
  756. Yylex_info *yylex_info;
  757. {
  758. static indx;
  759. static status;
  760. char *val_str;
  761. double *val_float, temp_float;
  762. long   *val_long,  temp_long;
  763.     val_long  = &(yylex_info->yylval->l);
  764.     val_float = &(yylex_info->yylval->f);
  765.     val_str = yylex_info->yylval->str;
  766.     if (yylex_info->init_flag == TRUE)
  767.     {
  768.         if( yylex_info->ch1_group == bNM )
  769.         {
  770.             indx = 0;
  771.             status = bNM;
  772.             if( yylex_info->ch1 == '.' ) status = bTOP;
  773.             val_str[indx++] = (char)yylex_info->ch1;
  774.         }else
  775.         {
  776.             yylex_info->new_yacc_pack = TRUE;
  777.             fprintf(stderr,"Program logic error in number_manager\n");
  778. #ifdef EXTERNALNOTE
  779.         Possible place for branch to exception handler.
  780. #endif /* ifdef EXTERNALNOTE */
  781.         }
  782.     } else
  783.     {
  784.         switch(yylex_info->ch1_group)
  785.         {
  786.         case bEe :  /* Cap "E" or low "e"      */
  787.             if (status == bEe)
  788.             {
  789.                 fprintf(stderr,
  790.                  "WARNING: %s:%d: Invalid number second attempt at an exponent ignored\n",
  791.                  yylex_info->filenm,yylex_info->line_no);
  792.                 CLOSE_FL_TOKEN;
  793.                 yylex_info->return_code        = REAL;
  794.             } else
  795.             {
  796.                 status = bEe;
  797.                 val_str[indx++] = (char)yylex_info->ch1;
  798.             }
  799.             break;
  800.         case bNM :  /* Numbers "0"-"9" and "." */
  801.             switch(status)
  802.             {
  803.             case bTOP:
  804.                 if( yylex_info->ch1 == '.' )
  805.                 {
  806.                     fprintf(stderr,
  807.                      "WARNING: %s:%d: Invalid number second attempt at a decimal point ignored\n",
  808.                      yylex_info->filenm,yylex_info->line_no);
  809.                     CLOSE_FL_TOKEN;
  810.                 } else
  811.                 val_str[indx++] = (char)yylex_info->ch1;
  812.                 break;
  813.             case bEe:
  814.                 if( yylex_info->ch1 == '.' )
  815.                 {
  816.                     fprintf(stderr,
  817.                      "WARNING: %s:%d: Invalid number decimal point after exponent ignored\n",
  818.                      yylex_info->filenm,yylex_info->line_no);
  819.                     CLOSE_FL_TOKEN;
  820.                 } else
  821.                 val_str[indx++] = (char)yylex_info->ch1;
  822.                 break;
  823.             default:
  824.                 if( yylex_info->ch1 == '.' ) status = bTOP;
  825.                 val_str[indx++] = (char)yylex_info->ch1;
  826.                 break;
  827.             }
  828.             break;
  829.         default  :
  830.             if (status == bNM)
  831.             {
  832.                 CLOSE_LI_TOKEN;
  833.                 yylex_info->return_code        = LONG;
  834.             } else
  835.             {
  836.                 CLOSE_FL_TOKEN;
  837.                 yylex_info->return_code        = REAL;
  838.             }
  839.             break;
  840.         }
  841.     }
  842. }
  843. /*----------------------------------------------------------------------*\
  844. | Procedure: void comment_manager(Yylex_info*)                           |
  845. |------------------------------------------------------------------------|
  846. | Description:                                                           |
  847. |------------------------------------------------------------------------|
  848. | Return:  void                                                          |
  849. \*----------------------------------------------------------------------*/
  850. void comment_manager( yylex_info )
  851. Yylex_info *yylex_info;
  852. {
  853.     if (yylex_info->init_flag == TRUE)
  854.     {
  855.         if(yylex_info->ch1_group != bCT)
  856.         {
  857.             yylex_info->new_yacc_pack = TRUE;
  858.             fprintf(stderr,"Program logic error in comment_manager\n");
  859. #ifdef EXTERNALNOTE
  860.         Possible place for branch to exception handler.
  861. #endif /* ifdef EXTERNALNOTE */
  862.         }
  863.     } else
  864.     {
  865.         switch(yylex_info->ch1_group)
  866.         {
  867.         case bEF:
  868.             fprintf(stderr,
  869.              "WARNING: %s:%d: EOF encountered while a comment was open\n",
  870.              yylex_info->filenm, yylex_info->line_no);
  871.             yylex_info->last_char_unused   = TRUE;
  872.             yylex_info->new_yacc_pack = TRUE;
  873.             break;
  874.         case bNL:
  875.             yylex_info->line_no++;
  876.             break;
  877.         case bCT:
  878.             yylex_info->new_yacc_pack = TRUE;
  879.             break;
  880.         }
  881.     }
  882. }
  883. /*----------------------------------------------------------------------*\
  884. | Procedure: void line_manager(Yylex_info*)                              |
  885. |------------------------------------------------------------------------|
  886. | Description:                                                           |
  887. |------------------------------------------------------------------------|
  888. | Return:  void                                                          |
  889. \*----------------------------------------------------------------------*/
  890. void line_manager( yylex_info )
  891. Yylex_info *yylex_info;
  892. {
  893.     yylex_info->line_no++;
  894.     yylex_info->new_yacc_pack = TRUE;
  895. }
  896. /*----------------------------------------------------------------------*\
  897. | Procedure: void space_manager(Yylex_info*)                             |
  898. |------------------------------------------------------------------------|
  899. | Description:                                                           |
  900. |------------------------------------------------------------------------|
  901. | Return:  void                                                          |
  902. \*----------------------------------------------------------------------*/
  903. void space_manager( yylex_info )
  904. Yylex_info *yylex_info;
  905. {
  906.     yylex_info->new_yacc_pack = TRUE;
  907. }
  908.  
  909. /*----------------------------------------------------------------------*\
  910. | Procedure: void junk_manager(Yylex_info*)                              |
  911. |------------------------------------------------------------------------|
  912. | Description:                                                           |
  913. |------------------------------------------------------------------------|
  914. | Return:  void                                                          |
  915. \*----------------------------------------------------------------------*/
  916. void junk_manager( yylex_info )
  917. Yylex_info *yylex_info;
  918. {
  919.     yylex_info->new_yacc_pack = TRUE;
  920. }
  921.  
  922. static Keyword_table keyword_table[] =
  923. {
  924.     /*----------------------------------------------------------------*\
  925.     |    Structures
  926.     \*----------------------------------------------------------------*/
  927.     BEGIN_STRUCTURE,"BEGINSTRUCTURE",
  928.     END_STRUCTURE,"ENDSTRUCTURE",
  929.  
  930.     /*----------------------------------------------------------------*\
  931.     |    Graphics Primitives
  932.     \*----------------------------------------------------------------*/
  933.     LABEL,"LABEL",
  934.     MARKER,"MARKER",
  935.     MARKER3,"MARKER3",
  936.     LINE,"LINE",
  937.     LINE3,"LINE3",
  938.     POLYGON,"POLYGON",
  939.     POLYGON3,"POLYGON3",
  940.     FILL_AREA_SET,"FILLAREASET",
  941.     FILL_AREA_SET3,"FILLAREASET3",
  942.     TRIANGLE3,"TRIANGLE3",
  943.     QUAD_MESH3,"QUADMESH3",
  944.     INDEX_POLYGONS3,"INDEXPOLYGONS3",
  945.     GEN_SPHERE3,"GENSPHERE3",
  946.     GEN_CIRCLE,"GENCIRCLE",
  947.     GEN_CIRCLE3,"GENCIRCLE3",
  948.     TEXT,"TEXT",
  949.     TEXT3,"TEXT3",
  950.     ANNOTATION_TEXT3,"ANNOTATIONTEXT3",
  951.     PIXEL_MAP3,"PIXELMAP3",
  952.     NON_UNIFORM_BSPLINE_CURVE,"NONUNIFORMBSPLINECURVE",               /* ver 1.0 */
  953.     NON_UNIFORM_BSPLINE_SURFACE,"NONUNIFORMBSPLINESURFACE",             /* ver 1.0 */
  954.  
  955.     /*----------------------------------------------------------------*\
  956.     |    Primitive Attributes
  957.     \*----------------------------------------------------------------*/
  958.     CURVE_APPROXIMATION_CRITERIA,"CURVEAPPROXIMATIONCRITERIA",            /* ver 1.0 */
  959.     TRIMCURVE_APPROXIMATION_CRITERIA,"TRIMCURVEAPPROXIMATIONCRITERIA",        /* ver 1.0 */
  960.     SURFACE_APPROXIMATION_CRITERIA,"SURFACEAPPROXIMATIONCRITERIA",        /* ver 1.0 */
  961.     MARKER_TYPE,"MARKERTYPE",
  962.     MARKER_SIZE,"MARKERSIZE",
  963.     MARKER_COLOR,"MARKERCOLOR",
  964.     MARKER_COLOR_INDEX,"MARKERCOLORINDEX",
  965.     LINE_TYPE,"LINETYPE",
  966.     LINE_WIDTH,"LINEWIDTH",
  967.     LINE_COLOR,"LINECOLOR",
  968.     LINE_COLOR_INDEX,"LINECOLORINDEX",
  969.     LINE_SHADING,"LINESHADING",
  970.     INTERIOR_STYLE,"INTERIORSTYLE",
  971.     INTERIOR_PATTERN_INDEX,"INTERIORPATTERNINDEX",
  972.     INTERIOR_COLOR,"INTERIORCOLOR",
  973.     INTERIOR_COLOR_INDEX,"INTERIORCOLORINDEX",
  974.     BACKFACE_INTERIOR_COLOR,"BACKFACEINTERIORCOLOR",
  975.     BACKFACE_INTERIOR_COLOR_INDEX,"BACKFACEINTERIORCOLORINDEX",
  976.     INTERIOR_SHADING,"INTERIORSHADING",
  977.     INTERIOR_LIGHTING,"INTERIORLIGHTING",
  978.     SURFACE_PROPERTIES,"SURFACEPROPERTIES",
  979.     BACKFACE_PROPERTIES,"BACKFACEPROPERTIES",
  980.     BACKFACE_PROCESSING,"BACKFACEPROCESSING",
  981.     EDGE_FLAG,"EDGEFLAG",
  982.     EDGE_TYPE,"EDGETYPE",
  983.     EDGE_WIDTH,"EDGEWIDTH",
  984.     EDGE_COLOR,"EDGECOLOR",
  985.     EDGE_COLOR_INDEX,"EDGECOLORINDEX",
  986.     TEXT_FONT,"TEXTFONT",
  987.     TEXT_PREC,"TEXTPREC",
  988.     TEXT_COLOR,"TEXTCOLOR",
  989.     TEXT_COLOR_INDEX,"TEXTCOLORINDEX",
  990.     TEXT_PATH,"TEXTPATH",
  991.     TEXT_ALIGN,"TEXTALIGN",
  992.     CHAR_HEIGHT,"CHARHEIGHT",
  993.     CHAR_EXP,"CHAREXP",
  994.     CHAR_SPACE,"CHARSPACE",
  995.     CHAR_UP_VECTOR,"CHARUPVECTOR",
  996.     ANNO_TEXT_CHAR_HEIGHT,"ANNOTEXTCHARHEIGHT",
  997.     ANNO_TEXT_CHAR_UP_VECTOR,"ANNOTEXTCHARUPVECTOR",
  998.     ANNO_TEXT_STYLE,"ANNOTEXTSTYLE",
  999.  
  1000.     /*----------------------------------------------------------------*\
  1001.     |    Rendering Attributes
  1002.     \*----------------------------------------------------------------*/
  1003.     LIGHT_STATE,"LIGHTSTATE",
  1004.     DEPTHCUE_INDEX,"DEPTHCUEINDEX",
  1005.     HLHS_REMOVAL,"HLHSREMOVAL",
  1006.  
  1007.     /*----------------------------------------------------------------*\
  1008.     |    Matrix Manipulation Entities
  1009.     \*----------------------------------------------------------------*/
  1010.     IDENTITY3,"IDENTITY3",
  1011.     CONCAT_MATRIX3,"CONCATMATRIX3",
  1012.     INVERT_MATRIX3,"INVERTMATRIX3",
  1013.     ROTATE3,"ROTATE3",
  1014.     ROTATE_XYZ3,"ROTATEXYZ3",
  1015.     TRANSLATE3,"TRANSLATE3",
  1016.     SCALE3,"SCALE3",
  1017.     MATRIX3,"MATRIX3",
  1018.     GET_MATRIX3,"GETMATRIX3",
  1019.     PUSH_MATRIX3,"PUSHMATRIX3",
  1020.     POP_MATRIX3,"POPMATRIX3",
  1021.     GLOBAL_TRANSFORMATION3,"GLOBALTRANSFORMATION3",
  1022.     LOCAL_TRANSFORMATION3,"LOCALTRANSFORMATION3",
  1023.     APPLY_TO_GLOBAL3,"APPLYTOGLOBAL3",
  1024.     APPLY_TO_LOCAL3,"APPLYTOLOCAL3",
  1025.     VIEW_ORIENTATION3,"VIEWORIENTATION3",
  1026.     VIEW_MAPPING3,"VIEWMAPPING3",
  1027.     ACTIVE_VIEW,"ACTIVEVIEW",
  1028.  
  1029.     /*----------------------------------------------------------------*\
  1030.     |    Structure Hierarchy
  1031.     \*----------------------------------------------------------------*/
  1032.     EXECUTE_STRUCTURE,"EXECUTESTRUCTURE",
  1033.     CALL_STRUCTURE,"CALLSTRUCTURE",
  1034.  
  1035.     /*----------------------------------------------------------------*\
  1036.     |    Verb File Entities
  1037.     \*----------------------------------------------------------------*/
  1038.     READ_GEOMETRY_FILE,"READGEOMETRYFILE",
  1039.     CLEAR_GEOMETRY,"CLEARGEOMETRY",
  1040.     BEGIN_TEST,"BEGINTEST",
  1041.     END_TEST,"ENDTEST",
  1042.     PAUSE,"PAUSE",
  1043.     SLEEP,"SLEEP",
  1044.     INVOKE_AT_FRAME,"INVOKEATFRAME",
  1045.     DEFINE_COLOR,"DEFINECOLOR",
  1046.     BACKGROUND_COLOR,"BACKGROUNDCOLOR",
  1047.     BACKGROUND_COLOR_INDEX,"BACKGROUNDCOLORINDEX",
  1048.     DEFINE_VIEW_SPECIFICATION,"DEFINEVIEWSPECIFICATION",
  1049.     DEFAULT_VIEW_SPECIFICATION,"DEFAULTVIEWSPECIFICATION",
  1050.     DEFINE_LIGHT,"DEFINELIGHT",
  1051.     DEFINE_DEPTHCUE,"DEFINEDEPTHCUE",
  1052.     CONFIGURATION,"CONFIGURATION",
  1053.  
  1054.     /*----------------------------------------------------------------*\
  1055.     |    Additional Keywords
  1056.     \*----------------------------------------------------------------*/
  1057.     KNOTS,"KNOTS",                    /* ver 1.0 */
  1058.     CTRL_POINTS,"CTRLPOINTS",                /* ver 1.0 */
  1059.     UKNOTS,"UKNOTS",                /* ver 1.0 */
  1060.     VKNOTS,"VKNOTS",                /* ver 1.0 */
  1061.     TRIMLOOP,"TRIMLOOP",                /* ver 1.0 */
  1062.     TRIMCURVE,"TRIMCURVE",                /* ver 1.0 */
  1063.     RATIONAL,"RATIONAL",                /* ver 1.0 */
  1064.     NON_RATIONAL,"NONRATIONAL",                /* ver 1.0 */
  1065.     IGNORE_GROUP,"IGNOREGROUP",
  1066.     VERTEX_COLORS,"VERTEXCOLORS",
  1067.     VERTEX_NORMALS,"VERTEXNORMALS",
  1068.     VERTEX_COLOR_INDICES,"VERTEXCOLORINDICES",
  1069.     FACET_COLORS,"FACETCOLORS",
  1070.     FACET_NORMALS,"FACETNORMALS",
  1071.     FACET_COLOR_INDICES,"FACETCOLORINDICES",
  1072.     VERTEX_COORDINATES,"VERTEXCOORDINATES",
  1073.     EDGE_VISIBILITY,"EDGEVISIBILITY",
  1074.     ENABLE,"ENABLE",
  1075.     DISABLE,"DISABLE",
  1076.     STRING,"STRING",
  1077.     CHAR,"CHAR",
  1078.     STROKE,"STROKE",
  1079.     WORLD,"WORLD",
  1080.     MODELLING,"MODELLING",
  1081.     AMBIENT_LIGHT,"AMBIENTLIGHT",
  1082.     DIRECTIONAL_LIGHT,"DIRECTIONALLIGHT",
  1083.     POSITIONAL_LIGHT,"POSITIONALLIGHT",
  1084.     SPOT_LIGHT,"SPOTLIGHT",
  1085.     LD_TRANSFORM,"LDTRANSFORM",
  1086.     ACTIVATE_LIST,"ACTIVATELIST",
  1087.     DEACTIVATE_LIST,"DEACTIVATELIST",
  1088.     HLHSRID,"HLHSRID",
  1089.     HLHS_DISABLE,"HLHSDISABLE",
  1090.     HLHS_ENABLE,"HLHSENABLE",
  1091.     MAKE_RAMP,"MAKERAMP",
  1092.     COLOR_LIST,"COLORLIST",
  1093.     RGB,"RGB",
  1094.     CIE,"CIE",
  1095.     HSV,"HSV",
  1096.     HLS,"HLS",
  1097.     PRECONCAT,"PRECONCAT",
  1098.     POSTCONCAT,"POSTCONCAT",
  1099.     REPLACE,"REPLACE",
  1100.     X_AXIS,"XAXIS",
  1101.     Y_AXIS,"YAXIS",
  1102.     Z_AXIS,"ZAXIS",
  1103.     PERSPECTIVE,"PERSPECTIVE",
  1104.     PARALLEL,"PARALLEL",
  1105.     MATCH_VIEW_AREA,"MATCHVIEWAREA",
  1106.     ADJUST_X,"ADJUSTX",
  1107.     ADJUST_Y,"ADJUSTY",
  1108.     GROW,"GROW",
  1109.     SHRINK,"SHRINK",
  1110.     XY_CLIP,"XYCLIP",
  1111.     NO_XY_CLIP,"NOXYCLIP",
  1112.     FRONT_CLIP,"FRONTCLIP",
  1113.     NO_FRONT_CLIP,"NOFRONTCLIP",
  1114.     BACK_CLIP,"BACKCLIP",
  1115.     NO_BACK_CLIP,"NOBACKCLIP",
  1116.     HOLLOW,"HOLLOW",
  1117.     SOLID,"SOLID",
  1118.     PATTERN,"PATTERN",
  1119.     EMPTY,"EMPTY",
  1120.     VIEW_MAPPING,"VIEWMAPPING",
  1121.     VIEW_ORIENTATION,"VIEWORIENTATION",
  1122.     GLOBAL_MODELLING,"GLOBALMODELLING",
  1123.     LOCAL_MODELLING,"LOCALMODELLING",
  1124.     COMPOSITE_MODELLING,"COMPOSITEMODELLING",
  1125.     SPECIFY_REPORT_FILE,"SPECIFYREPORTFILE",
  1126.     TO,"TO",
  1127.     END,"END",
  1128.     EXECUTE,"EXECUTE",
  1129.     CALL,"CALL",
  1130.     WINDOW_SIZE,"WINDOWSIZE",
  1131.     DOUBLE_BUFFER,"DOUBLEBUFFER",
  1132.     SINGLE_BUFFER,"SINGLEBUFFER",
  1133.     TRUE_COLOR,"TRUECOLOR",
  1134.     PSEUDO_COLOR,"PSEUDOCOLOR",
  1135.     FACET_COLOR_INDICES,"FACETCOLORINDICES",
  1136.     FACET_CONNECTIVITY,"FACETCONNECTIVITY",
  1137.     EXACT,"EXACT",
  1138.     CENTER,"CENTER",
  1139.     RADIUS,"RADIUS",
  1140.     SCALE_FACTORS,"SCALEFACTORS",
  1141.     NORMAL,"NORMAL",
  1142.     TEXT_DIRECTION,"TEXTDIRECTION",
  1143.     ADD,"ADD",
  1144.     AND,"AND",
  1145.     CLEAR,"CLEAR",
  1146.     INVERT,"INVERT",
  1147.     NAND,"NAND",
  1148.     NOOP,"NOOP",
  1149.     NOR,"NOR",
  1150.     OR,"OR",
  1151.     SET,"SET",
  1152.     SUBTRACT_DEST,"SUBTRACTDEST",
  1153.     SUBTRACT_SOURCE,"SUBTRACTSOURCE",
  1154.     XOR,"XOR",
  1155.     PIXEL_VALUES,"PIXELVALUES",
  1156.     INTENSITY_VALUES,"INTENSITYVALUES",
  1157.     PIXEL_VALUE_SEGMENTS,"PIXELVALUESEGMENTS",
  1158.     INTENSITY_VALUE_SEGMENTS,"INTENSITYVALUESEGMENTS"
  1159. };
  1160. static kw_table_size = sizeof(keyword_table)/sizeof(Keyword_table);
  1161.  
  1162.  
  1163. /*--------------------------------------------------------------------*\
  1164. | Procedure: int find_keyword(char*)                                  
  1165. |---------------------------------------------------------------------
  1166. | Description: Finds a key word by matching strings in an arrayed struct
  1167. |              with str_word the corresponding keyword token is returned
  1168. |---------------------------------------------------------------------
  1169. | Return:  0 if ok  1 if error                                        
  1170. \*--------------------------------------------------------------------*/
  1171. int  find_keyword(str_word)
  1172. char *str_word;
  1173. {
  1174. int i, return_value;
  1175. int  str_length, i_target;
  1176. char tmp_word[STRLENGTH];
  1177.  
  1178.     str_length =  strlen(str_word);
  1179.     i_target = 0;
  1180.     for(i=0;i<str_length;i++)
  1181.     {
  1182.         if ( islower(str_word[i]) )
  1183.         {
  1184.             /*--------------------------------------------*\
  1185.             |    The SUN version of toupper ONLY works in
  1186.             |    the input IS LOWER CASE (Ugh!)
  1187.             \*--------------------------------------------*/
  1188.             tmp_word[i_target] = toupper(str_word[i]);
  1189.         }
  1190.         else
  1191.             tmp_word[i_target] = str_word[i];
  1192.  
  1193. #ifdef REMOVE_UNDERSCORES
  1194.         if (tmp_word[i_target] != '_') i_target++;
  1195. #else /* ifdef REMOVE_UNDERSCORES */
  1196.         i_target++;
  1197. #endif /* ifdef REMOVE_UNDERSCORES */
  1198.     }
  1199.     tmp_word[i_target] = '\0';
  1200.     return_value = UNRECOGNIZED_KEYWORD;
  1201.     for(i=0;i<kw_table_size;i++)
  1202.     {
  1203.         if (!strcmp(tmp_word, keyword_table[i].kw_string))
  1204.         {
  1205.             return_value = keyword_table[i].kw_token;
  1206.             break;
  1207.         }
  1208.     }
  1209.     return(return_value);
  1210. }
  1211.  
  1212. /*--------------------------------------------------------------------*\
  1213. | Procedure: char *find_keyword_token(int)                                  
  1214. |---------------------------------------------------------------------
  1215. | Description: Finds a keyword string associated with a given token
  1216. |---------------------------------------------------------------------
  1217. | Return:  The pointer to the keyword string
  1218. \*--------------------------------------------------------------------*/
  1219. char *find_keyword_token(token)
  1220. BIF_INT token ;
  1221. {
  1222.     int i;
  1223.     char *return_value;
  1224.     return_value = "UNRECOGNIZED_KEYWORD";
  1225.     for(i=0;i<kw_table_size;i++)
  1226.     {
  1227.         if (token == keyword_table[i].kw_token )
  1228.         {
  1229.             return_value = keyword_table[i].kw_string;
  1230.             break;
  1231.         }
  1232.     }
  1233.     return(return_value);
  1234. }
  1235.  
  1236. /*----------------------------------------------------------------------*\
  1237. | Procedure: int bif_readgeom(qBIFfile)
  1238. |------------------------------------------------------------------------|
  1239. | Description: Receive a READ_GEOMETRY_FILE entity from the parser
  1240. |        qBIFfile    Name of geometry file to read
  1241. |------------------------------------------------------------------------|
  1242. | Return: Error Code
  1243. \*----------------------------------------------------------------------*/
  1244.  
  1245. int bif_readgeom(qBIFfile)
  1246. char *qBIFfile;
  1247. {
  1248.     printf("READ_GEOMETRY_FILE : (%s) \n",qBIFfile);
  1249.     last_file = active_file;
  1250.     strcpy(last_filenm,input_filenm); 
  1251.     strcpy(input_filenm,qBIFfile); 
  1252.  
  1253.     active_file = fopen(qBIFfile,"r");
  1254.     last_lineno = lineno;
  1255.     lineno = 1;
  1256.     if (active_file == NULL )
  1257.     {
  1258.        fprintf(stderr,
  1259.           "FATAL ERROR: unable to open file (%s) for reading\n",
  1260.           qBIFfile);
  1261.        fprintf(stderr,"Called from (%s) on line (%d)\n",
  1262.           last_filenm,last_lineno);
  1263.        exit(-1);
  1264.     } 
  1265. } /* End procedure bif_readgeom */
  1266.  
  1267.  
  1268.  
  1269. /*----------------------------------------------------------------------*\
  1270. | Procedure: void yyerror(char *)
  1271. |------------------------------------------------------------------------|
  1272. | Description: Receives error messages form yyparse and prints them to
  1273. |        stderr
  1274. |------------------------------------------------------------------------|
  1275. | Return: Error Code
  1276. \*----------------------------------------------------------------------*/
  1277.  
  1278. void yyerror(s)
  1279. char *s;
  1280. {
  1281.     fflush(stdout);
  1282.     fflush(stderr);
  1283.     fprintf(stderr,"(%s:Line %d) %s\n",input_filenm,lineno,s);
  1284.     fflush(stderr);
  1285. }
  1286.  
  1287. /*----------------------------------------------------------------------*\
  1288. | Procedure: void bif_openwk()
  1289. |------------------------------------------------------------------------|
  1290. | Description: Opens up the workstation as well as setting up 
  1291. |        the default structure
  1292. |------------------------------------------------------------------------|
  1293. | Return: Error Code
  1294. \*----------------------------------------------------------------------*/
  1295. bif_openwk()
  1296. {
  1297.     workid = bench_setup.workid;
  1298.     base_state_stid = bench_setup.base_state_stid;
  1299.  
  1300.     init_bench(&bench_setup,&wk_info);
  1301.  
  1302. #ifdef TEST_PRINT
  1303.     printf(
  1304.       "The size of the color map is %d, the aspect_ratio is %f\n",
  1305.       wk_info.cmap_size,
  1306.       wk_info.aspect_ratio);
  1307. #endif /* ifdef TEST_PRINT */
  1308.  
  1309. #ifdef USING_PHIGS
  1310.     /*------------------------------------------------------------*\
  1311.     |    Open and initialize the Non-retatined structure.
  1312.     |    The Non-retatined structure is an unposted black hole
  1313.     |    for elements that live outside of a test-loop. It is
  1314.     |    cleared each test-loop.
  1315.     \*------------------------------------------------------------*/
  1316.     fxopns();
  1317.     pcopy_all_elems_struct((Pint)bench_setup.base_state_stid);
  1318. #endif /* USING_PHIGS */
  1319.     /*------------------------------------------------------------*\
  1320.     |    Initialize the BIF traverser_state.
  1321.     \*------------------------------------------------------------*/
  1322.     do_endstructure(traverser_state,NULL);
  1323.     traverser_state->nrs_state           = 1;
  1324.     traverser_state->push_level          = 0;
  1325.     traverser_state->id_active_view      = 0;
  1326.     mx_identity(vm_matrix_public[traverser_state->id_active_view]);
  1327.     mx_identity(vo_matrix_public[traverser_state->id_active_view]);
  1328.     traverser_state->currentFrame        = 0;
  1329. #ifndef REFER_STRUCTURE_EXISTS
  1330.     traverser_state->tol             = &nrs_link;
  1331.     traverser_state->eol             = &nrs_link;
  1332.     traverser_state->tol->next         = NULL;
  1333.     traverser_state->tol->data         = bench_setup.nrs_stid;
  1334. #endif /* REFER_STRUCTURE_EXISTS */
  1335.     mx_identity(traverser_state->global    );
  1336.     mx_identity(traverser_state->local     );
  1337.     mx_identity(traverser_state->composite );
  1338. }
  1339.  
  1340. /*----------------------------------------------------------------------*\
  1341. | Procedure: void bif_closwk()
  1342. |------------------------------------------------------------------------|
  1343. | Description: WORKING: closes up the workstation as well as setting up 
  1344. |        the default structure
  1345. |------------------------------------------------------------------------|
  1346. | Return: Error Code
  1347. \*----------------------------------------------------------------------*/
  1348. bif_closewk()
  1349. {
  1350. #ifdef USING_PHIGS
  1351. #ifdef TEST_PRINT
  1352.     fprintf(stderr,"Closing window %d\n",workid);
  1353.     fflush(stderr);
  1354. #endif /* ifdef TEST_PRINT */
  1355.     /* Close the non-retained structure */
  1356.     if(wk_info.phigs_open) {
  1357.     pclose_struct();
  1358.     pclose_ws((Pint)workid);
  1359.     pclose_phigs();
  1360.     }
  1361. #endif /* USING_PHIGS */
  1362. }
  1363.  
  1364. #ifdef STAND_ALONE
  1365. /*----------------------------------------------------------------------*\
  1366. | Procedure: int yyparse(void)                                           |
  1367. |------------------------------------------------------------------------|
  1368. | Description: Temporary until attached to yacc                          |
  1369. |------------------------------------------------------------------------|
  1370. | Return:  0 if ok  1 if error                                           |
  1371. \*----------------------------------------------------------------------*/
  1372. int yyparse()
  1373. {
  1374. int return_value;
  1375.     while ( (return_value = yylex()) != 0)
  1376.     {
  1377.         printf("return_token is %d its value is ",return_value);
  1378.         switch(return_value)
  1379.         {
  1380.         case UNRECOVERABLE   :
  1381.             printf(" UNRECOVERABLE\n");
  1382.             break;
  1383.         case bEOF            :
  1384.             printf(" END OF FILE 1\n");
  1385.             break;
  1386.         case REAL           :
  1387.             printf(" the float %le\n",yylval.f);
  1388.             break;
  1389.         case LONG            :
  1390.             printf(" the long  %ld\n",yylval.l);
  1391.             break;
  1392.         case QSTRING          :
  1393.             printf(" the string '%s'\n",yylval.str);
  1394.             break;
  1395.         default              :
  1396.             printf(" some default value\n");
  1397.             break;
  1398.         }
  1399.     }
  1400.         printf("return_token is %d its value is ",return_value);
  1401.         printf(" END OF FILE 2\n");
  1402.     return(0);
  1403. }
  1404. #endif /* STAND_ALONE */
  1405.