1 %{
2 // Saves information about a rib file
3 typedef struct TRibFile {
4 	int				ribLineno;
5 	const char		*ribFile;
6 	YY_BUFFER_STATE	ribState;
7 	TRibFile		*next;
8 } TRibFile;
9 
10 static	TRibFile	*ribStack	=	NULL;
11 
12 // Tell flex how to define yylex for pure parser
13 #undef YY_DECL
14 #define YY_DECL int yylex( YYSTYPE *yylval )
15 
16 #ifdef HAVE_ZLIB
17 
18 // Overwrite the YYinput so that it uses libz
19 #undef YY_INPUT
20 #define YY_INPUT(buf, retval, maxlen)	if ( (retval = gzread((gzFile)ribin,buf,maxlen)) < 0) 			\
21 											YY_FATAL_ERROR( "input in flex scanner failed" );
22 
23 #endif
24 
25 %}
26 %option never-interactive
27 %option noyywrap
28 %%
29 Declare												return RIB_DECLARE;
30 FrameBegin											return RIB_FRAME_BEGIN;
31 FrameEnd											return RIB_FRAME_END;
32 WorldBegin											return RIB_WORLD_BEGIN;
33 WorldEnd											return RIB_WORLD_END;
34 Format												return RIB_FORMAT;
35 FrameAspectRatio									return RIB_FRAME_ASPECT_RATIO;
36 ScreenWindow										return RIB_SCREEN_WINDOW;
37 CropWindow											return RIB_CROP_WINDOW;
38 Projection											return RIB_PROJECTION;
39 Clipping											return RIB_CLIPPING;
40 ClippingPlane										return RIB_CLIPPING_PLANE;
41 DepthOfField										return RIB_DEPTH_OF_FIELD;
42 Shutter												return RIB_SHUTTER;
43 PixelVariance										return RIB_PIXEL_VARIANCE;
44 PixelSamples										return RIB_PIXEL_SAMPLES;
45 PixelFilter											return RIB_PIXEL_FILTER;
46 Exposure											return RIB_EXPOSURE;
47 Imager												return RIB_IMAGER;
48 Quantize											return RIB_QUANTIZE;
49 Display												return RIB_DISPLAY;
50 DisplayChannel										return RIB_DISPLAYCHANNEL;
51 Hider												return RIB_HIDER;
52 ColorSamples										return RIB_COLOR_SAMPLES;
53 RelativeDetail										return RIB_RELATIVE_DETAIL;
54 Option												return RIB_OPTION;
55 
56 AttributeBegin										return RIB_ATTRIBUTE_BEGIN;
57 AttributeEnd										return RIB_ATTRIBUTE_END;
58 Color												return RIB_COLOR;
59 Opacity												return RIB_OPACITY;
60 TextureCoordinates									return RIB_TEXTURE_COORDINATES;
61 LightSource											return RIB_LIGHT_SOURCE;
62 AreaLightSource										return RIB_AREA_LIGHT_SOURCE;
63 Illuminate											return RIB_ILLUMINATE;
64 Surface												return RIB_SURFACE;
65 Atmosphere											return RIB_ATMOSPHERE;
66 Interior											return RIB_INTERIOR;
67 Exterior											return RIB_EXTERIOR;
68 ShadingRate											return RIB_SHADING_RATE;
69 ShadingInterpolation								return RIB_SHADING_INTERPOLATION;
70 Matte												return RIB_MATTE;
71 Bound												return RIB_BOUND;
72 Detail												return RIB_DETAIL;
73 DetailRange											return RIB_DETAIL_RANGE;
74 GeometricApproximation								return RIB_GEOMETRIC_APPROXIMATION;
75 GeometricRepresentation								return RIB_GEOMETRIC_REPRESENTATION;
76 Orientation											return RIB_ORIENTATION;
77 ReverseOrientation									return RIB_REVERSE_ORIENTATION;
78 Sides												return RIB_SIDES;
79 
80 Identity											return RIB_IDENTITY;
81 Transform											return RIB_TRANSFORM;
82 ConcatTransform										return RIB_CONCAT_TRANSFORM;
83 Perspective											return RIB_PERSPECTIVE;
84 Translate											return RIB_TRANSLATE;
85 Rotate												return RIB_ROTATE;
86 Scale												return RIB_SCALE;
87 Skew												return RIB_SKEW;
88 Deformation											return RIB_DEFORMATION;
89 Displacement										return RIB_DISPLACEMENT;
90 CoordinateSystem									return RIB_COORDINATE_SYSTEM;
91 CoordSysTransform									return RIB_COORDINATE_SYS_TRANSFORM;
92 
93 TransformBegin										return RIB_TRANSFORM_BEGIN;
94 TransformEnd										return RIB_TRANSFORM_END;
95 
96 Attribute											return RIB_ATTRIBUTE;
97 
98 Polygon												return RIB_POLYGON;
99 GeneralPolygon										return RIB_GENERAL_POLYGON;
100 PointsPolygons										return RIB_POINTS_POLYGONS;
101 PointsGeneralPolygons								return RIB_POINTS_GENERAL_POLYGONS;
102 Basis												return RIB_BASIS;
103 Patch												return RIB_PATCH;
104 PatchMesh											return RIB_PATCH_MESH;
105 NuPatch												return RIB_NU_PATCH;
106 TrimCurve											return RIB_TRIM_CURVE;
107 
108 Sphere												return RIB_SPHERE;
109 Cone												return RIB_CONE;
110 Cylinder											return RIB_CYLINDER;
111 Hyperboloid											return RIB_HYPERBOLOID;
112 Paraboloid											return RIB_PARABOLOID;
113 Disk												return RIB_DISK;
114 Torus												return RIB_TORUS;
115 Curves												return RIB_CURVES;
116 Points												return RIB_POINTS;
117 SubdivisionMesh										return RIB_SUBDIVISION_MESH;
118 Blobby												return RIB_BLOBBY;
119 Geometry											return RIB_GEOMETRY;
120 
121 Procedural											return RIB_PROCEDURAL;
122 
123 SolidBegin											return RIB_SOLID_BEGIN;
124 SolidEnd											return RIB_SOLID_END;
125 
126 ObjectBegin											return RIB_OBJECT_BEGIN;
127 ObjectEnd											return RIB_OBJECT_END;
128 
129 ObjectInstance										return RIB_OBJECT_INSTANCE;
130 
131 MotionBegin											return RIB_MOTION_BEGIN;
132 MotionEnd											return RIB_MOTION_END;
133 
134 MakeTexture											return RIB_MAKE_TEXTURE;
135 MakeBrickMap										return RIB_MAKE_BRICKMAP;
136 MakeBump											return RIB_MAKE_BUMP;
137 MakeLatLongEnvironment								return RIB_MAKE_LAT_LONG_ENVIRONMENT;
138 MakeCubeFaceEnvironment								return RIB_MAKE_CUBE_FACE_ENVIRONMENT;
139 MakeShadow											return RIB_MAKE_SHADOW;
140 
141 ArchiveRecord										return RIB_ARCHIVE_RECORD;
142 
143 ArchiveBegin										return RIB_ARCHIVE_BEGIN;
144 ArchiveEnd											return RIB_ARCHIVE_END;
145 
146 Resource											return RIB_RESOURCE;
147 ResourceBegin										return RIB_RESOURCE_BEGIN;
148 ResourceEnd											return RIB_RESOURCE_END;
149 
150 IfBegin												return RIB_IFBEGIN;
151 IfEnd												return RIB_IFEND;
152 ElseIf												return RIB_ELSEIF;
153 Else												return RIB_ELSE;
154 
155 
156 ReadArchive[ \t]*\"[^\"]*\"							{
157 														char			fileName[256];
158 														char			*start	=	strchr(ribtext,'\"');
159 														char			location[OS_MAX_PATH_LENGTH];
160 														COptions		*options;
161 
162 														assert(start != NULL);
163 
164 														strcpy(fileName,start+1);
165 
166 														fileName[strlen(fileName)-1]	=	'\0';
167 
168 														options		=	CRenderer::context->getOptions();
169 
170 														if (CRenderer::locateFile(location,fileName,options->archivePath) == TRUE) {
171 															FILE	*in;
172 
173 															info(CODE_RESOLUTION,"\"%s\" -> \"%s\"\n",fileName,location);
174 
175 #ifdef HAVE_ZLIB
176 															in = (FILE *) gzopen( location, "r" );
177 #else
178 															in = fopen( location, "r" );
179 #endif
180 
181 															if (in != NULL) {
182 																TRibFile	*newFile	=	new TRibFile;
183 
184 																newFile->ribLineno		=	ribLineno;
185 																newFile->ribState		=	YY_CURRENT_BUFFER;
186 																newFile->ribFile		=	ribFile;
187 																newFile->next			=	ribStack;
188 																ribStack				=	newFile;
189 
190 																ribFile					=	strdup(fileName);
191 																ribLineno				=	1;
192 																ribin					=	in;
193 																rib_switch_to_buffer(rib_create_buffer( ribin, YY_BUF_SIZE ) );
194 																BEGIN(INITIAL);
195 															} else {
196 																error(CODE_NOFILE,"Failed to open \"%s\"\n",location);
197 															}
198 														} else {
199 															error(CODE_NOFILE,"Failed to find \"%s(.rib)\"\n",fileName);
200 														}
201 													}
202 
203 ErrorHandler										return RIB_ERROR_HANDLER;
204 
205 version												return RIB_VERSION;
206 [0-9]+\.[0-9]+\.[0-9]+								return RIB_VERSION_STRING;
207 
208 \[													return RIB_ARRAY_BEGIN;
209 \]													return RIB_ARRAY_END;
210 
211 \"[^\"]*\"											{   yylval->string	=	rstrdup(ribtext+1,CRenderer::globalMemory);	yylval->string[strlen(yylval->string)-1] = '\0'; return RIB_TEXT;}
212 [+-]?([0-9]+|([0-9]*(\.[0-9]+)?)([eE][+-]?[0-9]+)?)	{	/*sscanf(ribtext,"%f",&yylval->real);*/ yylval->real = (float) atof(ribtext); return RIB_FLOAT; }
213 [+-]?([0-9]+|([0-9]+(\.[0-9]*)?)([eE][+-]?[0-9]+)?)	{	/*sscanf(ribtext,"%f",&yylval->real);*/ yylval->real = (float) atof(ribtext); return RIB_FLOAT; }
214 
215 [\t ]												;
216 #\!.*												{	yylval->string	=	rstrdup(ribtext+2,CRenderer::globalMemory);	return RIB_STRUCTURE_COMMENT;	}
217 #.*													;
218 \n													{	ribLineno++; }
219 <<EOF>>												{
220 														if (ribStack == NULL) {
221 															yyterminate();
222 														} else 	{
223 															TRibFile	*nextFile	=	ribStack->next;
224 															rib_delete_buffer( YY_CURRENT_BUFFER );
225 #ifdef HAVE_ZLIB
226 															gzclose((gzFile)ribin);
227 #else
228 															fclose(ribin);
229 #endif
230 															free((char *) ribFile);
231 															rib_switch_to_buffer(ribStack->ribState);
232 															ribLineno	=	ribStack->ribLineno;
233 															ribFile		=	ribStack->ribFile;
234 															delete ribStack;
235 															ribStack	=	nextFile;
236 														}
237 													}
238 \377												{	// Terminate parsing for a runprogram
239 														if (ribStack == NULL) {
240 															yyterminate();
241 														} else 	{
242 															TRibFile	*nextFile	=	ribStack->next;
243 															rib_delete_buffer( YY_CURRENT_BUFFER );
244 
245 #ifdef HAVE_ZLIB
246 															gzclose((gzFile)ribin);
247 #else
248 															fclose(ribin);
249 #endif
250 
251 															free((char *) ribFile);
252 															rib_switch_to_buffer(ribStack->ribState);
253 															ribLineno	=	ribStack->ribLineno;
254 															ribFile		=	ribStack->ribFile;
255 															delete ribStack;
256 															ribStack	=	nextFile;
257 														}
258 													}
259 %%
260 
261