EXPRESS.C 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586
  1. /****************************************************************************
  2. * express.c
  3. *
  4. * This module implements an expression parser for the floats, vectors and
  5. * colours in scene description files.
  6. *
  7. * from Persistence of Vision(tm) Ray Tracer
  8. * Copyright 1996,1999 Persistence of Vision Team
  9. *---------------------------------------------------------------------------
  10. * NOTICE: This source code file is provided so that users may experiment
  11. * with enhancements to POV-Ray and to port the software to platforms other
  12. * than those supported by the POV-Ray Team. There are strict rules under
  13. * which you are permitted to use this file. The rules are in the file
  14. * named POVLEGAL.DOC which should be distributed with this file.
  15. * If POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  16. * Team Coordinator by email to team-coord@povray.org or visit us on the web at
  17. * http://www.povray.org. The latest version of POV-Ray may be found at this site.
  18. *
  19. * This program is based on the popular DKB raytracer version 2.12.
  20. * DKBTrace was originally written by David K. Buck.
  21. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  22. *
  23. * Modifications by Thomas Willhalm, March 1999, used with permission
  24. *
  25. *****************************************************************************/
  26. #include <ctype.h>
  27. #include "frame.h"
  28. #include "vector.h"
  29. #include "povproto.h"
  30. #include "parse.h"
  31. #include "parstxtr.h"
  32. #include "colour.h"
  33. #include "express.h"
  34. #include "matrices.h"
  35. #include "povray.h"
  36. #include "tokenize.h"
  37. #include "pattern.h"
  38. #include "pigment.h"
  39. #include "normal.h"
  40. #include "texture.h"
  41. /*****************************************************************************
  42. * Local preprocessor defines
  43. ******************************************************************************/
  44. #define ftrue(f) ((int)(fabs(f)>EPSILON))
  45. #ifndef FIX_WATCOM_BUG
  46. #define FIX_WATCOM_BUG
  47. #endif
  48. /*****************************************************************************
  49. * Local typedefs
  50. ******************************************************************************/
  51. /*****************************************************************************
  52. * Local variables
  53. ******************************************************************************/
  54. static unsigned int Number_Of_Random_Generators;
  55. static unsigned long *next_rand;
  56. /*****************************************************************************
  57. * Static functions
  58. ******************************************************************************/
  59. static void Parse_Vector_Param (VECTOR Vector);
  60. static void Parse_Vector_Param2 (VECTOR Vect1, VECTOR Vect2);
  61. static void Parse_Num_Factor (EXPRESS Express, int *Terms);
  62. static void Parse_Num_Term (EXPRESS Express, int *Terms);
  63. static void Parse_Rel_Factor (EXPRESS Express, int *Terms);
  64. static void Parse_Rel_Term (EXPRESS Express, int *Terms);
  65. static void Parse_Logical (EXPRESS Express, int *Terms);
  66. static void Parse_Express (EXPRESS Express, int *Terms);
  67. static void Promote_Express (EXPRESS Express,int *Old_Terms,int New_Terms);
  68. static void POV_strupr (char *s);
  69. static void POV_strlwr (char *s);
  70. static DBL stream_rand (int stream);
  71. static int stream_seed (int seed);
  72. /*****************************************************************************
  73. *
  74. * FUNCTION
  75. *
  76. * INPUT
  77. *
  78. * OUTPUT
  79. *
  80. * RETURNS
  81. *
  82. * AUTHOR
  83. *
  84. * DESCRIPTION
  85. *
  86. * CHANGES
  87. *
  88. ******************************************************************************/
  89. DBL Parse_Float_Param()
  90. {
  91. DBL Local;
  92. EXPRESS Express;
  93. int Terms = 1;
  94. GET(LEFT_PAREN_TOKEN);
  95. Parse_Express(Express,&Terms);
  96. if (Terms>1)
  97. {
  98. Error ("Float expected but vector or color expression found.");
  99. }
  100. Local = Express[0];
  101. GET(RIGHT_PAREN_TOKEN);
  102. return (Local);
  103. }
  104. /*****************************************************************************
  105. *
  106. * FUNCTION
  107. *
  108. * INPUT
  109. *
  110. * OUTPUT
  111. *
  112. * RETURNS
  113. *
  114. * AUTHOR
  115. *
  116. * DESCRIPTION
  117. *
  118. * CHANGES
  119. *
  120. ******************************************************************************/
  121. void Parse_Float_Param2(DBL *Val1,DBL *Val2)
  122. {
  123. GET (LEFT_PAREN_TOKEN);
  124. *Val1 = Parse_Float();
  125. Parse_Comma();
  126. *Val2 = Parse_Float();
  127. GET (RIGHT_PAREN_TOKEN);
  128. }
  129. /*****************************************************************************
  130. *
  131. * FUNCTION
  132. *
  133. * INPUT
  134. *
  135. * OUTPUT
  136. *
  137. * RETURNS
  138. *
  139. * AUTHOR
  140. *
  141. * DESCRIPTION
  142. *
  143. * CHANGES
  144. *
  145. ******************************************************************************/
  146. static void Parse_Vector_Param(VECTOR Vector)
  147. {
  148. GET(LEFT_PAREN_TOKEN);
  149. Parse_Vector(Vector);
  150. GET(RIGHT_PAREN_TOKEN);
  151. }
  152. /*****************************************************************************
  153. *
  154. * FUNCTION
  155. *
  156. * INPUT
  157. *
  158. * OUTPUT
  159. *
  160. * RETURNS
  161. *
  162. * AUTHOR
  163. *
  164. * DESCRIPTION
  165. *
  166. * CHANGES
  167. *
  168. ******************************************************************************/
  169. static void Parse_Vector_Param2(VECTOR Val1,VECTOR Val2)
  170. {
  171. GET (LEFT_PAREN_TOKEN);
  172. Parse_Vector(Val1);
  173. Parse_Comma();
  174. Parse_Vector(Val2);
  175. GET (RIGHT_PAREN_TOKEN);
  176. }
  177. /*****************************************************************************
  178. *
  179. * FUNCTION
  180. *
  181. * INPUT
  182. *
  183. * OUTPUT
  184. *
  185. * RETURNS
  186. *
  187. * AUTHOR
  188. *
  189. * DESCRIPTION
  190. *
  191. * CHANGES
  192. *
  193. ******************************************************************************/
  194. static void Parse_Num_Factor (EXPRESS Express,int *Terms)
  195. {
  196. int i = 0;
  197. DBL Val,Val2;
  198. VECTOR Vect,Vect2,Vect3;
  199. TRANSFORM Trans;
  200. char *Local_String, *Local_String2;
  201. FILE *f;
  202. POV_ARRAY *a;
  203. int Old_Ok=Ok_To_Declare;
  204. Ok_To_Declare=TRUE;
  205. EXPECT
  206. CASE (FLOAT_FUNCT_TOKEN)
  207. /* All of these functions return a DBL result */
  208. switch(Token.Function_Id)
  209. {
  210. case ABS_TOKEN:
  211. Val = Parse_Float_Param();
  212. Val = fabs(Val);
  213. break;
  214. case ACOS_TOKEN:
  215. Val = acos(Parse_Float_Param());
  216. break;
  217. case VAL_TOKEN:
  218. GET (LEFT_PAREN_TOKEN);
  219. Local_String=Parse_String();
  220. Val = atof(Local_String);
  221. POV_FREE(Local_String);
  222. GET (RIGHT_PAREN_TOKEN);
  223. break;
  224. case ASC_TOKEN:
  225. GET (LEFT_PAREN_TOKEN);
  226. Local_String=Parse_String();
  227. Val = (DBL)Local_String[0];
  228. POV_FREE(Local_String);
  229. GET (RIGHT_PAREN_TOKEN);
  230. break;
  231. case ASIN_TOKEN:
  232. Val = asin(Parse_Float_Param());
  233. break;
  234. case ATAN2_TOKEN:
  235. Parse_Float_Param2(&Val,&Val2);
  236. if (ftrue(Val) || ftrue(Val2))
  237. {
  238. Val=atan2(Val,Val2);
  239. }
  240. else
  241. {
  242. Error("Domain error in atan2\n");
  243. }
  244. break;
  245. case CEIL_TOKEN:
  246. Val = ceil(Parse_Float_Param());
  247. break;
  248. case CLOCK_TOKEN:
  249. Val = opts.FrameSeq.Clock_Value;
  250. break;
  251. case COS_TOKEN:
  252. Val = cos(Parse_Float_Param());
  253. break;
  254. case DEFINED_TOKEN:
  255. Val = Parse_Ifdef_Param();
  256. break;
  257. case DEGREES_TOKEN:
  258. Val = Parse_Float_Param()/M_PI_180;
  259. break;
  260. case DIV_TOKEN:
  261. Parse_Float_Param2(&Val,&Val2);
  262. Val=(DBL) ( (int)(Val/Val2) );
  263. break;
  264. case EXP_TOKEN:
  265. Val = exp(Parse_Float_Param());
  266. break;
  267. case FILE_EXISTS_TOKEN:
  268. GET (LEFT_PAREN_TOKEN);
  269. Local_String=Parse_String();
  270. Val = ((f=Locate_File(Local_String,READ_BINFILE_STRING,"","",NULL,FALSE))==NULL) ? 0.0 : 1.0;
  271. if (f != NULL)
  272. {
  273. fclose(f);
  274. }
  275. POV_FREE(Local_String);
  276. GET (RIGHT_PAREN_TOKEN);
  277. break;
  278. case FLOAT_ID_TOKEN:
  279. Val = *((DBL *) Token.Data);
  280. break;
  281. case FLOAT_TOKEN:
  282. Val = Token.Token_Float;
  283. break;
  284. case FLOOR_TOKEN:
  285. Val = floor(Parse_Float_Param());
  286. break;
  287. case INT_TOKEN:
  288. Val = (DBL) ((int) Parse_Float_Param());
  289. break;
  290. case LOG_TOKEN:
  291. Val = Parse_Float_Param();
  292. if (Val<=0.0)
  293. {
  294. Error("Log of negative number %lf\n",Val);
  295. }
  296. else
  297. {
  298. Val = log(Val);
  299. }
  300. break;
  301. case MAX_TOKEN:
  302. Parse_Float_Param2(&Val,&Val2);
  303. Val = max(Val,Val2);
  304. break;
  305. case MIN_TOKEN:
  306. Parse_Float_Param2(&Val,&Val2);
  307. Val = min(Val,Val2);
  308. break;
  309. case MOD_TOKEN:
  310. Parse_Float_Param2(&Val,&Val2);
  311. Val = fmod(Val,Val2);
  312. break;
  313. case PI_TOKEN:
  314. Val = M_PI;
  315. break;
  316. case POW_TOKEN:
  317. Parse_Float_Param2(&Val,&Val2);
  318. Val=pow(Val,Val2);
  319. break;
  320. case RADIANS_TOKEN:
  321. Val = Parse_Float_Param()*M_PI_180;
  322. break;
  323. case SIN_TOKEN:
  324. Val = sin(Parse_Float_Param());
  325. break;
  326. case SQRT_TOKEN:
  327. Val = Parse_Float_Param();
  328. if (Val<0.0)
  329. {
  330. Error("sqrt of negative number %lf\n",Val);
  331. }
  332. else
  333. {
  334. Val = sqrt(Val);
  335. }
  336. break;
  337. case STRCMP_TOKEN:
  338. GET (LEFT_PAREN_TOKEN);
  339. Local_String=Parse_String();
  340. Parse_Comma();
  341. Local_String2=Parse_String();
  342. Val = (DBL)strcmp(Local_String,Local_String2);
  343. POV_FREE(Local_String);
  344. POV_FREE(Local_String2);
  345. GET (RIGHT_PAREN_TOKEN);
  346. break;
  347. case STRLEN_TOKEN:
  348. GET (LEFT_PAREN_TOKEN);
  349. Local_String=Parse_String();
  350. Val = (DBL)strlen(Local_String);
  351. POV_FREE(Local_String);
  352. GET (RIGHT_PAREN_TOKEN);
  353. break;
  354. case TAN_TOKEN:
  355. Val = tan(Parse_Float_Param());
  356. break;
  357. case VDOT_TOKEN:
  358. Parse_Vector_Param2(Vect,Vect2);
  359. VDot(Val,Vect,Vect2);
  360. break;
  361. case VLENGTH_TOKEN:
  362. Parse_Vector_Param(Vect);
  363. VLength(Val,Vect);
  364. break;
  365. case VERSION_TOKEN:
  366. Val = opts.Language_Version;
  367. break;
  368. case TRUE_TOKEN:
  369. case YES_TOKEN:
  370. case ON_TOKEN:
  371. Val = 1.0;
  372. break;
  373. case FALSE_TOKEN:
  374. case NO_TOKEN:
  375. case OFF_TOKEN:
  376. Val = 0.0;
  377. break;
  378. case SEED_TOKEN:
  379. Val = stream_seed((int)Parse_Float_Param());
  380. break;
  381. case RAND_TOKEN:
  382. i = (int)Parse_Float_Param();
  383. if ((i < 0) || (i >= Number_Of_Random_Generators))
  384. {
  385. Error("Illegal random number generator.");
  386. }
  387. Val = stream_rand(i);
  388. break;
  389. case CLOCK_DELTA_TOKEN:
  390. Val = Clock_Delta;
  391. break;
  392. case DIMENSIONS_TOKEN:
  393. GET(LEFT_PAREN_TOKEN)
  394. GET(ARRAY_ID_TOKEN)
  395. a = (POV_ARRAY *)(*(Token.DataPtr));
  396. Val = a->Dims+1;
  397. GET(RIGHT_PAREN_TOKEN)
  398. break;
  399. case DIMENSION_SIZE_TOKEN:
  400. GET(LEFT_PAREN_TOKEN)
  401. GET(ARRAY_ID_TOKEN)
  402. Parse_Comma();
  403. a = (POV_ARRAY *)(*(Token.DataPtr));
  404. i = (int)Parse_Float()-1.0;
  405. if ((i < 0) || (i > a->Dims))
  406. {
  407. Val = 0.0;
  408. }
  409. else
  410. {
  411. Val = a->Sizes[i];
  412. }
  413. GET(RIGHT_PAREN_TOKEN)
  414. break;
  415. }
  416. for (i=0; i < *Terms; i++)
  417. Express[i]=Val;
  418. EXIT
  419. END_CASE
  420. CASE (VECTOR_FUNCT_TOKEN)
  421. /* All of these functions return a VECTOR result */
  422. switch(Token.Function_Id)
  423. {
  424. case VAXIS_ROTATE_TOKEN:
  425. GET (LEFT_PAREN_TOKEN);
  426. Parse_Vector(Vect2);
  427. Parse_Comma();
  428. Parse_Vector(Vect3);
  429. Parse_Comma();
  430. Val=Parse_Float()*M_PI_180;
  431. GET (RIGHT_PAREN_TOKEN);
  432. Compute_Axis_Rotation_Transform(&Trans,Vect3,Val);
  433. MTransPoint(Vect, Vect2, &Trans);
  434. break;
  435. case VCROSS_TOKEN:
  436. Parse_Vector_Param2(Vect2,Vect3);
  437. VCross(Vect,Vect2,Vect3);
  438. break;
  439. case VECTOR_ID_TOKEN:
  440. Assign_Vector(Vect,Token.Data);
  441. break;
  442. case VNORMALIZE_TOKEN:
  443. Parse_Vector_Param(Vect);
  444. VLength(Val,Vect);
  445. if (Val==0.0)
  446. {
  447. Make_Vector(Vect,0.0,0.0,0.0);
  448. }
  449. else
  450. {
  451. VInverseScaleEq(Vect,Val);
  452. }
  453. break;
  454. case VROTATE_TOKEN:
  455. Parse_Vector_Param2(Vect2,Vect3);
  456. Compute_Rotation_Transform (&Trans, Vect3);
  457. MTransPoint(Vect, Vect2, &Trans);
  458. break;
  459. case X_TOKEN:
  460. Make_Vector(Vect,1.0,0.0,0.0)
  461. break;
  462. case Y_TOKEN:
  463. Make_Vector(Vect,0.0,1.0,0.0)
  464. break;
  465. case Z_TOKEN:
  466. Make_Vector(Vect,0.0,0.0,1.0)
  467. break;
  468. }
  469. /* If it was expecting a DBL, promote it to a VECTOR.
  470. I haven't yet figured out what to do if it was expecting
  471. a COLOUR value with Terms>3
  472. */
  473. if (*Terms==1)
  474. *Terms=3;
  475. for (i=0; i < 3; i++)
  476. Express[i]=Vect[i];
  477. EXIT
  478. END_CASE
  479. CASE (COLOUR_ID_TOKEN)
  480. *Terms=5;
  481. for (i=0; i<5; i++)
  482. Express[i]=(DBL)( ((COLC *)(Token.Data))[i] );
  483. EXIT
  484. END_CASE
  485. CASE (UV_ID_TOKEN)
  486. *Terms=2;
  487. for (i=0; i<2; i++)
  488. Express[i]=(DBL)( ((DBL *)(Token.Data))[i] );
  489. EXIT
  490. END_CASE
  491. CASE (VECTOR_4D_ID_TOKEN)
  492. *Terms=4;
  493. for (i=0; i<4; i++)
  494. Express[i]=(DBL)( ((DBL *)(Token.Data))[i] );
  495. EXIT
  496. END_CASE
  497. CASE (T_TOKEN)
  498. *Terms=4;
  499. Express[0]=0.0;
  500. Express[1]=0.0;
  501. Express[2]=0.0;
  502. Express[3]=1.0;
  503. EXIT
  504. END_CASE
  505. CASE (U_TOKEN)
  506. *Terms=2;
  507. Express[0]=1.0;
  508. Express[1]=0.0;
  509. EXIT
  510. END_CASE
  511. CASE (V_TOKEN)
  512. *Terms=2;
  513. Express[0]=0.0;
  514. Express[1]=1.0;
  515. EXIT
  516. END_CASE
  517. CASE (PLUS_TOKEN)
  518. END_CASE
  519. CASE (DASH_TOKEN)
  520. Ok_To_Declare=Old_Ok;
  521. Parse_Num_Factor(Express,Terms);
  522. Old_Ok=Ok_To_Declare;
  523. Ok_To_Declare=TRUE;
  524. for (i=0; i<*Terms; i++)
  525. Express[i]=-Express[i];
  526. EXIT
  527. END_CASE
  528. CASE (EXCLAMATION_TOKEN)
  529. Ok_To_Declare=Old_Ok;
  530. Parse_Num_Factor(Express,Terms);
  531. Old_Ok=Ok_To_Declare;
  532. Ok_To_Declare=TRUE;
  533. for (i=0; i<*Terms; i++)
  534. Express[i] = ftrue(Express[i])?0.0:1.0;
  535. EXIT
  536. END_CASE
  537. CASE (LEFT_PAREN_TOKEN)
  538. Parse_Express(Express,Terms);
  539. GET(RIGHT_PAREN_TOKEN);
  540. EXIT
  541. END_CASE
  542. /* This case parses a 2, 3, 4, or 5 term vector. First parse 2 terms.
  543. Note Parse_Comma won't crash if it doesn't find one.
  544. */
  545. CASE (LEFT_ANGLE_TOKEN)
  546. Express[X] = Parse_Float(); Parse_Comma();
  547. Express[Y] = Parse_Float(); Parse_Comma();
  548. *Terms=2;
  549. EXPECT
  550. CASE_EXPRESS
  551. /* If a 3th float is found, parse it. */
  552. Express[2] = Parse_Float(); Parse_Comma();
  553. *Terms=3;
  554. EXPECT
  555. CASE_EXPRESS
  556. /* If a 4th float is found, parse it. */
  557. Express[3] = Parse_Float(); Parse_Comma();
  558. *Terms=4;
  559. EXPECT
  560. CASE_EXPRESS
  561. /* If a 5th float is found, parse it. */
  562. Express[4] = Parse_Float();
  563. *Terms=5;
  564. END_CASE
  565. OTHERWISE
  566. /* Only 4 found. */
  567. UNGET
  568. GET (RIGHT_ANGLE_TOKEN)
  569. EXIT
  570. END_CASE
  571. END_EXPECT
  572. EXIT
  573. END_CASE
  574. OTHERWISE
  575. /* Only 3 found. */
  576. UNGET
  577. GET (RIGHT_ANGLE_TOKEN)
  578. EXIT
  579. END_CASE
  580. END_EXPECT
  581. EXIT
  582. END_CASE
  583. OTHERWISE
  584. /* Only 2 found. */
  585. UNGET
  586. GET (RIGHT_ANGLE_TOKEN)
  587. EXIT
  588. END_CASE
  589. END_EXPECT
  590. EXIT
  591. END_CASE
  592. OTHERWISE
  593. Parse_Error_Str ("numeric expression");
  594. END_CASE
  595. END_EXPECT
  596. Ok_To_Declare=Old_Ok;
  597. /* Parse VECTOR.x or COLOR.red type things */
  598. EXPECT
  599. CASE(PERIOD_TOKEN)
  600. EXPECT
  601. CASE (VECTOR_FUNCT_TOKEN)
  602. switch(Token.Function_Id)
  603. {
  604. case X_TOKEN:
  605. i=X;
  606. break;
  607. case Y_TOKEN:
  608. i=Y;
  609. break;
  610. case Z_TOKEN:
  611. i=Z;
  612. break;
  613. default:
  614. Parse_Error_Str ("x, y, or z");
  615. }
  616. EXIT
  617. END_CASE
  618. CASE (COLOUR_KEY_TOKEN)
  619. switch(Token.Function_Id)
  620. {
  621. case RED_TOKEN:
  622. i=RED;
  623. break;
  624. case GREEN_TOKEN:
  625. i=GREEN;
  626. break;
  627. case BLUE_TOKEN:
  628. i=BLUE;
  629. break;
  630. case FILTER_TOKEN:
  631. i=FILTER;
  632. break;
  633. case TRANSMIT_TOKEN:
  634. i=TRANSM;
  635. break;
  636. default:
  637. Parse_Error_Str ("red, green, blue, filter, or transmit");
  638. }
  639. EXIT
  640. END_CASE
  641. CASE(U_TOKEN)
  642. i=U;
  643. EXIT
  644. END_CASE
  645. CASE(V_TOKEN)
  646. i=V;
  647. EXIT
  648. END_CASE
  649. CASE(T_TOKEN)
  650. i=T;
  651. EXIT
  652. END_CASE
  653. OTHERWISE
  654. Parse_Error_Str ("x, y, z or color component");
  655. END_CASE
  656. END_EXPECT
  657. if (i>=*Terms)
  658. {
  659. Error("Bad operands for period operator.");
  660. }
  661. *Terms=1;
  662. Express[0]=Express[i];
  663. EXIT
  664. END_CASE
  665. OTHERWISE
  666. UNGET
  667. EXIT
  668. END_CASE
  669. END_EXPECT
  670. }
  671. /*****************************************************************************
  672. *
  673. * FUNCTION
  674. *
  675. * INPUT
  676. *
  677. * OUTPUT
  678. *
  679. * RETURNS
  680. *
  681. * AUTHOR
  682. *
  683. * DESCRIPTION
  684. *
  685. * CHANGES
  686. *
  687. ******************************************************************************/
  688. /* If first operand of a 2-operand function had more terms than the second,
  689. then the parsing of the 2nd operand would have automatically promoted it.
  690. But if 2nd operand has more terms then we must go back promote the 1st
  691. operand before combining them Promote_Express does it. If Old_Terms=1
  692. then set all terms to Express[0]. Otherwise pad extra terms with 0.0.
  693. */
  694. static void Promote_Express(EXPRESS Express,int *Old_Terms,int New_Terms)
  695. {
  696. register int i;
  697. if (*Old_Terms >= New_Terms)
  698. return;
  699. if (*Old_Terms==1)
  700. {
  701. for(i=1;i<New_Terms;i++)
  702. {
  703. Express[i]=Express[0];
  704. }
  705. }
  706. else
  707. {
  708. for(i=(*Old_Terms);i<New_Terms;i++)
  709. {
  710. Express[i]=0.0;
  711. }
  712. }
  713. *Old_Terms=New_Terms;
  714. }
  715. /*****************************************************************************
  716. *
  717. * FUNCTION
  718. *
  719. * INPUT
  720. *
  721. * OUTPUT
  722. *
  723. * RETURNS
  724. *
  725. * AUTHOR
  726. *
  727. * DESCRIPTION
  728. *
  729. * CHANGES
  730. *
  731. ******************************************************************************/
  732. static void Parse_Num_Term (EXPRESS Express,int *Terms)
  733. {
  734. register int i;
  735. EXPRESS Local_Express;
  736. int Local_Terms;
  737. Parse_Num_Factor(Express,Terms);
  738. Local_Terms=*Terms;
  739. EXPECT
  740. CASE (STAR_TOKEN)
  741. Parse_Num_Factor(Local_Express,&Local_Terms);
  742. Promote_Express(Express,Terms,Local_Terms);
  743. for(i=0;i<*Terms;i++)
  744. Express[i] *= Local_Express[i];
  745. END_CASE
  746. CASE (SLASH_TOKEN)
  747. Parse_Num_Factor(Local_Express,&Local_Terms);
  748. Promote_Express(Express,Terms,Local_Terms);
  749. for(i=0;i<*Terms;i++)
  750. {
  751. if (Local_Express[i]==0.0) /* must be 0.0, not EPSILON */
  752. {
  753. Express[i]=HUGE_VAL;
  754. Warn(0.0,"Divide by zero.");
  755. }
  756. else
  757. {
  758. Express[i] /= Local_Express[i];
  759. }
  760. }
  761. END_CASE
  762. OTHERWISE
  763. UNGET
  764. EXIT
  765. END_CASE
  766. END_EXPECT
  767. }
  768. /*****************************************************************************
  769. *
  770. * FUNCTION
  771. *
  772. * INPUT
  773. *
  774. * OUTPUT
  775. *
  776. * RETURNS
  777. *
  778. * AUTHOR
  779. *
  780. * DESCRIPTION
  781. *
  782. * CHANGES
  783. *
  784. ******************************************************************************/
  785. static void Parse_Rel_Factor (EXPRESS Express,int *Terms)
  786. {
  787. register int i;
  788. EXPRESS Local_Express;
  789. int Local_Terms;
  790. Parse_Num_Term(Express,Terms);
  791. Local_Terms=*Terms;
  792. EXPECT
  793. CASE (PLUS_TOKEN)
  794. Parse_Num_Term(Local_Express,&Local_Terms);
  795. Promote_Express(Express,Terms,Local_Terms);
  796. for(i=0;i<*Terms;i++)
  797. Express[i] += Local_Express[i];
  798. END_CASE
  799. CASE (DASH_TOKEN)
  800. Parse_Num_Term(Local_Express,&Local_Terms);
  801. Promote_Express(Express,Terms,Local_Terms);
  802. for(i=0;i<*Terms;i++)
  803. Express[i] -= Local_Express[i];
  804. END_CASE
  805. OTHERWISE
  806. UNGET
  807. EXIT
  808. END_CASE
  809. END_EXPECT
  810. }
  811. /*****************************************************************************
  812. *
  813. * FUNCTION
  814. *
  815. * INPUT
  816. *
  817. * OUTPUT
  818. *
  819. * RETURNS
  820. *
  821. * AUTHOR
  822. *
  823. * DESCRIPTION
  824. *
  825. * CHANGES
  826. *
  827. ******************************************************************************/
  828. static void Parse_Rel_Term (EXPRESS Express,int *Terms)
  829. {
  830. register int i;
  831. EXPRESS Local_Express;
  832. int Local_Terms;
  833. Parse_Rel_Factor(Express,Terms);
  834. Local_Terms=*Terms;
  835. EXPECT
  836. CASE (LEFT_ANGLE_TOKEN)
  837. Parse_Rel_Factor(Local_Express,&Local_Terms);
  838. Promote_Express(Express,Terms,Local_Terms);
  839. for(i=0;i<*Terms;i++)
  840. Express[i] = (DBL)(Express[i] < Local_Express[i]);
  841. END_CASE
  842. CASE (REL_LE_TOKEN)
  843. Parse_Rel_Factor(Local_Express,&Local_Terms);
  844. Promote_Express(Express,Terms,Local_Terms);
  845. for(i=0;i<*Terms;i++)
  846. Express[i] = (DBL)(Express[i] <= Local_Express[i]);
  847. END_CASE
  848. CASE (EQUALS_TOKEN)
  849. Parse_Rel_Factor(Local_Express,&Local_Terms);
  850. Promote_Express(Express,Terms,Local_Terms);
  851. for(i=0;i<*Terms;i++)
  852. Express[i] = (DBL)(!ftrue(Express[i]-Local_Express[i]));
  853. END_CASE
  854. CASE (REL_NE_TOKEN)
  855. Parse_Rel_Factor(Local_Express,&Local_Terms);
  856. Promote_Express(Express,Terms,Local_Terms);
  857. for(i=0;i<*Terms;i++)
  858. Express[i] = (DBL)ftrue(Express[i]-Local_Express[i]);
  859. END_CASE
  860. CASE (REL_GE_TOKEN)
  861. Parse_Rel_Factor(Local_Express,&Local_Terms);
  862. Promote_Express(Express,Terms,Local_Terms);
  863. for(i=0;i<*Terms;i++)
  864. Express[i] = (DBL)(Express[i] >= Local_Express[i]);
  865. END_CASE
  866. CASE (RIGHT_ANGLE_TOKEN)
  867. Parse_Rel_Factor(Local_Express,&Local_Terms);
  868. Promote_Express(Express,Terms,Local_Terms);
  869. for(i=0;i<*Terms;i++)
  870. Express[i] = (DBL)(Express[i] > Local_Express[i]);
  871. END_CASE
  872. OTHERWISE
  873. UNGET
  874. EXIT
  875. END_CASE
  876. END_EXPECT
  877. }
  878. /*****************************************************************************
  879. *
  880. * FUNCTION
  881. *
  882. * INPUT
  883. *
  884. * OUTPUT
  885. *
  886. * RETURNS
  887. *
  888. * AUTHOR
  889. *
  890. * DESCRIPTION
  891. *
  892. * CHANGES
  893. *
  894. ******************************************************************************/
  895. static void Parse_Logical (EXPRESS Express,int *Terms)
  896. {
  897. register int i;
  898. EXPRESS Local_Express;
  899. int Local_Terms;
  900. Parse_Rel_Term(Express,Terms);
  901. Local_Terms=*Terms;
  902. EXPECT
  903. CASE (AMPERSAND_TOKEN)
  904. Parse_Rel_Term(Local_Express,&Local_Terms);
  905. Promote_Express(Express,Terms,Local_Terms);
  906. for(i=0;i<*Terms;i++)
  907. Express[i] = (DBL)(ftrue(Express[i]) && ftrue(Local_Express[i]));
  908. END_CASE
  909. CASE (BAR_TOKEN)
  910. Parse_Rel_Term(Local_Express,&Local_Terms);
  911. Promote_Express(Express,Terms,Local_Terms);
  912. for(i=0;i<*Terms;i++)
  913. Express[i] = (DBL)(ftrue(Express[i]) || ftrue(Local_Express[i]));
  914. END_CASE
  915. OTHERWISE
  916. UNGET
  917. EXIT
  918. END_CASE
  919. END_EXPECT
  920. }
  921. /*****************************************************************************
  922. *
  923. * FUNCTION
  924. *
  925. * INPUT
  926. *
  927. * OUTPUT
  928. *
  929. * RETURNS
  930. *
  931. * AUTHOR
  932. *
  933. * DESCRIPTION
  934. *
  935. * CHANGES
  936. *
  937. ******************************************************************************/
  938. static void Parse_Express (EXPRESS Express,int *Terms)
  939. {
  940. EXPRESS Local_Express1, Local_Express2;
  941. EXPRESS *Chosen;
  942. int Local_Terms1, Local_Terms2;
  943. Local_Terms1 = 1;
  944. Parse_Logical(Express,&Local_Terms1);
  945. EXPECT
  946. CASE (QUESTION_TOKEN)
  947. if (Local_Terms1 != 1)
  948. Error("Conditional must evaluate to a float.");
  949. Local_Terms1 = Local_Terms2 = *Terms;
  950. Parse_Express(Local_Express1,&Local_Terms1);
  951. GET(COLON_TOKEN);
  952. Parse_Express(Local_Express2,&Local_Terms2);
  953. if (ftrue(Express[0]))
  954. {
  955. Chosen = (EXPRESS *)&Local_Express1;
  956. *Terms = Local_Terms1;
  957. }
  958. else
  959. {
  960. Chosen = (EXPRESS *)&Local_Express2;
  961. *Terms = Local_Terms2;
  962. }
  963. memcpy(Express,Chosen,sizeof(EXPRESS));
  964. EXIT
  965. END_CASE
  966. OTHERWISE
  967. /* Not a (c)?a:b expression. Since Express was parsed with
  968. Local_Terms1=1 then we may have to promote this. Suppose
  969. Terms=3 but Local_Terms1=1. If this had been a (c)?a:b
  970. then a float is ok but since it is not a condition then
  971. it must be promoted to Terms=3. Note that the parameters
  972. below look wrong but they are not.
  973. */
  974. Promote_Express (Express,&Local_Terms1,*Terms);
  975. /* On the other hand, Local_Terms1 may be bigger than Terms.
  976. If so, Express already is promoted and Terms must reflect that.
  977. */
  978. *Terms=Local_Terms1;
  979. UNGET
  980. EXIT
  981. END_CASE
  982. END_EXPECT
  983. }
  984. /*****************************************************************************
  985. *
  986. * FUNCTION
  987. *
  988. * INPUT
  989. *
  990. * OUTPUT
  991. *
  992. * RETURNS
  993. *
  994. * AUTHOR
  995. *
  996. * DESCRIPTION
  997. *
  998. * CHANGES
  999. *
  1000. ******************************************************************************/
  1001. DBL Parse_Raw_Number()
  1002. {
  1003. int Terms;
  1004. DBL Val;
  1005. EXPRESS Express;
  1006. Terms = 1;
  1007. Parse_Num_Factor(Express, &Terms);
  1008. Val = Express[0];
  1009. if (Terms != 1)
  1010. {
  1011. Error("Raw float expected but vector found instead.");
  1012. }
  1013. return (Val);
  1014. }
  1015. /*****************************************************************************
  1016. *
  1017. * FUNCTION
  1018. *
  1019. * INPUT
  1020. *
  1021. * OUTPUT
  1022. *
  1023. * RETURNS
  1024. *
  1025. * AUTHOR
  1026. *
  1027. * DESCRIPTION
  1028. *
  1029. * CHANGES
  1030. *
  1031. ******************************************************************************/
  1032. DBL Parse_Float ()
  1033. {
  1034. EXPRESS Express;
  1035. int Terms;
  1036. Terms=1;
  1037. if (opts.Language_Version < 1.5)
  1038. Parse_Num_Factor(Express,&Terms);
  1039. else
  1040. Parse_Rel_Factor(Express,&Terms);
  1041. if (Terms>1)
  1042. Error ("Float expected but vector or color expression found.");
  1043. return (Express[0]);
  1044. }
  1045. /*****************************************************************************
  1046. *
  1047. * FUNCTION
  1048. *
  1049. * INPUT
  1050. *
  1051. * OUTPUT
  1052. *
  1053. * RETURNS
  1054. *
  1055. * AUTHOR
  1056. *
  1057. * DESCRIPTION
  1058. *
  1059. * CHANGES
  1060. *
  1061. ******************************************************************************/
  1062. DBL Allow_Float (DBL defval)
  1063. {
  1064. DBL retval;
  1065. EXPECT
  1066. CASE_EXPRESS
  1067. retval = Parse_Float();
  1068. EXIT
  1069. END_CASE
  1070. OTHERWISE
  1071. UNGET
  1072. retval = defval;
  1073. EXIT
  1074. END_CASE
  1075. END_EXPECT
  1076. return (retval);
  1077. }
  1078. /*****************************************************************************
  1079. *
  1080. * FUNCTION
  1081. *
  1082. * INPUT
  1083. *
  1084. * OUTPUT
  1085. *
  1086. * RETURNS
  1087. *
  1088. * AUTHOR
  1089. *
  1090. * DESCRIPTION
  1091. *
  1092. * CHANGES
  1093. *
  1094. ******************************************************************************/
  1095. void Parse_Vector (VECTOR Vector)
  1096. {
  1097. EXPRESS Express;
  1098. int Terms;
  1099. /* Initialize expression. [DB 12/94] */
  1100. for (Terms = 0; Terms < 5; Terms++)
  1101. {
  1102. Express[Terms] = 0.0;
  1103. }
  1104. Terms=3;
  1105. if (opts.Language_Version < 1.5)
  1106. Parse_Num_Factor(Express,&Terms);
  1107. else
  1108. Parse_Rel_Factor(Express,&Terms);
  1109. if (Terms>3)
  1110. Error ("Vector expected but color expression found.");
  1111. for(Terms=0;Terms<3;Terms++)
  1112. Vector[Terms]=Express[Terms];
  1113. }
  1114. /*****************************************************************************
  1115. *
  1116. * FUNCTION
  1117. *
  1118. * INPUT
  1119. *
  1120. * OUTPUT
  1121. *
  1122. * RETURNS
  1123. *
  1124. * AUTHOR
  1125. *
  1126. * DESCRIPTION
  1127. *
  1128. * CHANGES
  1129. *
  1130. ******************************************************************************/
  1131. void Parse_Vector4D (VECTOR Vector)
  1132. {
  1133. EXPRESS Express;
  1134. int Terms;
  1135. int Dim = 4;
  1136. /* Initialize expression. [DB 12/94] */
  1137. for (Terms = 0; Terms < 5; Terms++)
  1138. {
  1139. Express[Terms] = 0.0;
  1140. }
  1141. Terms=Dim;
  1142. if (opts.Language_Version < 1.5)
  1143. Parse_Num_Factor(Express,&Terms);
  1144. else
  1145. Parse_Rel_Factor(Express,&Terms);
  1146. if (Terms>Dim)
  1147. Error ("Vector expected but color expression found.");
  1148. for(Terms=0;Terms<Dim;Terms++)
  1149. Vector[Terms]=Express[Terms];
  1150. }
  1151. /*****************************************************************************
  1152. *
  1153. * FUNCTION
  1154. *
  1155. * INPUT
  1156. *
  1157. * OUTPUT
  1158. *
  1159. * RETURNS
  1160. *
  1161. * AUTHOR
  1162. *
  1163. * DESCRIPTION
  1164. *
  1165. * CHANGES
  1166. *
  1167. ******************************************************************************/
  1168. void Parse_UV_Vect (UV_VECT UV_Vect)
  1169. {
  1170. EXPRESS Express;
  1171. int Terms;
  1172. /* Initialize expression. [DB 12/94] */
  1173. for (Terms = 0; Terms < 5; Terms++)
  1174. {
  1175. Express[Terms] = 0.0;
  1176. }
  1177. Terms=2;
  1178. if (opts.Language_Version < 1.5)
  1179. Parse_Num_Factor(Express,&Terms);
  1180. else
  1181. Parse_Rel_Factor(Express,&Terms);
  1182. if (Terms>2)
  1183. Error ("UV_Vector expected but vector or color expression found.");
  1184. for(Terms=0;Terms<2;Terms++)
  1185. UV_Vect[Terms]=Express[Terms];
  1186. }
  1187. /*****************************************************************************
  1188. *
  1189. * FUNCTION
  1190. *
  1191. * INPUT
  1192. *
  1193. * OUTPUT
  1194. *
  1195. * RETURNS
  1196. *
  1197. * AUTHOR
  1198. *
  1199. * DESCRIPTION
  1200. *
  1201. * CHANGES
  1202. *
  1203. ******************************************************************************/
  1204. int Parse_Unknown_Vector(EXPRESS Express)
  1205. {
  1206. int Terms;
  1207. /* Initialize expression. [DB 12/94] */
  1208. for (Terms = 0; Terms < 5; Terms++)
  1209. {
  1210. Express[Terms] = 0.0;
  1211. }
  1212. Terms=1;
  1213. if (opts.Language_Version < 1.5)
  1214. {
  1215. Parse_Num_Factor(Express,&Terms);
  1216. }
  1217. else
  1218. {
  1219. Parse_Rel_Factor(Express,&Terms);
  1220. }
  1221. return(Terms);
  1222. }
  1223. /*****************************************************************************
  1224. *
  1225. * FUNCTION
  1226. *
  1227. * INPUT
  1228. *
  1229. * OUTPUT
  1230. *
  1231. * RETURNS
  1232. *
  1233. * AUTHOR
  1234. *
  1235. * DESCRIPTION
  1236. *
  1237. * CHANGES
  1238. *
  1239. ******************************************************************************/
  1240. void Parse_Scale_Vector (VECTOR Vector)
  1241. {
  1242. Parse_Vector(Vector);
  1243. if (Vector[X] == 0.0)
  1244. {
  1245. Vector[X] = 1.0;
  1246. Warn(0.0, "Illegal Value: Scale X by 0.0. Changed to 1.0.");
  1247. }
  1248. if (Vector[Y] == 0.0)
  1249. {
  1250. Vector[Y] = 1.0;
  1251. Warn(0.0, "Illegal Value: Scale Y by 0.0. Changed to 1.0.");
  1252. }
  1253. if (Vector[Z] == 0.0)
  1254. {
  1255. Vector[Z] = 1.0;
  1256. Warn(0.0, "Illegal Value: Scale Z by 0.0. Changed to 1.0.");
  1257. }
  1258. }
  1259. /*****************************************************************************
  1260. *
  1261. * FUNCTION
  1262. *
  1263. * INPUT
  1264. *
  1265. * OUTPUT
  1266. *
  1267. * RETURNS
  1268. *
  1269. * AUTHOR
  1270. *
  1271. * DESCRIPTION
  1272. *
  1273. * CHANGES
  1274. *
  1275. ******************************************************************************/
  1276. void Parse_Colour (COLOUR Colour)
  1277. {
  1278. EXPRESS Express;
  1279. int Terms;
  1280. register int i;
  1281. /* Initialize expression. [DB 12/94] */
  1282. for (Terms = 0; Terms < 5; Terms++)
  1283. {
  1284. Express[Terms] = 0.0;
  1285. }
  1286. Make_Colour (Colour, 0.0, 0.0, 0.0);
  1287. ALLOW(COLOUR_TOKEN)
  1288. EXPECT
  1289. CASE (COLOUR_KEY_TOKEN)
  1290. switch(Token.Function_Id)
  1291. {
  1292. case ALPHA_TOKEN:
  1293. Warn(1.55, "Keyword ALPHA discontinued. Use FILTER instead.");
  1294. /* missing break deliberate */
  1295. case FILTER_TOKEN:
  1296. Colour[FILTER] = (COLC)Parse_Float();
  1297. break;
  1298. case BLUE_TOKEN:
  1299. Colour[BLUE] = (COLC)Parse_Float();
  1300. break;
  1301. case GREEN_TOKEN:
  1302. Colour[GREEN] = (COLC)Parse_Float();
  1303. break;
  1304. case RED_TOKEN:
  1305. Colour[RED] = (COLC)Parse_Float();
  1306. break;
  1307. case TRANSMIT_TOKEN:
  1308. Colour[TRANSM] = (COLC)Parse_Float();
  1309. break;
  1310. case RGB_TOKEN:
  1311. Terms=3;
  1312. Parse_Express(Express,&Terms);
  1313. if (Terms != 3)
  1314. Warn(0.0, "Suspicious expression after rgb.");
  1315. for (i=0;i<Terms;i++)
  1316. Colour[i]=(COLC)Express[i];
  1317. break;
  1318. case RGBF_TOKEN:
  1319. Terms=4;
  1320. Parse_Express(Express,&Terms);
  1321. if (Terms != 4)
  1322. Warn(0.0, "Suspicious expression after rgbf.");
  1323. for (i=0;i<Terms;i++)
  1324. Colour[i]=(COLC)Express[i];
  1325. break;
  1326. case RGBT_TOKEN:
  1327. Terms=4;
  1328. Parse_Express(Express,&Terms);
  1329. if (Terms != 4)
  1330. Warn(0.0, "Suspicious expression after rgbt.");
  1331. for (i=0;i<Terms;i++)
  1332. Colour[i]=(COLC)Express[i];
  1333. Colour[TRANSM]=Colour[FILTER];
  1334. Colour[FILTER]=0.0;
  1335. break;
  1336. case RGBFT_TOKEN:
  1337. Terms=5;
  1338. Parse_Express(Express,&Terms);
  1339. if (Terms != 5)
  1340. Warn(0.0, "Suspicious expression after rgbft.");
  1341. for (i=0;i<Terms;i++)
  1342. Colour[i]=(COLC)Express[i];
  1343. break;
  1344. }
  1345. END_CASE
  1346. CASE (COLOUR_ID_TOKEN)
  1347. UNGET
  1348. Terms=5;
  1349. Parse_Express(Express,&Terms);
  1350. for (i=0;i<Terms;i++)
  1351. Colour[i]=(COLC)Express[i];
  1352. END_CASE
  1353. CASE_EXPRESS
  1354. UNGET
  1355. Terms=5;
  1356. Parse_Express(Express,&Terms);
  1357. if (Terms != 5)
  1358. Error("Color expression expected but float or vector expression found.");
  1359. for (i=0;i<Terms;i++)
  1360. Colour[i]=(COLC)Express[i];
  1361. END_CASE
  1362. OTHERWISE
  1363. UNGET
  1364. EXIT
  1365. END_CASE
  1366. END_EXPECT
  1367. }
  1368. /*****************************************************************************
  1369. *
  1370. * FUNCTION
  1371. *
  1372. * Parse_Blend_Map
  1373. *
  1374. * INPUT
  1375. *
  1376. * Type of map to parse: pigment_map, normal_map etc
  1377. *
  1378. * OUTPUT
  1379. *
  1380. * RETURNS
  1381. *
  1382. * Pointer to created blend map
  1383. *
  1384. * AUTHOR
  1385. *
  1386. * Chris Young 11/94
  1387. *
  1388. * DESCRIPTION :
  1389. *
  1390. * CHANGES
  1391. *
  1392. ******************************************************************************/
  1393. BLEND_MAP *Parse_Blend_Map (int Blend_Type,int Pat_Type)
  1394. {
  1395. BLEND_MAP *New = NULL;
  1396. BLEND_MAP_ENTRY *Temp_Ent;
  1397. int i;
  1398. Parse_Begin ();
  1399. EXPECT
  1400. CASE2 (COLOUR_MAP_ID_TOKEN, PIGMENT_MAP_ID_TOKEN)
  1401. CASE3 (NORMAL_MAP_ID_TOKEN, TEXTURE_MAP_ID_TOKEN, SLOPE_MAP_ID_TOKEN)
  1402. New = Copy_Blend_Map ((BLEND_MAP *) Token.Data);
  1403. if (Blend_Type != New->Type)
  1404. {
  1405. Error("Wrong identifier type\n");
  1406. }
  1407. EXIT
  1408. END_CASE
  1409. OTHERWISE
  1410. UNGET
  1411. Temp_Ent = Create_BMap_Entries(MAX_BLEND_MAP_ENTRIES);
  1412. i = 0;
  1413. EXPECT
  1414. CASE (LEFT_SQUARE_TOKEN)
  1415. switch (Pat_Type)
  1416. {
  1417. case AVERAGE_PATTERN:
  1418. Temp_Ent[i].value = Allow_Float(1.0);
  1419. Parse_Comma();
  1420. break;
  1421. default:
  1422. Temp_Ent[i].value = Parse_Float();
  1423. Parse_Comma();
  1424. break;
  1425. }
  1426. switch (Blend_Type)
  1427. {
  1428. case PIGMENT_TYPE:
  1429. Temp_Ent[i].Vals.Pigment=Copy_Pigment(Default_Texture->Pigment);
  1430. Parse_Pigment(&(Temp_Ent[i].Vals.Pigment));
  1431. break;
  1432. case NORMAL_TYPE:
  1433. Temp_Ent[i].Vals.Tnormal=Copy_Tnormal(Default_Texture->Tnormal);
  1434. Parse_Tnormal(&(Temp_Ent[i].Vals.Tnormal));
  1435. break;
  1436. case SLOPE_TYPE:
  1437. Parse_UV_Vect(Temp_Ent[i].Vals.Point_Slope);
  1438. break;
  1439. case TEXTURE_TYPE:
  1440. Temp_Ent[i].Vals.Texture=Parse_Texture();
  1441. break;
  1442. case DENSITY_TYPE:
  1443. Temp_Ent[i].Vals.Pigment=NULL;
  1444. Parse_Media_Density_Pattern (&(Temp_Ent[i].Vals.Pigment));
  1445. break;
  1446. default:
  1447. Error("Type not implemented yet.");
  1448. }
  1449. if (++i > MAX_BLEND_MAP_ENTRIES)
  1450. Error ("Blend_Map too long");
  1451. GET (RIGHT_SQUARE_TOKEN);
  1452. END_CASE
  1453. OTHERWISE
  1454. UNGET
  1455. if (i < 1)
  1456. Error ("Must have at least one entry in map.");
  1457. New = Create_Blend_Map ();
  1458. New->Number_Of_Entries = i;
  1459. New->Type=Blend_Type;
  1460. New->Transparency_Flag=TRUE; /*Temp fix. Really set in Post_???*/
  1461. New->Blend_Map_Entries = (BLEND_MAP_ENTRY *)POV_REALLOC(Temp_Ent,sizeof(BLEND_MAP_ENTRY)*i,"blend map entries");
  1462. EXIT
  1463. END_CASE
  1464. END_EXPECT
  1465. EXIT
  1466. END_CASE
  1467. END_EXPECT
  1468. Parse_End ();
  1469. return (New);
  1470. }
  1471. /*****************************************************************************
  1472. *
  1473. * FUNCTION
  1474. *
  1475. * INPUT
  1476. *
  1477. * OUTPUT
  1478. *
  1479. * RETURNS
  1480. *
  1481. * AUTHOR
  1482. *
  1483. * DESCRIPTION
  1484. *
  1485. * CHANGES
  1486. *
  1487. ******************************************************************************/
  1488. BLEND_MAP *Parse_Blend_List (int Count,BLEND_MAP *Def_Map,int Blend_Type)
  1489. {
  1490. BLEND_MAP *New;
  1491. BLEND_MAP_ENTRY *Temp_Ent;
  1492. int Type, i;
  1493. i = 0;
  1494. if(Blend_Type == PIGMENT_TYPE)
  1495. {
  1496. EXPECT
  1497. CASE(PIGMENT_TOKEN)
  1498. UNGET
  1499. Type=PIGMENT_TYPE;
  1500. EXIT
  1501. END_CASE
  1502. OTHERWISE
  1503. UNGET
  1504. Type=COLOUR_TYPE;
  1505. EXIT
  1506. END_CASE
  1507. END_EXPECT
  1508. }
  1509. else
  1510. {
  1511. Type=Blend_Type;
  1512. }
  1513. Temp_Ent = Create_BMap_Entries(Count);
  1514. switch(Type)
  1515. {
  1516. case COLOUR_TYPE:
  1517. EXPECT
  1518. CASE_COLOUR
  1519. CASE_EXPRESS
  1520. Parse_Colour (Temp_Ent[i].Vals.Colour);
  1521. Parse_Comma ();
  1522. Temp_Ent[i].value = (SNGL)i;
  1523. if (++i >= Count)
  1524. EXIT
  1525. END_CASE
  1526. OTHERWISE
  1527. UNGET
  1528. EXIT
  1529. END_CASE
  1530. END_EXPECT
  1531. break;
  1532. case PIGMENT_TYPE:
  1533. EXPECT
  1534. CASE(PIGMENT_TOKEN)
  1535. Parse_Begin ();
  1536. Temp_Ent[i].Vals.Pigment=Copy_Pigment(Default_Texture->Pigment);
  1537. Parse_Pigment(&(Temp_Ent[i].Vals.Pigment));
  1538. Parse_End ();
  1539. Parse_Comma ();
  1540. Temp_Ent[i].value = (SNGL)i;
  1541. if (++i >= Count)
  1542. EXIT
  1543. END_CASE
  1544. OTHERWISE
  1545. UNGET
  1546. EXIT
  1547. END_CASE
  1548. END_EXPECT
  1549. break;
  1550. case NORMAL_TYPE:
  1551. EXPECT
  1552. CASE(TNORMAL_TOKEN)
  1553. Parse_Begin ();
  1554. Temp_Ent[i].Vals.Tnormal=Copy_Tnormal(Default_Texture->Tnormal);
  1555. Parse_Tnormal(&(Temp_Ent[i].Vals.Tnormal));
  1556. Parse_End ();
  1557. Parse_Comma ();
  1558. Temp_Ent[i].value = (SNGL)i;
  1559. if (++i >= Count)
  1560. EXIT
  1561. END_CASE
  1562. OTHERWISE
  1563. UNGET
  1564. EXIT
  1565. END_CASE
  1566. END_EXPECT
  1567. break;
  1568. case TEXTURE_TYPE:
  1569. EXPECT
  1570. CASE(TEXTURE_TOKEN)
  1571. Parse_Begin ();
  1572. Temp_Ent[i].Vals.Texture=Parse_Texture();
  1573. Parse_End ();
  1574. Parse_Comma ();
  1575. Temp_Ent[i].value = (SNGL)i;
  1576. if (++i >= Count)
  1577. EXIT
  1578. END_CASE
  1579. OTHERWISE
  1580. UNGET
  1581. EXIT
  1582. END_CASE
  1583. END_EXPECT
  1584. break;
  1585. case DENSITY_TYPE:
  1586. EXPECT
  1587. CASE(DENSITY_TOKEN)
  1588. Parse_Begin ();
  1589. Temp_Ent[i].Vals.Pigment=NULL;
  1590. Parse_Media_Density_Pattern (&(Temp_Ent[i].Vals.Pigment));
  1591. Parse_End ();
  1592. Parse_Comma ();
  1593. Temp_Ent[i].value = (SNGL)i;
  1594. if (++i >= Count)
  1595. EXIT
  1596. END_CASE
  1597. OTHERWISE
  1598. UNGET
  1599. EXIT
  1600. END_CASE
  1601. END_EXPECT
  1602. break;
  1603. }
  1604. if ((Type==NORMAL_TYPE) && (i==0))
  1605. {
  1606. POV_FREE(Temp_Ent);
  1607. return (NULL);
  1608. }
  1609. while (i < Count)
  1610. {
  1611. switch (Type)
  1612. {
  1613. case COLOUR_TYPE:
  1614. Assign_Colour(Temp_Ent[i].Vals.Colour,Def_Map->Blend_Map_Entries[i].Vals.Colour);
  1615. break;
  1616. case PIGMENT_TYPE:
  1617. Temp_Ent[i].Vals.Pigment=Copy_Pigment(Default_Texture->Pigment);
  1618. break;
  1619. case NORMAL_TYPE:
  1620. Temp_Ent[i].Vals.Tnormal=Copy_Tnormal(Default_Texture->Tnormal);
  1621. break;
  1622. case TEXTURE_TYPE:
  1623. Temp_Ent[i].Vals.Texture=Copy_Textures(Default_Texture);
  1624. break;
  1625. case DENSITY_TYPE:
  1626. Temp_Ent[i].Vals.Pigment=NULL;
  1627. break;
  1628. }
  1629. Temp_Ent[i].value = (SNGL)i;
  1630. i++;
  1631. }
  1632. New = Create_Blend_Map ();
  1633. New->Number_Of_Entries = Count;
  1634. New->Type=Type;
  1635. New->Transparency_Flag=TRUE; /*Temp fix. Really set in Post_???*/
  1636. New->Blend_Map_Entries = Temp_Ent;
  1637. return (New);
  1638. }
  1639. /*****************************************************************************
  1640. *
  1641. * FUNCTION
  1642. *
  1643. * Parse_Colour_Map
  1644. *
  1645. * INPUT
  1646. *
  1647. * OUTPUT
  1648. *
  1649. * RETURNS
  1650. *
  1651. * Pointer to newly created BLEND_MAP that has colors as all
  1652. * its entries.
  1653. *
  1654. * AUTHOR
  1655. *
  1656. * POV-Ray Team
  1657. *
  1658. * DESCRIPTION : This seperate routine parses color_maps only. It
  1659. * cannot be used for pigment_maps because it accomidates
  1660. * the old double entry color maps from vers 1.0
  1661. *
  1662. * CHANGES
  1663. *
  1664. ******************************************************************************/
  1665. BLEND_MAP *Parse_Colour_Map ()
  1666. {
  1667. BLEND_MAP *New = NULL;
  1668. int i,j,c,p,ii;
  1669. EXPRESS Express;
  1670. int Terms;
  1671. BLEND_MAP_ENTRY *Temp_Ent;
  1672. Parse_Begin ();
  1673. EXPECT
  1674. CASE (COLOUR_MAP_ID_TOKEN)
  1675. New = Copy_Blend_Map ((BLEND_MAP *) Token.Data);
  1676. EXIT
  1677. END_CASE
  1678. OTHERWISE
  1679. UNGET
  1680. Temp_Ent = Create_BMap_Entries(MAX_BLEND_MAP_ENTRIES);
  1681. i = 0;
  1682. j = 1;
  1683. EXPECT
  1684. CASE (LEFT_SQUARE_TOKEN)
  1685. Temp_Ent[i].value = Parse_Float(); Parse_Comma();
  1686. EXPECT
  1687. /* After [ must be a float. If 2nd thing found is another
  1688. float then this is an old style color_map.
  1689. */
  1690. CASE_FLOAT
  1691. Terms=1;
  1692. Parse_Express(Express,&Terms);
  1693. if (Terms==1)
  1694. {
  1695. Temp_Ent[j].value = Express[0];
  1696. Parse_Colour (Temp_Ent[i].Vals.Colour);
  1697. GET (COLOUR_TOKEN);
  1698. Parse_Colour (Temp_Ent[j].Vals.Colour);
  1699. i += 2;
  1700. j += 2;
  1701. }
  1702. else
  1703. if (Terms==5)
  1704. {
  1705. for (ii=0;ii<5;ii++)
  1706. Temp_Ent[i].Vals.Colour[ii]=(COLC)Express[ii];
  1707. i++;
  1708. j++;
  1709. }
  1710. else
  1711. Error("Illegal expression syntax in color_map.");
  1712. EXIT
  1713. END_CASE
  1714. CASE_COLOUR
  1715. Parse_Colour (Temp_Ent[i].Vals.Colour);
  1716. i++;
  1717. j++;
  1718. EXIT
  1719. END_CASE
  1720. END_EXPECT
  1721. if (j > MAX_BLEND_MAP_ENTRIES)
  1722. Error ("Blend_Map too long.");
  1723. GET (RIGHT_SQUARE_TOKEN);
  1724. END_CASE
  1725. OTHERWISE
  1726. UNGET
  1727. if (i < 1)
  1728. Error ("Must have at least one color in color map.");
  1729. /* Eliminate duplicates */
  1730. for (c = 1, p = 0; c<i; c++)
  1731. {
  1732. if (memcmp(&(Temp_Ent[p]),
  1733. &(Temp_Ent[c]),sizeof(BLEND_MAP_ENTRY)) == 0)
  1734. p--;
  1735. Temp_Ent[++p] = Temp_Ent[c];
  1736. }
  1737. p++;
  1738. New = Create_Blend_Map ();
  1739. New->Number_Of_Entries = p;
  1740. New->Type=COLOUR_TYPE;
  1741. New->Transparency_Flag=TRUE; /*Temp fix. Really set in Post_???*/
  1742. New->Blend_Map_Entries = (BLEND_MAP_ENTRY *)POV_REALLOC(Temp_Ent,sizeof(BLEND_MAP_ENTRY)*p,"blend map entries");
  1743. EXIT
  1744. END_CASE
  1745. END_EXPECT
  1746. EXIT
  1747. END_CASE
  1748. END_EXPECT
  1749. Parse_End ();
  1750. return (New);
  1751. }
  1752. /*****************************************************************************
  1753. *
  1754. * FUNCTION
  1755. *
  1756. * INPUT
  1757. *
  1758. * OUTPUT
  1759. *
  1760. * RETURNS
  1761. *
  1762. * AUTHOR
  1763. *
  1764. * DESCRIPTION
  1765. *
  1766. * CHANGES
  1767. *
  1768. ******************************************************************************/
  1769. char *Parse_String()
  1770. {
  1771. char *temp1, *temp2, *New = NULL, *p;
  1772. char temp3[64];
  1773. char temp4[64];
  1774. DBL val;
  1775. int l,l2,d;
  1776. EXPECT
  1777. CASE(STRING_LITERAL_TOKEN)
  1778. New=(char *)POV_MALLOC(strlen(Token.Token_String) + 1, "temporary string");
  1779. strcpy (New, Token.Token_String);
  1780. EXIT
  1781. END_CASE
  1782. CASE(STR_TOKEN)
  1783. GET (LEFT_PAREN_TOKEN);
  1784. val = Parse_Float();
  1785. Parse_Comma();
  1786. l = (int)Parse_Float();
  1787. Parse_Comma();
  1788. d = (int)Parse_Float();
  1789. GET (RIGHT_PAREN_TOKEN);
  1790. p=temp3;
  1791. *(p++) = '%';
  1792. if (l>0)
  1793. {
  1794. sprintf(p,"%d",l);
  1795. while (*(++p));
  1796. /* Could also be written for clarity as:
  1797. while (*p != '\0')
  1798. p++;
  1799. */
  1800. }
  1801. else
  1802. {
  1803. if (l)
  1804. {
  1805. sprintf(p,"0%d",abs(l));
  1806. while (*(++p));
  1807. }
  1808. }
  1809. if (d>=0)
  1810. {
  1811. *(p++) = '.';
  1812. sprintf(p,"%d",d);
  1813. while (*(++p));
  1814. }
  1815. *(p++) = 'f';
  1816. *p = '\0';
  1817. sprintf(temp4,temp3,val);
  1818. FIX_WATCOM_BUG
  1819. New=(char *)POV_MALLOC(strlen(temp4) + 1, "temporary string");
  1820. strcpy (New, temp4);
  1821. EXIT
  1822. END_CASE
  1823. CASE(CONCAT_TOKEN)
  1824. GET (LEFT_PAREN_TOKEN);
  1825. New=Parse_String();
  1826. EXPECT
  1827. CASE(RIGHT_PAREN_TOKEN)
  1828. EXIT
  1829. END_CASE
  1830. OTHERWISE
  1831. Parse_Comma();
  1832. temp1=New;
  1833. temp2=Parse_String();
  1834. l2=strlen(temp1)+strlen(temp2)+2;
  1835. New=(char *)POV_MALLOC(l2, "temporary string");
  1836. strcpy(New,temp1);
  1837. strcat(New,temp2);
  1838. POV_FREE(temp1);
  1839. POV_FREE(temp2);
  1840. END_CASE
  1841. END_EXPECT
  1842. EXIT
  1843. END_CASE
  1844. CASE(CHR_TOKEN)
  1845. New=(char *)POV_MALLOC(2, "temporary string");
  1846. d=(int)Parse_Float_Param();
  1847. if ((d<0)||(d>255))
  1848. {
  1849. Error("Value %d cannot be used in chr(...).\n",d);
  1850. }
  1851. New[0]=d;
  1852. New[1]='\0';
  1853. EXIT
  1854. END_CASE
  1855. CASE(SUBSTR_TOKEN)
  1856. GET (LEFT_PAREN_TOKEN);
  1857. temp1=Parse_String();
  1858. Parse_Comma();
  1859. l=(int)Parse_Float();
  1860. Parse_Comma();
  1861. d=(int)Parse_Float();
  1862. if ((l+d-1) > strlen(temp1))
  1863. {
  1864. Error("Illegal params in substr(%s,%d,%d).\n",temp1,l,d);
  1865. }
  1866. New=(char *)POV_MALLOC((size_t)(d+1), "temporary string");
  1867. strncpy(New,&(temp1[l-1]),(unsigned)d);
  1868. New[d]='\0';
  1869. POV_FREE(temp1);
  1870. GET (RIGHT_PAREN_TOKEN);
  1871. EXIT
  1872. END_CASE
  1873. CASE(STRUPR_TOKEN)
  1874. GET (LEFT_PAREN_TOKEN);
  1875. New=Parse_String();
  1876. POV_strupr(New);
  1877. GET (RIGHT_PAREN_TOKEN);
  1878. EXIT
  1879. END_CASE
  1880. CASE(STRLWR_TOKEN)
  1881. GET (LEFT_PAREN_TOKEN);
  1882. New=Parse_String();
  1883. POV_strlwr(New);
  1884. GET (RIGHT_PAREN_TOKEN);
  1885. EXIT
  1886. END_CASE
  1887. CASE(STRING_ID_TOKEN)
  1888. New=(char *)POV_MALLOC(strlen((char *)Token.Data) + 1, "temporary string");
  1889. strcpy (New, (char *)Token.Data);
  1890. EXIT
  1891. END_CASE
  1892. OTHERWISE
  1893. Parse_Error_Str ("string expression");
  1894. END_CASE
  1895. END_EXPECT
  1896. return (New);
  1897. }
  1898. /*****************************************************************************
  1899. *
  1900. * FUNCTION
  1901. *
  1902. * INPUT
  1903. *
  1904. * OUTPUT
  1905. *
  1906. * RETURNS
  1907. *
  1908. * AUTHOR
  1909. *
  1910. * DESCRIPTION
  1911. *
  1912. * CHANGES
  1913. *
  1914. ******************************************************************************/
  1915. char *Parse_Formatted_String()
  1916. {
  1917. char *New, *dest, *src, *temp;
  1918. char buff[MAX_STRING_INDEX*2];
  1919. dest = &buff[0];
  1920. temp = src = Parse_String();
  1921. while (*src != '\0')
  1922. {
  1923. switch(*src)
  1924. {
  1925. case '\\':
  1926. switch(*(++src))
  1927. {
  1928. case 'a': *dest=0x07; break;
  1929. case 'b': *dest=0x08; break;
  1930. case 'f': *dest=0x0c; break;
  1931. case 'n': *dest=0x0a; break;
  1932. case 'r': *dest=0x0d; break;
  1933. case 't': *dest=0x09; break;
  1934. case 'v': *dest=0x0b; break;
  1935. case '\0': *dest=0x5c; break;
  1936. case '\'': *dest=0x27; break;
  1937. default: *dest='\\'; dest++; *dest=*src; break;
  1938. }
  1939. break;
  1940. case '%':
  1941. *dest=*src; dest++; *dest=*src;
  1942. break;
  1943. default:
  1944. *dest=*src;
  1945. break;
  1946. }
  1947. src++;
  1948. dest++;
  1949. }
  1950. *dest='\0';
  1951. New=POV_STRDUP(buff);
  1952. POV_FREE(temp);
  1953. return (New);
  1954. }
  1955. /*****************************************************************************
  1956. *
  1957. * FUNCTION
  1958. *
  1959. * INPUT
  1960. *
  1961. * OUTPUT
  1962. *
  1963. * RETURNS
  1964. *
  1965. * AUTHOR
  1966. *
  1967. * DESCRIPTION
  1968. *
  1969. * CHANGES
  1970. *
  1971. ******************************************************************************/
  1972. static void POV_strupr(char *s)
  1973. {
  1974. int i;
  1975. for (i = 0; i < strlen(s); i++)
  1976. {
  1977. s[i] = (char)toupper((int)s[i]);
  1978. }
  1979. }
  1980. /*****************************************************************************
  1981. *
  1982. * FUNCTION
  1983. *
  1984. * INPUT
  1985. *
  1986. * OUTPUT
  1987. *
  1988. * RETURNS
  1989. *
  1990. * AUTHOR
  1991. *
  1992. * DESCRIPTION
  1993. *
  1994. * CHANGES
  1995. *
  1996. ******************************************************************************/
  1997. static void POV_strlwr(char *s)
  1998. {
  1999. int i;
  2000. for (i = 0; i < strlen(s); i++)
  2001. {
  2002. s[i] = (char)tolower((int)s[i]);
  2003. }
  2004. }
  2005. /*****************************************************************************
  2006. *
  2007. * FUNCTION
  2008. *
  2009. * stream_rand
  2010. *
  2011. * INPUT
  2012. *
  2013. * stream - number of random stream
  2014. *
  2015. * OUTPUT
  2016. *
  2017. * RETURNS
  2018. *
  2019. * DBL - random value
  2020. *
  2021. * AUTHOR
  2022. *
  2023. * Dieter Bayer
  2024. *
  2025. * DESCRIPTION
  2026. *
  2027. * Standard pseudo-random function.
  2028. *
  2029. * CHANGES
  2030. *
  2031. * Feb 1996 : Creation.
  2032. * Mar 1996 : Return 2^32 random values instead of 2^16 [AED]
  2033. *
  2034. ******************************************************************************/
  2035. static DBL stream_rand(int stream)
  2036. {
  2037. next_rand[stream] = next_rand[stream] * 1812433253L + 12345L;
  2038. return((DBL)(next_rand[stream] & 0xFFFFFFFFUL) / 0xFFFFFFFFUL);
  2039. }
  2040. /*****************************************************************************
  2041. *
  2042. * FUNCTION
  2043. *
  2044. * stream_seed
  2045. *
  2046. * INPUT
  2047. *
  2048. * seed - Pseudo-random generator start value
  2049. *
  2050. * OUTPUT
  2051. *
  2052. * RETURNS
  2053. *
  2054. * AUTHOR
  2055. *
  2056. * Dieter Bayer
  2057. *
  2058. * DESCRIPTION
  2059. *
  2060. * Set start value for pseudo-random generator.
  2061. *
  2062. * CHANGES
  2063. *
  2064. * Feb 1996 : Creation.
  2065. *
  2066. ******************************************************************************/
  2067. static int stream_seed(int seed)
  2068. {
  2069. next_rand = (unsigned long *)POV_REALLOC(next_rand, (Number_Of_Random_Generators+1)*sizeof(unsigned long), "random number generator");
  2070. next_rand[Number_Of_Random_Generators] = (unsigned long int)seed;
  2071. Number_Of_Random_Generators++;
  2072. return(Number_Of_Random_Generators-1);
  2073. }
  2074. /*****************************************************************************
  2075. *
  2076. * FUNCTION
  2077. *
  2078. * Init_Random_Generators
  2079. *
  2080. * INPUT
  2081. *
  2082. * OUTPUT
  2083. *
  2084. * RETURNS
  2085. *
  2086. * AUTHOR
  2087. *
  2088. * Dieter Bayer
  2089. *
  2090. * DESCRIPTION
  2091. *
  2092. * CHANGES
  2093. *
  2094. * Feb 1996 : Creation.
  2095. *
  2096. ******************************************************************************/
  2097. void Init_Random_Generators()
  2098. {
  2099. Number_Of_Random_Generators = 0;
  2100. next_rand = NULL;
  2101. }
  2102. /*****************************************************************************
  2103. *
  2104. * FUNCTION
  2105. *
  2106. * Destroy_Random_Generators
  2107. *
  2108. * INPUT
  2109. *
  2110. * OUTPUT
  2111. *
  2112. * RETURNS
  2113. *
  2114. * AUTHOR
  2115. *
  2116. * Dieter Bayer
  2117. *
  2118. * DESCRIPTION
  2119. *
  2120. * CHANGES
  2121. *
  2122. * Feb 1996 : Creation.
  2123. *
  2124. ******************************************************************************/
  2125. void Destroy_Random_Generators()
  2126. {
  2127. if (next_rand != NULL)
  2128. {
  2129. POV_FREE(next_rand);
  2130. }
  2131. next_rand = NULL;
  2132. Number_Of_Random_Generators = 0;
  2133. }
  2134. DBL Parse_Signed_Float(void)
  2135. {
  2136. DBL Sign=1.0;
  2137. DBL Val=0.0; /* tw */
  2138. EXPECT
  2139. CASE (PLUS_TOKEN)
  2140. END_CASE
  2141. CASE (DASH_TOKEN)
  2142. Sign=-1.0;
  2143. Get_Token();
  2144. /* Deliberate fall through with no END_CASE */
  2145. CASE (FLOAT_FUNCT_TOKEN)
  2146. if (Token.Function_Id==FLOAT_TOKEN)
  2147. {
  2148. Val = Sign * Token.Token_Float;
  2149. EXIT
  2150. }
  2151. else
  2152. {
  2153. Parse_Error(FLOAT_TOKEN);
  2154. }
  2155. END_CASE
  2156. OTHERWISE
  2157. Parse_Error(FLOAT_TOKEN);
  2158. END_CASE
  2159. END_EXPECT
  2160. return(Val);
  2161. }