#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 18 (of 19)."
# Contents:  libshade/yacc.y
# Wrapped by kolb@woody on Wed Jul 17 17:57:01 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'libshade/yacc.y' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libshade/yacc.y'\"
else
echo shar: Extracting \"'libshade/yacc.y'\" \(28326 characters\)
sed "s/^X//" >'libshade/yacc.y' <<'END_OF_FILE'
X/* yacc.y								   */
X/*									   */
X/* Copyright (C) 1989, 1991, Craig E. Kolb				   */
X/* All rights reserved.							   */
X/*									   */
X/* This software may be freely copied, modified, and redistributed,	   */
X/* provided that this copyright notice is preserved on all copies.	   */
X/*									   */
X/* You may not distribute this software, in whole or in part, as part of   */
X/* any commercial product without the express consent of the authors.	   */
X/* 									   */
X/* There is no warranty or other guarantee of fitness of this software	   */
X/* for any purpose.  It is provided solely "as is".			   */
X/* $Id: yacc.y,v 4.0 91/07/17 17:39:39 kolb Exp Locker: kolb $ */
X%{
X#include "rayshade.h"
X
X#include "symtab.h"
X#include "builtin.h"
X
X#include "libsurf/atmosphere.h"
X#include "libsurf/surface.h"
X#include "libtext/texture.h"
X#include "libimage/image.h"
X#include "libobj/geom.h"
X#include "liblight/light.h"
X#include "options.h"
X#include "stats.h"
X#include "viewing.h"
X
X#include "libobj/blob.h"
X#include "libobj/box.h"
X#include "libobj/cone.h"
X#include "libobj/csg.h"
X#include "libobj/cylinder.h"
X#include "libobj/disc.h"
X#include "libobj/grid.h"
X#include "libobj/hf.h"
X#include "libobj/instance.h"
X#include "libobj/list.h"
X#include "libobj/plane.h"
X#include "libobj/poly.h"
X#include "libobj/sphere.h"
X#include "libobj/torus.h"
X#include "libobj/triangle.h"
X
X#include "liblight/point.h"
X#include "liblight/infinite.h"
X#include "liblight/spot.h"
X#include "liblight/jittered.h"
X#include "liblight/extended.h"
X
X#include "libtext/blotch.h"
X#include "libtext/bump.h"
X#include "libtext/checker.h"
X#include "libtext/cloud.h"
X#include "libtext/fbm.h"
X#include "libtext/fbmbump.h"
X#include "libtext/gloss.h"
X#include "libtext/imagetext.h"
X#include "libtext/marble.h"
X#include "libtext/mount.h"
X#include "libtext/sky.h"
X#include "libtext/stripe.h"
X#include "libtext/windy.h"
X#include "libtext/wood.h"
X
X#include "libsurf/fog.h"
X#include "libsurf/fogdeck.h"
X#include "libsurf/mist.h"
X
X#include "libcommon/rotate.h"
X#include "libcommon/scale.h"
X#include "libcommon/translate.h"
X
XGeom *NewAggregate();
Xchar yyfilename[BUFSIZ];			/* Input filename */
XGeomList *Defstack;				/* Geom definition stack. */
Xint Npoints = 0;				/* # of points in Polypoints */
XSurface *tmpsurf;				/* Working surface */
XSurfList *CurSurf;
XTexture *CurText;				/* Working list of textures */
XImageText *Imagetext;				/* Working image texture */
XTrans *TransHead, *TransTail;			/* Linked list of current transformations */
XAtmosphere *CurEffect = (Atmosphere *)NULL;	/* Current atmos. effects */ 
XPointList *Polypoints;				/* List of vertices */
XMetaList *Metapoints, *Metapoint;
Xextern FILE *yyin;				/* input file pointer */
Xextern int yylineno;				/* Current line # in file */
Xextern Atmosphere *AtmosEffects;		/* atmospheric effects */
Xextern Medium TopMedium;			/* "air" */
Xextern void	GeomAddToDefined(),
X		LightAddToDefined(),
X		SurfaceAddToDefined();
Xextern Surface	*SurfaceGetNamed();
Xextern Geom 	*GeomGetNamed();
X%}
X%union {
X	char *c;
X	int i;
X	Float d;
X	Vector v;
X	Vec2d uv;
X	Color col;
X	Atmosphere *atmos;
X	Light *light;
X	Surface *surf;
X	Geom *obj;
X	Texture *text;
X	Mapping *map;
X	Trans *trans;
X	Expr *e;
X	SymtabEntry *sym;
X}
X%token <d> tFLOAT
X%token <c> tSTRING tFILENAME
X%token tAPERTURE tAPPLYSURF
X%token tBACKGROUND tBLOB tBLOTCH tBOX tBUMP tCONE tCYL tDIRECTIONAL tCURSURF
X%token tEXTENDED tEYEP tFBM tFBMBUMP tFOCALDIST tFOG tFOGDECK tFOV tGLOSS tGRID
X%token tHEIGHTFIELD tLIGHT tLIST tLOOKP tMARBLE tMAXDEPTH tMIST
X%token tJITTER tNOJITTER tDEFINE
X%token tOBJECT tOUTFILE  tSKY tDISC tDIFFERENCE tUNION tINTERSECT
X%token tPLANE tPOINT tPOLY tROTATE tSPOT tPRINT
X%token tSCALE tSCREEN tSPHERE tSURFACE
X%token tTHRESH tTRANSLATE tTRANSFORM tTRIANGLE tTRIANGLEUV tUP tEND
X%token tTEXTURE tCHECKER tWOOD tCONTRAST tCUTOFF tCLOUD
X%token tAMBIENT tDIFFUSE tREFLECT tTRANSP tSPECULAR tSPECPOW
X%token tINDEX tATMOSPHERE tNOSHADOW tAREA tTRANSLU tTORUS
X%token tEYESEP tSHADOWTRANSP tREPORT tVERBOSE tQUIET tWINDOW tSTRIPE
X%token tMAP tUV tSPHERICAL tCYLINDRICAL tPLANAR
X%token tIMAGE tSMOOTH tCOMPONENT tTEXTSURF tRANGE tTILE tSTARTTIME tFRAMELENGTH
X%token tNAME tFILTER tGAUSS tBODY tSAMPLE tEXTINCT tWINDY tMOUNT
X%token tSHUTTER tFRAMES
X%type <c> Filename
X%type <e> AnimExpr MExpr ParenExpr
X%type <d> Expr Float
X%type <v> Vector
X%type <uv> Vec2d
X%type <col> Color Intensity Lightdef
X%type <text> Texturetype
X%type <i> SurfCompName IExpr CombineOp
X%type <atmos> EffectType
X%type <light> LightType
X%type <obj> PrimType Primitive TransTextObj
X%type <obj> Csg Aggregate Object TransObj ObjType
X%type <obj> Blob Box Cone Cylinder Disc HeightField Plane Poly
X%type <obj> Sphere Triangle Torus AggregateType List Grid AggregateCreate
X%type <obj> NamedObject
X%type <surf> Surface OptSurface NamedSurf
X%type <surf> SurfSpec ModifyNamedSurf
X%type <map> Mapping MapMethod OptMapping
X%type <trans> TransformType
X%type <sym> Symtabent
X
X%left '+' '-'
X%left '*' '/' '%'
X%left UMINUS
X%right '^'
X%%
XItems		: /* empty */
X		| Items Item
X		;
XItem		: Eyep
X		| Lookp
X		| Up
X		| Fov
X		| Screen
X		| Window
X		| Report
X		| Aperture
X		| Focaldist
X		| Eyesep
X		| Maxdepth
X		| Sample
X		| Filter
X		| Contrast
X		| Cutoff
X		| Background
X		| Shadowtransp
X		| Light
X		| SurfDef
X		| CurSurf
X		| Outfile
X		| Instance
X		| NameObject
X		| GlobalEffects
X		| Define
X		| Frames
X		| Starttime
X		| Shutter
X		| Framelength
X    		| Print
X		;
XInstance	: TransTextObj
X		{
X			if ($1) {
X				/*
X				 * Add instance to current object.
X				 */
X				$1->next = Defstack->obj->next;
X				Defstack->obj->next = $1;
X			}
X		}
XTransTextObj	: TransObj Textures
X		{
X			if ($$ && CurText) {
X				$$->texture = TextAppend(CurText, $$->texture);
X			}
X			CurText = (Texture *)NULL;
X		}
X		;	
XTransObj	: Object Transforms
X		{
X			$$ = $1;
X			if ($$ != (Geom *)NULL) {
X				if (TransHead) {
X					$$->trans = TransHead;
X					$$->transtail = TransTail;
X					/*
X					 * We compose non-animated tranformation lists,
X					 * so we're only animated if it's one long,
X					 * or it's animated itself.
X					 */
X					if ($$->trans->assoc || $$->trans->next)
X						/* geometry is animated...*/
X						$$->animtrans = TRUE;
X				}
X			}
X		}
X		;
XObject		: ObjType
X		{
X			if ($$)
X				StatsAddRep($$);
X		}
X		| NamedObject
X		;
XObjType		: Primitive
X		| Aggregate
X		;
XPrimitive	: PrimType
X		{
X			if ($$)
X				$$->prims = 1;	/* one primitive */
X		}
X		;
XPrimType	: Plane
X		| Sphere
X		| Box
X		| Triangle
X		| Cylinder
X		| Cone
X		| Poly
X		| HeightField
X		| Disc
X		| Torus
X		| Blob
X		;
XNameObject	: tNAME tSTRING TransTextObj
X		{
X			if ($3) {
X				$3->name = $2;
X				GeomAddToDefined($3);
X			}
X		};
XAggdefs		: Aggdefs Aggdef
X		|
X		;
XAggdef		: Instance
X		| SurfDef
X		| CurSurf
X		| NameObject
X		;
XTextures	: Textures Texture
X		|
X		;
XTexture		: tTEXTURE Texturetype Transforms
X		{
X			if ($2 != (Texture *)NULL) {
X				/*
X				 * Set transformation information.
X				 */
X				if (TransHead) {
X					$2->trans = TransHead;
X					/*
X					 * We compose non-animated tranformation lists,
X					 * so we're only animated if it's one long,
X					 * or it's animated itself.
X					 */
X					if ($2->trans->assoc || $2->trans->next)
X						/* texture transformation is animated...*/
X						$2->animtrans = TRUE;
X				}
X				/*
X				 * Walk to the end of list of textures and
X				 * append new texture.  This is done so that
X				 * textures are applied in the expected order.
X				 */
X				CurText = TextAppend($2, CurText);
X			}
X		}
X		;
XTexturetype	: tCHECKER Surface
X		{
X			$$ = TextCheckerCreate($2);
X		}
X		| tBLOTCH Expr Surface
X		{
X			$$ = TextBlotchCreate($2, $3);
X		}
X		| tBUMP Expr
X		{
X			$$ = TextBumpCreate($2);
X		}
X		| tMARBLE
X		{
X			$$ = TextMarbleCreate((char *)NULL);
X		}
X		| tMARBLE Filename
X		{
X			$$ = TextMarbleCreate($2);
X		}
X		| tFBM Expr Expr Expr Expr IExpr Expr
X		{
X			$$ = TextFBmCreate($2, $3, $4, $5, $6, $7,
X						(char *)NULL);
X		}
X		| tFBM Expr Expr Expr Expr IExpr Expr Filename
X		{
X			$$ = TextFBmCreate($2, $3, $4, $5, $6, $7, $8);
X		}
X		| tFBMBUMP Expr Expr Expr Expr IExpr 
X		{
X			$$ = TextFBmBumpCreate($2, $3, $4, $5, $6);
X		}
X		| tWOOD
X		{
X			$$ = TextWoodCreate();
X		}
X		| tGLOSS Expr 
X		{
X			$$ = TextGlossCreate($2);
X		}
X		| tCLOUD Expr Expr Expr IExpr Expr Expr Expr
X		{
X			$$ = TextCloudCreate($2, $3, $4, $5, $6, $7, $8);
X		}
X		| tSKY Expr Expr Expr IExpr Expr Expr
X		{
X			$$ = TextSkyCreate($2, $3, $4, $5, $6, $7);
X		}
X		| ImageText
X		{
X			/*
X			 * Image texturing has so many options
X			 * that specification is keyword-based.
X			 */
X			if (Imagetext->image == (Image *)NULL)
X				$$ = (Texture *)NULL;
X			else
X				$$ = TextCreate(Imagetext, ImageTextApply);
X			Imagetext = (ImageText *)NULL;
X		}
X		| tSTRIPE Surface Expr Expr OptMapping
X		{
X			$$ = TextStripeCreate($2, $3, $4, $5);
X		}
X		| tWINDY Expr Expr Expr Expr IExpr Expr Expr Expr
X		{
X			$$ = TextWindyCreate($2, $3, $4, $5, $6, $7, $8, $9);
X		}
X		| tMOUNT Filename Expr Expr
X		{
X			$$ = TextMountCreate($2, $3, $4);
X		}
X		;
XImageText	: ImageTextType ImageTextOptions
X		;
XImageTextType	: tIMAGE Filename
X		{
X			Imagetext = ImageTextCreate($2);
X		}
X		;
XImageTextOptions: ImageTextOptions ImageTextOption
X		| /* EMPTY */
X		;
XImageTextOption: tCOMPONENT SurfCompName
X		{
X			/* set texture to modify given component */	
X			ImageTextSetComponent(Imagetext, $2);
X		}
X		| tTILE Expr Expr
X		{
X			Imagetext->tileu = $2;
X			Imagetext->tilev = $3;
X		}
X		| tTEXTSURF Surface
X		{
X			Imagetext->surf = $2;
X		}
X		| tRANGE Expr Expr
X		{
X			Imagetext->hi = $2;
X			Imagetext->lo = $3;
X		}
X		| tSMOOTH
X		{
X			Imagetext->smooth = TRUE;
X		}
X		| Mapping
X		{
X			Imagetext->mapping = $1;
X		};
XNamedObject	: tOBJECT Surface tSTRING
X		{
X			Geom *otmp;
X			/*
X			 * Create an instance of the named object.
X			 */
X			otmp = GeomGetNamed($3);
X			if (otmp == (Geom *)NULL)
X				RLerror(RL_PANIC,
X				  "There is no object named \"%s\".", $3);
X			$$ = GeomInstanceCreate(otmp);
X			$$->surf = $2;
X			$$->prims = otmp->prims;
X		}
X		| tOBJECT tSTRING
X		{
X			Geom *otmp;
X
X			otmp = GeomGetNamed($2);
X			if (otmp == (Geom *)NULL)
X				RLerror(RL_PANIC,
X				  "There is no object named \"%s\".", $2);
X			$$ = GeomInstanceCreate(otmp);
X			$$->surf = CurSurf->surf;
X			$$->prims = otmp->prims;
X		};
XTransforms	: Transforms PostTransform
X		| /* empty */
X		{
X			TransHead = TransTail = (Trans *)NULL;
X		};
XPostTransform	: TransformType
X		{
X			if (TransHead == (Trans *)NULL) {
X				/* we're the list, head and tail */
X				TransHead = TransTail = $1;
X			} else {
X				if ($1->animated || TransTail->animated) {
X					/* new tail */
X					$1->prev = TransTail;
X					TransTail->next = $1;
X					TransTail = $1;
X				} else {
X					/* collapse with tail */
X					TransCompose(TransTail, $1, TransTail);
X					TransFree($1);
X				}
X			}
X		}
X		;
XTransformType	: tSCALE AnimExpr AnimExpr AnimExpr
X		{
X			$$ = TransScaleCreate();
X			TransScaleSetX($$, $2);
X			TransScaleSetY($$, $3);
X			TransScaleSetZ($$, $4);
X			if (!$$->animated)
X				TransPropagate($$);
X				
X		}
X		| tTRANSLATE AnimExpr AnimExpr AnimExpr
X		{
X			$$ = TransTranslateCreate();
X			TransTranslateSetX($$, $2);
X			TransTranslateSetY($$, $3);
X			TransTranslateSetZ($$, $4);
X			if (!$$->animated)
X				TransPropagate($$);
X		}
X		| tROTATE AnimExpr AnimExpr AnimExpr AnimExpr
X		{
X			$$ = TransRotateCreate();
X			TransRotateSetX($$, $2);
X			TransRotateSetY($$, $3);
X			TransRotateSetZ($$, $4);
X			TransRotateSetTheta($$, $5);
X			if (!$$->animated)
X				TransPropagate($$);
X		};
XEyep		: tEYEP Vector Transforms
X		{
X			Camera.pos = $2;
X			/*
X			 * Eye can be transformed...
X			if (CurMatrix) {
X				PointTransform(&Camera.pos, CurMatrix);
X				free((voidstar)CurMatrix);
X				CurMatrix = (Matrix*)NULL;
X			}
X			 */
X		}
X		;
XLookp		: tLOOKP Vector
X		{
X			Camera.lookp = $2;
X		}
X		;
XUp		: tUP Vector
X		{
X			Camera.up = $2;
X		}
X		;
XFov		: tFOV Expr Expr
X		{
X			Camera.hfov = $2;
X			Camera.vfov = $3;
X		}
X		| tFOV Expr
X		{
X			Camera.hfov = $2;
X			Camera.vfov = UNSET;
X		}
X		;
XSample		: tSAMPLE IExpr tJITTER
X		{
X			if (!Options.samples_set)
X				Options.samples = $2;
X			if (!Options.jitter_set)
X				Options.jitter = TRUE;
X		}
X		| tSAMPLE IExpr tNOJITTER
X		{
X			if (!Options.samples_set)
X				Options.samples = $2;
X			if (!Options.jitter_set)
X				Options.jitter = FALSE;
X		}
X		| tSAMPLE IExpr
X		{
X			if (!Options.samples_set)
X				Options.samples = $2;
X		}
X		;
XFilter		: tFILTER tBOX Expr
X		{
X			Options.gaussian = FALSE;
X			Options.filterwidth = $3;
X		}
X		| tFILTER tBOX
X		{
X			Options.gaussian = FALSE;
X		}	
X		| tFILTER tGAUSS Expr
X		{
X			Options.gaussian = TRUE;
X			Options.filterwidth = $3;
X		}
X		| tFILTER tGAUSS
X		{
X			Options.gaussian = TRUE;
X		};
XStarttime	: tSTARTTIME Expr
X		{
X			Options.starttime = $2;
X		};
XFrames		: tFRAMES IExpr
X		{
X			if (!Options.totalframes_set)
X				Options.totalframes = $2;
X		};
XFramelength	: tFRAMELENGTH Expr
X		{
X			Options.framelength = $2;
X		};
XShutter		: tSHUTTER Expr
X		{
X			Options.shutterspeed = $2;
X		};
XContrast	: tCONTRAST Expr Expr Expr
X		{
X			if (!Options.contrast_set) {
X				Options.contrast.r = $2;
X				Options.contrast.g = $3;
X				Options.contrast.b = $4;
X			}
X		}
X		;
XCutoff		: tCUTOFF Intensity
X		{
X			if (!Options.cutoff_set)
X				Options.cutoff = $2;
X		}
X		;
XScreen		: tSCREEN IExpr IExpr 
X		{
X			if (!Options.resolution_set) {
X				Screen.xres = $2;
X				Screen.yres = $3;
X			}
X		}
X		;
XWindow		: tWINDOW Expr Expr Expr Expr
X		{
X			if (!Options.window_set) {
X				Options.xmin = $2;
X				Options.xmax = $3;
X				Options.ymin = $4;
X				Options.ymax = $5;
X			}
X		}
XReport		: tREPORT Verbose Quiet IExpr Filename
X		{
X			if (!Options.freq_set)
X				Options.report_freq = $4;
X			if (Options.statsname == (char *)NULL)
X				Options.statsname = strsave($5);
X		}
X		| tREPORT Verbose Quiet IExpr
X		{
X			if (!Options.freq_set)
X				Options.report_freq = $4;
X		}
X		| tREPORT Verbose Quiet Filename
X		{
X			if (Options.statsname == (char *)NULL)
X				Options.statsname = strsave($4);
X		}
X		| tREPORT Verbose Quiet
X		;
XVerbose		: tVERBOSE
X		{ Options.verbose = TRUE; }
X		|
X		;
XQuiet		: tQUIET
X		{ Options.quiet = TRUE; }
X		|
X		;
XAperture	: tAPERTURE Expr
X		{
X			Camera.aperture = $2;
X		}
X		;
XFocaldist	: tFOCALDIST Expr
X		{
X			Camera.focaldist = $2;
X		}
X		;
XEyesep		: tEYESEP Expr
X		{
X			if (!Options.eyesep_set)
X				Options.eyesep = $2;
X		}
X		;
XMaxdepth	: tMAXDEPTH IExpr
X		{
X			if (!Options.maxdepth_set)
X				Options.maxdepth = $2;
X		}
X		;
XBackground	: tBACKGROUND Color
X		{
X			Screen.background = $2;
X		}
X		;
XShadowtransp	: tSHADOWTRANSP
X		{
X			Options.shadowtransp = TRUE;
X		}
X		;
XLight		: LightType
X		{
X			LightAddToDefined($1);
X		}
X		| LightType tNOSHADOW
X		{
X			$1->shadow = FALSE;
X			LightAddToDefined($1);
X		}
X		| tLIGHT Intensity tAMBIENT
X		{
X			Options.ambient = $2;
X		}
X		| Lightdef tAREA Vector Vector IExpr Vector IExpr
X		{
X			extern void AreaLightCreate();
X			/* Area light is strange in that the
X			 * Creation routine does the installation.
X			 */
X			AreaLightCreate(&$1, &$3, &$4, $5, &$6, $7, TRUE);
X		}
X		| Lightdef tAREA Vector Vector IExpr Vector IExpr tNOSHADOW
X		{
X			extern void AreaLightCreate();
X			/* Area light is strange in that the
X			 * Creation routine does the installation.
X			 */
X			AreaLightCreate(&$1, &$3, &$4, $5, &$6, $7, FALSE);
X		};
XLightType	: Lightdef tPOINT Vector
X		{
X			$$ = LightPointCreate(&$1, &$3);
X		}
X		| Lightdef tDIRECTIONAL Vector
X		{
X			$$ = LightInfiniteCreate(&$1, &$3);
X		}
X		| Lightdef tEXTENDED Expr Vector
X		{
X			$$ = LightExtendedCreate(&$1, $3, &$4);
X		}
X		| Lightdef tSPOT Vector Vector Expr
X		{
X			$$ = LightSpotCreate(&$1, &$3, &$4, $5, 0., 0.);
X		}
X		| Lightdef tSPOT Vector Vector Expr Expr Expr
X		{
X			/* light <intens> spot from <to> coef inner_rad
X					outer_rad */
X			$$ = LightSpotCreate(&$1, &$3, &$4, $5, $6, $7);
X		};
XLightdef	: tLIGHT Intensity
X		{
X			$$ = $2;
X		}
X		;
XCurSurf		: tAPPLYSURF Surface
X		{
X			CurSurf->surf = $2;
X		}
X		;
XOptSurface	: Surface
X		| /* EMPTY */
X		{
X			$$ = CurSurf->surf;
X		}
X		;
XSurface		: NamedSurf
X		| ModifyNamedSurf
X		| SurfSpec
X		;
XNamedSurf	: tSTRING
X		{
X			$$ = SurfaceGetNamed($1);
X			/*
X			 * Free up memory allocated for surf name.
X			 * We bother doing this because for large models
X			 * converted from 3.0, surfnames this can account
X			 * for lots o' bytes.
X			 */
X			free((voidstar)$1);
X		}
X		| tCURSURF
X		{
X			extern Surface DefaultSurface;
X
X			if (CurSurf->surf)
X				$$ = CurSurf->surf;
X			else
X				$$ = &DefaultSurface;
X		}
X		;
XModifyNamedSurf : CopyNamedSurf SurfComponent SurfComponents
X		{
X			$$ = tmpsurf;
X			tmpsurf = (Surface *)NULL;
X		}
X		| CopyCurSurf SurfComponent SurfComponents
X		{
X			$$ = tmpsurf;
X			tmpsurf = (Surface *)NULL;
X		}
X		;
XCopyNamedSurf	: tSTRING
X		{
X			tmpsurf = SurfaceCopy(SurfaceGetNamed($1));
X		}
X		;
XCopyCurSurf	: tCURSURF
X		{
X			extern Surface DefaultSurface;
X			if (CurSurf->surf)
X				tmpsurf = SurfaceCopy(CurSurf->surf);
X			else
X				tmpsurf = SurfaceCopy(&DefaultSurface);
X		}
X		;
XSurfSpec	: SurfComponent SurfComponents
X		{
X			$$ = tmpsurf;
X			tmpsurf = (Surface *)NULL;
X		} 
X		;
XSurfDef		: tSURFACE tSTRING Surface
X		{
X			tmpsurf = SurfaceCopy($3);
X			tmpsurf->name = strsave($2);
X			SurfaceAddToDefined(tmpsurf);
X			tmpsurf = (Surface *)NULL;
X		}
X		| tSURFACE tSTRING
X		{
X			/* black surface */
X			tmpsurf = SurfaceCreate();
X			tmpsurf->name = strsave($2);
X			SurfaceAddToDefined(tmpsurf);
X			tmpsurf = (Surface *)NULL;
X		}
X		;
XSurfComponents	: SurfComponents SurfComponent
X		| /* EMPTY */
X		;
XSurfComponent	: Ambient
X		| Diffuse
X		| Specular
X		| Specpow
X		| Body
X		| Reflect
X		| Transp
X		| Extinct
X		| Index
X		| Translu
X		| Noshadow
X		;
XAmbient		: tAMBIENT Color
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->amb = $2;
X		}
X		;
XDiffuse		: tDIFFUSE Color
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->diff = $2;
X		}
X		;
XSpecular	: tSPECULAR Color
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->spec = $2;
X		}
X		;
XBody		: tBODY Color
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->body = $2;
X		};
XExtinct		: tEXTINCT Expr
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->statten = $2;
X		};
XSpecpow		: tSPECPOW Expr
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->srexp = $2;
X		}
X		;
XReflect		: tREFLECT Expr
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->reflect = $2;
X		}
X		;
XTransp		: tTRANSP Expr
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->transp = $2;
X		}
X		;
XIndex		: tINDEX Expr
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->index = $2;
X		}
X		;
XTranslu		: tTRANSLU Expr Color Expr
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->translucency = $2;
X			tmpsurf->translu = $3;
X			tmpsurf->stexp = $4;
X		}
X		;
XNoshadow	: tNOSHADOW
X		{
X			if (tmpsurf == (Surface *)NULL)
X				tmpsurf = SurfaceCreate();
X			tmpsurf->noshadow = TRUE;
X		}
X		;
XHeightField	: tHEIGHTFIELD Surface Filename
X		{
X			$$ = GeomHfCreate($3);
X			if ($$)
X				$$->surf = $2;
X		}
X		| tHEIGHTFIELD Filename
X		{
X			$$ = GeomHfCreate($2);
X		}
X		;
XPoly		: tPOLY OptSurface Polypoints
X		{
X			$$ = GeomPolygonCreate(Polypoints, Npoints,
X				Options.flipnorm);
X			if ($$)
X				$$->surf = $2;
X			Polypoints = (PointList *)NULL;
X			Npoints = 0;
X		}
X		;
XPolypoints	: /* empty */
X		| Polypoints Polypoint
X		;
XPolypoint	: Vector
X		{
X			PointList *ptmp;
X
X			ptmp = (PointList *)Malloc(sizeof(PointList));
X			ptmp->vec = $1;
X			ptmp->next = Polypoints;
X			Polypoints = ptmp;
X			Npoints++;
X		}
X		;
XAggregate	: AggregateDef
X		{
X			if (Defstack->obj) {
X				/*
X				 * Set object texture to current texture.
X				 */
X				Defstack->obj->texture = CurText;
X			}
X			CurText = (Texture *)NULL;
X			/*
X			 * Pop topmost object on stack.
X			 */
X			$$ = Defstack->obj;
X			Defstack = GeomStackPop(Defstack);
X			/* Pop current surface */
X			CurSurf = SurfPop(CurSurf);
X		}
X		;
XAggregateDef	: AggregateCreate Aggdefs tEND
X		{
X			/* Convert aggregate, pop stacks, etc. */
X			if ($1) {
X				if (Defstack->obj->next == (Geom *)NULL) {
X					RLerror(RL_WARN,
X						"Null object defined.\n");
X					Defstack->obj = (Geom *)NULL;
X				} else {
X					/*
X					 * Convert the linked list of objects
X					 * associated with the topmost object
X					 * to the appropriate aggregate type.
X					 */
X					Defstack->obj->prims=AggregateConvert(
X						Defstack->obj,
X						Defstack->obj->next);
X					/*
X					 * Make sure conversion worked OK.
X					 */
X					if (Defstack->obj->prims <= 0)
X						Defstack->obj = (Geom *)NULL;
X				}
X			}
X		}
X		;
XAggregateCreate	: AggregateType
X		{
X			if ($1) {
X				Defstack = GeomStackPush($1, Defstack);
X				CurSurf = SurfPush((Surface *)NULL, CurSurf);
X			}
X		};
XAggregateType	: List
X		| Grid
X		| Csg
X		;
XList		: tLIST
X		{
X			$$ = GeomListCreate();
X		}
X		;
XGrid		: tGRID IExpr IExpr IExpr
X		{
X			$$ = GeomGridCreate($2, $3, $4);
X		}
X		;
XCsg		: CombineOp
X		{
X			$$ = GeomCsgCreate($1);
X			Options.csg = TRUE;
X		}
X		;
XCombineOp	: tUNION
X		{
X		    $$ = CSG_UNION;
X		}
X		| tINTERSECT
X		{
X		    $$ = CSG_INTERSECT;
X		}
X		| tDIFFERENCE
X		{
X		    $$ = CSG_DIFFERENCE;
X		}
X    		;
XCone		: tCONE OptSurface Expr Vector Expr Vector
X		{
X			if (equal($3, $5)) {
X				/* It's really a cylinder */
X				$$ = GeomCylinderCreate($3, &$4, &$6);
X			} else
X				$$ = GeomConeCreate($3, &$4, $5, &$6);
X			if ($$)
X				$$->surf = $2;
X		}
X		;
XCylinder	: tCYL OptSurface Expr Vector Vector
X		{
X			$$ = GeomCylinderCreate($3, &$4, &$5);
X			if ($$)
X				$$->surf = $2;
X		}
X		;
XSphere		: tSPHERE OptSurface Expr Vector
X		{
X			$$ = GeomSphereCreate($3, &($4));
X			if ($$)
X				$$->surf = $2;
X		}
X		;
XDisc		: tDISC OptSurface Expr Vector Vector
X		{
X			$$ = GeomDiscCreate($3, &($4), &($5));
X			if ($$)
X				$$->surf = $2;
X		}
X		;
XBox		: tBOX OptSurface Vector Vector
X		{
X			$$ = GeomBoxCreate(&$3, &$4);
X			if ($$)
X				$$->surf = $2;
X		}
X		;
XTriangle	: tTRIANGLE OptSurface Vector Vector Vector
X		{
X			$$ = GeomTriangleCreate(FLATTRI, &($3), &($4), &($5),
X				(Vector *)NULL, (Vector *)NULL, (Vector *)NULL,
X				(Vec2d *)NULL, (Vec2d *)NULL, (Vec2d *)NULL,
X				Options.flipnorm);
X			if ($$)
X				$$->surf = $2;
X		}
X		| tTRIANGLE OptSurface  Vector Vector
X					Vector Vector
X					Vector Vector
X		{
X			$$ = GeomTriangleCreate(PHONGTRI, &($3), &($5),
X				&($7), &($4), &($6), &($8),
X				(Vec2d *)NULL, (Vec2d *)NULL, (Vec2d *)NULL,
X				Options.flipnorm);
X			if ($$)
X				$$->surf = $2;
X		}
X		| tTRIANGLEUV OptSurface Vector Vector Vec2d
X					 Vector Vector Vec2d
X					 Vector Vector Vec2d
X		{
X			$$ = GeomTriangleCreate(PHONGTRI, &($3), &($6), &($9),
X						&($4), &($7), &($10),
X						&($5), &($8), &($11),
X						Options.flipnorm);
X			if ($$)
X				$$->surf = $2;
X		}
X		;
XPlane		: tPLANE OptSurface Vector Vector
X		{
X			$$ = GeomPlaneCreate(&($3), &($4));
X			if ($$)
X				$$->surf = $2;
X		}
X		;
XTorus		: tTORUS OptSurface Expr Expr Vector Vector
X		{
X			$$ = GeomTorusCreate($3, $4, &($5), &($6));
X			if ($$)
X				$$->surf = $2;
X		}
X		;
XBlob		: tBLOB OptSurface Expr MetaPoints
X		{
X			$$ = GeomBlobCreate($3, Metapoints, Npoints);
X			if ($$)
X				$$->surf = $2;
X			Metapoints = (MetaList *)NULL;
X			Npoints = 0;
X		}
X		;
XMetaPoints	: /* empty */
X		| MetaPoints MetaPoint
X		;
XMetaPoint	: Expr Expr Expr Expr Expr
X		{
X			Metapoint = (MetaList *)Malloc(sizeof(MetaList));
X			Metapoint->mvec.c0 = $1;
X			Metapoint->mvec.rs = $2;
X			Metapoint->mvec.x = $3;
X			Metapoint->mvec.y = $4;
X			Metapoint->mvec.z = $5;
X			Metapoint->next = Metapoints;
X			Metapoints = Metapoint;
X			Npoints++;
X		}
X		;
XOutfile		: tOUTFILE Filename
X		{
X			if (Options.imgname != (char *)NULL)
X				/* Already set on command line. */
X				RLerror(RL_WARN,
X					"Ignoring output file name \"%s\".\n",
X					$2);
X			else
X				Options.imgname = strsave($2);
X		}
X		;
XGlobalEffects	: tATMOSPHERE Effects
X		{
X			AtmosEffects = CurEffect;
X			CurEffect = (Atmosphere *)NULL;
X		}
X		| tATMOSPHERE IExpr Effects
X		{
X			if ($2 <= 0.)
X				RLerror(RL_PANIC,
X				"Index of refraction must be positive.\n");
X			TopMedium.index = $2;
X			AtmosEffects = CurEffect;
X			CurEffect = (Atmosphere *)NULL;
X		}
X		;
XEffects		: Effects Effect
X		|
X		;
XEffect		: EffectType
X		{
X			$1->next = CurEffect;
X			CurEffect = $1;
X		}
X		;
XEffectType	: tMIST Color Color Expr Expr
X		{
X			$$ = AtmosMistCreate(&($2), &($3), $4, $5);
X		}
X		| tFOG Color Color
X		{
X			$$ = AtmosFogCreate(&($2), &($3));
X		}
X		| tFOGDECK Expr Expr Vector Expr IExpr Color Color
X		{
X			$$ = AtmosFogdeckCreate($2, $3, &$4, $5, $6, &$7, &$8);
X		}
X		;
XColor		: Expr Expr Expr
X		{
X			$$.r = $1;
X			$$.g = $2;
X			$$.b = $3;
X		}
X		;
XVector		: Expr Expr Expr
X		{
X			$$.x = $1;
X			$$.y = $2;
X			$$.z = $3;
X		}
X		;
XVec2d		: Expr Expr 
X		{
X			$$.u = $1;
X			$$.v = $2;
X		}
X		;
XOptMapping	: Mapping
X		| /* EMPTY */
X		{
X			$$ = UVMappingCreate();
X		}
X		;
XMapping		: tMAP MapMethod
X		{
X			$$ = $2;
X		}
X		;
XMapMethod	: tUV
X		{
X			$$ = UVMappingCreate();
X		}
X		| tSPHERICAL
X		{
X			$$ = SphereMappingCreate((Vector *)NULL,
X				(Vector *)NULL, (Vector *)NULL);
X		}
X		| tSPHERICAL Vector Vector Vector
X		{
X			/* origin up uaxis */
X			$$ = SphereMappingCreate(&$2, &$3, &$4);
X		}
X		| tCYLINDRICAL
X		{
X			$$ = CylMappingCreate((Vector *)NULL,
X				(Vector *)NULL, (Vector *)NULL);
X		}
X		| tCYLINDRICAL Vector Vector Vector
X		{
X			/* origin up uaxis */
X			$$ = CylMappingCreate(&$2, &$3, &$4);
X		}
X		| tPLANAR
X		{
X			$$ = LinearMappingCreate((Vector *)NULL,
X				(Vector *)NULL, (Vector *)NULL);
X		}
X		| tPLANAR Vector Vector Vector
X		{
X			/* origin up uaxis */
X			$$ = LinearMappingCreate(&$2, &$3, &$4);
X		}
X		;
XSurfCompName	: tAMBIENT
X		{
X			$$ = AMBIENT;
X		}
X		| tDIFFUSE
X		{
X			$$ = DIFFUSE;
X		}
X		| tBODY
X		{
X			$$ = BODY;
X		}
X		| tSPECULAR
X		{
X			$$ = SPECULAR;
X		}
X		| tREFLECT
X		{
X			$$ = REFLECT;
X		}
X		| tTRANSP
X		{
X			$$ = TRANSP;
X		}
X		| tSPECPOW
X		{
X			$$ = SPECPOW;
X		}
X		| tBUMP
X		{
X			$$ = BUMP;
X		}
X		| tINDEX
X		{
X			$$ = INDEX;
X		}
X		;
XIntensity	: Expr
X		{ $$.r = $$.g = $$.b = $1; }
X		| Color
X		;
XPrint		: tPRINT Expr
X		{
X			fprintf(stderr,"%f\n",$2);
X		}
XDefine		: tDEFINE tSTRING AnimExpr
X		{
X			SymtabAddEntry($2, $3->type, $3, NULL, $3->timevary, 0);
X		};
XIExpr		: Expr
X		{ $$ = (int)$1; }
X		;
XExpr		: Float
X		| ParenExpr
X		{
X			if (!$1->timevary) {
X				$$ = ExprEval($1);
X			} else {
X				RLerror(RL_PANIC, "Illegal expression use.\n");
X			}
X		}
X		;
XAnimExpr	: Float
X		{
X			$$ = ExprReuseFloatCreate($1);
X		}
X		| ParenExpr
X		;
XParenExpr	: '(' MExpr ')'
X		{
X			$$ = $2;
X		};
XMExpr		: tFLOAT
X		{
X			$$ = ExprFloatCreate($1, FALSE);
X		}
X		| tSTRING
X		{
X			$$ = ExprFloatSymtabFind($1);
X		}
X		| Symtabent '(' MExpr ')'
X		{
X			$$ = ExprResolve1($3, $1->value.fp, $1->timevary);
X		}
X		| Symtabent '(' MExpr ',' MExpr ')'
X		{
X			$$ = ExprResolve2($3, $5,
X					$1->value.fp,
X					$1->timevary);
X		}
X		| Symtabent '(' MExpr ',' MExpr ',' MExpr ')'
X		{
X			$$ = ExprResolve3($3, $5, $7, 
X					$1->value.fp,
X					$1->timevary);
X		}
X		| Symtabent '(' MExpr ',' MExpr ',' MExpr ',' MExpr ')'
X		{
X			$$ = ExprResolve4($3, $5, $7, $9, 
X					$1->value.fp,
X					$1->timevary);
X		}
X		| Symtabent
X			'(' MExpr ',' MExpr ',' MExpr ',' MExpr ',' MExpr ')'
X		{
X			$$ = ExprResolve5($3, $5, $7, $9, $11,
X					$1->value.fp,
X					$1->timevary);
X		}
X		| '(' MExpr ')'
X		{
X			$$ = $2;
X		}
X		| MExpr '+' MExpr
X		{
X			$$ = ExprResolve2($1, $3, SumExpr, FALSE);
X		}
X		| MExpr '-' MExpr
X		{
X			$$ = ExprResolve2($1, $3, DiffExpr, FALSE);
X		}
X		| MExpr '*' MExpr
X		{
X			$$ = ExprResolve2($1, $3, MultExpr, FALSE);
X		}
X		| MExpr '/' MExpr
X		{
X			$$ = ExprResolve2($1, $3, DivideExpr, FALSE);
X		}
X		| MExpr '%' MExpr
X		{
X			$$ = ExprResolve2($1, $3, ModExpr, FALSE);
X		}
X		| '-' MExpr %prec UMINUS
X		{
X			$$ = ExprResolve1($2, NegateExpr, FALSE);
X		}
X		| '+' MExpr %prec UMINUS
X		{
X			$$ = $2;
X		}
X		| MExpr '^' MExpr
X		{
X			$$ = ExprResolve2($1, $3, pow, FALSE);
X		} ;
XFloat		: tFLOAT
X		| '-' tFLOAT
X		{ $$ = -$2; }
X		| '+' tFLOAT
X		{ $$ = $2; };
XFilename	: tSTRING
X		| tFILENAME
X		;
XSymtabent	: tSTRING
X		{
X			$$ = SymtabBuiltinFind($1);
X		};
X%%
X/*
X * Issue error message containing filename and line number, and exit.
X */
X/*VARARGS1*/
Xyyerror(s, pat1, pat2)
Xchar *s, *pat1, *pat2;
X{
X	fprintf(stderr,"%s: Error: %s: line %d: ", Options.progname,
X			yyfilename, yylineno);
X	fprintf(stderr, s, pat1, pat2);
X	if (*s && s[strlen(s) -1] != '\n')
X		/* YACC doesn't put newlines on error messages. */
X		fprintf(stderr,"\n");	
X	fflush(stderr);
X	exit(1);
X}
X
XGeom *
XNewAggregate(obj)
XGeom *obj;
X{
X	obj->name = Defstack->obj->name;
X	obj->next = Defstack->obj->next;
X	return obj;
X}
END_OF_FILE
if test 28326 -ne `wc -c <'libshade/yacc.y'`; then
    echo shar: \"'libshade/yacc.y'\" unpacked with wrong size!
fi
# end of 'libshade/yacc.y'
fi
echo shar: End of archive 18 \(of 19\).
cp /dev/null ark18isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 19 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
