home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / vsl-lex.C < prev    next >
C/C++ Source or Header  |  1998-12-06  |  55KB  |  2,232 lines

  1. // This file was modified for -*- C++ -*-
  2. // using $RCSfile: lextoC.flex,v $ $Revision: 1.5 $
  3.  
  4. /* A lexical scanner generated by flex */
  5.  
  6. /* Scanner skeleton version:
  7.  * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
  8.  */
  9.  
  10. #define FLEX_SCANNER
  11. #define YY_FLEX_MAJOR_VERSION 2
  12. #define YY_FLEX_MINOR_VERSION 5
  13.  
  14. #include <stdio.h>
  15.  
  16.  
  17. /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
  18. #ifdef c_plusplus
  19. #ifndef __cplusplus
  20. #define __cplusplus
  21. #endif
  22. #endif
  23.  
  24.  
  25. #ifdef __cplusplus
  26.  
  27. #include <stdlib.h>
  28. #include <unistd.h>
  29.  
  30. /* Use prototypes in function declarations. */
  31. #define YY_USE_PROTOS
  32.  
  33. /* The "const" storage-class-modifier is valid. */
  34. #define YY_USE_CONST
  35.  
  36. #else    /* ! __cplusplus */
  37.  
  38. #if __STDC__
  39.  
  40. #define YY_USE_PROTOS
  41. #define YY_USE_CONST
  42.  
  43. #endif    /* __STDC__ */
  44. #endif    /* ! __cplusplus */
  45.  
  46. #ifdef __TURBOC__
  47.  #pragma warn -rch
  48.  #pragma warn -use
  49. #include <io.h>
  50. #include <stdlib.h>
  51. #define YY_USE_CONST
  52. #define YY_USE_PROTOS
  53. #endif
  54.  
  55. #ifdef YY_USE_CONST
  56. #define vslconst const
  57. #else
  58. #define vslconst
  59. #endif
  60.  
  61.  
  62. #ifdef YY_USE_PROTOS
  63. #define YY_PROTO(proto) proto
  64. #else
  65. #define YY_PROTO(proto) ()
  66. #endif
  67.  
  68. /* Returned upon end-of-file. */
  69. #define YY_NULL 0
  70.  
  71. /* Promotes a possibly negative, possibly signed char to an unsigned
  72.  * integer for use as an array index.  If the signed char is negative,
  73.  * we want to instead treat it as an 8-bit unsigned char, hence the
  74.  * double cast.
  75.  */
  76. #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
  77.  
  78. /* Enter a start condition.  This macro really ought to take a parameter,
  79.  * but we do it the disgusting crufty way forced on us by the ()-less
  80.  * definition of BEGIN.
  81.  */
  82. #define BEGIN vsl_start = 1 + 2 *
  83.  
  84. /* Translate the current start state into a value that can be later handed
  85.  * to BEGIN to return to the state.  The YYSTATE alias is for lex
  86.  * compatibility.
  87.  */
  88. #define YY_START ((vsl_start - 1) / 2)
  89. #define YYSTATE YY_START
  90.  
  91. /* Action number for EOF rule of a given start state. */
  92. #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
  93.  
  94. /* Special action meaning "start processing a new file". */
  95. #define YY_NEW_FILE vslrestart( vslin )
  96.  
  97. #define YY_END_OF_BUFFER_CHAR 0
  98.  
  99. /* Size of default input buffer. */
  100. #define YY_BUF_SIZE 16384
  101.  
  102. typedef struct vsl_buffer_state *YY_BUFFER_STATE;
  103.  
  104. // extern int vslleng;
  105. // extern FILE *vslin, *vslout;
  106.  
  107. #define EOB_ACT_CONTINUE_SCAN 0
  108. #define EOB_ACT_END_OF_FILE 1
  109. #define EOB_ACT_LAST_MATCH 2
  110.  
  111. /* The funky do-while in the following #define is used to turn the definition
  112.  * int a single C statement (which needs a semi-colon terminator).  This
  113.  * avoids problems with code like:
  114.  *
  115.  *     if ( condition_holds )
  116.  *        vslless( 5 );
  117.  *    else
  118.  *        do_something_else();
  119.  *
  120.  * Prior to using the do-while the compiler would get upset at the
  121.  * "else" because it interpreted the "if" statement as being all
  122.  * done when it reached the ';' after the vslless() call.
  123.  */
  124.  
  125. /* Return all but the first 'n' matched characters back to the input stream. */
  126.  
  127. #define vslless(n) \
  128.     do \
  129.         { \
  130.         /* Undo effects of setting up vsltext. */ \
  131.         *vsl_cp = vsl_hold_char; \
  132.         YY_RESTORE_YY_MORE_OFFSET \
  133.         vsl_c_buf_p = vsl_cp = vsl_bp + n - YY_MORE_ADJ; \
  134.         YY_DO_BEFORE_ACTION; /* set up vsltext again */ \
  135.         } \
  136.     while ( 0 )
  137.  
  138. #define unput(c) vslunput( c, vsltext_ptr )
  139.  
  140. /* The following is because we cannot portably get our hands on size_t
  141.  * (without autoconf's help, which isn't available because we want
  142.  * flex-generated scanners to compile on their own).
  143.  */
  144. typedef unsigned int vsl_size_t;
  145.  
  146.  
  147. struct vsl_buffer_state
  148.     {
  149.     FILE *vsl_input_file;
  150.  
  151.     char *vsl_ch_buf;        /* input buffer */
  152.     char *vsl_buf_pos;        /* current position in input buffer */
  153.  
  154.     /* Size of input buffer in bytes, not including room for EOB
  155.      * characters.
  156.      */
  157.     vsl_size_t vsl_buf_size;
  158.  
  159.     /* Number of characters read into vsl_ch_buf, not including EOB
  160.      * characters.
  161.      */
  162.     int vsl_n_chars;
  163.  
  164.     /* Whether we "own" the buffer - i.e., we know we created it,
  165.      * and can realloc() it to grow it, and should free() it to
  166.      * delete it.
  167.      */
  168.     int vsl_is_our_buffer;
  169.  
  170.     /* Whether this is an "interactive" input source; if so, and
  171.      * if we're using stdio for input, then we want to use getc()
  172.      * instead of fread(), to make sure we stop fetching input after
  173.      * each newline.
  174.      */
  175.     int vsl_is_interactive;
  176.  
  177.     /* Whether we're considered to be at the beginning of a line.
  178.      * If so, '^' rules will be active on the next match, otherwise
  179.      * not.
  180.      */
  181.     int vsl_at_bol;
  182.  
  183.     /* Whether to try to fill the input buffer when we reach the
  184.      * end of it.
  185.      */
  186.     int vsl_fill_buffer;
  187.  
  188.     int vsl_buffer_status;
  189. #define YY_BUFFER_NEW 0
  190. #define YY_BUFFER_NORMAL 1
  191.     /* When an EOF's been seen but there's still some text to process
  192.      * then we mark the buffer as YY_EOF_PENDING, to indicate that we
  193.      * shouldn't try reading from the input source any more.  We might
  194.      * still have a bunch of tokens to match, though, because of
  195.      * possible backing-up.
  196.      *
  197.      * When we actually see the EOF, we change the status to "new"
  198.      * (via vslrestart()), so that the user can continue scanning by
  199.      * just pointing vslin at a new input file.
  200.      */
  201. #define YY_BUFFER_EOF_PENDING 2
  202.     };
  203.  
  204. static YY_BUFFER_STATE vsl_current_buffer = 0;
  205.  
  206. /* We provide macros for accessing buffer states in case in the
  207.  * future we want to put the buffer states in a more general
  208.  * "scanner state".
  209.  */
  210. #define YY_CURRENT_BUFFER vsl_current_buffer
  211.  
  212.  
  213. /* vsl_hold_char holds the character lost when vsltext is formed. */
  214. static char vsl_hold_char;
  215.  
  216. static int vsl_n_chars;        /* number of characters read into vsl_ch_buf */
  217.  
  218.  
  219. int vslleng;
  220.  
  221. /* Points to current character in buffer. */
  222. static char *vsl_c_buf_p = (char *) 0;
  223. static int vsl_init = 1;        /* whether we need to initialize */
  224. static int vsl_start = 0;    /* start state number */
  225.  
  226. /* Flag which is used to allow vslwrap()'s to do buffer switches
  227.  * instead of setting up a fresh vslin.  A bit of a hack ...
  228.  */
  229. static int vsl_did_buffer_switch_on_eof;
  230.  
  231. void vslrestart YY_PROTO(( FILE *input_file ));
  232.  
  233. void vsl_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
  234. void vsl_load_buffer_state YY_PROTO(( void ));
  235. YY_BUFFER_STATE vsl_create_buffer YY_PROTO(( FILE *file, int size ));
  236. void vsl_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
  237. void vsl_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
  238. void vsl_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
  239. #define YY_FLUSH_BUFFER vsl_flush_buffer( vsl_current_buffer )
  240.  
  241. YY_BUFFER_STATE vsl_scan_buffer YY_PROTO(( char *base, vsl_size_t size ));
  242. YY_BUFFER_STATE vsl_scan_string YY_PROTO(( vslconst char *vsl_str ));
  243. YY_BUFFER_STATE vsl_scan_bytes YY_PROTO(( vslconst char *bytes, int len ));
  244.  
  245. static void *vsl_flex_alloc YY_PROTO(( vsl_size_t ));
  246. static void *vsl_flex_realloc YY_PROTO(( void *, vsl_size_t ));
  247. static void vsl_flex_free YY_PROTO(( void * ));
  248.  
  249. #define vsl_new_buffer vsl_create_buffer
  250.  
  251. #define vsl_set_interactive(is_interactive) \
  252.     { \
  253.     if ( ! vsl_current_buffer ) \
  254.         vsl_current_buffer = vsl_create_buffer( vslin, YY_BUF_SIZE ); \
  255.     vsl_current_buffer->vsl_is_interactive = is_interactive; \
  256.     }
  257.  
  258. #define vsl_set_bol(at_bol) \
  259.     { \
  260.     if ( ! vsl_current_buffer ) \
  261.         vsl_current_buffer = vsl_create_buffer( vslin, YY_BUF_SIZE ); \
  262.     vsl_current_buffer->vsl_at_bol = at_bol; \
  263.     }
  264.  
  265. #define YY_AT_BOL() (vsl_current_buffer->vsl_at_bol)
  266.  
  267. typedef unsigned char YY_CHAR;
  268. FILE *vslin = (FILE *) 0, *vslout = (FILE *) 0;
  269. typedef int vsl_state_type;
  270. // extern char *vsltext;
  271. #define vsltext_ptr vsltext
  272.  
  273. static vsl_state_type vsl_get_previous_state YY_PROTO(( void ));
  274. static vsl_state_type vsl_try_NUL_trans YY_PROTO(( vsl_state_type current_state ));
  275. static int vsl_get_next_buffer YY_PROTO(( void ));
  276. static void vsl_fatal_error YY_PROTO(( vslconst char msg[] ));
  277.  
  278. /* Done after the current pattern has been matched and before the
  279.  * corresponding action - sets up vsltext.
  280.  */
  281. #define YY_DO_BEFORE_ACTION \
  282.     vsltext_ptr = vsl_bp; \
  283.     vslleng = (int) (vsl_cp - vsl_bp); \
  284.     vsl_hold_char = *vsl_cp; \
  285.     *vsl_cp = '\0'; \
  286.     vsl_c_buf_p = vsl_cp;
  287.  
  288. #define YY_NUM_RULES 44
  289. #define YY_END_OF_BUFFER 45
  290. static vslconst short int vsl_accept[149] =
  291.     {   0,
  292.        41,   41,   45,   43,   41,   42,   43,   29,   43,   43,
  293.        43,   40,   28,   37,   33,   35,   25,   31,   25,   25,
  294.        25,   25,   25,   25,   25,   25,   25,   30,   32,   41,
  295.        43,   41,    0,    1,    0,   26,    0,    3,    2,   40,
  296.        27,   38,   34,   36,   25,   25,   25,   18,   14,   23,
  297.        25,   25,   19,   25,   25,   41,    0,    0,    4,    0,
  298.         0,    0,    0,    0,    0,    0,    1,    0,   39,    2,
  299.        20,   25,   22,   21,   25,   25,    4,    0,    0,    0,
  300.         0,    0,    0,   16,   25,   15,   25,    0,    0,    0,
  301.         0,    0,    0,   17,   24,    0,    0,    0,    0,    0,
  302.  
  303.         0,    0,    7,    0,    0,    0,    9,    0,    7,    7,
  304.         0,    0,    0,    0,    0,    0,    0,    0,    0,   10,
  305.         0,    0,    0,    8,    0,    0,    0,    0,    5,    0,
  306.         6,    0,    0,    0,    5,    6,    0,    0,    0,    0,
  307.         0,   12,    0,    0,    0,   13,   11,    0
  308.     } ;
  309.  
  310. static vslconst int vsl_ec[256] =
  311.     {   0,
  312.         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
  313.         1,    2,    1,    1,    1,    1,    1,    1,    1,    1,
  314.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  315.         1,    2,    4,    5,    6,    1,    1,    7,    1,    1,
  316.         1,    8,    1,    1,    9,   10,   11,   12,   12,   12,
  317.        12,   12,   12,   12,   12,   12,   12,   13,    1,   14,
  318.        15,   16,    1,    1,   17,   17,   17,   17,   17,   17,
  319.        17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
  320.        17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
  321.         1,   18,    1,   19,   17,    1,   20,   17,   21,   22,
  322.  
  323.        23,   24,   25,   26,   27,   17,   17,   28,   29,   30,
  324.        31,   32,   17,   33,   34,   35,   36,   37,   38,   17,
  325.        17,   17,    1,   39,    1,   40,    1,    1,    1,    1,
  326.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  327.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  328.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  329.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  330.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  331.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  332.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  333.  
  334.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  335.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  336.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  337.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  338.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  339.         1,    1,    1,    1,    1
  340.     } ;
  341.  
  342. static vslconst int vsl_meta[41] =
  343.     {   0,
  344.         1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
  345.         1,    3,    1,    1,    1,    1,    3,    1,    1,    3,
  346.         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
  347.         3,    3,    3,    3,    3,    3,    3,    3,    1,    1
  348.     } ;
  349.  
  350. static vslconst short int vsl_base[159] =
  351.     {   0,
  352.         0,   39,  191,  192,  188,  192,   37,  192,  173,  178,
  353.        35,  175,  173,   32,  192,  170,    0,  192,  154,  155,
  354.       155,   20,  158,  149,  146,  152,  151,  192,  192,   47,
  355.        54,  174,   46,  192,   47,  192,  165,  192,    0,  162,
  356.       192,  192,  192,  192,    0,  151,  138,    0,    0,    0,
  357.       136,  135,    0,  146,  145,   55,    0,  163,    0,  136,
  358.       138,  127,  130,  139,  131,   49,   54,   55,  192,    0,
  359.         0,   39,    0,    0,  130,  126,    0,  137,  127,  133,
  360.       135,  122,  131,    0,  128,    0,  128,  122,  126,  115,
  361.       122,  118,  122,    0,    0,  108,  141,  109,  112,  120,
  362.  
  363.       115,  116,  135,  109,  115,  113,  192,  110,    0,  130,
  364.       109,   61,  106,   66,  103,   67,   86,   97,   87,  192,
  365.        74,  109,   95,  192,   85,   73,   80,   96,    0,   83,
  366.         0,   63,   67,   70,    0,    0,   58,   69,   60,   56,
  367.        57,  192,   55,   52,   51,  192,  192,  192,  103,   67,
  368.       106,  109,  112,  115,  118,  121,  124,  127
  369.     } ;
  370.  
  371. static vslconst short int vsl_def[159] =
  372.     {   0,
  373.       148,    1,  148,  148,  148,  148,  149,  148,  148,  148,
  374.       148,  148,  148,  148,  148,  148,  150,  148,  150,  150,
  375.       150,  150,  150,  150,  150,  150,  150,  148,  148,  148,
  376.       148,  148,  149,  148,  151,  148,  148,  148,  152,  148,
  377.       148,  148,  148,  148,  150,  150,  150,  150,  150,  150,
  378.       150,  150,  150,  150,  150,  148,   31,   31,  153,  148,
  379.       148,  148,  148,  148,  148,  149,  149,  151,  148,  152,
  380.       150,  150,  150,  150,  150,  150,  153,  148,  148,  148,
  381.       148,  148,  148,  150,  150,  150,  150,  148,  148,  148,
  382.       148,  148,  148,  150,  150,  148,  148,  148,  148,  148,
  383.  
  384.       148,  148,  154,  148,  148,  148,  148,  148,  154,  154,
  385.       148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
  386.       148,  155,  156,  148,  148,  148,  148,  155,  157,  156,
  387.       158,  148,  148,  148,  157,  158,  148,  148,  148,  148,
  388.       148,  148,  148,  148,  148,  148,  148,    0,  148,  148,
  389.       148,  148,  148,  148,  148,  148,  148,  148
  390.     } ;
  391.  
  392. static vslconst short int vsl_nxt[233] =
  393.     {   0,
  394.         4,    5,    6,    4,    7,    4,    8,    4,    9,   10,
  395.        11,   12,   13,   14,   15,   16,   17,    4,   18,   19,
  396.        17,   17,   20,   21,   17,   17,   22,   23,   17,   24,
  397.        25,   17,   17,   17,   26,   17,   17,   27,   28,   29,
  398.        30,   34,   38,   49,   31,   39,   42,   43,   56,   50,
  399.        34,   67,   57,   34,   35,   58,   56,   59,   34,   67,
  400.        57,   84,  116,   35,   68,   85,   35,  121,  116,   45,
  401.       122,   35,   68,  147,  146,  121,  145,  144,  122,  123,
  402.        60,   61,  143,  142,   62,   63,   64,  123,  141,   65,
  403.       140,  117,  139,  118,  138,  137,  119,  117,  131,  118,
  404.  
  405.       129,  134,  119,   33,  133,   33,   66,  132,   66,   70,
  406.       131,   70,   77,  129,   77,  109,  127,  109,  128,  126,
  407.       128,  130,  125,  130,  135,  124,  135,  136,  120,  136,
  408.       115,  110,  114,  113,  112,  111,  110,  108,  107,  106,
  409.       105,  104,  103,  102,  101,  100,   99,   98,   97,   96,
  410.        95,   94,   93,   92,   91,   90,   89,   88,   87,   86,
  411.        83,   82,   81,   80,   79,   78,  148,   76,   75,   74,
  412.        73,   72,   71,   40,   69,   32,   55,   54,   53,   52,
  413.        51,   48,   47,   46,   44,   41,   40,   37,   36,   32,
  414.       148,    3,  148,  148,  148,  148,  148,  148,  148,  148,
  415.  
  416.       148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
  417.       148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
  418.       148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
  419.       148,  148
  420.     } ;
  421.  
  422. static vslconst short int vsl_chk[233] =
  423.     {   0,
  424.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  425.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  426.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  427.         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
  428.         2,    7,   11,   22,    2,   11,   14,   14,   30,   22,
  429.        33,   35,   30,   66,    7,   31,   56,   31,   67,   68,
  430.        56,   72,  112,   33,   35,   72,   66,  114,  116,  150,
  431.       114,   67,   68,  145,  144,  121,  143,  141,  121,  114,
  432.        31,   31,  140,  139,   31,   31,   31,  121,  138,   31,
  433.       137,  112,  134,  112,  133,  132,  112,  116,  130,  116,
  434.  
  435.       128,  127,  116,  149,  126,  149,  151,  125,  151,  152,
  436.       123,  152,  153,  122,  153,  154,  119,  154,  155,  118,
  437.       155,  156,  117,  156,  157,  115,  157,  158,  113,  158,
  438.       111,  110,  108,  106,  105,  104,  103,  102,  101,  100,
  439.        99,   98,   97,   96,   93,   92,   91,   90,   89,   88,
  440.        87,   85,   83,   82,   81,   80,   79,   78,   76,   75,
  441.        65,   64,   63,   62,   61,   60,   58,   55,   54,   52,
  442.        51,   47,   46,   40,   37,   32,   27,   26,   25,   24,
  443.        23,   21,   20,   19,   16,   13,   12,   10,    9,    5,
  444.         3,  148,  148,  148,  148,  148,  148,  148,  148,  148,
  445.  
  446.       148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
  447.       148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
  448.       148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
  449.       148,  148
  450.     } ;
  451.  
  452. static vsl_state_type vsl_last_accepting_state;
  453. static char *vsl_last_accepting_cpos;
  454.  
  455. /* The intent behind this definition is that it'll catch
  456.  * any uses of REJECT which flex missed.
  457.  */
  458. #define REJECT reject_used_but_not_detected
  459. #define vslmore() vslmore_used_but_not_detected
  460. #define YY_MORE_ADJ 0
  461. #define YY_RESTORE_YY_MORE_OFFSET
  462. char *vsltext;
  463. #line 1 "./vsl-lex.L"
  464. #define INITIAL 0
  465. /* $Id: vsl-lex.L,v 1.21 1998/11/23 17:43:48 zeller Exp $ -*- C++ -*- */
  466. /* VSL lexical analysis */
  467. #line 5 "./vsl-lex.L"
  468. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  469. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  470. // 
  471. // This file is part of DDD.
  472. // 
  473. // DDD is free software; you can redistribute it and/or
  474. // modify it under the terms of the GNU General Public
  475. // License as published by the Free Software Foundation; either
  476. // version 2 of the License, or (at your option) any later version.
  477. // 
  478. // DDD is distributed in the hope that it will be useful,
  479. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  480. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  481. // See the GNU General Public License for more details.
  482. // 
  483. // You should have received a copy of the GNU General Public
  484. // License along with DDD -- see the file COPYING.
  485. // If not, write to the Free Software Foundation, Inc.,
  486. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  487. // 
  488. // DDD is the data display debugger.
  489. // For details, see the DDD World-Wide-Web page, 
  490. // `http://www.cs.tu-bs.de/softech/ddd/',
  491. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  492.  
  493. char VSL_lex_rcsid[] = 
  494.     "$Id: vsl-lex.L,v 1.21 1998/11/23 17:43:48 zeller Exp $";
  495.  
  496. // Define BAD_ISTREAM != 0, if istream::open() aborts upon
  497. // non-existing file
  498. #define BAD_ISTREAM 1
  499.  
  500. #include <stdio.h>
  501. #include <errno.h>
  502. #include "strclass.h"
  503.  
  504. static const int max_include_nesting = 40;    // max include nesting
  505.  
  506. static istream    *streamstack[max_include_nesting]; // File descriptors
  507. static string    namestack[max_include_nesting];       // File names
  508. static int    linestack[max_include_nesting];       // File lines
  509. static int    topstack = 0;               // Next free position
  510.  
  511. #ifdef FLEX_SCANNER
  512. static YY_BUFFER_STATE bufstack[max_include_nesting]; // Buffer states
  513. #endif
  514.  
  515. static istream *vslstream = &cin;
  516.  
  517. static int vsllinenumber;
  518.  
  519. static int switchdown();
  520. static int switchup(char *filename, bool thisdir);
  521.  
  522. static char pushback[BUFSIZ];
  523. static char *pushback_ptr = pushback;
  524.  
  525. inline int do_unput(char c) 
  526. {
  527.     if (c != '\0')
  528.     *pushback_ptr++ = c;
  529.  
  530.     return c;
  531. }
  532.  
  533. static int do_input() 
  534. {
  535.     if (pushback_ptr != pushback)
  536.     return *--pushback_ptr;
  537.  
  538.     char c;
  539.  
  540.     vslstream->get(c);
  541.     if (vslstream->eof())
  542.     return 0;
  543.  
  544.     if (c == '\n')
  545.     vsllinenumber++;
  546.     return c;
  547. }
  548.  
  549. // The way SUN lex wants input
  550. #ifdef input
  551. #undef input
  552. #define input do_input
  553. #endif
  554.  
  555. #ifdef unput
  556. #undef unput
  557. #define unput do_unput
  558. #endif
  559.  
  560. // The way FLEX wants input
  561. #ifdef FLEX_SCANNER
  562. #undef YY_INPUT
  563. #define YY_INPUT(buf, result, max_size) \
  564. {\
  565.     int c = do_input(); \
  566.     result = (c == '\0') ? YY_NULL : (buf[0] = c, 1); \
  567. }
  568. #endif
  569.  
  570. #undef vslwrap
  571. #define YY_SKIP_YYWRAP
  572. extern "C" int vslwrap() 
  573.     if (switchdown())
  574.     return 1;
  575.     return vslstream->eof();
  576. }
  577.  
  578.  
  579. // Anything not in the list is a single character
  580. #ifdef ECHO
  581. #undef ECHO
  582. #endif
  583. #define ECHO                 return vsltext[0]
  584.  
  585.  
  586. #ifdef FLEX_SCANNER
  587. // #defining YY_BREAK to empty disables warnings about unreachable breaks.
  588. #define YY_BREAK DO_NOT_BREAK
  589. #define DO_NOT_BREAK
  590. #define BREAK break;
  591. #endif // FLEX_SCANNER
  592.  
  593. /* C-Bezeichner */
  594. /* C-Strings */
  595. /* C-Integers */
  596. /* #include-Strings */
  597. /* Whitespace */
  598. #line 597 "lex.vsl.c"
  599.  
  600. /* Macros after this point can all be overridden by user definitions in
  601.  * section 1.
  602.  */
  603.  
  604. #ifndef YY_SKIP_YYWRAP
  605. #ifdef __cplusplus
  606. extern "C" int vslwrap YY_PROTO(( void ));
  607. #else
  608. extern int vslwrap YY_PROTO(( void ));
  609. #endif
  610. #endif
  611.  
  612. #ifndef YY_NO_UNPUT
  613. static void vslunput YY_PROTO(( int c, char *buf_ptr ));
  614. #endif
  615.  
  616. #ifndef vsltext_ptr
  617. static void vsl_flex_strncpy YY_PROTO(( char *, vslconst char *, int ));
  618. #endif
  619.  
  620. #ifdef YY_NEED_STRLEN
  621. static int vsl_flex_strlen YY_PROTO(( vslconst char * ));
  622. #endif
  623.  
  624. #ifndef YY_NO_INPUT
  625. #ifdef __cplusplus
  626. static int vslinput YY_PROTO(( void ));
  627. #else
  628. static int input YY_PROTO(( void ));
  629. #endif
  630. #endif
  631.  
  632. #if YY_STACK_USED
  633. static int vsl_start_stack_ptr = 0;
  634. static int vsl_start_stack_depth = 0;
  635. static int *vsl_start_stack = 0;
  636. #ifndef YY_NO_PUSH_STATE
  637. static void vsl_push_state YY_PROTO(( int new_state ));
  638. #endif
  639. #ifndef YY_NO_POP_STATE
  640. static void vsl_pop_state YY_PROTO(( void ));
  641. #endif
  642. #ifndef YY_NO_TOP_STATE
  643. static int vsl_top_state YY_PROTO(( void ));
  644. #endif
  645.  
  646. #else
  647. #define YY_NO_PUSH_STATE 1
  648. #define YY_NO_POP_STATE 1
  649. #define YY_NO_TOP_STATE 1
  650. #endif
  651.  
  652. #ifdef YY_MALLOC_DECL
  653. YY_MALLOC_DECL
  654. #else
  655. #if __STDC__
  656. #ifndef __cplusplus
  657. #include <stdlib.h>
  658. #endif
  659. #else
  660. /* Just try to get by without declaring the routines.  This will fail
  661.  * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
  662.  * or sizeof(void*) != sizeof(int).
  663.  */
  664. #endif
  665. #endif
  666.  
  667. /* Amount of stuff to slurp up with each read. */
  668. #ifndef YY_READ_BUF_SIZE
  669. #define YY_READ_BUF_SIZE 8192
  670. #endif
  671.  
  672. /* Copy whatever the last rule matched to the standard output. */
  673.  
  674. #ifndef ECHO
  675. /* This used to be an fputs(), but since the string might contain NUL's,
  676.  * we now use fwrite().
  677.  */
  678. #define ECHO (void) fwrite( vsltext, vslleng, 1, vslout )
  679. #endif
  680.  
  681. /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
  682.  * is returned in "result".
  683.  */
  684. #ifndef YY_INPUT
  685. #define YY_INPUT(buf,result,max_size) \
  686.     if ( vsl_current_buffer->vsl_is_interactive ) \
  687.         { \
  688.         int c = '*', n; \
  689.         for ( n = 0; n < max_size && \
  690.                  (c = getc( vslin )) != EOF && c != '\n'; ++n ) \
  691.             buf[n] = (char) c; \
  692.         if ( c == '\n' ) \
  693.             buf[n++] = (char) c; \
  694.         if ( c == EOF && ferror( vslin ) ) \
  695.             YY_FATAL_ERROR( "input in flex scanner failed" ); \
  696.         result = n; \
  697.         } \
  698.     else if ( ((result = fread( buf, 1, max_size, vslin )) == 0) \
  699.           && ferror( vslin ) ) \
  700.         YY_FATAL_ERROR( "input in flex scanner failed" );
  701. #endif
  702.  
  703. /* No semi-colon after return; correct usage is to write "vslterminate();" -
  704.  * we don't want an extra ';' after the "return" because that will cause
  705.  * some compilers to complain about unreachable statements.
  706.  */
  707. #ifndef vslterminate
  708. #define vslterminate() return YY_NULL
  709. #endif
  710.  
  711. /* Number of entries by which start-condition stack grows. */
  712. #ifndef YY_START_STACK_INCR
  713. #define YY_START_STACK_INCR 25
  714. #endif
  715.  
  716. /* Report a fatal error. */
  717. #ifndef YY_FATAL_ERROR
  718. #define YY_FATAL_ERROR(msg) vsl_fatal_error( msg )
  719. #endif
  720.  
  721. /* Default declaration of generated scanner - a define so the user can
  722.  * easily add parameters.
  723.  */
  724. #ifndef YY_DECL
  725. #define YY_DECL int vsllex YY_PROTO(( void ))
  726. #endif
  727.  
  728. /* Code executed at the beginning of each rule, after vsltext and vslleng
  729.  * have been set up.
  730.  */
  731. #ifndef YY_USER_ACTION
  732. #define YY_USER_ACTION
  733. #endif
  734.  
  735. /* Code executed at the end of each rule. */
  736. #ifndef YY_BREAK
  737. #define YY_BREAK break;
  738. #endif
  739.  
  740. #define YY_RULE_SETUP \
  741.     if ( vslleng > 0 ) \
  742.         vsl_current_buffer->vsl_at_bol = \
  743.                 (vsltext[vslleng - 1] == '\n'); \
  744.     YY_USER_ACTION
  745.  
  746. YY_DECL
  747.     {
  748.     register vsl_state_type vsl_current_state;
  749.     register char *vsl_cp, *vsl_bp;
  750.     register int vsl_act;
  751.  
  752. #line 149 "./vsl-lex.L"
  753.  
  754.  
  755. #line 754 "lex.vsl.c"
  756.  
  757.     if ( vsl_init )
  758.         {
  759.         vsl_init = 0;
  760.  
  761. #ifdef YY_USER_INIT
  762.         YY_USER_INIT;
  763. #endif
  764.  
  765.         if ( ! vsl_start )
  766.             vsl_start = 1;    /* first start state */
  767.  
  768.         if ( ! vslin )
  769.             vslin = stdin;
  770.  
  771.         if ( ! vslout )
  772.             vslout = stdout;
  773.  
  774.         if ( ! vsl_current_buffer )
  775.             vsl_current_buffer =
  776.                 vsl_create_buffer( vslin, YY_BUF_SIZE );
  777.  
  778.         vsl_load_buffer_state();
  779.         }
  780.  
  781.     while ( 1 )        /* loops until end-of-file is reached */
  782.         {
  783.         vsl_cp = vsl_c_buf_p;
  784.  
  785.         /* Support of vsltext. */
  786.         *vsl_cp = vsl_hold_char;
  787.  
  788.         /* vsl_bp points to the position in vsl_ch_buf of the start of
  789.          * the current run.
  790.          */
  791.         vsl_bp = vsl_cp;
  792.  
  793.         vsl_current_state = vsl_start;
  794.         vsl_current_state += YY_AT_BOL();
  795. vsl_match:
  796.         do
  797.             {
  798.             register YY_CHAR vsl_c = vsl_ec[YY_SC_TO_UI(*vsl_cp)];
  799.             if ( vsl_accept[vsl_current_state] )
  800.                 {
  801.                 vsl_last_accepting_state = vsl_current_state;
  802.                 vsl_last_accepting_cpos = vsl_cp;
  803.                 }
  804.             while ( vsl_chk[vsl_base[vsl_current_state] + vsl_c] != vsl_current_state )
  805.                 {
  806.                 vsl_current_state = (int) vsl_def[vsl_current_state];
  807.                 if ( vsl_current_state >= 149 )
  808.                     vsl_c = vsl_meta[(unsigned int) vsl_c];
  809.                 }
  810.             vsl_current_state = vsl_nxt[vsl_base[vsl_current_state] + (unsigned int) vsl_c];
  811.             ++vsl_cp;
  812.             }
  813.         while ( vsl_base[vsl_current_state] != 192 );
  814.  
  815. vsl_find_action:
  816.         vsl_act = vsl_accept[vsl_current_state];
  817.         if ( vsl_act == 0 )
  818.             { /* have to back up */
  819.             vsl_cp = vsl_last_accepting_cpos;
  820.             vsl_current_state = vsl_last_accepting_state;
  821.             vsl_act = vsl_accept[vsl_current_state];
  822.             }
  823.  
  824.         YY_DO_BEFORE_ACTION;
  825.  
  826.  
  827. do_action:    /* This label is used only to access EOF actions. */
  828.  
  829.  
  830.         switch ( vsl_act )
  831.     { /* beginning of action switch */
  832.             case 0: /* must back up */
  833.             /* undo the effects of YY_DO_BEFORE_ACTION */
  834.             *vsl_cp = vsl_hold_char;
  835.             vsl_cp = vsl_last_accepting_cpos;
  836.             vsl_current_state = vsl_last_accepting_state;
  837.             goto vsl_find_action;
  838.  
  839. case 1:
  840. YY_RULE_SETUP
  841. #line 151 "./vsl-lex.L"
  842. return STRING;            // string
  843.     YY_BREAK
  844. case 2:
  845. YY_RULE_SETUP
  846. #line 153 "./vsl-lex.L"
  847. BREAK                // C++ comment
  848.     YY_BREAK
  849. case 3:
  850. YY_RULE_SETUP
  851. #line 154 "./vsl-lex.L"
  852. {                // C comment
  853.             // aus `man lex`
  854.             loop:
  855.             while (vslinput() != '*');
  856.             switch (vslinput())
  857.                 {
  858.                 case '/': break;
  859.                 case '*': unput('*');
  860.                 default : goto loop;
  861.                 }
  862.             BREAK
  863.         }
  864.     YY_BREAK
  865. case 4:
  866. YY_RULE_SETUP
  867. #line 166 "./vsl-lex.L"
  868. BREAK            // Unix exec() tag
  869.     YY_BREAK
  870. case 5:
  871. YY_RULE_SETUP
  872. #line 168 "./vsl-lex.L"
  873. {            // #include "..."
  874.             char buf[BUFSIZ];
  875.             strcpy(buf, (char *)vsltext);
  876.             char *start = buf;
  877.             while (*start != '\"') 
  878.                 start++;
  879.             char *end = ++start;
  880.             while (*end != '\"') 
  881.                 end++;
  882.             *end = '\0';
  883.             switchup(start, true);
  884.             BREAK
  885.         }
  886.     YY_BREAK
  887. case 6:
  888. YY_RULE_SETUP
  889. #line 181 "./vsl-lex.L"
  890. {            // #include <...>
  891.             char buf[BUFSIZ];
  892.             strcpy(buf, (char *)vsltext);
  893.             char *start = buf;
  894.             while (*start != '<') 
  895.                 start++;
  896.             char *end = ++start;
  897.             while (*end != '>') 
  898.                 end++;
  899.             *end = '\0';
  900.             switchup(start, false);
  901.             BREAK
  902.         }
  903.     YY_BREAK
  904. case 7:
  905. YY_RULE_SETUP
  906. #line 194 "./vsl-lex.L"
  907. {            // #line LINE ["FILE"]
  908.             string buf((char *)vsltext);
  909.             buf = buf.after("line");
  910.             char *s = (char *)buf.chars();
  911.             int line = strtol(s, &s, 10);
  912.             if (s == buf.chars())
  913.                 VSLLib::parse_error("illegal #line number");
  914.             else
  915.                 vsllinenumber = line;
  916.  
  917.             buf = buf.after('"');
  918.             if (buf != "")
  919.             {
  920.                 buf = buf.before('"');
  921.                 if (buf == "")
  922.                 VSLLib::parse_error("illegal #line file");
  923.                 else
  924.                 vslfilename = uncook(buf);
  925.             }
  926.             BREAK
  927.         }
  928.     YY_BREAK
  929. case 8:
  930. YY_RULE_SETUP
  931. #line 216 "./vsl-lex.L"
  932. return OVERRIDE;        // Other manipulators
  933.     YY_BREAK
  934. case 9:
  935. YY_RULE_SETUP
  936. #line 217 "./vsl-lex.L"
  937. return OVERRIDE;
  938.     YY_BREAK
  939. case 10:
  940. YY_RULE_SETUP
  941. #line 218 "./vsl-lex.L"
  942. return REPLACE;
  943.     YY_BREAK
  944. case 11:
  945. YY_RULE_SETUP
  946. #line 219 "./vsl-lex.L"
  947. return OVERRIDE;    // Other manipulators
  948.     YY_BREAK
  949. case 12:
  950. YY_RULE_SETUP
  951. #line 220 "./vsl-lex.L"
  952. return OVERRIDE;
  953.     YY_BREAK
  954. case 13:
  955. YY_RULE_SETUP
  956. #line 221 "./vsl-lex.L"
  957. return REPLACE;
  958.     YY_BREAK
  959. case 14:
  960. YY_RULE_SETUP
  961. #line 223 "./vsl-lex.L"
  962. return IF;            // Tokens
  963.     YY_BREAK
  964. case 15:
  965. YY_RULE_SETUP
  966. #line 224 "./vsl-lex.L"
  967. return THEN;
  968.     YY_BREAK
  969. case 16:
  970. YY_RULE_SETUP
  971. #line 225 "./vsl-lex.L"
  972. return ELSE;
  973.     YY_BREAK
  974. case 17:
  975. YY_RULE_SETUP
  976. #line 226 "./vsl-lex.L"
  977. return ELSIF;
  978.     YY_BREAK
  979. case 18:
  980. YY_RULE_SETUP
  981. #line 227 "./vsl-lex.L"
  982. return FI;
  983.     YY_BREAK
  984. case 19:
  985. YY_RULE_SETUP
  986. #line 228 "./vsl-lex.L"
  987. return OR;
  988.     YY_BREAK
  989. case 20:
  990. YY_RULE_SETUP
  991. #line 229 "./vsl-lex.L"
  992. return AND;
  993.     YY_BREAK
  994. case 21:
  995. YY_RULE_SETUP
  996. #line 230 "./vsl-lex.L"
  997. return NOT;
  998.     YY_BREAK
  999. case 22:
  1000. YY_RULE_SETUP
  1001. #line 231 "./vsl-lex.L"
  1002. return LET;
  1003.     YY_BREAK
  1004. case 23:
  1005. YY_RULE_SETUP
  1006. #line 232 "./vsl-lex.L"
  1007. return IN;
  1008.     YY_BREAK
  1009. case 24:
  1010. YY_RULE_SETUP
  1011. #line 233 "./vsl-lex.L"
  1012. return WHERE;
  1013.     YY_BREAK
  1014. case 25:
  1015. YY_RULE_SETUP
  1016. #line 234 "./vsl-lex.L"
  1017. return IDENTIFIER;
  1018.     YY_BREAK
  1019. case 26:
  1020. YY_RULE_SETUP
  1021. #line 236 "./vsl-lex.L"
  1022. return ARROW;
  1023.     YY_BREAK
  1024. case 27:
  1025. YY_RULE_SETUP
  1026. #line 237 "./vsl-lex.L"
  1027. return CONS;
  1028.     YY_BREAK
  1029. case 28:
  1030. YY_RULE_SETUP
  1031. #line 238 "./vsl-lex.L"
  1032. return APPEND;
  1033.     YY_BREAK
  1034. case 29:
  1035. YY_RULE_SETUP
  1036. #line 239 "./vsl-lex.L"
  1037. return HALIGN;
  1038.     YY_BREAK
  1039. case 30:
  1040. YY_RULE_SETUP
  1041. #line 240 "./vsl-lex.L"
  1042. return VALIGN;
  1043.     YY_BREAK
  1044. case 31:
  1045. YY_RULE_SETUP
  1046. #line 241 "./vsl-lex.L"
  1047. return UALIGN;
  1048.     YY_BREAK
  1049. case 32:
  1050. YY_RULE_SETUP
  1051. #line 242 "./vsl-lex.L"
  1052. return TALIGN;
  1053.     YY_BREAK
  1054. case 33:
  1055. YY_RULE_SETUP
  1056. #line 243 "./vsl-lex.L"
  1057. return EQ;
  1058.     YY_BREAK
  1059. case 34:
  1060. YY_RULE_SETUP
  1061. #line 244 "./vsl-lex.L"
  1062. return NE;
  1063.     YY_BREAK
  1064. case 35:
  1065. YY_RULE_SETUP
  1066. #line 245 "./vsl-lex.L"
  1067. return GT;
  1068.     YY_BREAK
  1069. case 36:
  1070. YY_RULE_SETUP
  1071. #line 246 "./vsl-lex.L"
  1072. return GE;
  1073.     YY_BREAK
  1074. case 37:
  1075. YY_RULE_SETUP
  1076. #line 247 "./vsl-lex.L"
  1077. return LT;
  1078.     YY_BREAK
  1079. case 38:
  1080. YY_RULE_SETUP
  1081. #line 248 "./vsl-lex.L"
  1082. return LE;
  1083.     YY_BREAK
  1084. case 39:
  1085. YY_RULE_SETUP
  1086. #line 250 "./vsl-lex.L"
  1087. return THREEDOTS;
  1088.     YY_BREAK
  1089. case 40:
  1090. YY_RULE_SETUP
  1091. #line 252 "./vsl-lex.L"
  1092. return INTEGER;
  1093.     YY_BREAK
  1094. case 41:
  1095. YY_RULE_SETUP
  1096. #line 254 "./vsl-lex.L"
  1097. BREAK                // Whitespace (ignore)
  1098.     YY_BREAK
  1099. case 42:
  1100. YY_RULE_SETUP
  1101. #line 255 "./vsl-lex.L"
  1102. BREAK                // Likewise
  1103.     YY_BREAK
  1104. case 43:
  1105. YY_RULE_SETUP
  1106. #line 256 "./vsl-lex.L"
  1107. return vsltext[0];        // All other characters
  1108.     YY_BREAK
  1109. case 44:
  1110. YY_RULE_SETUP
  1111. #line 257 "./vsl-lex.L"
  1112. ECHO;
  1113.     YY_BREAK
  1114. #line 1113 "lex.vsl.c"
  1115. case YY_STATE_EOF(INITIAL):
  1116.     vslterminate();
  1117.  
  1118.     case YY_END_OF_BUFFER:
  1119.         {
  1120.         /* Amount of text matched not including the EOB char. */
  1121.         int vsl_amount_of_matched_text = (int) (vsl_cp - vsltext_ptr) - 1;
  1122.  
  1123.         /* Undo the effects of YY_DO_BEFORE_ACTION. */
  1124.         *vsl_cp = vsl_hold_char;
  1125.         YY_RESTORE_YY_MORE_OFFSET
  1126.  
  1127.         if ( vsl_current_buffer->vsl_buffer_status == YY_BUFFER_NEW )
  1128.             {
  1129.             /* We're scanning a new file or input source.  It's
  1130.              * possible that this happened because the user
  1131.              * just pointed vslin at a new source and called
  1132.              * vsllex().  If so, then we have to assure
  1133.              * consistency between vsl_current_buffer and our
  1134.              * globals.  Here is the right place to do so, because
  1135.              * this is the first action (other than possibly a
  1136.              * back-up) that will match for the new input source.
  1137.              */
  1138.             vsl_n_chars = vsl_current_buffer->vsl_n_chars;
  1139.             vsl_current_buffer->vsl_input_file = vslin;
  1140.             vsl_current_buffer->vsl_buffer_status = YY_BUFFER_NORMAL;
  1141.             }
  1142.  
  1143.         /* Note that here we test for vsl_c_buf_p "<=" to the position
  1144.          * of the first EOB in the buffer, since vsl_c_buf_p will
  1145.          * already have been incremented past the NUL character
  1146.          * (since all states make transitions on EOB to the
  1147.          * end-of-buffer state).  Contrast this with the test
  1148.          * in input().
  1149.          */
  1150.         if ( vsl_c_buf_p <= &vsl_current_buffer->vsl_ch_buf[vsl_n_chars] )
  1151.             { /* This was really a NUL. */
  1152.             vsl_state_type vsl_next_state;
  1153.  
  1154.             vsl_c_buf_p = vsltext_ptr + vsl_amount_of_matched_text;
  1155.  
  1156.             vsl_current_state = vsl_get_previous_state();
  1157.  
  1158.             /* Okay, we're now positioned to make the NUL
  1159.              * transition.  We couldn't have
  1160.              * vsl_get_previous_state() go ahead and do it
  1161.              * for us because it doesn't know how to deal
  1162.              * with the possibility of jamming (and we don't
  1163.              * want to build jamming into it because then it
  1164.              * will run more slowly).
  1165.              */
  1166.  
  1167.             vsl_next_state = vsl_try_NUL_trans( vsl_current_state );
  1168.  
  1169.             vsl_bp = vsltext_ptr + YY_MORE_ADJ;
  1170.  
  1171.             if ( vsl_next_state )
  1172.                 {
  1173.                 /* Consume the NUL. */
  1174.                 vsl_cp = ++vsl_c_buf_p;
  1175.                 vsl_current_state = vsl_next_state;
  1176.                 goto vsl_match;
  1177.                 }
  1178.  
  1179.             else
  1180.                 {
  1181.                 vsl_cp = vsl_c_buf_p;
  1182.                 goto vsl_find_action;
  1183.                 }
  1184.             }
  1185.  
  1186.         else switch ( vsl_get_next_buffer() )
  1187.             {
  1188.             case EOB_ACT_END_OF_FILE:
  1189.                 {
  1190.                 vsl_did_buffer_switch_on_eof = 0;
  1191.  
  1192.                 if ( vslwrap() )
  1193.                     {
  1194.                     /* Note: because we've taken care in
  1195.                      * vsl_get_next_buffer() to have set up
  1196.                      * vsltext, we can now set up
  1197.                      * vsl_c_buf_p so that if some total
  1198.                      * hoser (like flex itself) wants to
  1199.                      * call the scanner after we return the
  1200.                      * YY_NULL, it'll still work - another
  1201.                      * YY_NULL will get returned.
  1202.                      */
  1203.                     vsl_c_buf_p = vsltext_ptr + YY_MORE_ADJ;
  1204.  
  1205.                     vsl_act = YY_STATE_EOF(YY_START);
  1206.                     goto do_action;
  1207.                     }
  1208.  
  1209.                 else
  1210.                     {
  1211.                     if ( ! vsl_did_buffer_switch_on_eof )
  1212.                         YY_NEW_FILE;
  1213.                     }
  1214.                 break;
  1215.                 }
  1216.  
  1217.             case EOB_ACT_CONTINUE_SCAN:
  1218.                 vsl_c_buf_p =
  1219.                     vsltext_ptr + vsl_amount_of_matched_text;
  1220.  
  1221.                 vsl_current_state = vsl_get_previous_state();
  1222.  
  1223.                 vsl_cp = vsl_c_buf_p;
  1224.                 vsl_bp = vsltext_ptr + YY_MORE_ADJ;
  1225.                 goto vsl_match;
  1226.  
  1227.             case EOB_ACT_LAST_MATCH:
  1228.                 vsl_c_buf_p =
  1229.                 &vsl_current_buffer->vsl_ch_buf[vsl_n_chars];
  1230.  
  1231.                 vsl_current_state = vsl_get_previous_state();
  1232.  
  1233.                 vsl_cp = vsl_c_buf_p;
  1234.                 vsl_bp = vsltext_ptr + YY_MORE_ADJ;
  1235.                 goto vsl_find_action;
  1236.             }
  1237.         break;
  1238.         }
  1239.  
  1240.     default:
  1241.         YY_FATAL_ERROR(
  1242.             "fatal flex scanner internal error--no action found" );
  1243.     } /* end of action switch */
  1244.         } /* end of scanning one token */
  1245.     } /* end of vsllex */
  1246.  
  1247.  
  1248. /* vsl_get_next_buffer - try to read in a new buffer
  1249.  *
  1250.  * Returns a code representing an action:
  1251.  *    EOB_ACT_LAST_MATCH -
  1252.  *    EOB_ACT_CONTINUE_SCAN - continue scanning from current position
  1253.  *    EOB_ACT_END_OF_FILE - end of file
  1254.  */
  1255.  
  1256. static int vsl_get_next_buffer()
  1257.     {
  1258.     register char *dest = vsl_current_buffer->vsl_ch_buf;
  1259.     register char *source = vsltext_ptr;
  1260.     register int number_to_move, i;
  1261.     int ret_val;
  1262.  
  1263.     if ( vsl_c_buf_p > &vsl_current_buffer->vsl_ch_buf[vsl_n_chars + 1] )
  1264.         YY_FATAL_ERROR(
  1265.         "fatal flex scanner internal error--end of buffer missed" );
  1266.  
  1267.     if ( vsl_current_buffer->vsl_fill_buffer == 0 )
  1268.         { /* Don't try to fill the buffer, so this is an EOF. */
  1269.         if ( vsl_c_buf_p - vsltext_ptr - YY_MORE_ADJ == 1 )
  1270.             {
  1271.             /* We matched a single character, the EOB, so
  1272.              * treat this as a final EOF.
  1273.              */
  1274.             return EOB_ACT_END_OF_FILE;
  1275.             }
  1276.  
  1277.         else
  1278.             {
  1279.             /* We matched some text prior to the EOB, first
  1280.              * process it.
  1281.              */
  1282.             return EOB_ACT_LAST_MATCH;
  1283.             }
  1284.         }
  1285.  
  1286.     /* Try to read more data. */
  1287.  
  1288.     /* First move last chars to start of buffer. */
  1289.     number_to_move = (int) (vsl_c_buf_p - vsltext_ptr) - 1;
  1290.  
  1291.     for ( i = 0; i < number_to_move; ++i )
  1292.         *(dest++) = *(source++);
  1293.  
  1294.     if ( vsl_current_buffer->vsl_buffer_status == YY_BUFFER_EOF_PENDING )
  1295.         /* don't do the read, it's not guaranteed to return an EOF,
  1296.          * just force an EOF
  1297.          */
  1298.         vsl_current_buffer->vsl_n_chars = vsl_n_chars = 0;
  1299.  
  1300.     else
  1301.         {
  1302.         int num_to_read =
  1303.             vsl_current_buffer->vsl_buf_size - number_to_move - 1;
  1304.  
  1305.         while ( num_to_read <= 0 )
  1306.             { /* Not enough room in the buffer - grow it. */
  1307. #ifdef YY_USES_REJECT
  1308.             YY_FATAL_ERROR(
  1309. "input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
  1310. #else
  1311.  
  1312.             /* just a shorter name for the current buffer */
  1313.             YY_BUFFER_STATE b = vsl_current_buffer;
  1314.  
  1315.             int vsl_c_buf_p_offset =
  1316.                 (int) (vsl_c_buf_p - b->vsl_ch_buf);
  1317.  
  1318.             if ( b->vsl_is_our_buffer )
  1319.                 {
  1320.                 int new_size = b->vsl_buf_size * 2;
  1321.  
  1322.                 if ( new_size <= 0 )
  1323.                     b->vsl_buf_size += b->vsl_buf_size / 8;
  1324.                 else
  1325.                     b->vsl_buf_size *= 2;
  1326.  
  1327.                 b->vsl_ch_buf = (char *)
  1328.                     /* Include room in for 2 EOB chars. */
  1329.                     vsl_flex_realloc( (void *) b->vsl_ch_buf,
  1330.                              b->vsl_buf_size + 2 );
  1331.                 }
  1332.             else
  1333.                 /* Can't grow it, we don't own it. */
  1334.                 b->vsl_ch_buf = 0;
  1335.  
  1336.             if ( ! b->vsl_ch_buf )
  1337.                 YY_FATAL_ERROR(
  1338.                 "fatal error - scanner input buffer overflow" );
  1339.  
  1340.             vsl_c_buf_p = &b->vsl_ch_buf[vsl_c_buf_p_offset];
  1341.  
  1342.             num_to_read = vsl_current_buffer->vsl_buf_size -
  1343.                         number_to_move - 1;
  1344. #endif
  1345.             }
  1346.  
  1347.         if ( num_to_read > YY_READ_BUF_SIZE )
  1348.             num_to_read = YY_READ_BUF_SIZE;
  1349.  
  1350.         /* Read in more data. */
  1351.         YY_INPUT( (&vsl_current_buffer->vsl_ch_buf[number_to_move]),
  1352.             vsl_n_chars, num_to_read );
  1353.  
  1354.         vsl_current_buffer->vsl_n_chars = vsl_n_chars;
  1355.         }
  1356.  
  1357.     if ( vsl_n_chars == 0 )
  1358.         {
  1359.         if ( number_to_move == YY_MORE_ADJ )
  1360.             {
  1361.             ret_val = EOB_ACT_END_OF_FILE;
  1362.             vslrestart( vslin );
  1363.             }
  1364.  
  1365.         else
  1366.             {
  1367.             ret_val = EOB_ACT_LAST_MATCH;
  1368.             vsl_current_buffer->vsl_buffer_status =
  1369.                 YY_BUFFER_EOF_PENDING;
  1370.             }
  1371.         }
  1372.  
  1373.     else
  1374.         ret_val = EOB_ACT_CONTINUE_SCAN;
  1375.  
  1376.     vsl_n_chars += number_to_move;
  1377.     vsl_current_buffer->vsl_ch_buf[vsl_n_chars] = YY_END_OF_BUFFER_CHAR;
  1378.     vsl_current_buffer->vsl_ch_buf[vsl_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
  1379.  
  1380.     vsltext_ptr = &vsl_current_buffer->vsl_ch_buf[0];
  1381.  
  1382.     return ret_val;
  1383.     }
  1384.  
  1385.  
  1386. /* vsl_get_previous_state - get the state just before the EOB char was reached */
  1387.  
  1388. static vsl_state_type vsl_get_previous_state()
  1389.     {
  1390.     register vsl_state_type vsl_current_state;
  1391.     register char *vsl_cp;
  1392.  
  1393.     vsl_current_state = vsl_start;
  1394.     vsl_current_state += YY_AT_BOL();
  1395.  
  1396.     for ( vsl_cp = vsltext_ptr + YY_MORE_ADJ; vsl_cp < vsl_c_buf_p; ++vsl_cp )
  1397.         {
  1398.         register YY_CHAR vsl_c = (*vsl_cp ? vsl_ec[YY_SC_TO_UI(*vsl_cp)] : 1);
  1399.         if ( vsl_accept[vsl_current_state] )
  1400.             {
  1401.             vsl_last_accepting_state = vsl_current_state;
  1402.             vsl_last_accepting_cpos = vsl_cp;
  1403.             }
  1404.         while ( vsl_chk[vsl_base[vsl_current_state] + vsl_c] != vsl_current_state )
  1405.             {
  1406.             vsl_current_state = (int) vsl_def[vsl_current_state];
  1407.             if ( vsl_current_state >= 149 )
  1408.                 vsl_c = vsl_meta[(unsigned int) vsl_c];
  1409.             }
  1410.         vsl_current_state = vsl_nxt[vsl_base[vsl_current_state] + (unsigned int) vsl_c];
  1411.         }
  1412.  
  1413.     return vsl_current_state;
  1414.     }
  1415.  
  1416.  
  1417. /* vsl_try_NUL_trans - try to make a transition on the NUL character
  1418.  *
  1419.  * synopsis
  1420.  *    next_state = vsl_try_NUL_trans( current_state );
  1421.  */
  1422.  
  1423. #ifdef YY_USE_PROTOS
  1424. static vsl_state_type vsl_try_NUL_trans( vsl_state_type vsl_current_state )
  1425. #else
  1426. static vsl_state_type vsl_try_NUL_trans( vsl_current_state )
  1427. vsl_state_type vsl_current_state;
  1428. #endif
  1429.     {
  1430.     register int vsl_is_jam;
  1431.     register char *vsl_cp = vsl_c_buf_p;
  1432.  
  1433.     register YY_CHAR vsl_c = 1;
  1434.     if ( vsl_accept[vsl_current_state] )
  1435.         {
  1436.         vsl_last_accepting_state = vsl_current_state;
  1437.         vsl_last_accepting_cpos = vsl_cp;
  1438.         }
  1439.     while ( vsl_chk[vsl_base[vsl_current_state] + vsl_c] != vsl_current_state )
  1440.         {
  1441.         vsl_current_state = (int) vsl_def[vsl_current_state];
  1442.         if ( vsl_current_state >= 149 )
  1443.             vsl_c = vsl_meta[(unsigned int) vsl_c];
  1444.         }
  1445.     vsl_current_state = vsl_nxt[vsl_base[vsl_current_state] + (unsigned int) vsl_c];
  1446.     vsl_is_jam = (vsl_current_state == 148);
  1447.  
  1448.     return vsl_is_jam ? 0 : vsl_current_state;
  1449.     }
  1450.  
  1451.  
  1452. #ifndef YY_NO_UNPUT
  1453. #ifdef YY_USE_PROTOS
  1454. static void vslunput( int c, register char *vsl_bp )
  1455. #else
  1456. static void vslunput( c, vsl_bp )
  1457. int c;
  1458. register char *vsl_bp;
  1459. #endif
  1460.     {
  1461.     register char *vsl_cp = vsl_c_buf_p;
  1462.  
  1463.     /* undo effects of setting up vsltext */
  1464.     *vsl_cp = vsl_hold_char;
  1465.  
  1466.     if ( vsl_cp < vsl_current_buffer->vsl_ch_buf + 2 )
  1467.         { /* need to shift things up to make room */
  1468.         /* +2 for EOB chars. */
  1469.         register int number_to_move = vsl_n_chars + 2;
  1470.         register char *dest = &vsl_current_buffer->vsl_ch_buf[
  1471.                     vsl_current_buffer->vsl_buf_size + 2];
  1472.         register char *source =
  1473.                 &vsl_current_buffer->vsl_ch_buf[number_to_move];
  1474.  
  1475.         while ( source > vsl_current_buffer->vsl_ch_buf )
  1476.             *--dest = *--source;
  1477.  
  1478.         vsl_cp += (int) (dest - source);
  1479.         vsl_bp += (int) (dest - source);
  1480.         vsl_current_buffer->vsl_n_chars =
  1481.             vsl_n_chars = vsl_current_buffer->vsl_buf_size;
  1482.  
  1483.         if ( vsl_cp < vsl_current_buffer->vsl_ch_buf + 2 )
  1484.             YY_FATAL_ERROR( "flex scanner push-back overflow" );
  1485.         }
  1486.  
  1487.     *--vsl_cp = (char) c;
  1488.  
  1489.  
  1490.     vsltext_ptr = vsl_bp;
  1491.     vsl_hold_char = *vsl_cp;
  1492.     vsl_c_buf_p = vsl_cp;
  1493.     }
  1494. #endif    /* ifndef YY_NO_UNPUT */
  1495.  
  1496.  
  1497. #ifdef __cplusplus
  1498. static int vslinput()
  1499. #else
  1500. static int input()
  1501. #endif
  1502.     {
  1503.     int c;
  1504.  
  1505.     *vsl_c_buf_p = vsl_hold_char;
  1506.  
  1507.     if ( *vsl_c_buf_p == YY_END_OF_BUFFER_CHAR )
  1508.         {
  1509.         /* vsl_c_buf_p now points to the character we want to return.
  1510.          * If this occurs *before* the EOB characters, then it's a
  1511.          * valid NUL; if not, then we've hit the end of the buffer.
  1512.          */
  1513.         if ( vsl_c_buf_p < &vsl_current_buffer->vsl_ch_buf[vsl_n_chars] )
  1514.             /* This was really a NUL. */
  1515.             *vsl_c_buf_p = '\0';
  1516.  
  1517.         else
  1518.             { /* need more input */
  1519.             int offset = vsl_c_buf_p - vsltext_ptr;
  1520.             ++vsl_c_buf_p;
  1521.  
  1522.             switch ( vsl_get_next_buffer() )
  1523.                 {
  1524.                 case EOB_ACT_LAST_MATCH:
  1525.                     /* This happens because vsl_g_n_b()
  1526.                      * sees that we've accumulated a
  1527.                      * token and flags that we need to
  1528.                      * try matching the token before
  1529.                      * proceeding.  But for input(),
  1530.                      * there's no matching to consider.
  1531.                      * So convert the EOB_ACT_LAST_MATCH
  1532.                      * to EOB_ACT_END_OF_FILE.
  1533.                      */
  1534.  
  1535.                     /* Reset buffer status. */
  1536.                     vslrestart( vslin );
  1537.  
  1538.                     /* fall through */
  1539.  
  1540.                 case EOB_ACT_END_OF_FILE:
  1541.                     {
  1542.                     if ( vslwrap() )
  1543.                         return EOF;
  1544.  
  1545.                     if ( ! vsl_did_buffer_switch_on_eof )
  1546.                         YY_NEW_FILE;
  1547. #ifdef __cplusplus
  1548.                     return vslinput();
  1549. #else
  1550.                     return input();
  1551. #endif
  1552.                     }
  1553.  
  1554.                 case EOB_ACT_CONTINUE_SCAN:
  1555.                     vsl_c_buf_p = vsltext_ptr + offset;
  1556.                     break;
  1557.                 }
  1558.             }
  1559.         }
  1560.  
  1561.     c = *(unsigned char *) vsl_c_buf_p;    /* cast for 8-bit char's */
  1562.     *vsl_c_buf_p = '\0';    /* preserve vsltext */
  1563.     vsl_hold_char = *++vsl_c_buf_p;
  1564.  
  1565.     vsl_current_buffer->vsl_at_bol = (c == '\n');
  1566.  
  1567.     return c;
  1568.     }
  1569.  
  1570.  
  1571. #ifdef YY_USE_PROTOS
  1572. void vslrestart( FILE *input_file )
  1573. #else
  1574. void vslrestart( input_file )
  1575. FILE *input_file;
  1576. #endif
  1577.     {
  1578.     if ( ! vsl_current_buffer )
  1579.         vsl_current_buffer = vsl_create_buffer( vslin, YY_BUF_SIZE );
  1580.  
  1581.     vsl_init_buffer( vsl_current_buffer, input_file );
  1582.     vsl_load_buffer_state();
  1583.     }
  1584.  
  1585.  
  1586. #ifdef YY_USE_PROTOS
  1587. void vsl_switch_to_buffer( YY_BUFFER_STATE new_buffer )
  1588. #else
  1589. void vsl_switch_to_buffer( new_buffer )
  1590. YY_BUFFER_STATE new_buffer;
  1591. #endif
  1592.     {
  1593.     if ( vsl_current_buffer == new_buffer )
  1594.         return;
  1595.  
  1596.     if ( vsl_current_buffer )
  1597.         {
  1598.         /* Flush out information for old buffer. */
  1599.         *vsl_c_buf_p = vsl_hold_char;
  1600.         vsl_current_buffer->vsl_buf_pos = vsl_c_buf_p;
  1601.         vsl_current_buffer->vsl_n_chars = vsl_n_chars;
  1602.         }
  1603.  
  1604.     vsl_current_buffer = new_buffer;
  1605.     vsl_load_buffer_state();
  1606.  
  1607.     /* We don't actually know whether we did this switch during
  1608.      * EOF (vslwrap()) processing, but the only time this flag
  1609.      * is looked at is after vslwrap() is called, so it's safe
  1610.      * to go ahead and always set it.
  1611.      */
  1612.     vsl_did_buffer_switch_on_eof = 1;
  1613.     }
  1614.  
  1615.  
  1616. #ifdef YY_USE_PROTOS
  1617. void vsl_load_buffer_state( void )
  1618. #else
  1619. void vsl_load_buffer_state()
  1620. #endif
  1621.     {
  1622.     vsl_n_chars = vsl_current_buffer->vsl_n_chars;
  1623.     vsltext_ptr = vsl_c_buf_p = vsl_current_buffer->vsl_buf_pos;
  1624.     vslin = vsl_current_buffer->vsl_input_file;
  1625.     vsl_hold_char = *vsl_c_buf_p;
  1626.     }
  1627.  
  1628.  
  1629. #ifdef YY_USE_PROTOS
  1630. YY_BUFFER_STATE vsl_create_buffer( FILE *file, int size )
  1631. #else
  1632. YY_BUFFER_STATE vsl_create_buffer( file, size )
  1633. FILE *file;
  1634. int size;
  1635. #endif
  1636.     {
  1637.     YY_BUFFER_STATE b;
  1638.  
  1639.     b = (YY_BUFFER_STATE) vsl_flex_alloc( sizeof( struct vsl_buffer_state ) );
  1640.     if ( ! b )
  1641.         YY_FATAL_ERROR( "out of dynamic memory in vsl_create_buffer()" );
  1642.  
  1643.     b->vsl_buf_size = size;
  1644.  
  1645.     /* vsl_ch_buf has to be 2 characters longer than the size given because
  1646.      * we need to put in 2 end-of-buffer characters.
  1647.      */
  1648.     b->vsl_ch_buf = (char *) vsl_flex_alloc( b->vsl_buf_size + 2 );
  1649.     if ( ! b->vsl_ch_buf )
  1650.         YY_FATAL_ERROR( "out of dynamic memory in vsl_create_buffer()" );
  1651.  
  1652.     b->vsl_is_our_buffer = 1;
  1653.  
  1654.     vsl_init_buffer( b, file );
  1655.  
  1656.     return b;
  1657.     }
  1658.  
  1659.  
  1660. #ifdef YY_USE_PROTOS
  1661. void vsl_delete_buffer( YY_BUFFER_STATE b )
  1662. #else
  1663. void vsl_delete_buffer( b )
  1664. YY_BUFFER_STATE b;
  1665. #endif
  1666.     {
  1667.     if ( ! b )
  1668.         return;
  1669.  
  1670.     if ( b == vsl_current_buffer )
  1671.         vsl_current_buffer = (YY_BUFFER_STATE) 0;
  1672.  
  1673.     if ( b->vsl_is_our_buffer )
  1674.         vsl_flex_free( (void *) b->vsl_ch_buf );
  1675.  
  1676.     vsl_flex_free( (void *) b );
  1677.     }
  1678.  
  1679.  
  1680. #ifndef YY_ALWAYS_INTERACTIVE
  1681. #ifndef YY_NEVER_INTERACTIVE
  1682. extern int isatty YY_PROTO(( int ));
  1683. #endif
  1684. #endif
  1685.  
  1686. #ifdef YY_USE_PROTOS
  1687. void vsl_init_buffer( YY_BUFFER_STATE b, FILE *file )
  1688. #else
  1689. void vsl_init_buffer( b, file )
  1690. YY_BUFFER_STATE b;
  1691. FILE *file;
  1692. #endif
  1693.  
  1694.  
  1695.     {
  1696.     vsl_flush_buffer( b );
  1697.  
  1698.     b->vsl_input_file = file;
  1699.     b->vsl_fill_buffer = 1;
  1700.  
  1701. #if YY_ALWAYS_INTERACTIVE
  1702.     b->vsl_is_interactive = 1;
  1703. #else
  1704. #if YY_NEVER_INTERACTIVE
  1705.     b->vsl_is_interactive = 0;
  1706. #else
  1707.     b->vsl_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
  1708. #endif
  1709. #endif
  1710.     }
  1711.  
  1712.  
  1713. #ifdef YY_USE_PROTOS
  1714. void vsl_flush_buffer( YY_BUFFER_STATE b )
  1715. #else
  1716. void vsl_flush_buffer( b )
  1717. YY_BUFFER_STATE b;
  1718. #endif
  1719.  
  1720.     {
  1721.     if ( ! b )
  1722.         return;
  1723.  
  1724.     b->vsl_n_chars = 0;
  1725.  
  1726.     /* We always need two end-of-buffer characters.  The first causes
  1727.      * a transition to the end-of-buffer state.  The second causes
  1728.      * a jam in that state.
  1729.      */
  1730.     b->vsl_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
  1731.     b->vsl_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
  1732.  
  1733.     b->vsl_buf_pos = &b->vsl_ch_buf[0];
  1734.  
  1735.     b->vsl_at_bol = 1;
  1736.     b->vsl_buffer_status = YY_BUFFER_NEW;
  1737.  
  1738.     if ( b == vsl_current_buffer )
  1739.         vsl_load_buffer_state();
  1740.     }
  1741.  
  1742.  
  1743. #ifndef YY_NO_SCAN_BUFFER
  1744. #ifdef YY_USE_PROTOS
  1745. YY_BUFFER_STATE vsl_scan_buffer( char *base, vsl_size_t size )
  1746. #else
  1747. YY_BUFFER_STATE vsl_scan_buffer( base, size )
  1748. char *base;
  1749. vsl_size_t size;
  1750. #endif
  1751.     {
  1752.     YY_BUFFER_STATE b;
  1753.  
  1754.     if ( size < 2 ||
  1755.          base[size-2] != YY_END_OF_BUFFER_CHAR ||
  1756.          base[size-1] != YY_END_OF_BUFFER_CHAR )
  1757.         /* They forgot to leave room for the EOB's. */
  1758.         return 0;
  1759.  
  1760.     b = (YY_BUFFER_STATE) vsl_flex_alloc( sizeof( struct vsl_buffer_state ) );
  1761.     if ( ! b )
  1762.         YY_FATAL_ERROR( "out of dynamic memory in vsl_scan_buffer()" );
  1763.  
  1764.     b->vsl_buf_size = size - 2;    /* "- 2" to take care of EOB's */
  1765.     b->vsl_buf_pos = b->vsl_ch_buf = base;
  1766.     b->vsl_is_our_buffer = 0;
  1767.     b->vsl_input_file = 0;
  1768.     b->vsl_n_chars = b->vsl_buf_size;
  1769.     b->vsl_is_interactive = 0;
  1770.     b->vsl_at_bol = 1;
  1771.     b->vsl_fill_buffer = 0;
  1772.     b->vsl_buffer_status = YY_BUFFER_NEW;
  1773.  
  1774.     vsl_switch_to_buffer( b );
  1775.  
  1776.     return b;
  1777.     }
  1778. #endif
  1779.  
  1780.  
  1781. #ifndef YY_NO_SCAN_STRING
  1782. #ifdef YY_USE_PROTOS
  1783. YY_BUFFER_STATE vsl_scan_string( vslconst char *vsl_str )
  1784. #else
  1785. YY_BUFFER_STATE vsl_scan_string( vsl_str )
  1786. vslconst char *vsl_str;
  1787. #endif
  1788.     {
  1789.     int len;
  1790.     for ( len = 0; vsl_str[len]; ++len )
  1791.         ;
  1792.  
  1793.     return vsl_scan_bytes( vsl_str, len );
  1794.     }
  1795. #endif
  1796.  
  1797.  
  1798. #ifndef YY_NO_SCAN_BYTES
  1799. #ifdef YY_USE_PROTOS
  1800. YY_BUFFER_STATE vsl_scan_bytes( vslconst char *bytes, int len )
  1801. #else
  1802. YY_BUFFER_STATE vsl_scan_bytes( bytes, len )
  1803. vslconst char *bytes;
  1804. int len;
  1805. #endif
  1806.     {
  1807.     YY_BUFFER_STATE b;
  1808.     char *buf;
  1809.     vsl_size_t n;
  1810.     int i;
  1811.  
  1812.     /* Get memory for full buffer, including space for trailing EOB's. */
  1813.     n = len + 2;
  1814.     buf = (char *) vsl_flex_alloc( n );
  1815.     if ( ! buf )
  1816.         YY_FATAL_ERROR( "out of dynamic memory in vsl_scan_bytes()" );
  1817.  
  1818.     for ( i = 0; i < len; ++i )
  1819.         buf[i] = bytes[i];
  1820.  
  1821.     buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
  1822.  
  1823.     b = vsl_scan_buffer( buf, n );
  1824.     if ( ! b )
  1825.         YY_FATAL_ERROR( "bad buffer in vsl_scan_bytes()" );
  1826.  
  1827.     /* It's okay to grow etc. this buffer, and we should throw it
  1828.      * away when we're done.
  1829.      */
  1830.     b->vsl_is_our_buffer = 1;
  1831.  
  1832.     return b;
  1833.     }
  1834. #endif
  1835.  
  1836.  
  1837. #ifndef YY_NO_PUSH_STATE
  1838. #ifdef YY_USE_PROTOS
  1839. static void vsl_push_state( int new_state )
  1840. #else
  1841. static void vsl_push_state( new_state )
  1842. int new_state;
  1843. #endif
  1844.     {
  1845.     if ( vsl_start_stack_ptr >= vsl_start_stack_depth )
  1846.         {
  1847.         vsl_size_t new_size;
  1848.  
  1849.         vsl_start_stack_depth += YY_START_STACK_INCR;
  1850.         new_size = vsl_start_stack_depth * sizeof( int );
  1851.  
  1852.         if ( ! vsl_start_stack )
  1853.             vsl_start_stack = (int *) vsl_flex_alloc( new_size );
  1854.  
  1855.         else
  1856.             vsl_start_stack = (int *) vsl_flex_realloc(
  1857.                     (void *) vsl_start_stack, new_size );
  1858.  
  1859.         if ( ! vsl_start_stack )
  1860.             YY_FATAL_ERROR(
  1861.             "out of memory expanding start-condition stack" );
  1862.         }
  1863.  
  1864.     vsl_start_stack[vsl_start_stack_ptr++] = YY_START;
  1865.  
  1866.     BEGIN(new_state);
  1867.     }
  1868. #endif
  1869.  
  1870.  
  1871. #ifndef YY_NO_POP_STATE
  1872. static void vsl_pop_state()
  1873.     {
  1874.     if ( --vsl_start_stack_ptr < 0 )
  1875.         YY_FATAL_ERROR( "start-condition stack underflow" );
  1876.  
  1877.     BEGIN(vsl_start_stack[vsl_start_stack_ptr]);
  1878.     }
  1879. #endif
  1880.  
  1881.  
  1882. #ifndef YY_NO_TOP_STATE
  1883. static int vsl_top_state()
  1884.     {
  1885.     return vsl_start_stack[vsl_start_stack_ptr - 1];
  1886.     }
  1887. #endif
  1888.  
  1889. #ifndef YY_EXIT_FAILURE
  1890. #define YY_EXIT_FAILURE 2
  1891. #endif
  1892.  
  1893. #ifdef YY_USE_PROTOS
  1894. static void vsl_fatal_error( vslconst char msg[] )
  1895. #else
  1896. static void vsl_fatal_error( msg )
  1897. char msg[];
  1898. #endif
  1899.     {
  1900.     (void) fprintf( stderr, "%s\n", msg );
  1901.     exit( YY_EXIT_FAILURE );
  1902.     }
  1903.  
  1904.  
  1905.  
  1906. /* Redefine vslless() so it works in section 3 code. */
  1907.  
  1908. #undef vslless
  1909. #define vslless(n) \
  1910.     do \
  1911.         { \
  1912.         /* Undo effects of setting up vsltext. */ \
  1913.         vsltext[vslleng] = vsl_hold_char; \
  1914.         vsl_c_buf_p = vsltext + n; \
  1915.         vsl_hold_char = *vsl_c_buf_p; \
  1916.         *vsl_c_buf_p = '\0'; \
  1917.         vslleng = n; \
  1918.         } \
  1919.     while ( 0 )
  1920.  
  1921.  
  1922. /* Internal utility routines. */
  1923.  
  1924. #ifndef vsltext_ptr
  1925. #ifdef YY_USE_PROTOS
  1926. static void vsl_flex_strncpy( char *s1, vslconst char *s2, int n )
  1927. #else
  1928. static void vsl_flex_strncpy( s1, s2, n )
  1929. char *s1;
  1930. vslconst char *s2;
  1931. int n;
  1932. #endif
  1933.     {
  1934.     register int i;
  1935.     for ( i = 0; i < n; ++i )
  1936.         s1[i] = s2[i];
  1937.     }
  1938. #endif
  1939.  
  1940. #ifdef YY_NEED_STRLEN
  1941. #ifdef YY_USE_PROTOS
  1942. static int vsl_flex_strlen( vslconst char *s )
  1943. #else
  1944. static int vsl_flex_strlen( s )
  1945. vslconst char *s;
  1946. #endif
  1947.     {
  1948.     register int n;
  1949.     for ( n = 0; s[n]; ++n )
  1950.         ;
  1951.  
  1952.     return n;
  1953.     }
  1954. #endif
  1955.  
  1956.  
  1957. #ifdef YY_USE_PROTOS
  1958. static void *vsl_flex_alloc( vsl_size_t size )
  1959. #else
  1960. static void *vsl_flex_alloc( size )
  1961. vsl_size_t size;
  1962. #endif
  1963.     {
  1964.     return (void *) malloc( size );
  1965.     }
  1966.  
  1967. #ifdef YY_USE_PROTOS
  1968. static void *vsl_flex_realloc( void *ptr, vsl_size_t size )
  1969. #else
  1970. static void *vsl_flex_realloc( ptr, size )
  1971. void *ptr;
  1972. vsl_size_t size;
  1973. #endif
  1974.     {
  1975.     /* The cast to (char *) in the following accommodates both
  1976.      * implementations that use char* generic pointers, and those
  1977.      * that use void* generic pointers.  It works with the latter
  1978.      * because both ANSI C and C++ allow castless assignment from
  1979.      * any pointer type to void*, and deal with argument conversions
  1980.      * as though doing an assignment.
  1981.      */
  1982.     return (void *) realloc( (char *) ptr, size );
  1983.     }
  1984.  
  1985. #ifdef YY_USE_PROTOS
  1986. static void vsl_flex_free( void *ptr )
  1987. #else
  1988. static void vsl_flex_free( ptr )
  1989. void *ptr;
  1990. #endif
  1991.     {
  1992.     free( ptr );
  1993.     }
  1994.  
  1995. #if YY_MAIN
  1996. int main()
  1997.     {
  1998.     vsllex();
  1999.     return 0;
  2000.     }
  2001. #endif
  2002. #line 257 "./vsl-lex.L"
  2003.  
  2004. class vslNameSet {
  2005. private:
  2006.     string _name;
  2007.     vslNameSet *_next;
  2008.  
  2009. public:
  2010.     vslNameSet(const char *name)
  2011.     : _name(name), _next(0)
  2012.     {}
  2013.     ~vslNameSet()       { reset(); }
  2014.     void reset();
  2015.     int add(const char *name);
  2016.  
  2017. private:
  2018.     vslNameSet(const vslNameSet&)
  2019.     : _name(), _next(0)
  2020.     {
  2021.     assert(0);
  2022.     }
  2023.     vslNameSet& operator = (const vslNameSet&)
  2024.     {
  2025.     assert(0); return *this;
  2026.     }
  2027. } vslnameSet("xyzzy");
  2028.  
  2029. // Delete name set
  2030. void vslNameSet::reset()
  2031.     if (_next) 
  2032.     delete _next; 
  2033.     _next = 0; 
  2034. }
  2035.  
  2036. // Add to name set; if already there, return -1
  2037. int vslNameSet::add(const char *name)
  2038. {
  2039.     if (strcmp(_name.chars(), name) == 0)
  2040.     return -1;
  2041.  
  2042.     if (_next)
  2043.     return _next->add(name);
  2044.  
  2045.     _next = new vslNameSet(name);
  2046.     return 0;
  2047. }
  2048.  
  2049. // Clear name set
  2050. static void switchreset()
  2051. {
  2052.     vslnameSet.reset();
  2053. }
  2054.  
  2055.  
  2056. // Return to original file
  2057. static int switchdown() 
  2058. {
  2059.     if (topstack <= 0)
  2060.     return -1;
  2061.     
  2062.     if (vslstream != 0)
  2063.     {
  2064.     if (VSEFlags::verbose)
  2065.     {
  2066.         cout << ")";
  2067.         cout.flush();
  2068.     }
  2069.     delete vslstream;
  2070.     }
  2071.  
  2072.     topstack--;
  2073.     vslstream     = streamstack[topstack];
  2074.     vslfilename     = namestack[topstack];
  2075.     vsllinenumber = linestack[topstack];
  2076.  
  2077. #ifdef FLEX_SCANNER
  2078.     if (YY_CURRENT_BUFFER != 0)
  2079.     vsl_delete_buffer(YY_CURRENT_BUFFER);
  2080.     vsl_switch_to_buffer(bufstack[topstack]);
  2081. #endif
  2082.  
  2083.     return 0;
  2084. }
  2085.  
  2086. #ifndef VSL_INCLUDE_PATH
  2087. #define VSL_INCLUDE_PATH "/usr/local/lib/vsl-include"
  2088. #endif
  2089.  
  2090. // Search file in directories -I, $VSL_INCLUDE suchen
  2091. // as well as in ".", if THISDIR == true
  2092. // If not found, return FILENAME
  2093. static char *searchpath(char *filename, bool thisDir)
  2094. {
  2095.     char includeList[BUFSIZ];
  2096.  
  2097.     // If "-I" is given, use this path
  2098.     char *s = VSEFlags::include_search_path;
  2099.     if (s == NULL || s[0] == '\0')
  2100.     {
  2101.     // Otherwise: Use environment or default path
  2102.     s = getenv("VSL_INCLUDE");
  2103.     if (s == NULL)
  2104.     {
  2105.         static string path = 
  2106.         string(VSL_INCLUDE_PATH) +
  2107.         ":/usr/local/vse/vsl-include"
  2108.         ":/usr/vse/vsl-include"
  2109.         ":/usr/local/lib/vse/vsl-include"
  2110.         ":/usr/lib/vse/vsl-include"
  2111.         ":/usr/local/lib/vsl-include"
  2112.         ":/usr/lib/vsl-include";
  2113.         
  2114.         s = path;
  2115.     }
  2116.     }
  2117.  
  2118.     // If this dir is supposed to be searched, prepend ".:"
  2119.     if (thisDir)
  2120.     strcpy(includeList, ".:");
  2121.     else
  2122.     strcpy(includeList, "");
  2123.     strncat(includeList, s, BUFSIZ - 2);
  2124.  
  2125.     // Check dirs; if file can be opened, return full path
  2126.     for (char *p = strtok(includeList, ":"); p != NULL; p = strtok(NULL, ":"))
  2127.     {
  2128.     static char path[BUFSIZ];
  2129.     strcpy(path, p);
  2130.     strcat(path, "/");
  2131.     strcat(path, filename);
  2132.  
  2133.     FILE *fp = fopen(path, "r");
  2134.     if (fp != NULL && fclose(fp) != EOF)
  2135.     {
  2136.         // Remove "./" prefix
  2137.         if (path[0] == '.' && path[1] == '/')
  2138.         return path + 2;
  2139.         else
  2140.         return path;
  2141.     }
  2142.     }
  2143.  
  2144.     return filename;
  2145. }
  2146.  
  2147. // Switch to file FILENAME
  2148. static int switchup(char *filename, bool thisdir) 
  2149. {
  2150.     if (string(filename) != "")
  2151.     {
  2152.     // Search file
  2153.     filename = searchpath(filename, thisdir);
  2154.  
  2155.     // Add to name set; if we already have read it, don't care
  2156.     if (vslnameSet.add(filename))
  2157.         return 0;
  2158.     }
  2159.  
  2160.     if (topstack >= max_include_nesting)
  2161.     {
  2162.     VSLLib::parse_error("too many #include's");
  2163.     return -1;
  2164.     }
  2165.  
  2166. #ifdef FLEX_SCANNER
  2167.     if (YY_CURRENT_BUFFER == 0)
  2168.     {
  2169.     YY_CURRENT_BUFFER = vsl_new_buffer(stdin, YY_BUF_SIZE);
  2170.     vsl_load_buffer_state();
  2171.     }
  2172.  
  2173.     bufstack[topstack]      = YY_CURRENT_BUFFER;
  2174. #endif
  2175.  
  2176.     streamstack[topstack] = vslstream;
  2177.     namestack[topstack]      = vslfilename;
  2178.     linestack[topstack]      = vsllinenumber;
  2179.     topstack++;
  2180.  
  2181.     vsllinenumber = 1;
  2182.     vslfilename = filename;
  2183.  
  2184. #ifdef FLEX_SCANNER
  2185.     vsl_switch_to_buffer(vsl_new_buffer(stdin, YY_BUF_SIZE));
  2186. #endif
  2187.  
  2188.     if (string(filename) == "")
  2189.     {
  2190.     vslstream   = &cin;
  2191.     vslfilename = "standard input";
  2192.     }
  2193.     else
  2194.     {
  2195. #if BAD_ISTREAM
  2196.     vslstream = 0;
  2197.     FILE *fp = fopen(filename, "r");
  2198.     if (fp == NULL || fclose(fp) == EOF) 
  2199.     {
  2200. #else
  2201.     vslstream = new ifstream(filename, ios::in);
  2202.     if (!vslstream->readable()) 
  2203.     {
  2204. #endif
  2205.     switchdown();
  2206.     VSLLib::parse_error(string(filename) + ": " + strerror(errno));
  2207.     return -1;
  2208.     }
  2209.  
  2210. #if BAD_ISTREAM
  2211.     // vslstream can now be opened
  2212.     vslstream = new ifstream(filename, ios::in);
  2213. #endif
  2214.     }
  2215.  
  2216.     if (VSEFlags::verbose)
  2217.     {
  2218.     cout << "(" << vslfilename;
  2219.     cout.flush();
  2220.     }
  2221.  
  2222. #ifdef FLEX_SCANNER
  2223.     // Avoid warnings about unused vslunput() function
  2224.     if (false)
  2225.     vslunput(0, 0);        // Never called
  2226. #endif
  2227.  
  2228.     return 0;
  2229. }
  2230.