Browse Source

replace explicit crossbar with last_saved_result interface; integrate with DX8

David Rose 20 years ago
parent
commit
ba139578e0

+ 6 - 9
panda/src/display/graphicsStateGuardian.I

@@ -249,19 +249,16 @@ get_supports_texture_combine() const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: GraphicsStateGuardian::get_supports_texture_crossbar
+//     Function: GraphicsStateGuardian::get_supports_texture_saved_result
 //       Access: Published
 //       Access: Published
 //  Description: Returns true if this GSG can use the
 //  Description: Returns true if this GSG can use the
-//               TextureStage::CS_crossbar_stage blend source, which
-//               allows you to specify an arbitrary TextureStage as a
-//               source parameter to set_combine_rgb() or
-//               set_combine_alpha().  If this is false, you must use
-//               choose from one of the available enumerated values
-//               for the source of each operand.
+//               TextureStage::CS_last_saved_result source, which
+//               allows you to save the result of a TextureStage and
+//               re-use it for multiple inputs.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE bool GraphicsStateGuardian::
 INLINE bool GraphicsStateGuardian::
-get_supports_texture_crossbar() const {
-  return _supports_texture_crossbar;
+get_supports_texture_saved_result() const {
+  return _supports_texture_saved_result;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 1 - 1
panda/src/display/graphicsStateGuardian.cxx

@@ -123,7 +123,7 @@ GraphicsStateGuardian(const FrameBufferProperties &properties,
   // Assume we don't support these fairly advanced texture combiner
   // Assume we don't support these fairly advanced texture combiner
   // modes.
   // modes.
   _supports_texture_combine = false;
   _supports_texture_combine = false;
-  _supports_texture_crossbar = false;
+  _supports_texture_saved_result = false;
   _supports_texture_dot3 = false;
   _supports_texture_dot3 = false;
 
 
   // Assume no limits on number of lights or clip planes.
   // Assume no limits on number of lights or clip planes.

+ 2 - 2
panda/src/display/graphicsStateGuardian.h

@@ -95,7 +95,7 @@ PUBLISHED:
   INLINE int get_max_cube_map_dimension() const;
   INLINE int get_max_cube_map_dimension() const;
 
 
   INLINE bool get_supports_texture_combine() const;
   INLINE bool get_supports_texture_combine() const;
-  INLINE bool get_supports_texture_crossbar() const;
+  INLINE bool get_supports_texture_saved_result() const;
   INLINE bool get_supports_texture_dot3() const;
   INLINE bool get_supports_texture_dot3() const;
 
 
   INLINE int get_max_lights() const;
   INLINE int get_max_lights() const;
@@ -367,7 +367,7 @@ protected:
   int _max_cube_map_dimension;
   int _max_cube_map_dimension;
 
 
   bool _supports_texture_combine;
   bool _supports_texture_combine;
-  bool _supports_texture_crossbar;
+  bool _supports_texture_saved_result;
   bool _supports_texture_dot3;
   bool _supports_texture_dot3;
 
 
   int _max_lights;
   int _max_lights;

+ 12 - 1
panda/src/doc/eggSyntax.txt

@@ -257,6 +257,7 @@ appear before they are referenced.
       PRIMARY-COLOR
       PRIMARY-COLOR
       PREVIOUS
       PREVIOUS
       CONSTANT_COLOR_SCALE
       CONSTANT_COLOR_SCALE
+      LAST_SAVED_RESULT
 
 
     combine-operand may be one of:
     combine-operand may be one of:
 
 
@@ -525,7 +526,7 @@ appear before they are referenced.
     (1 1 1 1).  The morph-list is an optional list of <DRGBA> entries.
     (1 1 1 1).  The morph-list is an optional list of <DRGBA> entries.
 
 
 
 
-    <UV> [name] { u v [morph-list] }
+    <UV> [name] { u v [tangent] [binormal] [morph-list] }
 
 
     This gives the texture coordinates of the vertex.  This must be
     This gives the texture coordinates of the vertex.  This must be
     specified if a texture is to be mapped onto this geometry.  As
     specified if a texture is to be mapped onto this geometry.  As
@@ -536,6 +537,16 @@ appear before they are referenced.
     support for multitexturing.  The name may be omitted to specify
     support for multitexturing.  The name may be omitted to specify
     the default UV's.
     the default UV's.
 
 
+    The UV's also support an optional tangent and binormal.  These
+    values are based on the vertex normal and the UV coordinates of
+    connected vertices, and are used to render normal maps and similar
+    lighting effects.  They are defined within the <UV> entry because
+    there may be a different set of tangents and binormals for each
+    different UV coordinate set.  If present, they have the expected
+    syntax:
+
+    <UV> [name] { u v <Tangent> { x y z } <Binormal> { x y z } }
+
 
 
 <DynamicVertexPool> name { vertices }
 <DynamicVertexPool> name { vertices }
 
 

+ 13 - 6
panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx

@@ -115,10 +115,6 @@ DXGraphicsStateGuardian8(const FrameBufferProperties &properties) :
     Geom::GR_point_perspective | Geom::GR_point_sprite |
     Geom::GR_point_perspective | Geom::GR_point_sprite |
     Geom::GR_triangle_strip | Geom::GR_triangle_fan |
     Geom::GR_triangle_strip | Geom::GR_triangle_fan |
     Geom::GR_flat_first_vertex;
     Geom::GR_flat_first_vertex;
-
-  _supports_texture_combine = true;
-  _supports_texture_crossbar = false;
-  _supports_texture_dot3 = true;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -1519,6 +1515,10 @@ reset() {
   _max_vertex_transforms = d3d_caps.MaxVertexBlendMatrices;
   _max_vertex_transforms = d3d_caps.MaxVertexBlendMatrices;
   _max_vertex_transform_indices = d3d_caps.MaxVertexBlendMatrixIndex;
   _max_vertex_transform_indices = d3d_caps.MaxVertexBlendMatrixIndex;
 
 
+  _supports_texture_combine = ((d3d_caps.TextureOpCaps & D3DTEXOPCAPS_LERP) != 0);
+  _supports_texture_saved_result = ((d3d_caps.PrimitiveMiscCaps & D3DPMISCCAPS_TSSARGTEMP) != 0);
+  _supports_texture_dot3 = true;
+
   ZeroMemory(&_lmodel_ambient, sizeof(Colorf));
   ZeroMemory(&_lmodel_ambient, sizeof(Colorf));
   _d3d_device->SetRenderState(D3DRS_AMBIENT, 0x0);
   _d3d_device->SetRenderState(D3DRS_AMBIENT, 0x0);
 
 
@@ -2243,6 +2243,7 @@ do_issue_texture() {
     bool any_point_sprite = false;
     bool any_point_sprite = false;
     switch (mode) {
     switch (mode) {
     case TexGenAttrib::M_off:
     case TexGenAttrib::M_off:
+    case TexGenAttrib::M_light_vector:
       _d3d_device->SetTextureStageState(i, D3DTSS_TEXCOORDINDEX, texcoord_index);
       _d3d_device->SetTextureStageState(i, D3DTSS_TEXCOORDINDEX, texcoord_index);
       break;
       break;
       
       
@@ -2888,6 +2889,12 @@ set_texture_blend_mode(int i, const TextureStage *stage) {
     break;
     break;
   }
   }
 
 
+  if (stage->get_saved_result()) {
+    _d3d_device->SetTextureStageState(i, D3DTSS_RESULTARG, D3DTA_TEMP);
+  } else {
+    _d3d_device->SetTextureStageState(i, D3DTSS_RESULTARG, D3DTA_CURRENT);
+  }
+
   if (stage->uses_color()) {
   if (stage->uses_color()) {
     // Set up the constant color for this stage.
     // Set up the constant color for this stage.
 
 
@@ -3299,8 +3306,8 @@ get_texture_argument(TextureStage::CombineSource source,
   case TextureStage::CS_previous:
   case TextureStage::CS_previous:
     return D3DTA_CURRENT | get_texture_argument_modifier(operand);
     return D3DTA_CURRENT | get_texture_argument_modifier(operand);
 
 
-  case TextureStage::CS_crossbar_stage:
-    break;
+  case TextureStage::CS_last_saved_result:
+    return D3DTA_TEMP | get_texture_argument_modifier(operand);
   }
   }
   dxgsg8_cat.error()
   dxgsg8_cat.error()
     << "Invalid TextureStage::CombineSource value (" << (int)source << ")\n";
     << "Invalid TextureStage::CombineSource value (" << (int)source << ")\n";

+ 35 - 0
panda/src/egg/eggTexture.I

@@ -306,6 +306,41 @@ get_combine_operand(CombineChannel channel, int n) const {
   return _combiner[channel]._ops[n]._operand;
   return _combiner[channel]._ops[n]._operand;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: EggTexture::set_saved_result
+//       Access: Published
+//  Description: Sets the saved_result flag.  When this is true, the
+//               output of this stage is not part of the normal
+//               pipeline--that is, it will not be supplied as the
+//               "previous" source for the next texture stage--but it
+//               will instead be supplied as the "last_saved_result"
+//               source for any future stages, until the next
+//               TextureStage with a saved_result set true is
+//               encountered.
+//
+//               This can be used to reuse the results of this texture
+//               stage as input to more than one stage later in the
+//               pipeline.
+//
+//               The last texture in the pipeline (the one with the
+//               highest sort value) should not have this flag set.
+////////////////////////////////////////////////////////////////////
+INLINE void EggTexture::
+set_saved_result(bool saved_result) {
+  _saved_result = saved_result;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: EggTexture::get_saved_result
+//       Access: Published
+//  Description: Returns the current setting of the saved_result flag.
+//               See set_saved_result().
+////////////////////////////////////////////////////////////////////
+INLINE bool EggTexture::
+get_saved_result() const {
+  return _saved_result;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: EggTexture::set_tex_gen
 //     Function: EggTexture::set_tex_gen
 //       Access: Published
 //       Access: Published

+ 13 - 0
panda/src/egg/eggTexture.cxx

@@ -43,6 +43,7 @@ EggTexture(const string &tref_name, const string &filename)
   _magfilter = FT_unspecified;
   _magfilter = FT_unspecified;
   _anisotropic_degree = 0;
   _anisotropic_degree = 0;
   _env_type = ET_unspecified;
   _env_type = ET_unspecified;
+  _saved_result = false;
   _tex_gen = TG_unspecified;
   _tex_gen = TG_unspecified;
   _priority = 0;
   _priority = 0;
   _color.set(0.0f, 0.0f, 0.0f, 1.0f);
   _color.set(0.0f, 0.0f, 0.0f, 1.0f);
@@ -82,6 +83,7 @@ operator = (const EggTexture &copy) {
   _magfilter = copy._magfilter;
   _magfilter = copy._magfilter;
   _anisotropic_degree = copy._anisotropic_degree;
   _anisotropic_degree = copy._anisotropic_degree;
   _env_type = copy._env_type;
   _env_type = copy._env_type;
+  _saved_result = copy._saved_result;
   _tex_gen = copy._tex_gen;
   _tex_gen = copy._tex_gen;
   _stage_name = copy._stage_name;
   _stage_name = copy._stage_name;
   _priority = copy._priority;
   _priority = copy._priority;
@@ -196,6 +198,11 @@ write(ostream &out, int indent_level) const {
     }
     }
   }
   }
 
 
+  if (get_saved_result()) {
+    indent(out, indent_level + 2)
+      << "<Scalar> saved-result { 1 }\n";
+  }
+
   if (get_tex_gen() != TG_unspecified) {
   if (get_tex_gen() != TG_unspecified) {
     indent(out, indent_level + 2)
     indent(out, indent_level + 2)
       << "<Scalar> tex-gen { " << get_tex_gen() << " }\n";
       << "<Scalar> tex-gen { " << get_tex_gen() << " }\n";
@@ -763,6 +770,9 @@ string_combine_source(const string &string) {
   } else if (cmp_nocase_uh(string, "constant_color_scale") == 0) {
   } else if (cmp_nocase_uh(string, "constant_color_scale") == 0) {
     return CS_constant_color_scale;
     return CS_constant_color_scale;
 
 
+  } else if (cmp_nocase_uh(string, "last_saved_result") == 0) {
+    return CS_last_saved_result;
+
   } else {
   } else {
     return CS_unspecified;
     return CS_unspecified;
   }
   }
@@ -1097,6 +1107,9 @@ operator << (ostream &out, EggTexture::CombineSource cs) {
 
 
   case EggTexture::CS_constant_color_scale:
   case EggTexture::CS_constant_color_scale:
     return out << "constant_color_scale";
     return out << "constant_color_scale";
+
+  case EggTexture::CS_last_saved_result:
+    return out << "last_saved_result";
   }
   }
 
 
   return out << "**invalid CombineSource(" << (int)cs << ")**";
   return out << "**invalid CombineSource(" << (int)cs << ")**";

+ 5 - 0
panda/src/egg/eggTexture.h

@@ -119,6 +119,7 @@ PUBLISHED:
     CS_primary_color,
     CS_primary_color,
     CS_previous,
     CS_previous,
     CS_constant_color_scale,
     CS_constant_color_scale,
+    CS_last_saved_result,
   };
   };
   enum CombineOperand {
   enum CombineOperand {
     CO_unspecified,
     CO_unspecified,
@@ -180,6 +181,9 @@ PUBLISHED:
   INLINE void set_combine_operand(CombineChannel channel, int n, CombineOperand co);
   INLINE void set_combine_operand(CombineChannel channel, int n, CombineOperand co);
   INLINE CombineOperand get_combine_operand(CombineChannel channel, int n) const;
   INLINE CombineOperand get_combine_operand(CombineChannel channel, int n) const;
 
 
+  INLINE void set_saved_result(bool saved_result);
+  INLINE bool get_saved_result() const;
+
   INLINE void set_tex_gen(TexGen tex_gen);
   INLINE void set_tex_gen(TexGen tex_gen);
   INLINE TexGen get_tex_gen() const;
   INLINE TexGen get_tex_gen() const;
 
 
@@ -270,6 +274,7 @@ private:
   FilterType _minfilter, _magfilter;
   FilterType _minfilter, _magfilter;
   int _anisotropic_degree;
   int _anisotropic_degree;
   EnvType _env_type;
   EnvType _env_type;
+  bool _saved_result;
   TexGen _tex_gen;
   TexGen _tex_gen;
   string _stage_name;
   string _stage_name;
   int _priority;
   int _priority;

+ 2965 - 2943
panda/src/egg/lexer.cxx.prebuilt

@@ -1,2943 +1,2965 @@
-#define yy_create_buffer eggyy_create_buffer
-#define yy_delete_buffer eggyy_delete_buffer
-#define yy_scan_buffer eggyy_scan_buffer
-#define yy_scan_string eggyy_scan_string
-#define yy_scan_bytes eggyy_scan_bytes
-#define yy_flex_debug eggyy_flex_debug
-#define yy_init_buffer eggyy_init_buffer
-#define yy_flush_buffer eggyy_flush_buffer
-#define yy_load_buffer_state eggyy_load_buffer_state
-#define yy_switch_to_buffer eggyy_switch_to_buffer
-#define yyin eggyyin
-#define yyleng eggyyleng
-#define yylex eggyylex
-#define yyout eggyyout
-#define yyrestart eggyyrestart
-#define yytext eggyytext
-#define yywrap eggyywrap
-
-#line 20 "lex.yy.c"
-/* A lexical scanner generated by flex */
-
-/* Scanner skeleton version:
- * $Header$
- */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-
-#include <stdio.h>
-
-
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
-#endif
-#endif
-
-
-#ifdef __cplusplus
-
-#include <stdlib.h>
-
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else	/* ! __cplusplus */
-
-#if __STDC__
-
-#define YY_USE_PROTOS
-#define YY_USE_CONST
-
-#endif	/* __STDC__ */
-#endif	/* ! __cplusplus */
-
-#ifdef __TURBOC__
- #pragma warn -rch
- #pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index.  If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition.  This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN yy_start = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state.  The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START ((yy_start - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#define YY_BUF_SIZE 16384
-
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-
-extern int yyleng;
-extern FILE *yyin, *yyout;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator).  This
- * avoids problems with code like:
- *
- * 	if ( condition_holds )
- *		yyless( 5 );
- *	else
- *		do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
-
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up yytext. */ \
-		*yy_cp = yy_hold_char; \
-		YY_RESTORE_YY_MORE_OFFSET \
-		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
-		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
-		} \
-	while ( 0 )
-
-#define unput(c) yyunput( c, yytext_ptr )
-
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-typedef unsigned int yy_size_t;
-
-
-struct yy_buffer_state
-	{
-	FILE *yy_input_file;
-
-	char *yy_ch_buf;		/* input buffer */
-	char *yy_buf_pos;		/* current position in input buffer */
-
-	/* Size of input buffer in bytes, not including room for EOB
-	 * characters.
-	 */
-	yy_size_t yy_buf_size;
-
-	/* Number of characters read into yy_ch_buf, not including EOB
-	 * characters.
-	 */
-	int yy_n_chars;
-
-	/* Whether we "own" the buffer - i.e., we know we created it,
-	 * and can realloc() it to grow it, and should free() it to
-	 * delete it.
-	 */
-	int yy_is_our_buffer;
-
-	/* Whether this is an "interactive" input source; if so, and
-	 * if we're using stdio for input, then we want to use getc()
-	 * instead of fread(), to make sure we stop fetching input after
-	 * each newline.
-	 */
-	int yy_is_interactive;
-
-	/* Whether we're considered to be at the beginning of a line.
-	 * If so, '^' rules will be active on the next match, otherwise
-	 * not.
-	 */
-	int yy_at_bol;
-
-	/* Whether to try to fill the input buffer when we reach the
-	 * end of it.
-	 */
-	int yy_fill_buffer;
-
-	int yy_buffer_status;
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
-	/* When an EOF's been seen but there's still some text to process
-	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
-	 * shouldn't try reading from the input source any more.  We might
-	 * still have a bunch of tokens to match, though, because of
-	 * possible backing-up.
-	 *
-	 * When we actually see the EOF, we change the status to "new"
-	 * (via yyrestart()), so that the user can continue scanning by
-	 * just pointing yyin at a new input file.
-	 */
-#define YY_BUFFER_EOF_PENDING 2
-	};
-
-static YY_BUFFER_STATE yy_current_buffer = 0;
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- */
-#define YY_CURRENT_BUFFER yy_current_buffer
-
-
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-
-static int yy_n_chars;		/* number of characters read into yy_ch_buf */
-
-
-int yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1;		/* whether we need to initialize */
-static int yy_start = 0;	/* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin.  A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart YY_PROTO(( FILE *input_file ));
-
-void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
-void yy_load_buffer_state YY_PROTO(( void ));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
-void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
-void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
-
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
-YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
-
-static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
-static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
-static void yy_flex_free YY_PROTO(( void * ));
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
-	{ \
-	if ( ! yy_current_buffer ) \
-		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
-	yy_current_buffer->yy_is_interactive = is_interactive; \
-	}
-
-#define yy_set_bol(at_bol) \
-	{ \
-	if ( ! yy_current_buffer ) \
-		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
-	yy_current_buffer->yy_at_bol = at_bol; \
-	}
-
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
-
-typedef unsigned char YY_CHAR;
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-typedef int yy_state_type;
-extern char *yytext;
-#define yytext_ptr yytext
-
-static yy_state_type yy_get_previous_state YY_PROTO(( void ));
-static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
-static int yy_get_next_buffer YY_PROTO(( void ));
-static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
-	yytext_ptr = yy_bp; \
-	yyleng = (int) (yy_cp - yy_bp); \
-	yy_hold_char = *yy_cp; \
-	*yy_cp = '\0'; \
-	yy_c_buf_p = yy_cp;
-
-#define YY_NUM_RULES 98
-#define YY_END_OF_BUFFER 99
-static yyconst short int yy_accept[557] =
-    {   0,
-        0,    0,   99,   97,    2,    1,   96,   97,   97,   97,
-       97,   90,   90,   97,   97,   97,    5,   97,    1,   97,
-       90,   97,   90,    4,    3,   90,   92,   97,   91,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,    3,    3,   92,   97,   90,   91,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       66,   97,   97,   97,   94,   97,   95,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   18,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   32,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   81,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   24,   97,   97,   97,   97,
-
-       22,   97,   97,   97,   97,   97,   31,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   52,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   67,   97,   97,   97,
-       97,   97,   97,   97,   97,   78,   97,   97,   97,   97,
-       97,   97,   93,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   19,   97,   97,   97,   97,   23,
-       97,   28,   97,   97,   97,   97,   97,   97,   37,   38,
-       97,   97,   97,   43,   97,   97,   97,   97,   97,   97,
-       97,   53,   97,   55,   56,   57,   97,   97,   97,   97,
-
-       97,   97,   97,   97,   97,   97,   97,   97,   74,   97,
-       77,   97,   97,   97,   97,   97,   97,   93,   97,    7,
-       97,   97,   97,   12,   97,   97,   97,   97,   97,   97,
-       97,   21,   26,   97,   97,   30,   97,   97,   33,   34,
-       97,   97,   42,   97,   97,   97,   97,   48,   97,   97,
-       97,   97,   97,   97,   60,   97,   97,   97,   65,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   11,   13,   97,   97,   97,
-       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-       44,   97,   97,   97,   97,   97,   97,   54,   58,   59,
-
-       97,   97,   63,   97,   97,   97,   97,   97,   97,   97,
-       97,   97,   97,   97,   97,   84,   97,   97,   97,   97,
-       97,   97,   97,   14,   15,   97,   97,   97,   20,   97,
-       97,   35,   97,   97,   40,   41,   97,   97,   97,   97,
-       97,   51,   97,   62,   97,   68,   69,   70,   97,   97,
-       97,   97,   79,   80,   82,   83,   97,   97,   97,   97,
-       97,   97,   10,   97,   97,   25,   97,   97,   36,   39,
-       97,   97,   97,   97,   97,   61,   97,   71,   97,   97,
-       97,   97,   97,   97,   97,   88,   97,   97,    8,   97,
-       16,   97,   97,   97,   97,   97,   97,   97,   97,   97,
-
-       72,   73,   97,   97,   97,   97,   87,   97,   97,   97,
-       97,   97,   29,   45,   97,   47,   49,   50,   97,   97,
-       97,   85,   86,   97,    6,   97,   97,   97,   97,   97,
-       75,   97,   89,   97,   97,   97,   46,   97,   97,   97,
-       97,   97,   97,   76,   97,   97,   97,   97,    9,   97,
-       97,   64,   17,   97,   27,    0
-    } ;
-
-static yyconst int yy_ec[256] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
-        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    2,    1,    4,    1,    5,    1,    1,    1,    1,
-        1,    6,    7,    1,    8,    9,   10,   11,   12,   13,
-       14,   15,   13,   13,   13,   13,   13,    1,    1,   16,
-        1,   17,    1,    1,   19,   20,   21,   22,   23,   24,
-       25,   26,   27,   28,   29,   30,   31,   32,   33,   34,
-       35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
-        1,    1,    1,    1,   18,    1,   19,   20,   21,   22,
-
-       23,   24,   25,   26,   27,   28,   29,   30,   31,   32,
-       33,   34,   35,   36,   37,   38,   39,   40,   41,   42,
-       43,   44,   45,    1,   45,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1
-    } ;
-
-static yyconst int yy_meta[46] =
-    {   0,
-        1,    2,    3,    2,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    2
-    } ;
-
-static yyconst short int yy_base[562] =
-    {   0,
-        0,   44,  663,    0,  664,    0,  664,    8,   81,   22,
-       18,  100,   19,  123,  630,  642,  664,    0,    0,   29,
-       30,  628,   51,    0,   65,   68,   14,  159,  164,   61,
-       91,  170,   43,  623,  631,  625,  623,  623,   70,   68,
-       66,   86,  621,   93,  175,  181,  128,  111,  629,  628,
-      619,  626,  136,    0,   18,  207,  213,    0,  605,  629,
-       45,  615,  627,  612,  102,  627,  607,  605,  604,  607,
-      614,  602,  597,  593,  603,  604,  595,  599,  597,  173,
-      603,  596,  596,  594,  588,  603,  601,  587,  586,  593,
-      598,  581,  100,  594,  597,  578,  596,  595,  578,  593,
-
-      584,  209,  568,  586,  176,  570,  578,  577,  588,  575,
-        0,  574,  566,  570,    0,  589,    0,  572,  577,  567,
-      563,  573,  558,  556,  562,  199,  555,    0,  552,  572,
-      550,  551,  566,  562,  567,  539,  563,  558,  562,  540,
-      561,    0,  547,  538,  543,  536,  550,  538,  146,  548,
-      546,  538,  548,  544,  543,  527,  532,  520,  545,  542,
-      195,  528,  529,  519,  535,  518,  525,  537,  528,   48,
-      520,  519,  526,  174,  532,  516,  515,    0,  514,  513,
-      506,  538,  500,  518,  517,  519,  502,  507,  530,  512,
-      507,  510,  499,  509,  513,    0,  510,  497,  508,  502,
-
-        0,  508,  493,  506,  496,  487,    0,  481,  500,  480,
-      480,  499,  498,  478,  486,  482,  494,  491,  472,  487,
-      471,  487,  467,  479,    0,  486,  464,  484,  483,  482,
-      471,   79,  474,  469,  474,  471,    0,  470,  465,  452,
-      465,  452,  471,  455,  469,    0,  452,  451,  450,  449,
-      458,  461,  231,  443,  461,  444,  445,  452,  457,  451,
-      450,  439,  438,  442,    0,  436,  448,  449,  448,    0,
-      437,    0,  440,  445,  439,  428,  442,  441,    0,    0,
-      430,  414,  438,    0,  424,  194,  415,  435,  419,  420,
-      416,    0,  425,    0,    0,    0,  416,  410,  428,  412,
-
-      411,  416,  424,  408,  402,  402,  399,  134,    0,  411,
-        0,  397,  396,  395,  394,  389,  398,    0,  408,    0,
-      409,  408,  409,    0,  408,  401,  385,  399,  389,  399,
-      389,    0,    0,  397,  398,    0,  393,  394,    0,    0,
-      395,  221,    0,  396,  373,  372,  372,    0,  384,  381,
-      375,  389,  388,  387,    0,  382,  377,  120,    0,  363,
-      362,  376,  372,  364,  377,  365,  357,  356,  355,  354,
-      230,  363,  350,  352,  357,    0,    0,  369,  368,  352,
-      364,  359,  364,  340,  357,  361,  354,  346,  358,  357,
-        0,  337,  336,  328,  347,  344,  351,    0,    0,    0,
-
-      344,  349,    0,  332,  347,  346,  345,  324,  324,  321,
-      335,  340,  339,  338,  337,    0,  321,  319,  328,  319,
-      313,  326,  330,    0,    0,  308,  307,  327,    0,  320,
-      319,    0,  324,  323,    0,    0,  299,  314,  303,  304,
-      309,    0,  317,    0,  301,    0,    0,    0,  315,  300,
-      307,  224,    0,    0,    0,    0,  302,  295,  303,  239,
-      286,  241,    0,  308,  301,    0,  287,  286,    0,    0,
-      298,  301,  296,  280,  279,    0,  294,    0,  298,  297,
-      294,  274,  280,  280,  292,    0,  271,  284,    0,  283,
-        0,  268,  266,  286,  285,  280,  283,  282,  281,  270,
-
-        0,    0,  264,  259,  277,  276,    0,  287,  274,  258,
-      246,  265,    0,    0,  264,    0,    0,    0,  248,  268,
-      257,    0,    0,  266,    0,  244,  244,  238,  262,  251,
-        0,  243,    0,  253,  227,  229,    0,  227,  242,  204,
-      209,  174,  160,    0,  122,   76,   35,   32,    0,   21,
-        1,    0,    0,    1,    0,  664,  266,    0,  269,  271,
-      273
-    } ;
-
-static yyconst short int yy_def[562] =
-    {   0,
-      557,  557,  556,  558,  556,  559,  556,  558,  558,  558,
-      558,  558,   12,  558,  558,  558,  556,  558,  559,  558,
-       12,  558,  558,  558,  560,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  560,  561,  558,  558,  558,   29,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  253,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
-      558,  558,  558,  558,  558,    0,  556,  556,  556,  556,
-      556
-    } ;
-
-static yyconst short int yy_nxt[710] =
-    {   0,
-       18,    5,    6,    7,  556,  556,    8,    9,   10,   11,
-       12,   13,   13,   13,   13,   14,   20,  555,   21,   21,
-       21,   21,   21,   24,   55,   55,   15,   25,   55,   55,
-      554,   16,   23,   23,   23,   23,   23,  553,   18,   23,
-       23,   23,   23,   23,   17,    5,    6,    7,  552,   18,
-        8,    9,   10,   11,   12,   13,   13,   13,   13,   14,
-       18,   23,   23,   23,   23,   23,   54,  551,   54,   76,
-       15,   18,   77,   28,  120,   16,  121,  239,   23,   23,
-       23,   23,   23,   59,   60,  240,   85,   61,   17,   20,
-       28,   21,   21,   21,   21,   21,   83,  298,   88,   62,
-
-       86,  299,   84,   87,   89,   90,  550,   22,   26,   54,
-       21,   21,   21,   21,   21,   94,   63,   95,  110,   27,
-       64,   91,   28,   65,   92,   96,  157,  111,  112,  158,
-       66,  125,  126,  113,  127,  107,  403,   54,  549,   54,
-      404,   29,   30,   31,   32,  108,   33,   34,   35,   36,
-       37,   38,   39,   40,   41,   42,   43,  364,   44,   45,
-       46,   47,   48,  365,   49,   56,   56,  109,  214,   57,
-       57,   57,   57,   57,   58,   58,   58,   58,   58,   97,
-       54,  215,   58,   58,   58,   58,   58,   58,   67,  142,
-       68,  548,  244,  143,  172,   98,   69,   99,  173,  102,
-
-      100,   70,  174,  103,  245,   71,  547,   72,   73,  144,
-      104,   74,   75,  227,  345,  101,  105,   57,   57,   57,
-       57,   57,  106,   57,   57,   57,   57,   57,  167,  192,
-      346,  546,  193,  168,  389,  390,  228,  229,  230,  545,
-      169,  318,  318,  318,  318,  318,  416,  481,  417,  318,
-      318,  318,  318,  318,  318,  486,  487,  489,  544,  543,
-      482,  490,  542,  418,  541,  419,    4,    4,    4,   19,
-       19,   53,   53,   54,   54,  540,  539,  538,  537,  536,
-      535,  534,  533,  532,  531,  530,  529,  528,  527,  526,
-      525,  524,  523,  522,  521,  520,  519,  518,  517,  516,
-
-      515,  514,  513,  512,  511,  510,  509,  508,  507,  506,
-      505,  504,  503,  502,  501,  500,  499,  498,  497,  496,
-      495,  494,  493,  492,  491,  488,  485,  484,  483,  480,
-      479,  478,  477,  476,  475,  474,  473,  472,  471,  470,
-      469,  468,  467,  466,  465,  464,  463,  462,  461,  460,
-      459,  458,  457,  456,  455,  454,  453,  452,  451,  450,
-      449,  448,  447,  446,  445,  444,  443,  442,  441,  440,
-      439,  438,  437,  436,  435,  434,  433,  432,  431,  430,
-      429,  428,  427,  426,  425,  424,  423,  422,  421,  420,
-      415,  414,  413,  412,  411,  410,  409,  408,  407,  406,
-
-      405,  402,  401,  400,  399,  398,  397,  396,  395,  394,
-      393,  392,  391,  388,  387,  386,  385,  384,  383,  382,
-      381,  380,  379,  378,  377,  376,  375,  374,  373,  372,
-      371,  370,  369,  368,  367,  366,  363,  362,  361,  360,
-      359,  358,  357,  356,  355,  354,  353,  352,  351,  350,
-      349,  348,  347,  344,  343,  342,  341,  340,  339,  338,
-      337,  336,  335,  334,  333,  332,  331,  330,  329,  328,
-      327,  326,  325,  324,  323,  322,  321,  320,  319,  317,
-      316,  315,  314,  313,  312,  311,  310,  309,  308,  307,
-      306,  305,  304,  303,  302,  301,  300,  297,  296,  295,
-
-      294,  293,  292,  291,  290,  289,  288,  287,  286,  285,
-      284,  283,  282,  281,  280,  279,  278,  277,  276,  275,
-      274,  273,  272,  271,  270,  269,  268,  267,  266,  265,
-      264,  263,  262,  261,  260,  259,  258,  257,  256,  255,
-      254,  253,  252,  251,  250,  249,  248,  247,  246,  243,
-      242,  241,  238,  237,  236,  235,  234,  233,  232,  231,
-      226,  225,  224,  223,  222,  221,  220,  219,  218,  217,
-      216,  213,  212,  211,  210,  209,  208,  207,  206,  205,
-      204,  203,  202,  201,  200,  199,  198,  197,  196,  195,
-      194,  191,  190,  189,  188,  187,  186,  185,  184,  183,
-
-      182,  181,  180,  179,  178,  177,  176,  175,  171,  170,
-      166,  165,  164,  163,  162,  161,  160,  159,  156,  155,
-      154,  153,  152,  151,  150,  149,  148,  147,  146,  145,
-      141,  140,  139,  138,  137,  136,  135,  134,  133,  132,
-      131,  130,  129,  128,  124,  123,  122,  119,  118,  117,
-      116,  115,  114,   93,   82,   81,   80,   79,   78,   52,
-       51,   50,  556,    3,  556,  556,  556,  556,  556,  556,
-      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
-      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
-      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
-
-      556,  556,  556,  556,  556,  556,  556,  556,  556
-    } ;
-
-static yyconst short int yy_chk[710] =
-    {   0,
-      558,    1,    1,    1,    0,    0,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    8,  554,    8,    8,
-        8,    8,    8,   11,   27,   27,    1,   11,   55,   55,
-      551,    1,   10,   10,   10,   10,   10,  550,   13,   20,
-       20,   20,   20,   20,    1,    2,    2,    2,  548,   21,
-        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-       13,   23,   23,   23,   23,   23,   25,  547,   25,   33,
-        2,   21,   33,   23,   61,    2,   61,  170,   26,   26,
-       26,   26,   26,   30,   30,  170,   40,   30,    2,    9,
-       26,    9,    9,    9,    9,    9,   39,  232,   41,   30,
-
-       40,  232,   39,   40,   41,   42,  546,    9,   12,   25,
-       12,   12,   12,   12,   12,   44,   31,   44,   48,   12,
-       31,   42,   12,   31,   42,   44,   93,   48,   48,   93,
-       31,   65,   65,   48,   65,   47,  358,   53,  545,   53,
-      358,   12,   14,   14,   14,   47,   14,   14,   14,   14,
-       14,   14,   14,   14,   14,   14,   14,  308,   14,   14,
-       14,   14,   14,  308,   14,   28,   28,   47,  149,   28,
-       28,   28,   28,   28,   29,   29,   29,   29,   29,   45,
-       53,  149,   29,   29,   29,   29,   29,   29,   32,   80,
-       32,  543,  174,   80,  105,   45,   32,   45,  105,   46,
-
-       45,   32,  105,   46,  174,   32,  542,   32,   32,   80,
-       46,   32,   32,  161,  286,   45,   46,   56,   56,   56,
-       56,   56,   46,   57,   57,   57,   57,   57,  102,  126,
-      286,  541,  126,  102,  342,  342,  161,  161,  161,  540,
-      102,  253,  253,  253,  253,  253,  371,  452,  371,  253,
-      253,  253,  253,  253,  253,  460,  460,  462,  539,  538,
-      452,  462,  536,  371,  535,  371,  557,  557,  557,  559,
-      559,  560,  560,  561,  561,  534,  532,  530,  529,  528,
-      527,  526,  524,  521,  520,  519,  515,  512,  511,  510,
-      509,  508,  506,  505,  504,  503,  500,  499,  498,  497,
-
-      496,  495,  494,  493,  492,  490,  488,  487,  485,  484,
-      483,  482,  481,  480,  479,  477,  475,  474,  473,  472,
-      471,  468,  467,  465,  464,  461,  459,  458,  457,  451,
-      450,  449,  445,  443,  441,  440,  439,  438,  437,  434,
-      433,  431,  430,  428,  427,  426,  423,  422,  421,  420,
-      419,  418,  417,  415,  414,  413,  412,  411,  410,  409,
-      408,  407,  406,  405,  404,  402,  401,  397,  396,  395,
-      394,  393,  392,  390,  389,  388,  387,  386,  385,  384,
-      383,  382,  381,  380,  379,  378,  375,  374,  373,  372,
-      370,  369,  368,  367,  366,  365,  364,  363,  362,  361,
-
-      360,  357,  356,  354,  353,  352,  351,  350,  349,  347,
-      346,  345,  344,  341,  338,  337,  335,  334,  331,  330,
-      329,  328,  327,  326,  325,  323,  322,  321,  319,  317,
-      316,  315,  314,  313,  312,  310,  307,  306,  305,  304,
-      303,  302,  301,  300,  299,  298,  297,  293,  291,  290,
-      289,  288,  287,  285,  283,  282,  281,  278,  277,  276,
-      275,  274,  273,  271,  269,  268,  267,  266,  264,  263,
-      262,  261,  260,  259,  258,  257,  256,  255,  254,  252,
-      251,  250,  249,  248,  247,  245,  244,  243,  242,  241,
-      240,  239,  238,  236,  235,  234,  233,  231,  230,  229,
-
-      228,  227,  226,  224,  223,  222,  221,  220,  219,  218,
-      217,  216,  215,  214,  213,  212,  211,  210,  209,  208,
-      206,  205,  204,  203,  202,  200,  199,  198,  197,  195,
-      194,  193,  192,  191,  190,  189,  188,  187,  186,  185,
-      184,  183,  182,  181,  180,  179,  177,  176,  175,  173,
-      172,  171,  169,  168,  167,  166,  165,  164,  163,  162,
-      160,  159,  158,  157,  156,  155,  154,  153,  152,  151,
-      150,  148,  147,  146,  145,  144,  143,  141,  140,  139,
-      138,  137,  136,  135,  134,  133,  132,  131,  130,  129,
-      127,  125,  124,  123,  122,  121,  120,  119,  118,  116,
-
-      114,  113,  112,  110,  109,  108,  107,  106,  104,  103,
-      101,  100,   99,   98,   97,   96,   95,   94,   92,   91,
-       90,   89,   88,   87,   86,   85,   84,   83,   82,   81,
-       79,   78,   77,   76,   75,   74,   73,   72,   71,   70,
-       69,   68,   67,   66,   64,   63,   62,   60,   59,   52,
-       51,   50,   49,   43,   38,   37,   36,   35,   34,   22,
-       16,   15,    3,  556,  556,  556,  556,  556,  556,  556,
-      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
-      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
-      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
-
-      556,  556,  556,  556,  556,  556,  556,  556,  556
-    } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "lexer.lxx"
-#define INITIAL 0
-/*
-// Filename: lexer.l
-// Created by:  drose (16Jan99)
-// 
-////////////////////////////////////////////////////////////////////
-*/
-#line 9 "lexer.lxx"
-#include "lexerDefs.h"
-#include "parserDefs.h"
-#include "config_egg.h"
-#include "parser.h"
-
-#include <indent.h>
-#include <notify.h>
-
-#include <math.h>
-#include <pandabase.h>
-
-extern "C" int eggyywrap(void);  // declared below.
-
-static int yyinput(void);        // declared by flex.
-
-
-////////////////////////////////////////////////////////////////////
-// Static variables
-////////////////////////////////////////////////////////////////////
-
-// We'll increment line_number and col_number as we parse the file, so
-// that we can report the position of an error.
-static int line_number = 0;
-static int col_number = 0;
-
-// current_line holds as much of the current line as will fit.  Its
-// only purpose is for printing it out to report an error to the user.
-static const int max_error_width = 1024;
-static char current_line[max_error_width + 1];
-
-static int error_count = 0;
-static int warning_count = 0;
-
-// This is the pointer to the current input stream.
-static istream *inp = NULL;
-
-// This is the name of the egg file we're parsing.  We keep it so we
-// can print it out for error messages.
-static string egg_filename;
-
-// This is the initial token state returned by the lexer.  It allows
-// the yacc grammar to start from initial points.
-static int initial_token;
-
-
-////////////////////////////////////////////////////////////////////
-// Defining the interface to the lexer.
-////////////////////////////////////////////////////////////////////
-
-void
-egg_init_lexer(istream &in, const string &filename) {
-  inp = &in;
-  egg_filename = filename;
-  line_number = 0;
-  col_number = 0;
-  error_count = 0;
-  warning_count = 0;
-  initial_token = START_EGG;
-}
-
-void
-egg_start_group_body() {
-  /* Set the initial state to begin within a group_body context,
-     instead of at the beginning of the egg file. */
-  initial_token = START_GROUP_BODY;
-}
-
-void
-egg_start_texture_body() {
-  initial_token = START_TEXTURE_BODY;
-}
-
-void
-egg_start_primitive_body() {
-  initial_token = START_PRIMITIVE_BODY;
-}
-
-int
-egg_error_count() {
-  return error_count;
-}
-
-int
-egg_warning_count() {
-  return warning_count;
-}
-
-
-////////////////////////////////////////////////////////////////////
-// Internal support functions.
-////////////////////////////////////////////////////////////////////
-
-int
-eggyywrap(void) {
-  return 1;
-}
-
-void
-eggyyerror(const string &msg) {
-  if (egg_cat.is_error()) {
-    ostream &out = egg_cat.error(false);
-
-    out << "\nError";
-    if (!egg_filename.empty()) {
-      out << " in " << egg_filename;
-    }
-    out 
-      << " at line " << line_number << ", column " << col_number << ":\n"
-      << setiosflags(Notify::get_literal_flag())
-      << current_line << "\n";
-    indent(out, col_number-1) 
-      << "^\n" << msg << "\n\n" 
-      << resetiosflags(Notify::get_literal_flag()) << flush;
-  }
-  error_count++;
-}
-
-void
-eggyyerror(ostringstream &strm) {
-  string s = strm.str();
-  eggyyerror(s);
-}
-
-void
-eggyywarning(const string &msg) {
-  if (egg_cat.is_warning()) {
-    ostream &out = egg_cat.warning(false);
-
-    out << "\nWarning";
-    if (!egg_filename.empty()) {
-      out << " in " << egg_filename;
-    }
-    out 
-      << " at line " << line_number << ", column " << col_number << ":\n"
-      << setiosflags(Notify::get_literal_flag())
-      << current_line << "\n";
-    indent(out, col_number-1) 
-      << "^\n" << msg << "\n\n" 
-      << resetiosflags(Notify::get_literal_flag()) << flush;
-  }
-  warning_count++;
-}
-
-void
-eggyywarning(ostringstream &strm) {
-  string s = strm.str();
-  eggyywarning(s);
-}
-
-// Now define a function to take input from an istream instead of a
-// stdio FILE pointer.  This is flex-specific.
-static void
-input_chars(char *buffer, int &result, int max_size) {
-  nassertv(inp != NULL);
-  if (*inp) {
-    inp->read(buffer, max_size);
-    result = inp->gcount();
-
-    if (line_number == 0) {
-      // This is a special case.  If we are reading the very first bit
-      // from the stream, copy it into the current_line array.  This
-      // is because the \n.* rule below, which fills current_line
-      // normally, doesn't catch the first line.
-      int length = min(max_error_width, result);
-      strncpy(current_line, buffer, length);
-      current_line[length] = '\0';
-      line_number++;
-      col_number = 0;
-
-      // Truncate it at the newline.
-      char *end = strchr(current_line, '\n');
-      if (end != NULL) {
-        *end = '\0';
-      }
-    }
-
-  } else {
-    // End of file or I/O error.
-    result = 0;
-  }
-}
-#undef YY_INPUT
-#define YY_INPUT(buffer, result, max_size) input_chars(buffer, result, max_size)
-
-// read_char reads and returns a single character, incrementing the
-// supplied line and column numbers as appropriate.  A convenience
-// function for the scanning functions below.
-static int
-read_char(int &line, int &col) {
-  int c = yyinput();
-  if (c == '\n') {
-    line++;
-    col = 0;
-  } else {
-    col++;
-  }
-  return c;
-}
-
-// scan_quoted_string reads a string delimited by quotation marks and
-// returns it.
-static string
-scan_quoted_string() {
-  string result;
-
-  // We don't touch the current line number and column number during
-  // scanning, so that if we detect an error while scanning the string
-  // (e.g. an unterminated string), we'll report the error as
-  // occurring at the start of the string, not at the end--somewhat
-  // more convenient for the user.
-
-  // Instead of adjusting the global line_number and col_number
-  // variables, we'll operate on our own local variables for the
-  // interim.
-  int line = line_number;
-  int col = col_number;
-
-  int c;
-  c = read_char(line, col);
-  while (c != '"' && c != EOF) {
-    result += c;
-    c = read_char(line, col);
-  }
-
-  if (c == EOF) {
-    eggyyerror("This quotation mark is unterminated.");
-  }
-
-  line_number = line;
-  col_number = col;
-
-  return result;
-}
-
-// eat_c_comment scans past all characters up until the first */
-// encountered.
-static void
-eat_c_comment() {
-  // As above, we'll operate on our own local copies of line_number
-  // and col_number within this function.
-
-  int line = line_number;
-  int col = col_number;
-
-  int c, last_c;
-  
-  last_c = '\0';
-  c = read_char(line, col);
-  while (c != EOF && !(last_c == '*' && c == '/')) {
-    if (last_c == '/' && c == '*') {
-      ostringstream errmsg;
-      errmsg << "This comment contains a nested /* symbol at line "
-             << line << ", column " << col-1 << "--possibly unclosed?"
-             << ends;
-      eggyywarning(errmsg);
-    }
-    last_c = c;
-    c = read_char(line, col);
-  }
-
-  if (c == EOF) {
-    eggyyerror("This comment marker is unclosed.");
-  }
-
-  line_number = line;
-  col_number = col;
-}
-
-
-// accept() is called below as each piece is pulled off and
-// accepted by the lexer; it increments the current column number.
-INLINE void accept() {
-  col_number += yyleng;
-}
-
-#line 1004 "lex.yy.c"
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap YY_PROTO(( void ));
-#else
-extern int yywrap YY_PROTO(( void ));
-#endif
-#endif
-
-#ifndef YY_NO_UNPUT
-static void yyunput YY_PROTO(( int c, char *buf_ptr ));
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO(( yyconst char * ));
-#endif
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-static int yyinput YY_PROTO(( void ));
-#else
-static int input YY_PROTO(( void ));
-#endif
-#endif
-
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO(( int new_state ));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO(( void ));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO(( void ));
-#endif
-
-#else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
-#endif
-
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
-#else
-/* Just try to get by without declaring the routines.  This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
-#endif
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
-#endif
-
-/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
-	if ( yy_current_buffer->yy_is_interactive ) \
-		{ \
-		int c = '*', n; \
-		for ( n = 0; n < max_size && \
-			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
-			buf[n] = (char) c; \
-		if ( c == '\n' ) \
-			buf[n++] = (char) c; \
-		if ( c == EOF && ferror( yyin ) ) \
-			YY_FATAL_ERROR( "input in flex scanner failed" ); \
-		result = n; \
-		} \
-	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
-		  && ferror( yyin ) ) \
-		YY_FATAL_ERROR( "input in flex scanner failed" );
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL int yylex YY_PROTO(( void ))
-#endif
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
-	YY_USER_ACTION
-
-YY_DECL
-	{
-	register yy_state_type yy_current_state;
-	register char *yy_cp = NULL, *yy_bp = NULL;
-	register int yy_act;
-
-#line 290 "lexer.lxx"
-
-
-
-  if (initial_token != 0) {
-    int t = initial_token;
-    initial_token = 0;
-    return t;
-  }
-
-
-#line 1166 "lex.yy.c"
-
-	if ( yy_init )
-		{
-		yy_init = 0;
-
-#ifdef YY_USER_INIT
-		YY_USER_INIT;
-#endif
-
-		if ( ! yy_start )
-			yy_start = 1;	/* first start state */
-
-		if ( ! yyin )
-			yyin = stdin;
-
-		if ( ! yyout )
-			yyout = stdout;
-
-		if ( ! yy_current_buffer )
-			yy_current_buffer =
-				yy_create_buffer( yyin, YY_BUF_SIZE );
-
-		yy_load_buffer_state();
-		}
-
-	while ( 1 )		/* loops until end-of-file is reached */
-		{
-		yy_cp = yy_c_buf_p;
-
-		/* Support of yytext. */
-		*yy_cp = yy_hold_char;
-
-		/* yy_bp points to the position in yy_ch_buf of the start of
-		 * the current run.
-		 */
-		yy_bp = yy_cp;
-
-		yy_current_state = yy_start;
-yy_match:
-		do
-			{
-			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
-			if ( yy_accept[yy_current_state] )
-				{
-				yy_last_accepting_state = yy_current_state;
-				yy_last_accepting_cpos = yy_cp;
-				}
-			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-				{
-				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 557 )
-					yy_c = yy_meta[(unsigned int) yy_c];
-				}
-			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-			++yy_cp;
-			}
-		while ( yy_base[yy_current_state] != 664 );
-
-yy_find_action:
-		yy_act = yy_accept[yy_current_state];
-		if ( yy_act == 0 )
-			{ /* have to back up */
-			yy_cp = yy_last_accepting_cpos;
-			yy_current_state = yy_last_accepting_state;
-			yy_act = yy_accept[yy_current_state];
-			}
-
-		YY_DO_BEFORE_ACTION;
-
-
-do_action:	/* This label is used only to access EOF actions. */
-
-
-		switch ( yy_act )
-	{ /* beginning of action switch */
-			case 0: /* must back up */
-			/* undo the effects of YY_DO_BEFORE_ACTION */
-			*yy_cp = yy_hold_char;
-			yy_cp = yy_last_accepting_cpos;
-			yy_current_state = yy_last_accepting_state;
-			goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 300 "lexer.lxx"
-{
-  // New line.  Save a copy of the line so we can print it out for the
-  // benefit of the user in case we get an error.
-
-  strncpy(current_line, yytext+1, max_error_width);
-  current_line[max_error_width] = '\0';
-  line_number++;
-  col_number=0;
-
-  // Return the whole line to the lexer, except the newline character,
-  // which we eat.
-  yyless(1);
-}
-	YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 314 "lexer.lxx"
-{ 
-  // Eat whitespace.
-  accept();
-}
-	YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 319 "lexer.lxx"
-{ 
-  // Eat C++-style comments.
-  accept();
-}
-	YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 324 "lexer.lxx"
-{
-  // Eat C-style comments.
-  accept();
-  eat_c_comment(); 
-}
-	YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 330 "lexer.lxx"
-{
-  // Send curly braces as themselves.
-  accept(); 
-  return eggyytext[0];
-}
-	YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 338 "lexer.lxx"
-{
-  accept();
-  return BEZIERCURVE;
-}
-	YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 342 "lexer.lxx"
-{
-  accept();
-  return BFACE;
-}
-	YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 346 "lexer.lxx"
-{
-  accept();
-  return BILLBOARD;
-}
-	YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 350 "lexer.lxx"
-{
-  accept();
-  return BILLBOARDCENTER;
-}
-	YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 354 "lexer.lxx"
-{
-  accept();
-  return BINORMAL;
-}
-	YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 358 "lexer.lxx"
-{
-  accept();
-  return BUNDLE;
-}
-	YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 362 "lexer.lxx"
-{
-  accept();
-  return SCALAR;
-}
-	YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 366 "lexer.lxx"
-{
-  accept();
-  return CLOSED;
-}
-	YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 370 "lexer.lxx"
-{
-  accept();
-  return COLLIDE;
-}
-	YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 374 "lexer.lxx"
-{
-  accept();
-  return COMMENT;
-}
-	YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 378 "lexer.lxx"
-{
-  accept();
-  return COMPONENT;
-}
-	YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 382 "lexer.lxx"
-{
-  accept();
-  return COORDSYSTEM;
-}
-	YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 386 "lexer.lxx"
-{
-  accept();
-  return CV;
-}
-	YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 390 "lexer.lxx"
-{
-  accept();
-  return DART;
-}
-	YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 394 "lexer.lxx"
-{
-  accept();
-  return DNORMAL;
-}
-	YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 398 "lexer.lxx"
-{
-  accept();
-  return DRGBA;
-}
-	YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 402 "lexer.lxx"
-{
-  accept();
-  return DUV;
-}
-	YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 406 "lexer.lxx"
-{
-  accept();
-  return DXYZ;
-}
-	YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 410 "lexer.lxx"
-{
-  accept();
-  return DCS;
-}
-	YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 414 "lexer.lxx"
-{
-  accept();
-  return DISTANCE;
-}
-	YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 418 "lexer.lxx"
-{
-  accept();
-  return DTREF;
-}
-	YY_BREAK
-case 27:
-YY_RULE_SETUP
-#line 422 "lexer.lxx"
-{
-  accept();
-  return DYNAMICVERTEXPOOL;
-}
-	YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 426 "lexer.lxx"
-{
-  accept();
-  return EXTERNAL_FILE;
-}
-	YY_BREAK
-case 29:
-YY_RULE_SETUP
-#line 430 "lexer.lxx"
-{
-  accept();
-  return FLIGHT;
-}
-	YY_BREAK
-case 30:
-YY_RULE_SETUP
-#line 434 "lexer.lxx"
-{
-  accept();
-  return GROUP;
-}
-	YY_BREAK
-case 31:
-YY_RULE_SETUP
-#line 438 "lexer.lxx"
-{
-  accept();
-  return HIP;
-}
-	YY_BREAK
-case 32:
-YY_RULE_SETUP
-#line 442 "lexer.lxx"
-{
-  accept();
-  return INTANGENT;
-}
-	YY_BREAK
-case 33:
-YY_RULE_SETUP
-#line 446 "lexer.lxx"
-{
-  accept();
-  return JOINT;
-}
-	YY_BREAK
-case 34:
-YY_RULE_SETUP
-#line 450 "lexer.lxx"
-{
-  accept();
-  return KNOTS;
-}
-	YY_BREAK
-case 35:
-YY_RULE_SETUP
-#line 454 "lexer.lxx"
-{
-  accept();
-  return INCLUDE;
-}
-	YY_BREAK
-case 36:
-YY_RULE_SETUP
-#line 458 "lexer.lxx"
-{
-  accept();
-  return INSTANCE;
-}
-	YY_BREAK
-case 37:
-YY_RULE_SETUP
-#line 462 "lexer.lxx"
-{
-  accept();
-  return LINE;
-}
-	YY_BREAK
-case 38:
-YY_RULE_SETUP
-#line 466 "lexer.lxx"
-{
-  accept();
-  return LOOP;
-}
-	YY_BREAK
-case 39:
-YY_RULE_SETUP
-#line 470 "lexer.lxx"
-{
-  accept();
-  return MATERIAL;
-}
-	YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 474 "lexer.lxx"
-{
-  accept();
-  return MATRIX3;
-}
-	YY_BREAK
-case 41:
-YY_RULE_SETUP
-#line 478 "lexer.lxx"
-{
-  accept();
-  return MATRIX4;
-}
-	YY_BREAK
-case 42:
-YY_RULE_SETUP
-#line 482 "lexer.lxx"
-{
-  accept();
-  return MODEL;
-}
-	YY_BREAK
-case 43:
-YY_RULE_SETUP
-#line 486 "lexer.lxx"
-{
-  accept();
-  return MREF;
-}
-	YY_BREAK
-case 44:
-YY_RULE_SETUP
-#line 490 "lexer.lxx"
-{
-  accept();
-  return NORMAL;
-}
-	YY_BREAK
-case 45:
-YY_RULE_SETUP
-#line 494 "lexer.lxx"
-{
-  accept();
-  return NURBSCURVE;
-}
-	YY_BREAK
-case 46:
-YY_RULE_SETUP
-#line 498 "lexer.lxx"
-{
-  accept();
-  return NURBSSURFACE;
-}
-	YY_BREAK
-case 47:
-YY_RULE_SETUP
-#line 502 "lexer.lxx"
-{
-  accept();
-  return OBJECTTYPE;
-}
-	YY_BREAK
-case 48:
-YY_RULE_SETUP
-#line 506 "lexer.lxx"
-{
-  accept();
-  return ORDER;
-}
-	YY_BREAK
-case 49:
-YY_RULE_SETUP
-#line 510 "lexer.lxx"
-{
-  accept();
-  return OUTTANGENT;
-}
-	YY_BREAK
-case 50:
-YY_RULE_SETUP
-#line 514 "lexer.lxx"
-{
-  accept();
-  return POINTLIGHT;
-}
-	YY_BREAK
-case 51:
-YY_RULE_SETUP
-#line 518 "lexer.lxx"
-{
-  accept();
-  return POLYGON;
-}
-	YY_BREAK
-case 52:
-YY_RULE_SETUP
-#line 522 "lexer.lxx"
-{
-  accept();
-  return REF;
-}
-	YY_BREAK
-case 53:
-YY_RULE_SETUP
-#line 526 "lexer.lxx"
-{
-  accept();
-  return RGBA;
-}
-	YY_BREAK
-case 54:
-YY_RULE_SETUP
-#line 530 "lexer.lxx"
-{
-  accept();
-  return ROTATE;
-}
-	YY_BREAK
-case 55:
-YY_RULE_SETUP
-#line 534 "lexer.lxx"
-{
-  accept();
-  return ROTX;
-}
-	YY_BREAK
-case 56:
-YY_RULE_SETUP
-#line 538 "lexer.lxx"
-{
-  accept();
-  return ROTY;
-}
-	YY_BREAK
-case 57:
-YY_RULE_SETUP
-#line 542 "lexer.lxx"
-{
-  accept();
-  return ROTZ;
-}
-	YY_BREAK
-case 58:
-YY_RULE_SETUP
-#line 546 "lexer.lxx"
-{
-  accept();
-  return SANIM;
-}
-	YY_BREAK
-case 59:
-YY_RULE_SETUP
-#line 550 "lexer.lxx"
-{
-  accept();
-  return SCALAR;
-}
-	YY_BREAK
-case 60:
-YY_RULE_SETUP
-#line 554 "lexer.lxx"
-{
-  accept();
-  return SCALE;
-}
-	YY_BREAK
-case 61:
-YY_RULE_SETUP
-#line 558 "lexer.lxx"
-{
-  accept();
-  return SEQUENCE;
-}
-	YY_BREAK
-case 62:
-YY_RULE_SETUP
-#line 562 "lexer.lxx"
-{
-  accept();
-  return SHADING;
-}
-	YY_BREAK
-case 63:
-YY_RULE_SETUP
-#line 566 "lexer.lxx"
-{
-  accept();
-  return SWITCH;
-}
-	YY_BREAK
-case 64:
-YY_RULE_SETUP
-#line 570 "lexer.lxx"
-{
-  accept();
-  return SWITCHCONDITION;
-}
-	YY_BREAK
-case 65:
-YY_RULE_SETUP
-#line 574 "lexer.lxx"
-{
-  accept();
-  return TABLE;
-}
-	YY_BREAK
-case 66:
-YY_RULE_SETUP
-#line 578 "lexer.lxx"
-{
-  accept();
-  return TABLE_V;
-}
-	YY_BREAK
-case 67:
-YY_RULE_SETUP
-#line 582 "lexer.lxx"
-{
-  accept();
-  return TAG;
-}
-	YY_BREAK
-case 68:
-YY_RULE_SETUP
-#line 586 "lexer.lxx"
-{
-  accept();
-  return TANGENT;
-}
-	YY_BREAK
-case 69:
-YY_RULE_SETUP
-#line 590 "lexer.lxx"
-{
-  accept();
-  return TEXLIST;
-}
-	YY_BREAK
-case 70:
-YY_RULE_SETUP
-#line 594 "lexer.lxx"
-{
-  accept();
-  return TEXTURE;
-}
-	YY_BREAK
-case 71:
-YY_RULE_SETUP
-#line 598 "lexer.lxx"
-{
-  accept();
-  return TLENGTHS;
-}
-	YY_BREAK
-case 72:
-YY_RULE_SETUP
-#line 602 "lexer.lxx"
-{
-  accept();
-  return TRANSFORM;
-}
-	YY_BREAK
-case 73:
-YY_RULE_SETUP
-#line 606 "lexer.lxx"
-{
-  accept();
-  return TRANSLATE;
-}
-	YY_BREAK
-case 74:
-YY_RULE_SETUP
-#line 610 "lexer.lxx"
-{
-  accept();
-  return TREF;
-}
-	YY_BREAK
-case 75:
-YY_RULE_SETUP
-#line 614 "lexer.lxx"
-{
-  accept();
-  return TRIANGLEFAN;
-}
-	YY_BREAK
-case 76:
-YY_RULE_SETUP
-#line 618 "lexer.lxx"
-{
-  accept();
-  return TRIANGLESTRIP;
-}
-	YY_BREAK
-case 77:
-YY_RULE_SETUP
-#line 622 "lexer.lxx"
-{
-  accept();
-  return TRIM;
-}
-	YY_BREAK
-case 78:
-YY_RULE_SETUP
-#line 626 "lexer.lxx"
-{
-  accept();
-  return TXT;
-}
-	YY_BREAK
-case 79:
-YY_RULE_SETUP
-#line 630 "lexer.lxx"
-{
-  accept();
-  return UKNOTS;
-}
-	YY_BREAK
-case 80:
-YY_RULE_SETUP
-#line 634 "lexer.lxx"
-{
-  accept();
-  return UKNOTS;
-}
-	YY_BREAK
-case 81:
-YY_RULE_SETUP
-#line 638 "lexer.lxx"
-{
-  accept();
-  return UV;
-}
-	YY_BREAK
-case 82:
-YY_RULE_SETUP
-#line 642 "lexer.lxx"
-{
-  accept();
-  return VKNOTS;
-}
-	YY_BREAK
-case 83:
-YY_RULE_SETUP
-#line 646 "lexer.lxx"
-{
-  accept();
-  return VKNOTS;
-}
-	YY_BREAK
-case 84:
-YY_RULE_SETUP
-#line 650 "lexer.lxx"
-{
-  accept();
-  return VERTEX;
-}
-	YY_BREAK
-case 85:
-YY_RULE_SETUP
-#line 654 "lexer.lxx"
-{
-  accept();
-  return VERTEXANIM;
-}
-	YY_BREAK
-case 86:
-YY_RULE_SETUP
-#line 658 "lexer.lxx"
-{
-  accept();
-  return VERTEXPOOL;
-}
-	YY_BREAK
-case 87:
-YY_RULE_SETUP
-#line 662 "lexer.lxx"
-{
-  accept();
-  return VERTEXREF;
-}
-	YY_BREAK
-case 88:
-YY_RULE_SETUP
-#line 666 "lexer.lxx"
-{
-  accept();
-  return XFMANIM;
-}
-	YY_BREAK
-case 89:
-YY_RULE_SETUP
-#line 670 "lexer.lxx"
-{
-  accept();
-  return XFMSANIM;
-}
-	YY_BREAK
-case 90:
-YY_RULE_SETUP
-#line 677 "lexer.lxx"
-{ 
-  // An integer or floating-point number.
-  accept(); 
-  eggyylval._number = atof(eggyytext); 
-  eggyylval._string = yytext;
-  return NUMBER; 
-}
-	YY_BREAK
-case 91:
-YY_RULE_SETUP
-#line 685 "lexer.lxx"
-{
-  // A hexadecimal integer number.
-  accept(); 
-  eggyylval._ulong = strtoul(yytext+2, NULL, 16);
-  eggyylval._string = yytext;
-  return ULONG; 
-}
-	YY_BREAK
-case 92:
-YY_RULE_SETUP
-#line 693 "lexer.lxx"
-{
-  // A binary integer number.
-  accept(); 
-  eggyylval._ulong = strtoul(yytext+2, NULL, 2);
-  eggyylval._string = yytext;
-  return ULONG; 
-}
-	YY_BREAK
-case 93:
-YY_RULE_SETUP
-#line 701 "lexer.lxx"
-{
-  // not-a-number.  These sometimes show up in egg files accidentally.
-  accept(); 
-  memset(&eggyylval._number, 0, sizeof(eggyylval._number));
-  *(unsigned long *)&eggyylval._number = strtoul(yytext+3, NULL, 0);
-  eggyylval._string = yytext;
-  return NUMBER;
-}
-	YY_BREAK
-case 94:
-YY_RULE_SETUP
-#line 710 "lexer.lxx"
-{ 
-  // infinity.  As above.
-  accept(); 
-  eggyylval._number = HUGE_VAL;
-  eggyylval._string = yytext;
-  return NUMBER; 
-}
-	YY_BREAK
-case 95:
-YY_RULE_SETUP
-#line 718 "lexer.lxx"
-{
-  // minus infinity.  As above.
-  accept(); 
-  eggyylval._number = -HUGE_VAL;
-  eggyylval._string = yytext;
-  return NUMBER; 
-}
-	YY_BREAK
-case 96:
-YY_RULE_SETUP
-#line 727 "lexer.lxx"
-{
-  // Quoted string.
-  accept();
-  eggyylval._string = scan_quoted_string();
-  return STRING;
-}
-	YY_BREAK
-case 97:
-YY_RULE_SETUP
-#line 734 "lexer.lxx"
-{ 
-  // Unquoted string.
-  accept();
-  eggyylval._string = yytext;
-  return STRING;
-}
-	YY_BREAK
-case 98:
-YY_RULE_SETUP
-#line 740 "lexer.lxx"
-ECHO;
-	YY_BREAK
-#line 2064 "lex.yy.c"
-case YY_STATE_EOF(INITIAL):
-	yyterminate();
-
-	case YY_END_OF_BUFFER:
-		{
-		/* Amount of text matched not including the EOB char. */
-		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
-
-		/* Undo the effects of YY_DO_BEFORE_ACTION. */
-		*yy_cp = yy_hold_char;
-		YY_RESTORE_YY_MORE_OFFSET
-
-		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
-			{
-			/* We're scanning a new file or input source.  It's
-			 * possible that this happened because the user
-			 * just pointed yyin at a new source and called
-			 * yylex().  If so, then we have to assure
-			 * consistency between yy_current_buffer and our
-			 * globals.  Here is the right place to do so, because
-			 * this is the first action (other than possibly a
-			 * back-up) that will match for the new input source.
-			 */
-			yy_n_chars = yy_current_buffer->yy_n_chars;
-			yy_current_buffer->yy_input_file = yyin;
-			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
-			}
-
-		/* Note that here we test for yy_c_buf_p "<=" to the position
-		 * of the first EOB in the buffer, since yy_c_buf_p will
-		 * already have been incremented past the NUL character
-		 * (since all states make transitions on EOB to the
-		 * end-of-buffer state).  Contrast this with the test
-		 * in input().
-		 */
-		if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
-			{ /* This was really a NUL. */
-			yy_state_type yy_next_state;
-
-			yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
-
-			yy_current_state = yy_get_previous_state();
-
-			/* Okay, we're now positioned to make the NUL
-			 * transition.  We couldn't have
-			 * yy_get_previous_state() go ahead and do it
-			 * for us because it doesn't know how to deal
-			 * with the possibility of jamming (and we don't
-			 * want to build jamming into it because then it
-			 * will run more slowly).
-			 */
-
-			yy_next_state = yy_try_NUL_trans( yy_current_state );
-
-			yy_bp = yytext_ptr + YY_MORE_ADJ;
-
-			if ( yy_next_state )
-				{
-				/* Consume the NUL. */
-				yy_cp = ++yy_c_buf_p;
-				yy_current_state = yy_next_state;
-				goto yy_match;
-				}
-
-			else
-				{
-				yy_cp = yy_c_buf_p;
-				goto yy_find_action;
-				}
-			}
-
-		else switch ( yy_get_next_buffer() )
-			{
-			case EOB_ACT_END_OF_FILE:
-				{
-				yy_did_buffer_switch_on_eof = 0;
-
-				if ( yywrap() )
-					{
-					/* Note: because we've taken care in
-					 * yy_get_next_buffer() to have set up
-					 * yytext, we can now set up
-					 * yy_c_buf_p so that if some total
-					 * hoser (like flex itself) wants to
-					 * call the scanner after we return the
-					 * YY_NULL, it'll still work - another
-					 * YY_NULL will get returned.
-					 */
-					yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
-
-					yy_act = YY_STATE_EOF(YY_START);
-					goto do_action;
-					}
-
-				else
-					{
-					if ( ! yy_did_buffer_switch_on_eof )
-						YY_NEW_FILE;
-					}
-				break;
-				}
-
-			case EOB_ACT_CONTINUE_SCAN:
-				yy_c_buf_p =
-					yytext_ptr + yy_amount_of_matched_text;
-
-				yy_current_state = yy_get_previous_state();
-
-				yy_cp = yy_c_buf_p;
-				yy_bp = yytext_ptr + YY_MORE_ADJ;
-				goto yy_match;
-
-			case EOB_ACT_LAST_MATCH:
-				yy_c_buf_p =
-				&yy_current_buffer->yy_ch_buf[yy_n_chars];
-
-				yy_current_state = yy_get_previous_state();
-
-				yy_cp = yy_c_buf_p;
-				yy_bp = yytext_ptr + YY_MORE_ADJ;
-				goto yy_find_action;
-			}
-		break;
-		}
-
-	default:
-		YY_FATAL_ERROR(
-			"fatal flex scanner internal error--no action found" );
-	} /* end of action switch */
-		} /* end of scanning one token */
-	} /* end of yylex */
-
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- *	EOB_ACT_LAST_MATCH -
- *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- *	EOB_ACT_END_OF_FILE - end of file
- */
-
-static int yy_get_next_buffer()
-	{
-	register char *dest = yy_current_buffer->yy_ch_buf;
-	register char *source = yytext_ptr;
-	register int number_to_move, i;
-	int ret_val;
-
-	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
-		YY_FATAL_ERROR(
-		"fatal flex scanner internal error--end of buffer missed" );
-
-	if ( yy_current_buffer->yy_fill_buffer == 0 )
-		{ /* Don't try to fill the buffer, so this is an EOF. */
-		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
-			{
-			/* We matched a single character, the EOB, so
-			 * treat this as a final EOF.
-			 */
-			return EOB_ACT_END_OF_FILE;
-			}
-
-		else
-			{
-			/* We matched some text prior to the EOB, first
-			 * process it.
-			 */
-			return EOB_ACT_LAST_MATCH;
-			}
-		}
-
-	/* Try to read more data. */
-
-	/* First move last chars to start of buffer. */
-	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
-
-	for ( i = 0; i < number_to_move; ++i )
-		*(dest++) = *(source++);
-
-	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
-		/* don't do the read, it's not guaranteed to return an EOF,
-		 * just force an EOF
-		 */
-		yy_current_buffer->yy_n_chars = yy_n_chars = 0;
-
-	else
-		{
-		int num_to_read =
-			yy_current_buffer->yy_buf_size - number_to_move - 1;
-
-		while ( num_to_read <= 0 )
-			{ /* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
-			YY_FATAL_ERROR(
-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
-#else
-
-			/* just a shorter name for the current buffer */
-			YY_BUFFER_STATE b = yy_current_buffer;
-
-			int yy_c_buf_p_offset =
-				(int) (yy_c_buf_p - b->yy_ch_buf);
-
-			if ( b->yy_is_our_buffer )
-				{
-				int new_size = b->yy_buf_size * 2;
-
-				if ( new_size <= 0 )
-					b->yy_buf_size += b->yy_buf_size / 8;
-				else
-					b->yy_buf_size *= 2;
-
-				b->yy_ch_buf = (char *)
-					/* Include room in for 2 EOB chars. */
-					yy_flex_realloc( (void *) b->yy_ch_buf,
-							 b->yy_buf_size + 2 );
-				}
-			else
-				/* Can't grow it, we don't own it. */
-				b->yy_ch_buf = 0;
-
-			if ( ! b->yy_ch_buf )
-				YY_FATAL_ERROR(
-				"fatal error - scanner input buffer overflow" );
-
-			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
-
-			num_to_read = yy_current_buffer->yy_buf_size -
-						number_to_move - 1;
-#endif
-			}
-
-		if ( num_to_read > YY_READ_BUF_SIZE )
-			num_to_read = YY_READ_BUF_SIZE;
-
-		/* Read in more data. */
-		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
-			yy_n_chars, num_to_read );
-
-		yy_current_buffer->yy_n_chars = yy_n_chars;
-		}
-
-	if ( yy_n_chars == 0 )
-		{
-		if ( number_to_move == YY_MORE_ADJ )
-			{
-			ret_val = EOB_ACT_END_OF_FILE;
-			yyrestart( yyin );
-			}
-
-		else
-			{
-			ret_val = EOB_ACT_LAST_MATCH;
-			yy_current_buffer->yy_buffer_status =
-				YY_BUFFER_EOF_PENDING;
-			}
-		}
-
-	else
-		ret_val = EOB_ACT_CONTINUE_SCAN;
-
-	yy_n_chars += number_to_move;
-	yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
-	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
-
-	yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
-
-	return ret_val;
-	}
-
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-static yy_state_type yy_get_previous_state()
-	{
-	register yy_state_type yy_current_state;
-	register char *yy_cp;
-
-	yy_current_state = yy_start;
-
-	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
-		{
-		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
-		if ( yy_accept[yy_current_state] )
-			{
-			yy_last_accepting_state = yy_current_state;
-			yy_last_accepting_cpos = yy_cp;
-			}
-		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-			{
-			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 557 )
-				yy_c = yy_meta[(unsigned int) yy_c];
-			}
-		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-		}
-
-	return yy_current_state;
-	}
-
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- *	next_state = yy_try_NUL_trans( current_state );
- */
-
-#ifdef YY_USE_PROTOS
-static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
-#else
-static yy_state_type yy_try_NUL_trans( yy_current_state )
-yy_state_type yy_current_state;
-#endif
-	{
-	register int yy_is_jam;
-	register char *yy_cp = yy_c_buf_p;
-
-	register YY_CHAR yy_c = 1;
-	if ( yy_accept[yy_current_state] )
-		{
-		yy_last_accepting_state = yy_current_state;
-		yy_last_accepting_cpos = yy_cp;
-		}
-	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-		{
-		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 557 )
-			yy_c = yy_meta[(unsigned int) yy_c];
-		}
-	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 556);
-
-	return yy_is_jam ? 0 : yy_current_state;
-	}
-
-
-#ifndef YY_NO_UNPUT
-#ifdef YY_USE_PROTOS
-static void yyunput( int c, register char *yy_bp )
-#else
-static void yyunput( c, yy_bp )
-int c;
-register char *yy_bp;
-#endif
-	{
-	register char *yy_cp = yy_c_buf_p;
-
-	/* undo effects of setting up yytext */
-	*yy_cp = yy_hold_char;
-
-	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
-		{ /* need to shift things up to make room */
-		/* +2 for EOB chars. */
-		register int number_to_move = yy_n_chars + 2;
-		register char *dest = &yy_current_buffer->yy_ch_buf[
-					yy_current_buffer->yy_buf_size + 2];
-		register char *source =
-				&yy_current_buffer->yy_ch_buf[number_to_move];
-
-		while ( source > yy_current_buffer->yy_ch_buf )
-			*--dest = *--source;
-
-		yy_cp += (int) (dest - source);
-		yy_bp += (int) (dest - source);
-		yy_current_buffer->yy_n_chars =
-			yy_n_chars = yy_current_buffer->yy_buf_size;
-
-		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
-			YY_FATAL_ERROR( "flex scanner push-back overflow" );
-		}
-
-	*--yy_cp = (char) c;
-
-
-	yytext_ptr = yy_bp;
-	yy_hold_char = *yy_cp;
-	yy_c_buf_p = yy_cp;
-	}
-#endif	/* ifndef YY_NO_UNPUT */
-
-
-#ifdef __cplusplus
-static int yyinput()
-#else
-static int input()
-#endif
-	{
-	int c;
-
-	*yy_c_buf_p = yy_hold_char;
-
-	if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
-		{
-		/* yy_c_buf_p now points to the character we want to return.
-		 * If this occurs *before* the EOB characters, then it's a
-		 * valid NUL; if not, then we've hit the end of the buffer.
-		 */
-		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
-			/* This was really a NUL. */
-			*yy_c_buf_p = '\0';
-
-		else
-			{ /* need more input */
-			int offset = yy_c_buf_p - yytext_ptr;
-			++yy_c_buf_p;
-
-			switch ( yy_get_next_buffer() )
-				{
-				case EOB_ACT_LAST_MATCH:
-					/* This happens because yy_g_n_b()
-					 * sees that we've accumulated a
-					 * token and flags that we need to
-					 * try matching the token before
-					 * proceeding.  But for input(),
-					 * there's no matching to consider.
-					 * So convert the EOB_ACT_LAST_MATCH
-					 * to EOB_ACT_END_OF_FILE.
-					 */
-
-					/* Reset buffer status. */
-					yyrestart( yyin );
-
-					/* fall through */
-
-				case EOB_ACT_END_OF_FILE:
-					{
-					if ( yywrap() )
-						return EOF;
-
-					if ( ! yy_did_buffer_switch_on_eof )
-						YY_NEW_FILE;
-#ifdef __cplusplus
-					return yyinput();
-#else
-					return input();
-#endif
-					}
-
-				case EOB_ACT_CONTINUE_SCAN:
-					yy_c_buf_p = yytext_ptr + offset;
-					break;
-				}
-			}
-		}
-
-	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
-	*yy_c_buf_p = '\0';	/* preserve yytext */
-	yy_hold_char = *++yy_c_buf_p;
-
-
-	return c;
-	}
-
-
-#ifdef YY_USE_PROTOS
-void yyrestart( FILE *input_file )
-#else
-void yyrestart( input_file )
-FILE *input_file;
-#endif
-	{
-	if ( ! yy_current_buffer )
-		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
-
-	yy_init_buffer( yy_current_buffer, input_file );
-	yy_load_buffer_state();
-	}
-
-
-#ifdef YY_USE_PROTOS
-void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-#else
-void yy_switch_to_buffer( new_buffer )
-YY_BUFFER_STATE new_buffer;
-#endif
-	{
-	if ( yy_current_buffer == new_buffer )
-		return;
-
-	if ( yy_current_buffer )
-		{
-		/* Flush out information for old buffer. */
-		*yy_c_buf_p = yy_hold_char;
-		yy_current_buffer->yy_buf_pos = yy_c_buf_p;
-		yy_current_buffer->yy_n_chars = yy_n_chars;
-		}
-
-	yy_current_buffer = new_buffer;
-	yy_load_buffer_state();
-
-	/* We don't actually know whether we did this switch during
-	 * EOF (yywrap()) processing, but the only time this flag
-	 * is looked at is after yywrap() is called, so it's safe
-	 * to go ahead and always set it.
-	 */
-	yy_did_buffer_switch_on_eof = 1;
-	}
-
-
-#ifdef YY_USE_PROTOS
-void yy_load_buffer_state( void )
-#else
-void yy_load_buffer_state()
-#endif
-	{
-	yy_n_chars = yy_current_buffer->yy_n_chars;
-	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
-	yyin = yy_current_buffer->yy_input_file;
-	yy_hold_char = *yy_c_buf_p;
-	}
-
-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-#else
-YY_BUFFER_STATE yy_create_buffer( file, size )
-FILE *file;
-int size;
-#endif
-	{
-	YY_BUFFER_STATE b;
-
-	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
-	b->yy_buf_size = size;
-
-	/* yy_ch_buf has to be 2 characters longer than the size given because
-	 * we need to put in 2 end-of-buffer characters.
-	 */
-	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
-	if ( ! b->yy_ch_buf )
-		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
-	b->yy_is_our_buffer = 1;
-
-	yy_init_buffer( b, file );
-
-	return b;
-	}
-
-
-#ifdef YY_USE_PROTOS
-void yy_delete_buffer( YY_BUFFER_STATE b )
-#else
-void yy_delete_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-	{
-	if ( ! b )
-		return;
-
-	if ( b == yy_current_buffer )
-		yy_current_buffer = (YY_BUFFER_STATE) 0;
-
-	if ( b->yy_is_our_buffer )
-		yy_flex_free( (void *) b->yy_ch_buf );
-
-	yy_flex_free( (void *) b );
-	}
-
-
-
-#ifdef YY_USE_PROTOS
-void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
-#else
-void yy_init_buffer( b, file )
-YY_BUFFER_STATE b;
-FILE *file;
-#endif
-
-
-	{
-	yy_flush_buffer( b );
-
-	b->yy_input_file = file;
-	b->yy_fill_buffer = 1;
-
-#if YY_ALWAYS_INTERACTIVE
-	b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
-	b->yy_is_interactive = 0;
-#else
-	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-#endif
-#endif
-	}
-
-
-#ifdef YY_USE_PROTOS
-void yy_flush_buffer( YY_BUFFER_STATE b )
-#else
-void yy_flush_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-
-	{
-	if ( ! b )
-		return;
-
-	b->yy_n_chars = 0;
-
-	/* We always need two end-of-buffer characters.  The first causes
-	 * a transition to the end-of-buffer state.  The second causes
-	 * a jam in that state.
-	 */
-	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
-	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
-	b->yy_buf_pos = &b->yy_ch_buf[0];
-
-	b->yy_at_bol = 1;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	if ( b == yy_current_buffer )
-		yy_load_buffer_state();
-	}
-
-
-#ifndef YY_NO_SCAN_BUFFER
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-#else
-YY_BUFFER_STATE yy_scan_buffer( base, size )
-char *base;
-yy_size_t size;
-#endif
-	{
-	YY_BUFFER_STATE b;
-
-	if ( size < 2 ||
-	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
-	     base[size-1] != YY_END_OF_BUFFER_CHAR )
-		/* They forgot to leave room for the EOB's. */
-		return 0;
-
-	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
-	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
-	b->yy_buf_pos = b->yy_ch_buf = base;
-	b->yy_is_our_buffer = 0;
-	b->yy_input_file = 0;
-	b->yy_n_chars = b->yy_buf_size;
-	b->yy_is_interactive = 0;
-	b->yy_at_bol = 1;
-	b->yy_fill_buffer = 0;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	yy_switch_to_buffer( b );
-
-	return b;
-	}
-#endif
-
-
-#ifndef YY_NO_SCAN_STRING
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
-#else
-YY_BUFFER_STATE yy_scan_string( yy_str )
-yyconst char *yy_str;
-#endif
-	{
-	int len;
-	for ( len = 0; yy_str[len]; ++len )
-		;
-
-	return yy_scan_bytes( yy_str, len );
-	}
-#endif
-
-
-#ifndef YY_NO_SCAN_BYTES
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
-#else
-YY_BUFFER_STATE yy_scan_bytes( bytes, len )
-yyconst char *bytes;
-int len;
-#endif
-	{
-	YY_BUFFER_STATE b;
-	char *buf;
-	yy_size_t n;
-	int i;
-
-	/* Get memory for full buffer, including space for trailing EOB's. */
-	n = len + 2;
-	buf = (char *) yy_flex_alloc( n );
-	if ( ! buf )
-		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
-	for ( i = 0; i < len; ++i )
-		buf[i] = bytes[i];
-
-	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
-
-	b = yy_scan_buffer( buf, n );
-	if ( ! b )
-		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
-	/* It's okay to grow etc. this buffer, and we should throw it
-	 * away when we're done.
-	 */
-	b->yy_is_our_buffer = 1;
-
-	return b;
-	}
-#endif
-
-
-#ifndef YY_NO_PUSH_STATE
-#ifdef YY_USE_PROTOS
-static void yy_push_state( int new_state )
-#else
-static void yy_push_state( new_state )
-int new_state;
-#endif
-	{
-	if ( yy_start_stack_ptr >= yy_start_stack_depth )
-		{
-		yy_size_t new_size;
-
-		yy_start_stack_depth += YY_START_STACK_INCR;
-		new_size = yy_start_stack_depth * sizeof( int );
-
-		if ( ! yy_start_stack )
-			yy_start_stack = (int *) yy_flex_alloc( new_size );
-
-		else
-			yy_start_stack = (int *) yy_flex_realloc(
-					(void *) yy_start_stack, new_size );
-
-		if ( ! yy_start_stack )
-			YY_FATAL_ERROR(
-			"out of memory expanding start-condition stack" );
-		}
-
-	yy_start_stack[yy_start_stack_ptr++] = YY_START;
-
-	BEGIN(new_state);
-	}
-#endif
-
-
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state()
-	{
-	if ( --yy_start_stack_ptr < 0 )
-		YY_FATAL_ERROR( "start-condition stack underflow" );
-
-	BEGIN(yy_start_stack[yy_start_stack_ptr]);
-	}
-#endif
-
-
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state()
-	{
-	return yy_start_stack[yy_start_stack_ptr - 1];
-	}
-#endif
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-#ifdef YY_USE_PROTOS
-static void yy_fatal_error( yyconst char msg[] )
-#else
-static void yy_fatal_error( msg )
-char msg[];
-#endif
-	{
-	(void) fprintf( stderr, "%s\n", msg );
-	exit( YY_EXIT_FAILURE );
-	}
-
-
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up yytext. */ \
-		yytext[yyleng] = yy_hold_char; \
-		yy_c_buf_p = yytext + n; \
-		yy_hold_char = *yy_c_buf_p; \
-		*yy_c_buf_p = '\0'; \
-		yyleng = n; \
-		} \
-	while ( 0 )
-
-
-/* Internal utility routines. */
-
-#ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
-static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
-#else
-static void yy_flex_strncpy( s1, s2, n )
-char *s1;
-yyconst char *s2;
-int n;
-#endif
-	{
-	register int i;
-	for ( i = 0; i < n; ++i )
-		s1[i] = s2[i];
-	}
-#endif
-
-#ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
-static int yy_flex_strlen( yyconst char *s )
-#else
-static int yy_flex_strlen( s )
-yyconst char *s;
-#endif
-	{
-	register int n;
-	for ( n = 0; s[n]; ++n )
-		;
-
-	return n;
-	}
-#endif
-
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_alloc( yy_size_t size )
-#else
-static void *yy_flex_alloc( size )
-yy_size_t size;
-#endif
-	{
-	return (void *) malloc( size );
-	}
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_realloc( void *ptr, yy_size_t size )
-#else
-static void *yy_flex_realloc( ptr, size )
-void *ptr;
-yy_size_t size;
-#endif
-	{
-	/* The cast to (char *) in the following accommodates both
-	 * implementations that use char* generic pointers, and those
-	 * that use void* generic pointers.  It works with the latter
-	 * because both ANSI C and C++ allow castless assignment from
-	 * any pointer type to void*, and deal with argument conversions
-	 * as though doing an assignment.
-	 */
-	return (void *) realloc( (char *) ptr, size );
-	}
-
-#ifdef YY_USE_PROTOS
-static void yy_flex_free( void *ptr )
-#else
-static void yy_flex_free( ptr )
-void *ptr;
-#endif
-	{
-	free( ptr );
-	}
-
-#if YY_MAIN
-int main()
-	{
-	yylex();
-	return 0;
-	}
-#endif
-#line 740 "lexer.lxx"
+#define yy_create_buffer eggyy_create_buffer
+#define yy_delete_buffer eggyy_delete_buffer
+#define yy_scan_buffer eggyy_scan_buffer
+#define yy_scan_string eggyy_scan_string
+#define yy_scan_bytes eggyy_scan_bytes
+#define yy_flex_debug eggyy_flex_debug
+#define yy_init_buffer eggyy_init_buffer
+#define yy_flush_buffer eggyy_flush_buffer
+#define yy_load_buffer_state eggyy_load_buffer_state
+#define yy_switch_to_buffer eggyy_switch_to_buffer
+#define yyin eggyyin
+#define yyleng eggyyleng
+#define yylex eggyylex
+#define yyout eggyyout
+#define yyrestart eggyyrestart
+#define yytext eggyytext
+#define yywrap eggyywrap
+
+#line 20 "lex.yy.c"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header$
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <errno.h>
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#ifndef _WIN32
+#endif
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ * 	if ( condition_holds )
+ *		yyless( 5 );
+ *	else
+ *		do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		*yy_cp = yy_hold_char; \
+		YY_RESTORE_YY_MORE_OFFSET \
+		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+	};
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	yytext_ptr = yy_bp; \
+	yyleng = (int) (yy_cp - yy_bp); \
+	yy_hold_char = *yy_cp; \
+	*yy_cp = '\0'; \
+	yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 98
+#define YY_END_OF_BUFFER 99
+static yyconst short int yy_accept[557] =
+    {   0,
+        0,    0,   99,   97,    2,    1,   96,   97,   97,   97,
+       97,   90,   90,   97,   97,   97,    5,   97,    1,   97,
+       90,   97,   90,    4,    3,   90,   92,   97,   91,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,    3,    3,   92,   97,   90,   91,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       66,   97,   97,   97,   94,   97,   95,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   18,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   32,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   81,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   24,   97,   97,   97,   97,
+
+       22,   97,   97,   97,   97,   97,   31,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   52,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   67,   97,   97,   97,
+       97,   97,   97,   97,   97,   78,   97,   97,   97,   97,
+       97,   97,   93,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   19,   97,   97,   97,   97,   23,
+       97,   28,   97,   97,   97,   97,   97,   97,   37,   38,
+       97,   97,   97,   43,   97,   97,   97,   97,   97,   97,
+       97,   53,   97,   55,   56,   57,   97,   97,   97,   97,
+
+       97,   97,   97,   97,   97,   97,   97,   97,   74,   97,
+       77,   97,   97,   97,   97,   97,   97,   93,   97,    7,
+       97,   97,   97,   12,   97,   97,   97,   97,   97,   97,
+       97,   21,   26,   97,   97,   30,   97,   97,   33,   34,
+       97,   97,   42,   97,   97,   97,   97,   48,   97,   97,
+       97,   97,   97,   97,   60,   97,   97,   97,   65,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   11,   13,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       44,   97,   97,   97,   97,   97,   97,   54,   58,   59,
+
+       97,   97,   63,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   84,   97,   97,   97,   97,
+       97,   97,   97,   14,   15,   97,   97,   97,   20,   97,
+       97,   35,   97,   97,   40,   41,   97,   97,   97,   97,
+       97,   51,   97,   62,   97,   68,   69,   70,   97,   97,
+       97,   97,   79,   80,   82,   83,   97,   97,   97,   97,
+       97,   97,   10,   97,   97,   25,   97,   97,   36,   39,
+       97,   97,   97,   97,   97,   61,   97,   71,   97,   97,
+       97,   97,   97,   97,   97,   88,   97,   97,    8,   97,
+       16,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+
+       72,   73,   97,   97,   97,   97,   87,   97,   97,   97,
+       97,   97,   29,   45,   97,   47,   49,   50,   97,   97,
+       97,   85,   86,   97,    6,   97,   97,   97,   97,   97,
+       75,   97,   89,   97,   97,   97,   46,   97,   97,   97,
+       97,   97,   97,   76,   97,   97,   97,   97,    9,   97,
+       97,   64,   17,   97,   27,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    4,    1,    5,    1,    1,    1,    1,
+        1,    6,    7,    1,    8,    9,   10,   11,   12,   13,
+       14,   15,   13,   13,   13,   13,   13,    1,    1,   16,
+        1,   17,    1,    1,   19,   20,   21,   22,   23,   24,
+       25,   26,   27,   28,   29,   30,   31,   32,   33,   34,
+       35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
+        1,    1,    1,    1,   18,    1,   19,   20,   21,   22,
+
+       23,   24,   25,   26,   27,   28,   29,   30,   31,   32,
+       33,   34,   35,   36,   37,   38,   39,   40,   41,   42,
+       43,   44,   45,    1,   45,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[46] =
+    {   0,
+        1,    2,    3,    2,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    2
+    } ;
+
+static yyconst short int yy_base[562] =
+    {   0,
+        0,   44,  663,    0,  664,    0,  664,    8,   81,   22,
+       18,  100,   19,  123,  630,  642,  664,    0,    0,   29,
+       30,  628,   51,    0,   65,   68,   14,  159,  164,   61,
+       91,  170,   43,  623,  631,  625,  623,  623,   70,   68,
+       66,   86,  621,   93,  175,  181,  128,  111,  629,  628,
+      619,  626,  136,    0,   18,  207,  213,    0,  605,  629,
+       45,  615,  627,  612,  102,  627,  607,  605,  604,  607,
+      614,  602,  597,  593,  603,  604,  595,  599,  597,  173,
+      603,  596,  596,  594,  588,  603,  601,  587,  586,  593,
+      598,  581,  100,  594,  597,  578,  596,  595,  578,  593,
+
+      584,  209,  568,  586,  176,  570,  578,  577,  588,  575,
+        0,  574,  566,  570,    0,  589,    0,  572,  577,  567,
+      563,  573,  558,  556,  562,  199,  555,    0,  552,  572,
+      550,  551,  566,  562,  567,  539,  563,  558,  562,  540,
+      561,    0,  547,  538,  543,  536,  550,  538,  146,  548,
+      546,  538,  548,  544,  543,  527,  532,  520,  545,  542,
+      195,  528,  529,  519,  535,  518,  525,  537,  528,   48,
+      520,  519,  526,  174,  532,  516,  515,    0,  514,  513,
+      506,  538,  500,  518,  517,  519,  502,  507,  530,  512,
+      507,  510,  499,  509,  513,    0,  510,  497,  508,  502,
+
+        0,  508,  493,  506,  496,  487,    0,  481,  500,  480,
+      480,  499,  498,  478,  486,  482,  494,  491,  472,  487,
+      471,  487,  467,  479,    0,  486,  464,  484,  483,  482,
+      471,   79,  474,  469,  474,  471,    0,  470,  465,  452,
+      465,  452,  471,  455,  469,    0,  452,  451,  450,  449,
+      458,  461,  231,  443,  461,  444,  445,  452,  457,  451,
+      450,  439,  438,  442,    0,  436,  448,  449,  448,    0,
+      437,    0,  440,  445,  439,  428,  442,  441,    0,    0,
+      430,  414,  438,    0,  424,  194,  415,  435,  419,  420,
+      416,    0,  425,    0,    0,    0,  416,  410,  428,  412,
+
+      411,  416,  424,  408,  402,  402,  399,  134,    0,  411,
+        0,  397,  396,  395,  394,  389,  398,    0,  408,    0,
+      409,  408,  409,    0,  408,  401,  385,  399,  389,  399,
+      389,    0,    0,  397,  398,    0,  393,  394,    0,    0,
+      395,  221,    0,  396,  373,  372,  372,    0,  384,  381,
+      375,  389,  388,  387,    0,  382,  377,  120,    0,  363,
+      362,  376,  372,  364,  377,  365,  357,  356,  355,  354,
+      230,  363,  350,  352,  357,    0,    0,  369,  368,  352,
+      364,  359,  364,  340,  357,  361,  354,  346,  358,  357,
+        0,  337,  336,  328,  347,  344,  351,    0,    0,    0,
+
+      344,  349,    0,  332,  347,  346,  345,  324,  324,  321,
+      335,  340,  339,  338,  337,    0,  321,  319,  328,  319,
+      313,  326,  330,    0,    0,  308,  307,  327,    0,  320,
+      319,    0,  324,  323,    0,    0,  299,  314,  303,  304,
+      309,    0,  317,    0,  301,    0,    0,    0,  315,  300,
+      307,  224,    0,    0,    0,    0,  302,  295,  303,  239,
+      286,  241,    0,  308,  301,    0,  287,  286,    0,    0,
+      298,  301,  296,  280,  279,    0,  294,    0,  298,  297,
+      294,  274,  280,  280,  292,    0,  271,  284,    0,  283,
+        0,  268,  266,  286,  285,  280,  283,  282,  281,  270,
+
+        0,    0,  264,  259,  277,  276,    0,  287,  274,  258,
+      246,  265,    0,    0,  264,    0,    0,    0,  248,  268,
+      257,    0,    0,  266,    0,  244,  244,  238,  262,  251,
+        0,  243,    0,  253,  227,  229,    0,  227,  242,  204,
+      209,  174,  160,    0,  122,   76,   35,   32,    0,   21,
+        1,    0,    0,    1,    0,  664,  266,    0,  269,  271,
+      273
+    } ;
+
+static yyconst short int yy_def[562] =
+    {   0,
+      557,  557,  556,  558,  556,  559,  556,  558,  558,  558,
+      558,  558,   12,  558,  558,  558,  556,  558,  559,  558,
+       12,  558,  558,  558,  560,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  560,  561,  558,  558,  558,   29,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  253,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,  558,  558,  558,  558,  558,
+      558,  558,  558,  558,  558,    0,  556,  556,  556,  556,
+      556
+    } ;
+
+static yyconst short int yy_nxt[710] =
+    {   0,
+       18,    5,    6,    7,  556,  556,    8,    9,   10,   11,
+       12,   13,   13,   13,   13,   14,   20,  555,   21,   21,
+       21,   21,   21,   24,   55,   55,   15,   25,   55,   55,
+      554,   16,   23,   23,   23,   23,   23,  553,   18,   23,
+       23,   23,   23,   23,   17,    5,    6,    7,  552,   18,
+        8,    9,   10,   11,   12,   13,   13,   13,   13,   14,
+       18,   23,   23,   23,   23,   23,   54,  551,   54,   76,
+       15,   18,   77,   28,  120,   16,  121,  239,   23,   23,
+       23,   23,   23,   59,   60,  240,   85,   61,   17,   20,
+       28,   21,   21,   21,   21,   21,   83,  298,   88,   62,
+
+       86,  299,   84,   87,   89,   90,  550,   22,   26,   54,
+       21,   21,   21,   21,   21,   94,   63,   95,  110,   27,
+       64,   91,   28,   65,   92,   96,  157,  111,  112,  158,
+       66,  125,  126,  113,  127,  107,  403,   54,  549,   54,
+      404,   29,   30,   31,   32,  108,   33,   34,   35,   36,
+       37,   38,   39,   40,   41,   42,   43,  364,   44,   45,
+       46,   47,   48,  365,   49,   56,   56,  109,  214,   57,
+       57,   57,   57,   57,   58,   58,   58,   58,   58,   97,
+       54,  215,   58,   58,   58,   58,   58,   58,   67,  142,
+       68,  548,  244,  143,  172,   98,   69,   99,  173,  102,
+
+      100,   70,  174,  103,  245,   71,  547,   72,   73,  144,
+      104,   74,   75,  227,  345,  101,  105,   57,   57,   57,
+       57,   57,  106,   57,   57,   57,   57,   57,  167,  192,
+      346,  546,  193,  168,  389,  390,  228,  229,  230,  545,
+      169,  318,  318,  318,  318,  318,  416,  481,  417,  318,
+      318,  318,  318,  318,  318,  486,  487,  489,  544,  543,
+      482,  490,  542,  418,  541,  419,    4,    4,    4,   19,
+       19,   53,   53,   54,   54,  540,  539,  538,  537,  536,
+      535,  534,  533,  532,  531,  530,  529,  528,  527,  526,
+      525,  524,  523,  522,  521,  520,  519,  518,  517,  516,
+
+      515,  514,  513,  512,  511,  510,  509,  508,  507,  506,
+      505,  504,  503,  502,  501,  500,  499,  498,  497,  496,
+      495,  494,  493,  492,  491,  488,  485,  484,  483,  480,
+      479,  478,  477,  476,  475,  474,  473,  472,  471,  470,
+      469,  468,  467,  466,  465,  464,  463,  462,  461,  460,
+      459,  458,  457,  456,  455,  454,  453,  452,  451,  450,
+      449,  448,  447,  446,  445,  444,  443,  442,  441,  440,
+      439,  438,  437,  436,  435,  434,  433,  432,  431,  430,
+      429,  428,  427,  426,  425,  424,  423,  422,  421,  420,
+      415,  414,  413,  412,  411,  410,  409,  408,  407,  406,
+
+      405,  402,  401,  400,  399,  398,  397,  396,  395,  394,
+      393,  392,  391,  388,  387,  386,  385,  384,  383,  382,
+      381,  380,  379,  378,  377,  376,  375,  374,  373,  372,
+      371,  370,  369,  368,  367,  366,  363,  362,  361,  360,
+      359,  358,  357,  356,  355,  354,  353,  352,  351,  350,
+      349,  348,  347,  344,  343,  342,  341,  340,  339,  338,
+      337,  336,  335,  334,  333,  332,  331,  330,  329,  328,
+      327,  326,  325,  324,  323,  322,  321,  320,  319,  317,
+      316,  315,  314,  313,  312,  311,  310,  309,  308,  307,
+      306,  305,  304,  303,  302,  301,  300,  297,  296,  295,
+
+      294,  293,  292,  291,  290,  289,  288,  287,  286,  285,
+      284,  283,  282,  281,  280,  279,  278,  277,  276,  275,
+      274,  273,  272,  271,  270,  269,  268,  267,  266,  265,
+      264,  263,  262,  261,  260,  259,  258,  257,  256,  255,
+      254,  253,  252,  251,  250,  249,  248,  247,  246,  243,
+      242,  241,  238,  237,  236,  235,  234,  233,  232,  231,
+      226,  225,  224,  223,  222,  221,  220,  219,  218,  217,
+      216,  213,  212,  211,  210,  209,  208,  207,  206,  205,
+      204,  203,  202,  201,  200,  199,  198,  197,  196,  195,
+      194,  191,  190,  189,  188,  187,  186,  185,  184,  183,
+
+      182,  181,  180,  179,  178,  177,  176,  175,  171,  170,
+      166,  165,  164,  163,  162,  161,  160,  159,  156,  155,
+      154,  153,  152,  151,  150,  149,  148,  147,  146,  145,
+      141,  140,  139,  138,  137,  136,  135,  134,  133,  132,
+      131,  130,  129,  128,  124,  123,  122,  119,  118,  117,
+      116,  115,  114,   93,   82,   81,   80,   79,   78,   52,
+       51,   50,  556,    3,  556,  556,  556,  556,  556,  556,
+      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
+      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
+      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
+
+      556,  556,  556,  556,  556,  556,  556,  556,  556
+    } ;
+
+static yyconst short int yy_chk[710] =
+    {   0,
+      558,    1,    1,    1,    0,    0,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    8,  554,    8,    8,
+        8,    8,    8,   11,   27,   27,    1,   11,   55,   55,
+      551,    1,   10,   10,   10,   10,   10,  550,   13,   20,
+       20,   20,   20,   20,    1,    2,    2,    2,  548,   21,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+       13,   23,   23,   23,   23,   23,   25,  547,   25,   33,
+        2,   21,   33,   23,   61,    2,   61,  170,   26,   26,
+       26,   26,   26,   30,   30,  170,   40,   30,    2,    9,
+       26,    9,    9,    9,    9,    9,   39,  232,   41,   30,
+
+       40,  232,   39,   40,   41,   42,  546,    9,   12,   25,
+       12,   12,   12,   12,   12,   44,   31,   44,   48,   12,
+       31,   42,   12,   31,   42,   44,   93,   48,   48,   93,
+       31,   65,   65,   48,   65,   47,  358,   53,  545,   53,
+      358,   12,   14,   14,   14,   47,   14,   14,   14,   14,
+       14,   14,   14,   14,   14,   14,   14,  308,   14,   14,
+       14,   14,   14,  308,   14,   28,   28,   47,  149,   28,
+       28,   28,   28,   28,   29,   29,   29,   29,   29,   45,
+       53,  149,   29,   29,   29,   29,   29,   29,   32,   80,
+       32,  543,  174,   80,  105,   45,   32,   45,  105,   46,
+
+       45,   32,  105,   46,  174,   32,  542,   32,   32,   80,
+       46,   32,   32,  161,  286,   45,   46,   56,   56,   56,
+       56,   56,   46,   57,   57,   57,   57,   57,  102,  126,
+      286,  541,  126,  102,  342,  342,  161,  161,  161,  540,
+      102,  253,  253,  253,  253,  253,  371,  452,  371,  253,
+      253,  253,  253,  253,  253,  460,  460,  462,  539,  538,
+      452,  462,  536,  371,  535,  371,  557,  557,  557,  559,
+      559,  560,  560,  561,  561,  534,  532,  530,  529,  528,
+      527,  526,  524,  521,  520,  519,  515,  512,  511,  510,
+      509,  508,  506,  505,  504,  503,  500,  499,  498,  497,
+
+      496,  495,  494,  493,  492,  490,  488,  487,  485,  484,
+      483,  482,  481,  480,  479,  477,  475,  474,  473,  472,
+      471,  468,  467,  465,  464,  461,  459,  458,  457,  451,
+      450,  449,  445,  443,  441,  440,  439,  438,  437,  434,
+      433,  431,  430,  428,  427,  426,  423,  422,  421,  420,
+      419,  418,  417,  415,  414,  413,  412,  411,  410,  409,
+      408,  407,  406,  405,  404,  402,  401,  397,  396,  395,
+      394,  393,  392,  390,  389,  388,  387,  386,  385,  384,
+      383,  382,  381,  380,  379,  378,  375,  374,  373,  372,
+      370,  369,  368,  367,  366,  365,  364,  363,  362,  361,
+
+      360,  357,  356,  354,  353,  352,  351,  350,  349,  347,
+      346,  345,  344,  341,  338,  337,  335,  334,  331,  330,
+      329,  328,  327,  326,  325,  323,  322,  321,  319,  317,
+      316,  315,  314,  313,  312,  310,  307,  306,  305,  304,
+      303,  302,  301,  300,  299,  298,  297,  293,  291,  290,
+      289,  288,  287,  285,  283,  282,  281,  278,  277,  276,
+      275,  274,  273,  271,  269,  268,  267,  266,  264,  263,
+      262,  261,  260,  259,  258,  257,  256,  255,  254,  252,
+      251,  250,  249,  248,  247,  245,  244,  243,  242,  241,
+      240,  239,  238,  236,  235,  234,  233,  231,  230,  229,
+
+      228,  227,  226,  224,  223,  222,  221,  220,  219,  218,
+      217,  216,  215,  214,  213,  212,  211,  210,  209,  208,
+      206,  205,  204,  203,  202,  200,  199,  198,  197,  195,
+      194,  193,  192,  191,  190,  189,  188,  187,  186,  185,
+      184,  183,  182,  181,  180,  179,  177,  176,  175,  173,
+      172,  171,  169,  168,  167,  166,  165,  164,  163,  162,
+      160,  159,  158,  157,  156,  155,  154,  153,  152,  151,
+      150,  148,  147,  146,  145,  144,  143,  141,  140,  139,
+      138,  137,  136,  135,  134,  133,  132,  131,  130,  129,
+      127,  125,  124,  123,  122,  121,  120,  119,  118,  116,
+
+      114,  113,  112,  110,  109,  108,  107,  106,  104,  103,
+      101,  100,   99,   98,   97,   96,   95,   94,   92,   91,
+       90,   89,   88,   87,   86,   85,   84,   83,   82,   81,
+       79,   78,   77,   76,   75,   74,   73,   72,   71,   70,
+       69,   68,   67,   66,   64,   63,   62,   60,   59,   52,
+       51,   50,   49,   43,   38,   37,   36,   35,   34,   22,
+       16,   15,    3,  556,  556,  556,  556,  556,  556,  556,
+      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
+      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
+      556,  556,  556,  556,  556,  556,  556,  556,  556,  556,
+
+      556,  556,  556,  556,  556,  556,  556,  556,  556
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "lexer.lxx"
+#define INITIAL 0
+/*
+// Filename: lexer.l
+// Created by:  drose (16Jan99)
+// 
+////////////////////////////////////////////////////////////////////
+*/
+#line 9 "lexer.lxx"
+#include "lexerDefs.h"
+#include "parserDefs.h"
+#include "config_egg.h"
+#include "parser.h"
+
+#include <indent.h>
+#include <notify.h>
+
+#include <math.h>
+#include <pandabase.h>
+
+extern "C" int eggyywrap(void);  // declared below.
+
+static int yyinput(void);        // declared by flex.
+
+
+////////////////////////////////////////////////////////////////////
+// Static variables
+////////////////////////////////////////////////////////////////////
+
+// We'll increment line_number and col_number as we parse the file, so
+// that we can report the position of an error.
+static int line_number = 0;
+static int col_number = 0;
+
+// current_line holds as much of the current line as will fit.  Its
+// only purpose is for printing it out to report an error to the user.
+static const int max_error_width = 1024;
+static char current_line[max_error_width + 1];
+
+static int error_count = 0;
+static int warning_count = 0;
+
+// This is the pointer to the current input stream.
+static istream *inp = NULL;
+
+// This is the name of the egg file we're parsing.  We keep it so we
+// can print it out for error messages.
+static string egg_filename;
+
+// This is the initial token state returned by the lexer.  It allows
+// the yacc grammar to start from initial points.
+static int initial_token;
+
+
+////////////////////////////////////////////////////////////////////
+// Defining the interface to the lexer.
+////////////////////////////////////////////////////////////////////
+
+void
+egg_init_lexer(istream &in, const string &filename) {
+  inp = &in;
+  egg_filename = filename;
+  line_number = 0;
+  col_number = 0;
+  error_count = 0;
+  warning_count = 0;
+  initial_token = START_EGG;
+}
+
+void
+egg_start_group_body() {
+  /* Set the initial state to begin within a group_body context,
+     instead of at the beginning of the egg file. */
+  initial_token = START_GROUP_BODY;
+}
+
+void
+egg_start_texture_body() {
+  initial_token = START_TEXTURE_BODY;
+}
+
+void
+egg_start_primitive_body() {
+  initial_token = START_PRIMITIVE_BODY;
+}
+
+int
+egg_error_count() {
+  return error_count;
+}
+
+int
+egg_warning_count() {
+  return warning_count;
+}
+
+
+////////////////////////////////////////////////////////////////////
+// Internal support functions.
+////////////////////////////////////////////////////////////////////
+
+int
+eggyywrap(void) {
+  return 1;
+}
+
+void
+eggyyerror(const string &msg) {
+  if (egg_cat.is_error()) {
+    ostream &out = egg_cat.error(false);
+
+    out << "\nError";
+    if (!egg_filename.empty()) {
+      out << " in " << egg_filename;
+    }
+    out 
+      << " at line " << line_number << ", column " << col_number << ":\n"
+      << setiosflags(Notify::get_literal_flag())
+      << current_line << "\n";
+    indent(out, col_number-1) 
+      << "^\n" << msg << "\n\n" 
+      << resetiosflags(Notify::get_literal_flag()) << flush;
+  }
+  error_count++;
+}
+
+void
+eggyyerror(ostringstream &strm) {
+  string s = strm.str();
+  eggyyerror(s);
+}
+
+void
+eggyywarning(const string &msg) {
+  if (egg_cat.is_warning()) {
+    ostream &out = egg_cat.warning(false);
+
+    out << "\nWarning";
+    if (!egg_filename.empty()) {
+      out << " in " << egg_filename;
+    }
+    out 
+      << " at line " << line_number << ", column " << col_number << ":\n"
+      << setiosflags(Notify::get_literal_flag())
+      << current_line << "\n";
+    indent(out, col_number-1) 
+      << "^\n" << msg << "\n\n" 
+      << resetiosflags(Notify::get_literal_flag()) << flush;
+  }
+  warning_count++;
+}
+
+void
+eggyywarning(ostringstream &strm) {
+  string s = strm.str();
+  eggyywarning(s);
+}
+
+// Now define a function to take input from an istream instead of a
+// stdio FILE pointer.  This is flex-specific.
+static void
+input_chars(char *buffer, int &result, int max_size) {
+  nassertv(inp != NULL);
+  if (*inp) {
+    inp->read(buffer, max_size);
+    result = inp->gcount();
+
+    if (line_number == 0) {
+      // This is a special case.  If we are reading the very first bit
+      // from the stream, copy it into the current_line array.  This
+      // is because the \n.* rule below, which fills current_line
+      // normally, doesn't catch the first line.
+      int length = min(max_error_width, result);
+      strncpy(current_line, buffer, length);
+      current_line[length] = '\0';
+      line_number++;
+      col_number = 0;
+
+      // Truncate it at the newline.
+      char *end = strchr(current_line, '\n');
+      if (end != NULL) {
+        *end = '\0';
+      }
+    }
+
+  } else {
+    // End of file or I/O error.
+    result = 0;
+  }
+}
+#undef YY_INPUT
+#define YY_INPUT(buffer, result, max_size) input_chars(buffer, result, max_size)
+
+// read_char reads and returns a single character, incrementing the
+// supplied line and column numbers as appropriate.  A convenience
+// function for the scanning functions below.
+static int
+read_char(int &line, int &col) {
+  int c = yyinput();
+  if (c == '\n') {
+    line++;
+    col = 0;
+  } else {
+    col++;
+  }
+  return c;
+}
+
+// scan_quoted_string reads a string delimited by quotation marks and
+// returns it.
+static string
+scan_quoted_string() {
+  string result;
+
+  // We don't touch the current line number and column number during
+  // scanning, so that if we detect an error while scanning the string
+  // (e.g. an unterminated string), we'll report the error as
+  // occurring at the start of the string, not at the end--somewhat
+  // more convenient for the user.
+
+  // Instead of adjusting the global line_number and col_number
+  // variables, we'll operate on our own local variables for the
+  // interim.
+  int line = line_number;
+  int col = col_number;
+
+  int c;
+  c = read_char(line, col);
+  while (c != '"' && c != EOF) {
+    result += c;
+    c = read_char(line, col);
+  }
+
+  if (c == EOF) {
+    eggyyerror("This quotation mark is unterminated.");
+  }
+
+  line_number = line;
+  col_number = col;
+
+  return result;
+}
+
+// eat_c_comment scans past all characters up until the first */
+// encountered.
+static void
+eat_c_comment() {
+  // As above, we'll operate on our own local copies of line_number
+  // and col_number within this function.
+
+  int line = line_number;
+  int col = col_number;
+
+  int c, last_c;
+  
+  last_c = '\0';
+  c = read_char(line, col);
+  while (c != EOF && !(last_c == '*' && c == '/')) {
+    if (last_c == '/' && c == '*') {
+      ostringstream errmsg;
+      errmsg << "This comment contains a nested /* symbol at line "
+             << line << ", column " << col-1 << "--possibly unclosed?"
+             << ends;
+      eggyywarning(errmsg);
+    }
+    last_c = c;
+    c = read_char(line, col);
+  }
+
+  if (c == EOF) {
+    eggyyerror("This comment marker is unclosed.");
+  }
+
+  line_number = line;
+  col_number = col;
+}
+
+
+// accept() is called below as each piece is pulled off and
+// accepted by the lexer; it increments the current column number.
+INLINE void accept() {
+  col_number += yyleng;
+}
+
+#line 1007 "lex.yy.c"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( yy_current_buffer->yy_is_interactive ) \
+		{ \
+		int c = '*', n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(yyin); \
+			} \
+		}
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+YY_DECL
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+
+#line 290 "lexer.lxx"
+
+
+
+  if (initial_token != 0) {
+    int t = initial_token;
+    initial_token = 0;
+    return t;
+  }
+
+
+#line 1180 "lex.yy.c"
+
+	if ( yy_init )
+		{
+		yy_init = 0;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! yy_start )
+			yy_start = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! yy_current_buffer )
+			yy_current_buffer =
+				yy_create_buffer( yyin, YY_BUF_SIZE );
+
+		yy_load_buffer_state();
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = yy_c_buf_p;
+
+		/* Support of yytext. */
+		*yy_cp = yy_hold_char;
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = yy_start;
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			if ( yy_accept[yy_current_state] )
+				{
+				yy_last_accepting_state = yy_current_state;
+				yy_last_accepting_cpos = yy_cp;
+				}
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 557 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 664 );
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+		if ( yy_act == 0 )
+			{ /* have to back up */
+			yy_cp = yy_last_accepting_cpos;
+			yy_current_state = yy_last_accepting_state;
+			yy_act = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+
+do_action:	/* This label is used only to access EOF actions. */
+
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+			case 0: /* must back up */
+			/* undo the effects of YY_DO_BEFORE_ACTION */
+			*yy_cp = yy_hold_char;
+			yy_cp = yy_last_accepting_cpos;
+			yy_current_state = yy_last_accepting_state;
+			goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 300 "lexer.lxx"
+{
+  // New line.  Save a copy of the line so we can print it out for the
+  // benefit of the user in case we get an error.
+
+  strncpy(current_line, yytext+1, max_error_width);
+  current_line[max_error_width] = '\0';
+  line_number++;
+  col_number=0;
+
+  // Return the whole line to the lexer, except the newline character,
+  // which we eat.
+  yyless(1);
+}
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 314 "lexer.lxx"
+{ 
+  // Eat whitespace.
+  accept();
+}
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 319 "lexer.lxx"
+{ 
+  // Eat C++-style comments.
+  accept();
+}
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 324 "lexer.lxx"
+{
+  // Eat C-style comments.
+  accept();
+  eat_c_comment(); 
+}
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 330 "lexer.lxx"
+{
+  // Send curly braces as themselves.
+  accept(); 
+  return eggyytext[0];
+}
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 338 "lexer.lxx"
+{
+  accept();
+  return BEZIERCURVE;
+}
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 342 "lexer.lxx"
+{
+  accept();
+  return BFACE;
+}
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 346 "lexer.lxx"
+{
+  accept();
+  return BILLBOARD;
+}
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 350 "lexer.lxx"
+{
+  accept();
+  return BILLBOARDCENTER;
+}
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 354 "lexer.lxx"
+{
+  accept();
+  return BINORMAL;
+}
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 358 "lexer.lxx"
+{
+  accept();
+  return BUNDLE;
+}
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 362 "lexer.lxx"
+{
+  accept();
+  return SCALAR;
+}
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 366 "lexer.lxx"
+{
+  accept();
+  return CLOSED;
+}
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 370 "lexer.lxx"
+{
+  accept();
+  return COLLIDE;
+}
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 374 "lexer.lxx"
+{
+  accept();
+  return COMMENT;
+}
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 378 "lexer.lxx"
+{
+  accept();
+  return COMPONENT;
+}
+	YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 382 "lexer.lxx"
+{
+  accept();
+  return COORDSYSTEM;
+}
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 386 "lexer.lxx"
+{
+  accept();
+  return CV;
+}
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 390 "lexer.lxx"
+{
+  accept();
+  return DART;
+}
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 394 "lexer.lxx"
+{
+  accept();
+  return DNORMAL;
+}
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 398 "lexer.lxx"
+{
+  accept();
+  return DRGBA;
+}
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 402 "lexer.lxx"
+{
+  accept();
+  return DUV;
+}
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 406 "lexer.lxx"
+{
+  accept();
+  return DXYZ;
+}
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 410 "lexer.lxx"
+{
+  accept();
+  return DCS;
+}
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 414 "lexer.lxx"
+{
+  accept();
+  return DISTANCE;
+}
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 418 "lexer.lxx"
+{
+  accept();
+  return DTREF;
+}
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 422 "lexer.lxx"
+{
+  accept();
+  return DYNAMICVERTEXPOOL;
+}
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 426 "lexer.lxx"
+{
+  accept();
+  return EXTERNAL_FILE;
+}
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 430 "lexer.lxx"
+{
+  accept();
+  return FLIGHT;
+}
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 434 "lexer.lxx"
+{
+  accept();
+  return GROUP;
+}
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 438 "lexer.lxx"
+{
+  accept();
+  return HIP;
+}
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 442 "lexer.lxx"
+{
+  accept();
+  return INTANGENT;
+}
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 446 "lexer.lxx"
+{
+  accept();
+  return JOINT;
+}
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 450 "lexer.lxx"
+{
+  accept();
+  return KNOTS;
+}
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 454 "lexer.lxx"
+{
+  accept();
+  return INCLUDE;
+}
+	YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 458 "lexer.lxx"
+{
+  accept();
+  return INSTANCE;
+}
+	YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 462 "lexer.lxx"
+{
+  accept();
+  return LINE;
+}
+	YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 466 "lexer.lxx"
+{
+  accept();
+  return LOOP;
+}
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 470 "lexer.lxx"
+{
+  accept();
+  return MATERIAL;
+}
+	YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 474 "lexer.lxx"
+{
+  accept();
+  return MATRIX3;
+}
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 478 "lexer.lxx"
+{
+  accept();
+  return MATRIX4;
+}
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 482 "lexer.lxx"
+{
+  accept();
+  return MODEL;
+}
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 486 "lexer.lxx"
+{
+  accept();
+  return MREF;
+}
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 490 "lexer.lxx"
+{
+  accept();
+  return NORMAL;
+}
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 494 "lexer.lxx"
+{
+  accept();
+  return NURBSCURVE;
+}
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 498 "lexer.lxx"
+{
+  accept();
+  return NURBSSURFACE;
+}
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 502 "lexer.lxx"
+{
+  accept();
+  return OBJECTTYPE;
+}
+	YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 506 "lexer.lxx"
+{
+  accept();
+  return ORDER;
+}
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 510 "lexer.lxx"
+{
+  accept();
+  return OUTTANGENT;
+}
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 514 "lexer.lxx"
+{
+  accept();
+  return POINTLIGHT;
+}
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 518 "lexer.lxx"
+{
+  accept();
+  return POLYGON;
+}
+	YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 522 "lexer.lxx"
+{
+  accept();
+  return REF;
+}
+	YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 526 "lexer.lxx"
+{
+  accept();
+  return RGBA;
+}
+	YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 530 "lexer.lxx"
+{
+  accept();
+  return ROTATE;
+}
+	YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 534 "lexer.lxx"
+{
+  accept();
+  return ROTX;
+}
+	YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 538 "lexer.lxx"
+{
+  accept();
+  return ROTY;
+}
+	YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 542 "lexer.lxx"
+{
+  accept();
+  return ROTZ;
+}
+	YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 546 "lexer.lxx"
+{
+  accept();
+  return SANIM;
+}
+	YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 550 "lexer.lxx"
+{
+  accept();
+  return SCALAR;
+}
+	YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 554 "lexer.lxx"
+{
+  accept();
+  return SCALE;
+}
+	YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 558 "lexer.lxx"
+{
+  accept();
+  return SEQUENCE;
+}
+	YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 562 "lexer.lxx"
+{
+  accept();
+  return SHADING;
+}
+	YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 566 "lexer.lxx"
+{
+  accept();
+  return SWITCH;
+}
+	YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 570 "lexer.lxx"
+{
+  accept();
+  return SWITCHCONDITION;
+}
+	YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 574 "lexer.lxx"
+{
+  accept();
+  return TABLE;
+}
+	YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 578 "lexer.lxx"
+{
+  accept();
+  return TABLE_V;
+}
+	YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 582 "lexer.lxx"
+{
+  accept();
+  return TAG;
+}
+	YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 586 "lexer.lxx"
+{
+  accept();
+  return TANGENT;
+}
+	YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 590 "lexer.lxx"
+{
+  accept();
+  return TEXLIST;
+}
+	YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 594 "lexer.lxx"
+{
+  accept();
+  return TEXTURE;
+}
+	YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 598 "lexer.lxx"
+{
+  accept();
+  return TLENGTHS;
+}
+	YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 602 "lexer.lxx"
+{
+  accept();
+  return TRANSFORM;
+}
+	YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 606 "lexer.lxx"
+{
+  accept();
+  return TRANSLATE;
+}
+	YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 610 "lexer.lxx"
+{
+  accept();
+  return TREF;
+}
+	YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 614 "lexer.lxx"
+{
+  accept();
+  return TRIANGLEFAN;
+}
+	YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 618 "lexer.lxx"
+{
+  accept();
+  return TRIANGLESTRIP;
+}
+	YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 622 "lexer.lxx"
+{
+  accept();
+  return TRIM;
+}
+	YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 626 "lexer.lxx"
+{
+  accept();
+  return TXT;
+}
+	YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 630 "lexer.lxx"
+{
+  accept();
+  return UKNOTS;
+}
+	YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 634 "lexer.lxx"
+{
+  accept();
+  return UKNOTS;
+}
+	YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 638 "lexer.lxx"
+{
+  accept();
+  return UV;
+}
+	YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 642 "lexer.lxx"
+{
+  accept();
+  return VKNOTS;
+}
+	YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 646 "lexer.lxx"
+{
+  accept();
+  return VKNOTS;
+}
+	YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 650 "lexer.lxx"
+{
+  accept();
+  return VERTEX;
+}
+	YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 654 "lexer.lxx"
+{
+  accept();
+  return VERTEXANIM;
+}
+	YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 658 "lexer.lxx"
+{
+  accept();
+  return VERTEXPOOL;
+}
+	YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 662 "lexer.lxx"
+{
+  accept();
+  return VERTEXREF;
+}
+	YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 666 "lexer.lxx"
+{
+  accept();
+  return XFMANIM;
+}
+	YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 670 "lexer.lxx"
+{
+  accept();
+  return XFMSANIM;
+}
+	YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 677 "lexer.lxx"
+{ 
+  // An integer or floating-point number.
+  accept(); 
+  eggyylval._number = atof(eggyytext); 
+  eggyylval._string = yytext;
+  return NUMBER; 
+}
+	YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 685 "lexer.lxx"
+{
+  // A hexadecimal integer number.
+  accept(); 
+  eggyylval._ulong = strtoul(yytext+2, NULL, 16);
+  eggyylval._string = yytext;
+  return ULONG; 
+}
+	YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 693 "lexer.lxx"
+{
+  // A binary integer number.
+  accept(); 
+  eggyylval._ulong = strtoul(yytext+2, NULL, 2);
+  eggyylval._string = yytext;
+  return ULONG; 
+}
+	YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 701 "lexer.lxx"
+{
+  // not-a-number.  These sometimes show up in egg files accidentally.
+  accept(); 
+  memset(&eggyylval._number, 0, sizeof(eggyylval._number));
+  *(unsigned long *)&eggyylval._number = strtoul(yytext+3, NULL, 0);
+  eggyylval._string = yytext;
+  return NUMBER;
+}
+	YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 710 "lexer.lxx"
+{ 
+  // infinity.  As above.
+  accept(); 
+  eggyylval._number = HUGE_VAL;
+  eggyylval._string = yytext;
+  return NUMBER; 
+}
+	YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 718 "lexer.lxx"
+{
+  // minus infinity.  As above.
+  accept(); 
+  eggyylval._number = -HUGE_VAL;
+  eggyylval._string = yytext;
+  return NUMBER; 
+}
+	YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 727 "lexer.lxx"
+{
+  // Quoted string.
+  accept();
+  eggyylval._string = scan_quoted_string();
+  return STRING;
+}
+	YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 734 "lexer.lxx"
+{ 
+  // Unquoted string.
+  accept();
+  eggyylval._string = yytext;
+  return STRING;
+}
+	YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 740 "lexer.lxx"
+ECHO;
+	YY_BREAK
+#line 2078 "lex.yy.c"
+case YY_STATE_EOF(INITIAL):
+	yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = yy_hold_char;
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * yylex().  If so, then we have to assure
+			 * consistency between yy_current_buffer and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			yy_n_chars = yy_current_buffer->yy_n_chars;
+			yy_current_buffer->yy_input_file = yyin;
+			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state();
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++yy_c_buf_p;
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = yy_c_buf_p;
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer() )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				yy_did_buffer_switch_on_eof = 0;
+
+				if ( yywrap() )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * yytext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				yy_c_buf_p =
+					yytext_ptr + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				yy_c_buf_p =
+				&yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+	} /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+	{
+	register char *dest = yy_current_buffer->yy_ch_buf;
+	register char *source = yytext_ptr;
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( yy_current_buffer->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+	else
+		{
+		int num_to_read =
+			yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+			YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = yy_current_buffer;
+
+			int yy_c_buf_p_offset =
+				(int) (yy_c_buf_p - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					yy_flex_realloc( (void *) b->yy_ch_buf,
+							 b->yy_buf_size + 2 );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = yy_current_buffer->yy_buf_size -
+						number_to_move - 1;
+#endif
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+			yy_n_chars, num_to_read );
+
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	if ( yy_n_chars == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			yyrestart( yyin );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			yy_current_buffer->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	yy_n_chars += number_to_move;
+	yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+	yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+	return ret_val;
+	}
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+
+	yy_current_state = yy_start;
+
+	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		if ( yy_accept[yy_current_state] )
+			{
+			yy_last_accepting_state = yy_current_state;
+			yy_last_accepting_cpos = yy_cp;
+			}
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 557 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		}
+
+	return yy_current_state;
+	}
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+	{
+	register int yy_is_jam;
+	register char *yy_cp = yy_c_buf_p;
+
+	register YY_CHAR yy_c = 1;
+	if ( yy_accept[yy_current_state] )
+		{
+		yy_last_accepting_state = yy_current_state;
+		yy_last_accepting_cpos = yy_cp;
+		}
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 557 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 556);
+
+	return yy_is_jam ? 0 : yy_current_state;
+	}
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+	{
+	register char *yy_cp = yy_c_buf_p;
+
+	/* undo effects of setting up yytext */
+	*yy_cp = yy_hold_char;
+
+	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = yy_n_chars + 2;
+		register char *dest = &yy_current_buffer->yy_ch_buf[
+					yy_current_buffer->yy_buf_size + 2];
+		register char *source =
+				&yy_current_buffer->yy_ch_buf[number_to_move];
+
+		while ( source > yy_current_buffer->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		yy_current_buffer->yy_n_chars =
+			yy_n_chars = yy_current_buffer->yy_buf_size;
+
+		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+
+	yytext_ptr = yy_bp;
+	yy_hold_char = *yy_cp;
+	yy_c_buf_p = yy_cp;
+	}
+#endif	/* ifndef YY_NO_UNPUT */
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+	{
+	int c;
+
+	*yy_c_buf_p = yy_hold_char;
+
+	if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			/* This was really a NUL. */
+			*yy_c_buf_p = '\0';
+
+		else
+			{ /* need more input */
+			int offset = yy_c_buf_p - yytext_ptr;
+			++yy_c_buf_p;
+
+			switch ( yy_get_next_buffer() )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					yyrestart( yyin );
+
+					/* fall through */
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( yywrap() )
+						return EOF;
+
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					yy_c_buf_p = yytext_ptr + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
+	*yy_c_buf_p = '\0';	/* preserve yytext */
+	yy_hold_char = *++yy_c_buf_p;
+
+
+	return c;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+	{
+	if ( ! yy_current_buffer )
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+	yy_init_buffer( yy_current_buffer, input_file );
+	yy_load_buffer_state();
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+	{
+	if ( yy_current_buffer == new_buffer )
+		return;
+
+	if ( yy_current_buffer )
+		{
+		/* Flush out information for old buffer. */
+		*yy_c_buf_p = yy_hold_char;
+		yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	yy_current_buffer = new_buffer;
+	yy_load_buffer_state();
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (yywrap()) processing, but the only time this flag
+	 * is looked at is after yywrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	yy_did_buffer_switch_on_eof = 1;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+	{
+	yy_n_chars = yy_current_buffer->yy_n_chars;
+	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+	yyin = yy_current_buffer->yy_input_file;
+	yy_hold_char = *yy_c_buf_p;
+	}
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	yy_init_buffer( b, file );
+
+	return b;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+	{
+	if ( ! b )
+		return;
+
+	if ( b == yy_current_buffer )
+		yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		yy_flex_free( (void *) b->yy_ch_buf );
+
+	yy_flex_free( (void *) b );
+	}
+
+
+#ifndef _WIN32
+#else
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+#endif
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+	{
+	yy_flush_buffer( b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+	b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+	b->yy_is_interactive = 0;
+#else
+	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+	{
+	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == yy_current_buffer )
+		yy_load_buffer_state();
+	}
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	yy_switch_to_buffer( b );
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+	{
+	int len;
+	for ( len = 0; yy_str[len]; ++len )
+		;
+
+	return yy_scan_bytes( yy_str, len );
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+	{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = len + 2;
+	buf = (char *) yy_flex_alloc( n );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+	for ( i = 0; i < len; ++i )
+		buf[i] = bytes[i];
+
+	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = yy_scan_buffer( buf, n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+	{
+	if ( yy_start_stack_ptr >= yy_start_stack_depth )
+		{
+		yy_size_t new_size;
+
+		yy_start_stack_depth += YY_START_STACK_INCR;
+		new_size = yy_start_stack_depth * sizeof( int );
+
+		if ( ! yy_start_stack )
+			yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+		else
+			yy_start_stack = (int *) yy_flex_realloc(
+					(void *) yy_start_stack, new_size );
+
+		if ( ! yy_start_stack )
+			YY_FATAL_ERROR(
+			"out of memory expanding start-condition stack" );
+		}
+
+	yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+	BEGIN(new_state);
+	}
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+	{
+	if ( --yy_start_stack_ptr < 0 )
+		YY_FATAL_ERROR( "start-condition stack underflow" );
+
+	BEGIN(yy_start_stack[yy_start_stack_ptr]);
+	}
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+	{
+	return yy_start_stack[yy_start_stack_ptr - 1];
+	}
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+	{
+	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+	}
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		yytext[yyleng] = yy_hold_char; \
+		yy_c_buf_p = yytext + n; \
+		yy_hold_char = *yy_c_buf_p; \
+		*yy_c_buf_p = '\0'; \
+		yyleng = n; \
+		} \
+	while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+	{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+	}
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+	{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+	}
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+	{
+	return (void *) malloc( size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+	{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+	{
+	free( ptr );
+	}
+
+#if YY_MAIN
+int main()
+	{
+	yylex();
+	return 0;
+	}
+#endif
+#line 740 "lexer.lxx"

File diff suppressed because it is too large
+ 1155 - 910
panda/src/egg/parser.cxx.prebuilt


+ 219 - 91
panda/src/egg/parser.h.prebuilt

@@ -1,96 +1,224 @@
-#ifndef BISON_Y_TAB_H
-# define BISON_Y_TAB_H
+/* A Bison parser, made by GNU Bison 1.875b.  */
 
 
-# define	NUMBER	257
-# define	ULONG	258
-# define	STRING	259
-# define	BEZIERCURVE	260
-# define	BFACE	261
-# define	BILLBOARD	262
-# define	BILLBOARDCENTER	263
-# define	BINORMAL	264
-# define	BUNDLE	265
-# define	CLOSED	266
-# define	COLLIDE	267
-# define	COMMENT	268
-# define	COMPONENT	269
-# define	COORDSYSTEM	270
-# define	CV	271
-# define	DART	272
-# define	DNORMAL	273
-# define	DRGBA	274
-# define	DUV	275
-# define	DXYZ	276
-# define	DCS	277
-# define	DISTANCE	278
-# define	DTREF	279
-# define	DYNAMICVERTEXPOOL	280
-# define	EXTERNAL_FILE	281
-# define	FLIGHT	282
-# define	GROUP	283
-# define	HIP	284
-# define	INTANGENT	285
-# define	JOINT	286
-# define	KNOTS	287
-# define	INCLUDE	288
-# define	INSTANCE	289
-# define	LINE	290
-# define	LOOP	291
-# define	MATERIAL	292
-# define	MATRIX3	293
-# define	MATRIX4	294
-# define	MODEL	295
-# define	MREF	296
-# define	NORMAL	297
-# define	NURBSCURVE	298
-# define	NURBSSURFACE	299
-# define	OBJECTTYPE	300
-# define	ORDER	301
-# define	OUTTANGENT	302
-# define	POINTLIGHT	303
-# define	POLYGON	304
-# define	REF	305
-# define	RGBA	306
-# define	ROTATE	307
-# define	ROTX	308
-# define	ROTY	309
-# define	ROTZ	310
-# define	SANIM	311
-# define	SCALAR	312
-# define	SCALE	313
-# define	SEQUENCE	314
-# define	SHADING	315
-# define	SWITCH	316
-# define	SWITCHCONDITION	317
-# define	TABLE	318
-# define	TABLE_V	319
-# define	TAG	320
-# define	TANGENT	321
-# define	TEXLIST	322
-# define	TEXTURE	323
-# define	TLENGTHS	324
-# define	TRANSFORM	325
-# define	TRANSLATE	326
-# define	TREF	327
-# define	TRIANGLEFAN	328
-# define	TRIANGLESTRIP	329
-# define	TRIM	330
-# define	TXT	331
-# define	UKNOTS	332
-# define	UV	333
-# define	VKNOTS	334
-# define	VERTEX	335
-# define	VERTEXANIM	336
-# define	VERTEXPOOL	337
-# define	VERTEXREF	338
-# define	XFMANIM	339
-# define	XFMSANIM	340
-# define	START_EGG	341
-# define	START_GROUP_BODY	342
-# define	START_TEXTURE_BODY	343
-# define	START_PRIMITIVE_BODY	344
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
 
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NUMBER = 258,
+     ULONG = 259,
+     STRING = 260,
+     BEZIERCURVE = 261,
+     BFACE = 262,
+     BILLBOARD = 263,
+     BILLBOARDCENTER = 264,
+     BINORMAL = 265,
+     BUNDLE = 266,
+     CLOSED = 267,
+     COLLIDE = 268,
+     COMMENT = 269,
+     COMPONENT = 270,
+     COORDSYSTEM = 271,
+     CV = 272,
+     DART = 273,
+     DNORMAL = 274,
+     DRGBA = 275,
+     DUV = 276,
+     DXYZ = 277,
+     DCS = 278,
+     DISTANCE = 279,
+     DTREF = 280,
+     DYNAMICVERTEXPOOL = 281,
+     EXTERNAL_FILE = 282,
+     FLIGHT = 283,
+     GROUP = 284,
+     HIP = 285,
+     INTANGENT = 286,
+     JOINT = 287,
+     KNOTS = 288,
+     INCLUDE = 289,
+     INSTANCE = 290,
+     LINE = 291,
+     LOOP = 292,
+     MATERIAL = 293,
+     MATRIX3 = 294,
+     MATRIX4 = 295,
+     MODEL = 296,
+     MREF = 297,
+     NORMAL = 298,
+     NURBSCURVE = 299,
+     NURBSSURFACE = 300,
+     OBJECTTYPE = 301,
+     ORDER = 302,
+     OUTTANGENT = 303,
+     POINTLIGHT = 304,
+     POLYGON = 305,
+     REF = 306,
+     RGBA = 307,
+     ROTATE = 308,
+     ROTX = 309,
+     ROTY = 310,
+     ROTZ = 311,
+     SANIM = 312,
+     SCALAR = 313,
+     SCALE = 314,
+     SEQUENCE = 315,
+     SHADING = 316,
+     SWITCH = 317,
+     SWITCHCONDITION = 318,
+     TABLE = 319,
+     TABLE_V = 320,
+     TAG = 321,
+     TANGENT = 322,
+     TEXLIST = 323,
+     TEXTURE = 324,
+     TLENGTHS = 325,
+     TRANSFORM = 326,
+     TRANSLATE = 327,
+     TREF = 328,
+     TRIANGLEFAN = 329,
+     TRIANGLESTRIP = 330,
+     TRIM = 331,
+     TXT = 332,
+     UKNOTS = 333,
+     UV = 334,
+     VKNOTS = 335,
+     VERTEX = 336,
+     VERTEXANIM = 337,
+     VERTEXPOOL = 338,
+     VERTEXREF = 339,
+     XFMANIM = 340,
+     XFMSANIM = 341,
+     START_EGG = 342,
+     START_GROUP_BODY = 343,
+     START_TEXTURE_BODY = 344,
+     START_PRIMITIVE_BODY = 345
+   };
+#endif
+#define NUMBER 258
+#define ULONG 259
+#define STRING 260
+#define BEZIERCURVE 261
+#define BFACE 262
+#define BILLBOARD 263
+#define BILLBOARDCENTER 264
+#define BINORMAL 265
+#define BUNDLE 266
+#define CLOSED 267
+#define COLLIDE 268
+#define COMMENT 269
+#define COMPONENT 270
+#define COORDSYSTEM 271
+#define CV 272
+#define DART 273
+#define DNORMAL 274
+#define DRGBA 275
+#define DUV 276
+#define DXYZ 277
+#define DCS 278
+#define DISTANCE 279
+#define DTREF 280
+#define DYNAMICVERTEXPOOL 281
+#define EXTERNAL_FILE 282
+#define FLIGHT 283
+#define GROUP 284
+#define HIP 285
+#define INTANGENT 286
+#define JOINT 287
+#define KNOTS 288
+#define INCLUDE 289
+#define INSTANCE 290
+#define LINE 291
+#define LOOP 292
+#define MATERIAL 293
+#define MATRIX3 294
+#define MATRIX4 295
+#define MODEL 296
+#define MREF 297
+#define NORMAL 298
+#define NURBSCURVE 299
+#define NURBSSURFACE 300
+#define OBJECTTYPE 301
+#define ORDER 302
+#define OUTTANGENT 303
+#define POINTLIGHT 304
+#define POLYGON 305
+#define REF 306
+#define RGBA 307
+#define ROTATE 308
+#define ROTX 309
+#define ROTY 310
+#define ROTZ 311
+#define SANIM 312
+#define SCALAR 313
+#define SCALE 314
+#define SEQUENCE 315
+#define SHADING 316
+#define SWITCH 317
+#define SWITCHCONDITION 318
+#define TABLE 319
+#define TABLE_V 320
+#define TAG 321
+#define TANGENT 322
+#define TEXLIST 323
+#define TEXTURE 324
+#define TLENGTHS 325
+#define TRANSFORM 326
+#define TRANSLATE 327
+#define TREF 328
+#define TRIANGLEFAN 329
+#define TRIANGLESTRIP 330
+#define TRIM 331
+#define TXT 332
+#define UKNOTS 333
+#define UV 334
+#define VKNOTS 335
+#define VERTEX 336
+#define VERTEXANIM 337
+#define VERTEXPOOL 338
+#define VERTEXREF 339
+#define XFMANIM 340
+#define XFMSANIM 341
+#define START_EGG 342
+#define START_GROUP_BODY 343
+#define START_TEXTURE_BODY 344
+#define START_PRIMITIVE_BODY 345
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
 
 
 extern YYSTYPE eggyylval;
 extern YYSTYPE eggyylval;
 
 
-#endif /* not BISON_Y_TAB_H */
+
+

+ 3 - 0
panda/src/egg/parser.yxx

@@ -515,6 +515,9 @@ texture_body:
       texture->set_combine_operand(EggTexture::CC_alpha, 2, co);
       texture->set_combine_operand(EggTexture::CC_alpha, 2, co);
     }
     }
 
 
+  } else if (cmp_nocase_uh(name, "saved_result") == 0) {
+    texture->set_saved_result(((int)value) != 0);
+
   } else if (cmp_nocase_uh(name, "tex_gen") == 0) {
   } else if (cmp_nocase_uh(name, "tex_gen") == 0) {
     EggTexture::TexGen tex_gen = EggTexture::string_tex_gen(strval);
     EggTexture::TexGen tex_gen = EggTexture::string_tex_gen(strval);
     if (tex_gen == EggTexture::TG_unspecified) {
     if (tex_gen == EggTexture::TG_unspecified) {

+ 5 - 0
panda/src/egg2pg/eggLoader.cxx

@@ -1198,6 +1198,8 @@ make_texture_stage(const EggTexture *egg_tex) {
     stage->set_alpha_scale(egg_tex->get_alpha_scale());
     stage->set_alpha_scale(egg_tex->get_alpha_scale());
   }
   }
 
 
+  stage->set_saved_result(egg_tex->get_saved_result());
+
   stage->set_sort(egg_tex->get_multitexture_sort() * 10);
   stage->set_sort(egg_tex->get_multitexture_sort() * 10);
 
 
   if (egg_tex->has_priority()) {
   if (egg_tex->has_priority()) {
@@ -3155,6 +3157,9 @@ get_combine_source(const EggTexture *egg_tex,
 
 
   case EggTexture::CS_constant_color_scale:
   case EggTexture::CS_constant_color_scale:
     return TextureStage::CS_constant_color_scale;
     return TextureStage::CS_constant_color_scale;
+
+  case EggTexture::CS_last_saved_result:
+    return TextureStage::CS_last_saved_result;
   };
   };
 
 
   return TextureStage::CS_undefined;
   return TextureStage::CS_undefined;

+ 44 - 38
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -518,7 +518,7 @@ reset() {
 
 
   _supports_texture_combine = 
   _supports_texture_combine = 
     has_extension("GL_ARB_texture_env_combine") || is_at_least_version(1, 3);
     has_extension("GL_ARB_texture_env_combine") || is_at_least_version(1, 3);
-  _supports_texture_crossbar =
+  _supports_texture_saved_result =
     has_extension("GL_ARB_texture_env_crossbar") || is_at_least_version(1, 4);
     has_extension("GL_ARB_texture_env_crossbar") || is_at_least_version(1, 4);
   _supports_texture_dot3 =
   _supports_texture_dot3 =
     has_extension("GL_ARB_texture_env_dot3") || is_at_least_version(1, 3);
     has_extension("GL_ARB_texture_env_dot3") || is_at_least_version(1, 3);
@@ -3556,40 +3556,40 @@ get_texture_combine_type(TextureStage::CombineMode cm) {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 GLint CLP(GraphicsStateGuardian)::
 GLint CLP(GraphicsStateGuardian)::
 get_texture_src_type(TextureStage::CombineSource cs,
 get_texture_src_type(TextureStage::CombineSource cs,
-                     const TextureStage *source_stage, 
-                     const TextureAttrib *attrib, int this_stage) const {
+                     int last_stage, int last_saved_result, 
+                     int this_stage) const {
   switch (cs) {
   switch (cs) {
   case TextureStage::CS_undefined: // fall through
   case TextureStage::CS_undefined: // fall through
   case TextureStage::CS_texture: return GL_TEXTURE;
   case TextureStage::CS_texture: return GL_TEXTURE;
   case TextureStage::CS_constant: return GL_CONSTANT;
   case TextureStage::CS_constant: return GL_CONSTANT;
   case TextureStage::CS_primary_color: return GL_PRIMARY_COLOR;
   case TextureStage::CS_primary_color: return GL_PRIMARY_COLOR;
-  case TextureStage::CS_previous: return GL_PREVIOUS;
   case TextureStage::CS_constant_color_scale: return GL_CONSTANT;
   case TextureStage::CS_constant_color_scale: return GL_CONSTANT;
 
 
-  case TextureStage::CS_crossbar_stage:
-    {
-      int n = attrib->find_on_stage(source_stage);
-      if (n >= 0) {
-        if (_supports_texture_crossbar) {
-          return GL_TEXTURE0 + n;
-
-        } else if (n == this_stage) {
-          return GL_TEXTURE;
-
-        } else if (n == this_stage - 1) {
-          return GL_PREVIOUS;
-
-        } else {
-          GLCAT.warning()
-            << "Crossbar blending not supported\n";
-          return GL_PRIMARY_COLOR;
-        }
-      }
+  case TextureStage::CS_previous: 
+    if (last_stage == this_stage - 1) {
+      return GL_PREVIOUS;
+    } else if (last_stage == -1) {
+      return GL_PRIMARY_COLOR;
+    } else if (_supports_texture_saved_result) {
+      return GL_TEXTURE0 + last_stage;
+    } else {
       GLCAT.warning()
       GLCAT.warning()
-        << "TextureStage " << *attrib->get_on_stage(this_stage)
-        << " sources unused stage: " << *source_stage << "\n";
+        << "Current OpenGL driver does not support texture crossbar blending.\n";
       return GL_PRIMARY_COLOR;
       return GL_PRIMARY_COLOR;
-    } 
+    }
+      
+  case TextureStage::CS_last_saved_result: 
+    if (last_saved_result == this_stage - 1) {
+      return GL_PREVIOUS;
+    } else if (last_saved_result == -1) {
+      return GL_PRIMARY_COLOR;
+    } else if (_supports_texture_saved_result) {
+      return GL_TEXTURE0 + last_saved_result;
+    } else {
+      GLCAT.warning()
+        << "Current OpenGL driver does not support texture crossbar blending.\n";
+      return GL_PRIMARY_COLOR;
+    }
   }
   }
 
 
   GLCAT.error()
   GLCAT.error()
@@ -4488,6 +4488,8 @@ do_issue_texture() {
 
 
   _texture_involves_color_scale = false;
   _texture_involves_color_scale = false;
 
 
+  int last_saved_result = -1;
+  int last_stage = -1;
   int i;
   int i;
   for (i = 0; i < num_stages; i++) {
   for (i = 0; i < num_stages; i++) {
     TextureStage *stage = new_texture->get_on_stage(i);
     TextureStage *stage = new_texture->get_on_stage(i);
@@ -4573,8 +4575,7 @@ do_issue_texture() {
           case 3:
           case 3:
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC2_RGB, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC2_RGB, 
                          get_texture_src_type(stage->get_combine_rgb_source2(),
                          get_texture_src_type(stage->get_combine_rgb_source2(),
-                                              stage->get_combine_rgb_source2_stage(), 
-                                              new_texture, i));
+                                              last_stage, last_saved_result, i));
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND2_RGB, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND2_RGB, 
                          get_texture_operand_type(stage->get_combine_rgb_operand2()));
                          get_texture_operand_type(stage->get_combine_rgb_operand2()));
             // fall through
             // fall through
@@ -4582,8 +4583,7 @@ do_issue_texture() {
           case 2:
           case 2:
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC1_RGB, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC1_RGB, 
                          get_texture_src_type(stage->get_combine_rgb_source1(),
                          get_texture_src_type(stage->get_combine_rgb_source1(),
-                                              stage->get_combine_rgb_source1_stage(),
-                                              new_texture, i));
+                                              last_stage, last_saved_result, i));
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND1_RGB, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND1_RGB, 
                          get_texture_operand_type(stage->get_combine_rgb_operand1()));
                          get_texture_operand_type(stage->get_combine_rgb_operand1()));
             // fall through
             // fall through
@@ -4591,8 +4591,7 @@ do_issue_texture() {
           case 1:
           case 1:
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC0_RGB, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC0_RGB, 
                          get_texture_src_type(stage->get_combine_rgb_source0(),
                          get_texture_src_type(stage->get_combine_rgb_source0(),
-                                              stage->get_combine_rgb_source0_stage(),
-                                              new_texture, i));
+                                              last_stage, last_saved_result, i));
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND0_RGB, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND0_RGB, 
                          get_texture_operand_type(stage->get_combine_rgb_operand0()));
                          get_texture_operand_type(stage->get_combine_rgb_operand0()));
             // fall through
             // fall through
@@ -4607,8 +4606,7 @@ do_issue_texture() {
           case 3:
           case 3:
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC2_ALPHA, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC2_ALPHA, 
                          get_texture_src_type(stage->get_combine_alpha_source2(),
                          get_texture_src_type(stage->get_combine_alpha_source2(),
-                                              stage->get_combine_alpha_source2_stage(),
-                                              new_texture, i));
+                                              last_stage, last_saved_result, i));
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, 
                          get_texture_operand_type(stage->get_combine_alpha_operand2()));
                          get_texture_operand_type(stage->get_combine_alpha_operand2()));
             // fall through
             // fall through
@@ -4616,8 +4614,7 @@ do_issue_texture() {
           case 2:
           case 2:
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC1_ALPHA, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC1_ALPHA, 
                          get_texture_src_type(stage->get_combine_alpha_source1(),
                          get_texture_src_type(stage->get_combine_alpha_source1(),
-                                              stage->get_combine_alpha_source1_stage(),
-                                              new_texture, i));
+                                              last_stage, last_saved_result, i));
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, 
                          get_texture_operand_type(stage->get_combine_alpha_operand1()));
                          get_texture_operand_type(stage->get_combine_alpha_operand1()));
             // fall through
             // fall through
@@ -4625,8 +4622,7 @@ do_issue_texture() {
           case 1:
           case 1:
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC0_ALPHA, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_SRC0_ALPHA, 
                          get_texture_src_type(stage->get_combine_alpha_source0(),
                          get_texture_src_type(stage->get_combine_alpha_source0(),
-                                              stage->get_combine_alpha_source0_stage(),
-                                              new_texture, i));
+                                              last_stage, last_saved_result, i));
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, 
             GLP(TexEnvi)(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, 
                          get_texture_operand_type(stage->get_combine_alpha_operand0()));
                          get_texture_operand_type(stage->get_combine_alpha_operand0()));
             // fall through
             // fall through
@@ -4647,6 +4643,16 @@ do_issue_texture() {
         GLP(LoadIdentity)();
         GLP(LoadIdentity)();
       }
       }
     }
     }
+    
+    if (stage->get_saved_result()) {
+      // This texture's result will be "saved" for a future stage's
+      // input.
+      last_saved_result = i;
+    } else {
+      // This is a regular texture stage; it will be the "previous"
+      // input for the next stage.
+      last_stage = i;
+    }
   }
   }
     
     
   // Disable the texture stages that are no longer used.
   // Disable the texture stages that are no longer used.

+ 2 - 2
panda/src/glstuff/glGraphicsStateGuardian_src.h

@@ -224,8 +224,8 @@ protected:
   static GLint get_texture_apply_mode_type(TextureStage::Mode am);
   static GLint get_texture_apply_mode_type(TextureStage::Mode am);
   static GLint get_texture_combine_type(TextureStage::CombineMode cm);
   static GLint get_texture_combine_type(TextureStage::CombineMode cm);
   GLint get_texture_src_type(TextureStage::CombineSource cs,
   GLint get_texture_src_type(TextureStage::CombineSource cs,
-                             const TextureStage *source_stage, 
-                             const TextureAttrib *attrib, int this_stage) const;
+                             int last_stage, int last_saved_result, 
+                             int this_stage) const;
   static GLint get_texture_operand_type(TextureStage::CombineOperand co);
   static GLint get_texture_operand_type(TextureStage::CombineOperand co);
   static GLenum get_fog_mode_type(Fog::Mode m);
   static GLenum get_fog_mode_type(Fog::Mode m);
   static GLenum get_blend_equation_type(ColorBlendAttrib::Mode mode);
   static GLenum get_blend_equation_type(ColorBlendAttrib::Mode mode);

File diff suppressed because it is too large
+ 131 - 793
panda/src/gobj/textureStage.I


+ 25 - 105
panda/src/gobj/textureStage.cxx

@@ -39,6 +39,7 @@ TextureStage(const string &name) {
   _color.set(0.0f, 0.0f, 0.0f, 1.0f);
   _color.set(0.0f, 0.0f, 0.0f, 1.0f);
   _rgb_scale = 1;
   _rgb_scale = 1;
   _alpha_scale = 1;
   _alpha_scale = 1;
+  _saved_result = false;
   _combine_rgb_mode = CM_undefined;
   _combine_rgb_mode = CM_undefined;
   _num_combine_rgb_operands = 0;
   _num_combine_rgb_operands = 0;
   _combine_rgb_source0 = CS_undefined;
   _combine_rgb_source0 = CS_undefined;
@@ -75,6 +76,7 @@ operator = (const TextureStage &other) {
   _color = other._color;
   _color = other._color;
   _rgb_scale = other._rgb_scale;
   _rgb_scale = other._rgb_scale;
   _alpha_scale = other._alpha_scale;
   _alpha_scale = other._alpha_scale;
+  _saved_result = other._saved_result;
 
 
   _combine_rgb_mode = other._combine_rgb_mode;
   _combine_rgb_mode = other._combine_rgb_mode;
   _combine_rgb_source0 = other._combine_rgb_source0;
   _combine_rgb_source0 = other._combine_rgb_source0;
@@ -114,46 +116,41 @@ write(ostream &out) const {
   out << "TextureStage " << get_name() << ", sort = " << get_sort() << ", priority = " << get_priority() << "\n"
   out << "TextureStage " << get_name() << ", sort = " << get_sort() << ", priority = " << get_priority() << "\n"
       << "  texcoords = " << get_texcoord_name()->get_name()
       << "  texcoords = " << get_texcoord_name()->get_name()
       << ", mode = " << get_mode() << ", color = " << get_color()
       << ", mode = " << get_mode() << ", color = " << get_color()
-      << ", scale = " << get_rgb_scale() << ", " << get_alpha_scale() << "\n";
+      << ", scale = " << get_rgb_scale() << ", " << get_alpha_scale()
+      << ", saved_result = " << get_saved_result() << "\n";
 
 
   if (get_mode() == M_combine) {
   if (get_mode() == M_combine) {
     out << "  RGB combine mode =  " << get_combine_rgb_mode() << "\n";
     out << "  RGB combine mode =  " << get_combine_rgb_mode() << "\n";
     if (get_num_combine_rgb_operands() >= 1) {
     if (get_num_combine_rgb_operands() >= 1) {
-      write_operand(out, 0, get_combine_rgb_source0(), 
-                    get_combine_rgb_source0_stage(), 
-                    get_combine_rgb_operand0());
+      out << "    0: " << get_combine_rgb_source0() << ", "
+          << get_combine_rgb_operand0() << "\n";
     }
     }
     if (get_num_combine_rgb_operands() >= 2) {
     if (get_num_combine_rgb_operands() >= 2) {
-      write_operand(out, 1, get_combine_rgb_source1(), 
-                    get_combine_rgb_source1_stage(), 
-                    get_combine_rgb_operand1());
+      out << "    1: " << get_combine_rgb_source1() << ", "
+          << get_combine_rgb_operand1() << "\n";
     }
     }
     if (get_num_combine_rgb_operands() >= 3) {
     if (get_num_combine_rgb_operands() >= 3) {
-      write_operand(out, 2, get_combine_rgb_source2(), 
-                    get_combine_rgb_source2_stage(), 
-                    get_combine_rgb_operand2());
+      out << "    2: " << get_combine_rgb_source2() << ", "
+          << get_combine_rgb_operand2() << "\n";
     }
     }
     out << "  alpha combine mode =  " << get_combine_alpha_mode() << "\n";
     out << "  alpha combine mode =  " << get_combine_alpha_mode() << "\n";
     if (get_num_combine_alpha_operands() >= 1) {
     if (get_num_combine_alpha_operands() >= 1) {
-      write_operand(out, 0, get_combine_alpha_source0(), 
-                    get_combine_alpha_source0_stage(), 
-                    get_combine_alpha_operand0());
+      out << "    0: " << get_combine_alpha_source0() << ", "
+          << get_combine_alpha_operand0() << "\n";
     }
     }
     if (get_num_combine_alpha_operands() >= 2) {
     if (get_num_combine_alpha_operands() >= 2) {
-      write_operand(out, 1, get_combine_alpha_source1(), 
-                    get_combine_alpha_source1_stage(), 
-                    get_combine_alpha_operand1());
+      out << "    1: " << get_combine_alpha_source1() << ", "
+          << get_combine_alpha_operand1() << "\n";
     }
     }
     if (get_num_combine_alpha_operands() >= 3) {
     if (get_num_combine_alpha_operands() >= 3) {
-      write_operand(out, 2, get_combine_alpha_source2(), 
-                    get_combine_alpha_source2_stage(), 
-                    get_combine_alpha_operand2());
+      out << "    2: " << get_combine_alpha_source2() << ", "
+          << get_combine_alpha_operand2() << "\n";
     }
     }
   }
   }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: TextureStage::output
+//     Function: TextureStage::Destructor
 //       Access: Published
 //       Access: Published
 //  Description: Just a single line output
 //  Description: Just a single line output
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -162,25 +159,6 @@ output(ostream &out) const {
   out << "TextureStage " << get_name();
   out << "TextureStage " << get_name();
 }
 }
 
 
-////////////////////////////////////////////////////////////////////
-//     Function: TextureStage::write_operand
-//       Access: Private, Static
-//  Description: Used by write() to simply describe a single operand
-//               of the CM_combine mode (one of up to 3 defined by the
-//               stage).
-////////////////////////////////////////////////////////////////////
-void TextureStage::
-write_operand(ostream &out, int operand_index, CombineSource source, 
-              const TextureStage *source_stage, CombineOperand operand) {
-  if (source == CS_crossbar_stage) {
-    out << "    " << operand_index << ": " 
-        << *source_stage << ", " << operand << "\n";
-  } else {
-    out << "    " << operand_index << ": " 
-        << source << ", " << operand << "\n";
-  }
-}
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: TextureStage::get_expected_num_combine_operands
 //     Function: TextureStage::get_expected_num_combine_operands
 //       Access: Private, Static
 //       Access: Private, Static
@@ -308,7 +286,11 @@ fillin(DatagramIterator &scan, BamReader *manager) {
 
 
   _rgb_scale = scan.get_uint8();
   _rgb_scale = scan.get_uint8();
   _alpha_scale = scan.get_uint8();
   _alpha_scale = scan.get_uint8();
-  
+  _saved_result = false;
+  if (manager->get_file_minor_ver() >= 1) {
+    _saved_result = scan.get_bool();
+  }
+
   _combine_rgb_mode = (TextureStage::CombineMode) scan.get_uint8();
   _combine_rgb_mode = (TextureStage::CombineMode) scan.get_uint8();
   _num_combine_rgb_operands = scan.get_uint8();
   _num_combine_rgb_operands = scan.get_uint8();
   _combine_rgb_source0 = (TextureStage::CombineSource) scan.get_uint8();
   _combine_rgb_source0 = (TextureStage::CombineSource) scan.get_uint8();
@@ -327,27 +309,6 @@ fillin(DatagramIterator &scan, BamReader *manager) {
   _combine_alpha_source2 = (TextureStage::CombineSource) scan.get_uint8();
   _combine_alpha_source2 = (TextureStage::CombineSource) scan.get_uint8();
   _combine_alpha_operand2 = (TextureStage::CombineOperand) scan.get_uint8();
   _combine_alpha_operand2 = (TextureStage::CombineOperand) scan.get_uint8();
 
 
-  // We only read these pointers if the source types indicate they are
-  // defined.
-  if (_combine_rgb_source0 == CS_crossbar_stage) {
-    manager->read_pointer(scan);
-  }
-  if (_combine_rgb_source1 == CS_crossbar_stage) {
-    manager->read_pointer(scan);
-  }
-  if (_combine_rgb_source2 == CS_crossbar_stage) {
-    manager->read_pointer(scan);
-  }
-  if (_combine_alpha_source0 == CS_crossbar_stage) {
-    manager->read_pointer(scan);
-  }
-  if (_combine_alpha_source1 == CS_crossbar_stage) {
-    manager->read_pointer(scan);
-  }
-  if (_combine_alpha_source2 == CS_crossbar_stage) {
-    manager->read_pointer(scan);
-  }
-
   update_color_flags();
   update_color_flags();
 }
 }
 
 
@@ -364,27 +325,6 @@ complete_pointers(TypedWritable **p_list, BamReader *manager) {
 
 
   _texcoord_name = DCAST(InternalName, p_list[pi++]);
   _texcoord_name = DCAST(InternalName, p_list[pi++]);
 
 
-  // We only read these pointers if the source types indicate they are
-  // defined.
-  if (_combine_rgb_source0 == CS_crossbar_stage) {
-    _combine_rgb_source0_stage = DCAST(TextureStage, p_list[pi++]);
-  }
-  if (_combine_rgb_source1 == CS_crossbar_stage) {
-    _combine_rgb_source1_stage = DCAST(TextureStage, p_list[pi++]);
-  }
-  if (_combine_rgb_source2 == CS_crossbar_stage) {
-    _combine_rgb_source2_stage = DCAST(TextureStage, p_list[pi++]);
-  }
-  if (_combine_alpha_source0 == CS_crossbar_stage) {
-    _combine_alpha_source0_stage = DCAST(TextureStage, p_list[pi++]);
-  }
-  if (_combine_alpha_source1 == CS_crossbar_stage) {
-    _combine_alpha_source1_stage = DCAST(TextureStage, p_list[pi++]);
-  }
-  if (_combine_alpha_source2 == CS_crossbar_stage) {
-    _combine_alpha_source2_stage = DCAST(TextureStage, p_list[pi++]);
-  }
-
   return pi;
   return pi;
 }
 }
 
 
@@ -411,6 +351,7 @@ write_datagram(BamWriter *manager, Datagram &me) {
     _color.write_datagram(me);
     _color.write_datagram(me);
     me.add_uint8(_rgb_scale);
     me.add_uint8(_rgb_scale);
     me.add_uint8(_alpha_scale);
     me.add_uint8(_alpha_scale);
+    me.add_bool(_saved_result);
     
     
     me.add_uint8(_combine_rgb_mode);
     me.add_uint8(_combine_rgb_mode);
     me.add_uint8(_num_combine_rgb_operands);
     me.add_uint8(_num_combine_rgb_operands);
@@ -429,27 +370,6 @@ write_datagram(BamWriter *manager, Datagram &me) {
     me.add_uint8(_combine_alpha_operand1);
     me.add_uint8(_combine_alpha_operand1);
     me.add_uint8(_combine_alpha_source2);
     me.add_uint8(_combine_alpha_source2);
     me.add_uint8(_combine_alpha_operand2);
     me.add_uint8(_combine_alpha_operand2);
-
-    // We only write these pointers if the source types indicate they
-    // are defined.
-    if (_combine_rgb_source0 == CS_crossbar_stage) {
-      manager->write_pointer(me, _combine_rgb_source0_stage);
-    }
-    if (_combine_rgb_source1 == CS_crossbar_stage) {
-      manager->write_pointer(me, _combine_rgb_source1_stage);
-    }
-    if (_combine_rgb_source2 == CS_crossbar_stage) {
-      manager->write_pointer(me, _combine_rgb_source2_stage);
-    }
-    if (_combine_alpha_source0 == CS_crossbar_stage) {
-      manager->write_pointer(me, _combine_alpha_source0_stage);
-    }
-    if (_combine_alpha_source1 == CS_crossbar_stage) {
-      manager->write_pointer(me, _combine_alpha_source1_stage);
-    }
-    if (_combine_alpha_source2 == CS_crossbar_stage) {
-      manager->write_pointer(me, _combine_alpha_source2_stage);
-    }
   }
   }
 }
 }
 
 
@@ -536,8 +456,8 @@ operator << (ostream &out, TextureStage::CombineSource cs) {
   case TextureStage::CS_constant_color_scale:
   case TextureStage::CS_constant_color_scale:
     return out << "constant_color_scale";
     return out << "constant_color_scale";
 
 
-  case TextureStage::CS_crossbar_stage:
-    return out << "crossbar_stage";
+  case TextureStage::CS_last_saved_result:
+    return out << "last_saved_result";
   }
   }
 
 
   return out << "**invalid CombineSource(" << (int)cs << ")**";
   return out << "**invalid CombineSource(" << (int)cs << ")**";

+ 13 - 106
panda/src/gobj/textureStage.h

@@ -59,17 +59,17 @@ PUBLISHED:
 
 
   enum CombineMode {
   enum CombineMode {
     CM_undefined,
     CM_undefined,
-    CM_replace,      // 1 operand
-    CM_modulate,     // 2 operands
-    CM_add,          // 2 operands
-    CM_add_signed,   // 2 operands
-    CM_interpolate,  // 3 operands
-    CM_subtract,     // 2 operands
+    CM_replace,
+    CM_modulate,
+    CM_add,
+    CM_add_signed,
+    CM_interpolate,
+    CM_subtract,
 
 
     // The following are valid only for combine_rgb, not
     // The following are valid only for combine_rgb, not
     // combine_alpha.
     // combine_alpha.
-    CM_dot3_rgb,     // 2 operands
-    CM_dot3_rgba,    // 2 operands
+    CM_dot3_rgb,
+    CM_dot3_rgba,
   };
   };
 
 
   enum CombineSource {
   enum CombineSource {
@@ -79,7 +79,7 @@ PUBLISHED:
     CS_primary_color,
     CS_primary_color,
     CS_previous,
     CS_previous,
     CS_constant_color_scale,
     CS_constant_color_scale,
-    CS_crossbar_stage,
+    CS_last_saved_result,
   };
   };
 
 
   enum CombineOperand {
   enum CombineOperand {
@@ -117,126 +117,43 @@ PUBLISHED:
   INLINE void set_alpha_scale(int alpha_scale);
   INLINE void set_alpha_scale(int alpha_scale);
   INLINE int get_alpha_scale() const;
   INLINE int get_alpha_scale() const;
 
 
+  INLINE void set_saved_result(bool saved_result);
+  INLINE bool get_saved_result() const;
+
   INLINE void set_combine_rgb(CombineMode mode, 
   INLINE void set_combine_rgb(CombineMode mode, 
                               CombineSource source0, CombineOperand operand0);
                               CombineSource source0, CombineOperand operand0);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              const TextureStage *source0, CombineOperand operand0);
   INLINE void set_combine_rgb(CombineMode mode, 
   INLINE void set_combine_rgb(CombineMode mode, 
                               CombineSource source0, CombineOperand operand0,
                               CombineSource source0, CombineOperand operand0,
                               CombineSource source1, CombineOperand operand1);
                               CombineSource source1, CombineOperand operand1);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              const TextureStage *source0, CombineOperand operand0,
-                              CombineSource source1, CombineOperand operand1);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              CombineSource source0, CombineOperand operand0,
-                              const TextureStage *source1, CombineOperand operand1);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              const TextureStage *source0, CombineOperand operand0,
-                              const TextureStage *source1, CombineOperand operand1);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              CombineSource source0, CombineOperand operand0,
-                              CombineSource source1, CombineOperand operand1,
-                              CombineSource source2, CombineOperand operand2);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              const TextureStage *source0, CombineOperand operand0,
-                              CombineSource source1, CombineOperand operand1,
-                              CombineSource source2, CombineOperand operand2);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              CombineSource source0, CombineOperand operand0,
-                              const TextureStage *source1, CombineOperand operand1,
-                              CombineSource source2, CombineOperand operand2);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              CombineSource source0, CombineOperand operand0,
-                              CombineSource source1, CombineOperand operand1,
-                              const TextureStage *source2, CombineOperand operand2);
   INLINE void set_combine_rgb(CombineMode mode, 
   INLINE void set_combine_rgb(CombineMode mode, 
                               CombineSource source0, CombineOperand operand0,
                               CombineSource source0, CombineOperand operand0,
-                              const TextureStage *source1, CombineOperand operand1,
-                              const TextureStage *source2, CombineOperand operand2);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              const TextureStage *source0, CombineOperand operand0,
                               CombineSource source1, CombineOperand operand1,
                               CombineSource source1, CombineOperand operand1,
-                              const TextureStage *source2, CombineOperand operand2);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              const TextureStage *source0, CombineOperand operand0,
-                              const TextureStage *source1, CombineOperand operand1,
                               CombineSource source2, CombineOperand operand2);
                               CombineSource source2, CombineOperand operand2);
-  INLINE void set_combine_rgb(CombineMode mode, 
-                              const TextureStage *source0, CombineOperand operand0,
-                              const TextureStage *source1, CombineOperand operand1,
-                              const TextureStage *source2, CombineOperand operand2);
-
   INLINE CombineMode get_combine_rgb_mode() const;
   INLINE CombineMode get_combine_rgb_mode() const;
   INLINE int get_num_combine_rgb_operands() const;
   INLINE int get_num_combine_rgb_operands() const;
   INLINE CombineSource get_combine_rgb_source0() const;
   INLINE CombineSource get_combine_rgb_source0() const;
-  INLINE const TextureStage *get_combine_rgb_source0_stage() const;
   INLINE CombineOperand get_combine_rgb_operand0() const;
   INLINE CombineOperand get_combine_rgb_operand0() const;
   INLINE CombineSource get_combine_rgb_source1() const;
   INLINE CombineSource get_combine_rgb_source1() const;
-  INLINE const TextureStage *get_combine_rgb_source1_stage() const;
   INLINE CombineOperand get_combine_rgb_operand1() const;
   INLINE CombineOperand get_combine_rgb_operand1() const;
   INLINE CombineSource get_combine_rgb_source2() const;
   INLINE CombineSource get_combine_rgb_source2() const;
-  INLINE const TextureStage *get_combine_rgb_source2_stage() const;
   INLINE CombineOperand get_combine_rgb_operand2() const;
   INLINE CombineOperand get_combine_rgb_operand2() const;
 
 
   INLINE void set_combine_alpha(CombineMode mode, 
   INLINE void set_combine_alpha(CombineMode mode, 
                                 CombineSource source0, CombineOperand operand0);
                                 CombineSource source0, CombineOperand operand0);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                const TextureStage *source0, CombineOperand operand0);
   INLINE void set_combine_alpha(CombineMode mode, 
   INLINE void set_combine_alpha(CombineMode mode, 
                                 CombineSource source0, CombineOperand operand0,
                                 CombineSource source0, CombineOperand operand0,
                                 CombineSource source1, CombineOperand operand1);
                                 CombineSource source1, CombineOperand operand1);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                const TextureStage *source0, CombineOperand operand0,
-                                CombineSource source1, CombineOperand operand1);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                CombineSource source0, CombineOperand operand0,
-                                const TextureStage *source1, CombineOperand operand1);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                const TextureStage *source0, CombineOperand operand0,
-                                const TextureStage *source1, CombineOperand operand1);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                CombineSource source0, CombineOperand operand0,
-                                CombineSource source1, CombineOperand operand1,
-                                CombineSource source2, CombineOperand operand2);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                const TextureStage *source0, CombineOperand operand0,
-                                CombineSource source1, CombineOperand operand1,
-                                CombineSource source2, CombineOperand operand2);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                CombineSource source0, CombineOperand operand0,
-                                const TextureStage *source1, CombineOperand operand1,
-                                CombineSource source2, CombineOperand operand2);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                CombineSource source0, CombineOperand operand0,
-                                CombineSource source1, CombineOperand operand1,
-                                const TextureStage *source2, CombineOperand operand2);
   INLINE void set_combine_alpha(CombineMode mode, 
   INLINE void set_combine_alpha(CombineMode mode, 
                                 CombineSource source0, CombineOperand operand0,
                                 CombineSource source0, CombineOperand operand0,
-                                const TextureStage *source1, CombineOperand operand1,
-                                const TextureStage *source2, CombineOperand operand2);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                const TextureStage *source0, CombineOperand operand0,
                                 CombineSource source1, CombineOperand operand1,
                                 CombineSource source1, CombineOperand operand1,
-                                const TextureStage *source2, CombineOperand operand2);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                const TextureStage *source0, CombineOperand operand0,
-                                const TextureStage *source1, CombineOperand operand1,
                                 CombineSource source2, CombineOperand operand2);
                                 CombineSource source2, CombineOperand operand2);
-  INLINE void set_combine_alpha(CombineMode mode, 
-                                const TextureStage *source0, CombineOperand operand0,
-                                const TextureStage *source1, CombineOperand operand1,
-                                const TextureStage *source2, CombineOperand operand2);
-  
   INLINE CombineMode get_combine_alpha_mode() const;
   INLINE CombineMode get_combine_alpha_mode() const;
   INLINE int get_num_combine_alpha_operands() const;
   INLINE int get_num_combine_alpha_operands() const;
   INLINE CombineSource get_combine_alpha_source0() const;
   INLINE CombineSource get_combine_alpha_source0() const;
-  INLINE const TextureStage *get_combine_alpha_source0_stage() const;
   INLINE CombineOperand get_combine_alpha_operand0() const;
   INLINE CombineOperand get_combine_alpha_operand0() const;
   INLINE CombineSource get_combine_alpha_source1() const;
   INLINE CombineSource get_combine_alpha_source1() const;
-  INLINE const TextureStage *get_combine_alpha_source1_stage() const;
   INLINE CombineOperand get_combine_alpha_operand1() const;
   INLINE CombineOperand get_combine_alpha_operand1() const;
   INLINE CombineSource get_combine_alpha_source2() const;
   INLINE CombineSource get_combine_alpha_source2() const;
-  INLINE const TextureStage *get_combine_alpha_source2_stage() const;
   INLINE CombineOperand get_combine_alpha_operand2() const;
   INLINE CombineOperand get_combine_alpha_operand2() const;
 
 
   INLINE bool uses_color() const;
   INLINE bool uses_color() const;
@@ -253,11 +170,6 @@ public:
 private:
 private:
   INLINE void update_color_flags();
   INLINE void update_color_flags();
 
 
-  static void write_operand(ostream &out, int operand_index, 
-                            CombineSource source, 
-                            const TextureStage *source_stage,
-                            CombineOperand operand);
-
   static int get_expected_num_combine_operands(CombineMode cm);
   static int get_expected_num_combine_operands(CombineMode cm);
   static bool operand_valid_for_rgb(CombineOperand co);
   static bool operand_valid_for_rgb(CombineOperand co);
   static bool operand_valid_for_alpha(CombineOperand co);
   static bool operand_valid_for_alpha(CombineOperand co);
@@ -270,31 +182,26 @@ private:
   Colorf _color;
   Colorf _color;
   int _rgb_scale;
   int _rgb_scale;
   int _alpha_scale;
   int _alpha_scale;
+  bool _saved_result;
   bool _uses_color;
   bool _uses_color;
   bool _involves_color_scale;
   bool _involves_color_scale;
 
 
   CombineMode _combine_rgb_mode;
   CombineMode _combine_rgb_mode;
   int _num_combine_rgb_operands;
   int _num_combine_rgb_operands;
   CombineSource _combine_rgb_source0;
   CombineSource _combine_rgb_source0;
-  CPT(TextureStage) _combine_rgb_source0_stage;
   CombineOperand _combine_rgb_operand0;
   CombineOperand _combine_rgb_operand0;
   CombineSource _combine_rgb_source1;
   CombineSource _combine_rgb_source1;
-  CPT(TextureStage) _combine_rgb_source1_stage;
   CombineOperand _combine_rgb_operand1;
   CombineOperand _combine_rgb_operand1;
   CombineSource _combine_rgb_source2;
   CombineSource _combine_rgb_source2;
-  CPT(TextureStage) _combine_rgb_source2_stage;
   CombineOperand _combine_rgb_operand2;
   CombineOperand _combine_rgb_operand2;
 
 
   CombineMode _combine_alpha_mode;
   CombineMode _combine_alpha_mode;
   int _num_combine_alpha_operands;
   int _num_combine_alpha_operands;
   CombineSource _combine_alpha_source0;
   CombineSource _combine_alpha_source0;
-  CPT(TextureStage) _combine_alpha_source0_stage;
   CombineOperand _combine_alpha_operand0;
   CombineOperand _combine_alpha_operand0;
   CombineSource _combine_alpha_source1;
   CombineSource _combine_alpha_source1;
-  CPT(TextureStage) _combine_alpha_source1_stage;
   CombineOperand _combine_alpha_operand1;
   CombineOperand _combine_alpha_operand1;
   CombineSource _combine_alpha_source2;
   CombineSource _combine_alpha_source2;
-  CPT(TextureStage) _combine_alpha_source2_stage;
   CombineOperand _combine_alpha_operand2;
   CombineOperand _combine_alpha_operand2;
 
 
   static PT(TextureStage) _default_stage;
   static PT(TextureStage) _default_stage;

+ 2 - 1
panda/src/putil/bam.h

@@ -35,7 +35,8 @@ static const unsigned short _bam_major_ver = 5;
 // Bumped to major version 4 on 4/10/02 to store new scene graph.
 // Bumped to major version 4 on 4/10/02 to store new scene graph.
 // Bumped to major version 5 on 5/6/05 for new Geom implementation.
 // Bumped to major version 5 on 5/6/05 for new Geom implementation.
 
 
-static const unsigned short _bam_minor_ver = 0;
+static const unsigned short _bam_minor_ver = 1;
+// Bumped to minor version 1 on 7/14/05 to add TextureStage::_saved_result.
 
 
 
 
 #endif
 #endif

Some files were not shown because too many files changed in this diff