home *** CD-ROM | disk | FTP | other *** search
/ Computerworld 1996 March / Computerworld_1996-03_cd.bin / idg_cd3 / grafika / fraktaly / wins1821 / cmdfiles.c < prev    next >
C/C++ Source or Header  |  1996-02-13  |  76KB  |  2,388 lines

  1. /*
  2.     Command-line / Command-File Parser Routines
  3.     This module is linked as an overlay, use ENTER_OVLY and EXIT_OVLY.
  4. */
  5.  
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <float.h>
  10. #include <ctype.h>
  11. #include <time.h>
  12. #ifndef XFRACT
  13. #include <bios.h>
  14. #endif
  15. #include "fractint.h"
  16. #include "fractype.h"
  17. #ifdef __TURBOC__
  18. #include <dir.h>
  19. #endif
  20. #include "prototyp.h"
  21.  
  22. #ifdef XFRACT
  23. #define DEFAULT_PRINTER 5    /* Assume a Postscript printer */
  24. #define PRT_RESOLUTION  100    /* Assume medium resolution    */
  25. #define INIT_GIF87      0    /* Turn on GIF 89a processing  */
  26. #else
  27. #define DEFAULT_PRINTER 2    /* Assume an IBM/Epson printer */
  28. #define PRT_RESOLUTION  60    /* Assume low resolution       */
  29. #define INIT_GIF87      0    /* Turn on GIF 89a processing  */
  30. #endif
  31.  
  32. static int  cmdfile(FILE *,int);
  33. static int  next_command(char *,int,FILE *,char *,int *,int);
  34. static int  next_line(FILE *,char *,int);
  35. int  cmdarg(char *,int);
  36. static void argerror(char *);
  37. static void initvars_run(void);
  38. static void initvars_restart(void);
  39. static void initvars_fractal(void);
  40. static void initvars_3d(void);
  41. static void reset_ifs_defn(void);
  42. static void parse_textcolors(char *value);
  43. static int  parse_colors(char *value);
  44. static int  parse_printer(char *value);
  45.  
  46. /* variables defined by the command line/files processor */
  47. int        showdot;    /* color to show crawling graphics cursor */
  48. char    temp1[256];        /* temporary strings        */
  49. char    readname[80];        /* name of fractal input file */
  50. char    gifmask[13] = {""};
  51. char    PrintName[80]={"fract001.prn"}; /* Name for print-to-file */
  52. char    savename[80]={"fract001"};      /* save files using this name */
  53. char    autoname[80]={"auto.key"};      /* record auto keystrokes here */
  54. int    potflag=0;        /* continuous potential enabled? */
  55. int    pot16bit;        /* store 16 bit continuous potential values */
  56. int    gif87a_flag;        /* 1 if GIF87a format, 0 otherwise */
  57. int     dither_flag;        /* 1 if want to dither GIFs */
  58. int    askvideo;        /* flag for video prompting */
  59. char    floatflag;
  60. int    biomorph;        /* flag for biomorph */
  61. int    usr_biomorph;
  62. int    forcesymmetry;        /* force symmetry */
  63. int    showfile;        /* zero if file display pending */
  64. int    rflag, rseed;        /* Random number seeding flag and value */
  65. int    decomp[2];        /* Decomposition coloring */
  66. int    distest;
  67. int    distestwidth;
  68. char overwrite = 0;    /* 0 if file overwrite not allowed */
  69. int    soundflag;        /* 0 if sound is off, 1 if on */
  70. int    basehertz;        /* sound=x/y/x hertz value */
  71. int    debugflag;        /* internal use only - you didn't see this */
  72. int    timerflag;        /* you didn't see this, either */
  73. int    cyclelimit;        /* color-rotator upper limit */
  74. int    inside;         /* inside color: 1=blue     */
  75. int    fillcolor;         /* fillcolor: -1=normal     */
  76. int    outside;        /* outside color    */
  77. int    finattract;        /* finite attractor logic */
  78. int    display3d;        /* 3D display flag: 0 = OFF */
  79. int    overlay3d;        /* 3D overlay flag: 0 = OFF */
  80. int    init3d[20];        /* '3d=nn/nn/nn/...' values */
  81. int    initbatch;        /* 1 if batch run (no kbd)  */
  82. unsigned initsavetime;        /* autosave minutes        */
  83. double    initorbit[2];        /* initial orbitvalue */
  84. char    useinitorbit;        /* flag for initorbit */
  85. int    initmode;        /* initial video mode        */
  86. int    initcyclelimit;     /* initial cycle limit        */
  87. BYTE usemag;        /* use center-mag corners   */
  88. int    bailout;        /* user input bailout value */
  89. double    inversion[3];        /* radius, xcenter, ycenter */
  90. int    rotate_lo,rotate_hi;    /* cycling color range        */
  91. int far *ranges;        /* iter->color ranges mapping */
  92. int    rangeslen = 0;        /* size of ranges array     */
  93. char far *mapdacbox = NULL;    /* map= (default colors)    */
  94. int    colorstate;        /* 0, dacbox matches default (bios or map=) */
  95.                 /* 1, dacbox matches no known defined map   */
  96.                 /* 2, dacbox matches the colorfile map        */
  97. int    colorpreloaded;     /* if dacbox preloaded for next mode select */
  98. int     save_release;        /* release creating PAR file*/
  99.  
  100. extern int calc_status;
  101. extern int Targa_Overlay;
  102. int Targa_Out = 0;
  103. char    colorfile[80];        /* from last <l> <s> or colors=@filename    */
  104. int functionpreloaded; /* if function loaded for new bifs, JCO 7/5/92 */
  105. float    screenaspect = DEFAULTASPECT;    /* aspect ratio of the screen */
  106.  
  107. /* TARGA+ variables */
  108. int    TPlusFlag;        /* Use the TARGA+ if found  */
  109. int    MaxColorRes;        /* Default Color Resolution if available */
  110. int    PixelZoom;        /* TPlus Zoom Level */
  111. int    NonInterlaced;        /* Non-Interlaced video flag */
  112.  
  113. /* 3D Transparency Variables, MCP 5-30-91 */
  114. double xcoord, ycoord, zcoord, tcoord;
  115. double zzmin, zzmax;        /* initial depth corner values */
  116. double ttmin, ttmax;        /* initial time coordinates */
  117. int Transparent3D, SolidCore, MultiDrawing;
  118. int tpdepth, tptime;
  119. unsigned CoreRed, CoreGreen, CoreBlue, NumFrames;
  120.  
  121. /* AntiAliasing variables, MCP 6-6-91 */
  122. int AntiAliasing, Shadowing;
  123.  
  124. /* Julibrot variables TIW 1/24/93 */
  125. extern double mxmaxfp, mxminfp, mymaxfp, myminfp, originfp;
  126. extern double depthfp, heightfp, widthfp, distfp, eyesfp;
  127. extern int zdots; 
  128.  
  129. extern int lastorbittype, neworbittype;
  130. extern char *juli3Doptions[];
  131. extern int juli3Dmode;
  132. extern struct moreparams far moreparams[];
  133.  
  134. /* inverse julia methods. MVS 3/15/93 */
  135. extern int major_method;
  136. extern int minor_method;
  137.  
  138. int    orbitsave = 0;        /* for IFS and LORENZ to output acrospin file */
  139. int orbit_delay;                /* clock ticks delating orbit release */
  140. extern    int invert;
  141. extern int fractype;        /* fractal type         */
  142. extern double param[];         /* initial parameters        */
  143. extern double xxmin,xxmax;    /* initial corner values    */
  144. extern double yymin,yymax;    /* initial corner values    */
  145. extern double xx3rd,yy3rd;    /* initial corner values    */
  146. extern char usr_stdcalcmode;    /* '1', '2', 'g', 'b'       */
  147. extern int maxit;        /* max iterations        */
  148. extern int usr_periodicitycheck; /* periodicity checking  1=on,0=off */
  149. extern char usr_floatflag;    /* flag for float calcs */
  150. extern int usr_distest;     /* nonzero if distance estimator option */
  151. extern char color_lakes;    /* finite attractor flag */
  152. extern int haze;
  153. extern int RANDOMIZE;
  154. extern int Ambient;
  155. extern char light_name[];
  156. extern int BRIEF;
  157. extern int RAY;
  158. extern int release;
  159.  
  160. extern BYTE back_color[];
  161. extern BYTE dacbox[256][3];
  162. extern struct videoinfo far videotable[];
  163. extern int fpu;
  164. extern int iit;
  165.  
  166. extern double potparam[];    /* potential parameters  */
  167. extern int Printer_Resolution, LPTNumber,
  168.        Printer_Type, Printer_Titleblock,
  169.        Printer_ColorXlat, Printer_SetScreen,
  170.        Printer_SFrequency, Printer_SAngle, Printer_SStyle,
  171.        Printer_RFrequency, Printer_RAngle, Printer_RStyle,
  172.        Printer_GFrequency, Printer_GAngle, Printer_GStyle,
  173.        Printer_BFrequency, Printer_BAngle, Printer_BStyle,
  174.        Printer_Compress,
  175.        EPSFileType, ColorPS,
  176.        Print_To_File,Printer_CRLF;        /* for printer functions */
  177.  
  178. int    transparent[2];     /* transparency min/max values */
  179. int    LogFlag;        /* Logarithmic palette flag: 0 = no */
  180.  
  181. BYTE exitmode = 3;    /* video mode on exit */
  182.  
  183. extern int video_type;
  184. extern int svga_type;           /* for forcing a specific SVGA adapter */
  185. extern int mode7text;
  186. extern int textsafe;
  187. extern int vesa_detect;
  188. char    ai_8514;    /* Flag for using 8514a afi JCO 4/11/92 */
  189.  
  190. int        bios_palette;        /* set to 1 to force BIOS palette updates */
  191. int        escape_exit;         /* set to 1 to avoid the "are you sure?" screen */
  192.  
  193. extern int   viewwindow;
  194. extern float viewreduction;
  195. extern int   viewcrop;
  196. extern float finalaspectratio;
  197. extern int   viewxdots,viewydots;
  198.  
  199. extern char MAP_name[];
  200. extern int mapset;
  201.  
  202. extern int eyeseparation; /* Occular Separation */
  203. extern int glassestype;
  204. extern int xadjust; /* Convergence */
  205. extern int yadjust;
  206. extern int xtrans, ytrans; /* X,Y shift with no perspective */
  207. extern int red_crop_left, red_crop_right;
  208. extern int blue_crop_left, blue_crop_right;
  209. extern int red_bright, blue_bright;
  210. extern char showbox; /* flag to show box and vector in preview */
  211. extern char preview;        /* 3D preview mode flag */
  212. extern int previewfactor; /* Coarsness */
  213.  
  214. int first_init=1;        /* first time into cmdfiles? */
  215. static int init_rseed;
  216. static char initcorners,initparams;
  217. struct fractalspecificstuff far *curfractalspecific;
  218.  
  219. char FormFileName[80];        /* file to find (type=)formulas in */
  220. char FormName[ITEMNAMELEN+1];    /* Name of the Formula (if not null) */
  221. char LFileName[80];        /* file to find (type=)L-System's in */
  222. char LName[ITEMNAMELEN+1];    /* Name of L-System */
  223. char CommandFile[80];        /* file to find command sets in */
  224. char CommandName[ITEMNAMELEN+1];/* Name of Command set */
  225. char far CommandComment1[57];    /* comments for command set */
  226. char far CommandComment2[57];
  227. char far CommandComment3[57];
  228. char far CommandComment4[57];
  229. char IFSFileName[80];        /* file to find (type=)IFS in */
  230. char IFSName[ITEMNAMELEN+1];    /* Name of the IFS def'n (if not null) */
  231. float far *ifs_defn = NULL;    /* ifs parameters */
  232. int  ifs_changed;        /* nonzero if parameters have been edited */
  233. int  ifs_type;            /* 0=2d, 1=3d */
  234. int  slides = 0;        /* 1 autokey=play, 2 autokey=record */
  235.  
  236. BYTE txtcolor[]={
  237.       BLUE*16+L_WHITE,      /* C_TITLE           title background */
  238.       BLUE*16+L_GREEN,      /* C_TITLE_DEV       development vsn foreground */
  239.       GREEN*16+YELLOW,      /* C_HELP_HDG        help page title line */
  240.       WHITE*16+BLACK,      /* C_HELP_BODY       help page body */
  241.       GREEN*16+GRAY,      /* C_HELP_INSTR      help page instr at bottom */
  242.       WHITE*16+BLUE,      /* C_HELP_LINK       help page links */
  243.       CYAN*16+BLUE,      /* C_HELP_CURLINK    help page current link */
  244.       WHITE*16+GRAY,      /* C_PROMPT_BKGRD    prompt/choice background */
  245.       WHITE*16+BLACK,      /* C_PROMPT_TEXT     prompt/choice extra info */
  246.       BLUE*16+WHITE,      /* C_PROMPT_LO       prompt/choice text */
  247.       BLUE*16+L_WHITE,      /* C_PROMPT_MED      prompt/choice hdg2/... */
  248.       BLUE*16+YELLOW,      /* C_PROMPT_HI       prompt/choice hdg/cur/... */
  249.       GREEN*16+L_WHITE,   /* C_PROMPT_INPUT    fullscreen_prompt input */
  250.       CYAN*16+L_WHITE,      /* C_PROMPT_CHOOSE   fullscreen_prompt choice */
  251.       MAGENTA*16+L_WHITE, /* C_CHOICE_CURRENT  fullscreen_choice input */
  252.       BLACK*16+WHITE,      /* C_CHOICE_SP_INSTR speed key bar & instr */
  253.       BLACK*16+L_MAGENTA, /* C_CHOICE_SP_KEYIN speed key value */
  254.       WHITE*16+BLUE,      /* C_GENERAL_HI      tab, thinking, IFS */
  255.       WHITE*16+BLACK,      /* C_GENERAL_MED */
  256.       WHITE*16+GRAY,      /* C_GENERAL_LO */
  257.       BLACK*16+L_WHITE,   /* C_GENERAL_INPUT */
  258.       WHITE*16+BLACK,      /* C_DVID_BKGRD      disk video */
  259.       BLACK*16+YELLOW,      /* C_DVID_HI */
  260.       BLACK*16+L_WHITE,   /* C_DVID_LO */
  261.       RED*16+L_WHITE,      /* C_STOP_ERR        stop message, error */
  262.       GREEN*16+BLACK,      /* C_STOP_INFO       stop message, info */
  263.       BLUE*16+WHITE,      /* C_TITLE_LOW       bottom lines of title screen */
  264.       GREEN*16+BLACK,      /* C_AUTHDIV1        title screen dividers */
  265.       GREEN*16+GRAY,      /* C_AUTHDIV2        title screen dividers */
  266.       BLACK*16+L_WHITE,   /* C_PRIMARY           primary authors */
  267.       BLACK*16+WHITE      /* C_CONTRIB           contributing authors */
  268.       };
  269.  
  270. extern int active_system;
  271. /* start of string literals cleanup */
  272. char s_iter[]    = "iter";
  273. char s_real[]    = "real";
  274. char s_mult[]     = "mult";
  275. char s_sum[]     = "summ";
  276. char s_imag[]    = "imag";
  277. char s_zmag[]    = "zmag";
  278. char s_bof60[]   = "bof60";
  279. char s_bof61[]   = "bof61";
  280. char s_maxiter[] =  "maxiter";
  281. char s_epscross[] =  "epsiloncross";
  282. char s_startrail[] =  "startrail";
  283. char s_normal[] =  "normal";
  284. char s_period[] = "period";
  285. char *s_16bit=           "16bit";
  286. char *s_387=             "387";
  287. char *s_3d=              "3d";
  288. char *s_3dmode=          "3dmode";
  289. char *s_adapter=         "adapter";
  290. char *s_afi=             "afi";
  291. char *s_ambient=         "ambient";
  292. char *s_antialias=       "antialias";
  293. char *s_askvideo=        "askvideo";
  294. char *s_autokey=         "autokey";
  295. char *s_autokeyname=     "autokeyname";
  296. char *s_background=      "background";
  297. char *s_bailout=         "bailout";
  298. char *s_batch=           "batch";
  299. char *s_biomorph=        "biomorph";
  300. char *s_biospalette=     "biospalette";
  301. char *s_brief=           "brief";
  302. char *s_bright=          "bright";
  303. char *s_centermag=       "center-mag";
  304. char *s_cga=             "cga";
  305. char *s_coarse=          "coarse";
  306. char *s_colorps=         "colorps";
  307. char *s_colors=          "colors";
  308. char *s_comport=         "comport";
  309. char *s_converge=        "converge";
  310. char *s_corecolor=       "corecolor";
  311. char *s_corners=         "corners";
  312. char *s_cr=              "cr";
  313. char *s_crlf=            "crlf";
  314. char *s_crop=            "crop";
  315. char *s_cyclelimit=      "cyclelimit";
  316. char *s_cyclerange=      "cyclerange";
  317. char *s_debug=           "debug";
  318. char *s_debugflag=       "debugflag";
  319. char *s_decomp=          "decomp";
  320. char *s_distest=         "distest";
  321. char *s_dither=          "dither";
  322. char *s_ega=             "ega";
  323. char *s_egamono=         "egamono";
  324. char *s_epsf=            "epsf";
  325. char *s_exitmode=        "exitmode";
  326. char *s_exitnoask=       "exitnoask";
  327. char *s_filename=        "filename";
  328. char *s_fillcolor=       "fillcolor";
  329. char *s_filltype=        "filltype";
  330. char *s_finattract=      "finattract";
  331. char *s_float=           "float";
  332. char *s_formulafile=     "formulafile";
  333. char *s_formulaname=     "formulaname";
  334. char *s_fpu=             "fpu";
  335. char *s_fract001prn=    "fract001.prn";
  336. char *s_fullcolor=       "fullcolor";
  337. char *s_function=        "function";
  338. char *s_gif87a=          "gif87a";
  339. char *s_halftone=        "halftone";
  340. char *s_haze=            "haze";
  341. char *s_hertz=           "hertz";
  342. char *s_hgc=             "hgc";
  343. char *s_ifs=             "ifs";
  344. char *s_ifs3d=           "ifs3d";
  345. char *s_ifsfile=         "ifsfile";
  346. char *s_iit=             "iit";
  347. char *s_initorbit=       "initorbit";
  348. char *s_inside=          "inside";
  349. char *s_interocular=     "interocular";
  350. char *s_invert=          "invert";
  351. char *s_iterincr=        "iterincr";
  352. char *s_julibrot3d=      "julibrot3d";
  353. char *s_julibroteyes=    "julibroteyes";
  354. char *s_julibrotfromto=  "julibrotfromto";
  355. char *s_latitude=        "latitude";
  356. char *s_lf=              "lf";
  357. char *s_lfile=           "lfile";
  358. char *s_lightname=       "lightname";
  359. char *s_lightsource=     "lightsource";
  360. char *s_linefeed=        "linefeed";
  361. char *s_lname=           "lname";
  362. char *s_logmap=          "logmap";
  363. char *s_longitude=       "longitude";
  364. char *s_makedoc=         "makedoc";
  365. char *s_makemig=         "makemig";
  366. char *s_map=             "map";
  367. char *s_maxcolorres=     "maxcolorres";
  368. char *s_mcga=            "mcga";
  369. char *s_mdcorners=       "mdcorners";
  370. char *s_miim=            "miim";
  371. char *s_mono=            "mono";
  372. char *s_noiit=           "noiit";
  373. char *s_none=            "none";
  374. char *s_noninterlaced=   "noninterlaced";
  375. char *s_numframes=       "numframes";
  376. char *s_orbitdelay=      "orbitdelay";
  377. char *s_orbitname=       "orbitname";
  378. char *s_orbitsave=       "orbitsave";
  379. char *s_origin=          "origin";
  380. char *s_outside=         "outside";
  381. char *s_overlay=         "overlay";
  382. char *s_overwrite=       "overwrite";
  383. char *s_params=          "params";
  384. char *s_parmfile=        "parmfile";
  385. char *s_passes=          "passes";
  386. char *s_periodicity=     "periodicity";
  387. char *s_perspective=     "perspective";
  388. char *s_pi=              "pi";
  389. char *s_pixel=           "pixel";
  390. char *s_pixelzoom=       "pixelzoom";
  391. char *s_play=            "play";
  392. char *s_plotstyle=       "plotstyle";
  393. char *s_potential=       "potential";
  394. char *s_preview=         "preview";
  395. char *s_printer=         "printer";
  396. char *s_printfile=       "printfile";
  397. char *s_radius=          "radius";
  398. char *s_ramvideo=        "ramvideo";
  399. char *s_randomize=       "randomize";
  400. char *s_ranges=          "ranges";
  401. char *s_ray=             "ray";
  402. char *s_record=          "record";
  403. char *s_release=         "release";
  404. char *s_reset=           "reset";
  405. char *s_rleps=           "rleps";
  406. char *s_rotation=        "rotation";
  407. char *s_roughness=       "roughness";
  408. char *s_rseed=           "rseed";
  409. char *s_savename=        "savename";
  410. char *s_savetime=        "savetime";
  411. char *s_scalexyz=        "scalexyz";
  412. char *s_showbox=         "showbox";
  413. char *s_showdot=         "showdot";
  414. char *s_smoothing=       "smoothing";
  415. char *s_solidcore=       "solidcore";
  416. char *s_sound=           "sound";
  417. char *s_sphere=          "sphere";
  418. char *s_stereo=          "stereo";
  419. char *s_symmetry=        "symmetry";
  420. char *s_targa_out=       "targa_out";
  421. char *s_targa_overlay=   "targa_overlay";
  422. char *s_textcolors=      "textcolors";
  423. char *s_textsafe=        "textsafe";
  424. char *s_title=           "title";
  425. char *s_tplus=           "tplus";
  426. char *s_translate=       "translate";
  427. char *s_transparent=     "transparent";
  428. char *s_transparent3d=   "transparent3d";
  429. char *s_type=            "type";
  430. char *s_vesadetect=      "vesadetect";
  431. char *s_vga=             "vga";
  432. char *s_video=           "video";
  433. char *s_viewwindows=     "viewwindows";
  434. char *s_warn=            "warn";
  435. char *s_waterline=       "waterline";
  436. char *s_xaxis=           "xaxis";
  437. char *s_xyadjust=        "xyadjust";
  438. char *s_xyaxis=          "xyaxis";
  439. char *s_xyshift=         "xyshift";
  440. char *s_yaxis =          "yaxis"; 
  441.  
  442.  
  443. void cmdfiles_overlay() { }    /* for restore_active_ovly */
  444.  
  445. /*
  446.     cmdfiles(argc,argv) process the command-line arguments
  447.         it also processes the 'sstools.ini' file and any
  448.         indirect files ('fractint @myfile')
  449. */
  450.  
  451. int cmdfiles(int argc,char **argv)
  452. {
  453.    int       i;
  454.    char    curarg[141];
  455.    char    tempstring[101];
  456.    char    *sptr;
  457.    FILE    *initfile;
  458.  
  459.    ENTER_OVLY(OVLY_CMDFILES);
  460.  
  461.    if (first_init) initvars_run();    /* once per run initialization */
  462.    initvars_restart();            /* <ins> key initialization */
  463.    initvars_fractal();            /* image initialization */
  464.  
  465.    findpath("sstools.ini", tempstring); /* look for SSTOOLS.INI */
  466.    if (tempstring[0] != 0)        /* found it! */
  467.       if ((initfile = fopen(tempstring,"r")) != NULL)
  468.      cmdfile(initfile,1);        /* process it */
  469.  
  470.    for (i = 1; i < argc; i++) {     /* cycle through args */
  471. #ifdef XFRACT
  472.       /* Let the xfract code take a look at the argument */
  473.       if (unixarg(argc,argv,&i)) continue;
  474. #endif
  475.       strcpy(curarg,argv[i]);
  476.       if (curarg[0] == ';')             /* start of comments? */
  477.      break;
  478.       if (curarg[0] != '@') {           /* simple command? */
  479.      if (strchr(curarg,'=') == NULL) { /* not xxx=yyy, so check for gif */
  480.         strcpy(tempstring,curarg);
  481.         if (strchr(curarg,'.') == NULL)
  482.            strcat(tempstring,".gif");
  483.         if ((initfile = fopen(tempstring,"rb"))) {
  484.            fread(tempstring,6,1,initfile);
  485.            if ( tempstring[0] == 'G'
  486.          && tempstring[1] == 'I'
  487.          && tempstring[2] == 'F'
  488.          && tempstring[3] >= '8' && tempstring[3] <= '9'
  489.          && tempstring[4] >= '0' && tempstring[4] <= '9') {
  490.           strcpy(readname,curarg);
  491.           curarg[0] = showfile = 0;
  492.           }
  493.            fclose(initfile);
  494.            }
  495.         }
  496.      if (curarg[0])
  497.         cmdarg(curarg,0);        /* process simple command */
  498.      }
  499.       else if ((sptr = strchr(curarg,'/'))) { /* @filename/setname? */
  500.      *sptr = 0;
  501.      strcpy(CommandFile,&curarg[1]);
  502.      strcpy(CommandName,sptr+1);
  503.      find_file_item(CommandFile,CommandName,&initfile);
  504.      cmdfile(initfile,3);
  505.      }
  506.       else {                /* @filename */
  507.      if ((initfile = fopen(&curarg[1],"r")) == NULL)
  508.         argerror(curarg);
  509.      cmdfile(initfile,0);
  510.      }
  511.       }
  512.  
  513.    if (first_init == 0) {
  514.       initmode = -1; /* don't set video when <ins> key used */
  515.       showfile = 1;  /* nor startup image file            */
  516.       }
  517.  
  518.    if(debugflag != 110)
  519.        first_init = 0;
  520.    EXIT_OVLY;
  521.    return(0);
  522. }
  523.  
  524.  
  525. int load_commands(FILE *infile)
  526. {
  527.    /* when called, file is open in binary mode, positioned at the */
  528.    /* '(' or '{' following the desired parameter set's name       */
  529.    int ret;
  530.    ENTER_OVLY(OVLY_CMDFILES);
  531.    initcorners = initparams = 0; /* reset flags for type= */
  532.    ret = cmdfile(infile,2);
  533.    EXIT_OVLY;
  534.    return ret;
  535. }
  536.  
  537.  
  538. static void initvars_run()        /* once per run init */
  539. {
  540.    init_rseed = (int)time(NULL);
  541. }
  542.  
  543. static void initvars_restart()        /* <ins> key init */
  544. {
  545.    save_release = release;              /* this release number */
  546.    gif87a_flag = INIT_GIF87;            /* turn on GIF89a processing */
  547.    dither_flag = 0;            /* no dithering */
  548.    askvideo = 1;            /* turn on video-prompt flag */
  549.    overwrite = 0;            /* don't overwrite           */
  550.    soundflag = -1;            /* sound is on             */
  551.    basehertz = 440;            /* basic hertz rate         */
  552.    initbatch = 0;            /* not in batch mode         */
  553.    initsavetime = 0;            /* no auto-save          */
  554.    initmode = -1;            /* no initial video mode     */
  555.    viewwindow = 0;            /* no view window         */
  556.    viewreduction = 4.2;
  557.    viewcrop = 1;
  558.    ai_8514 = 0;                         /* no need for the 8514 API  */
  559.    finalaspectratio = screenaspect;
  560.    viewxdots = viewydots = 0;
  561.    orbit_delay = 0;                     /* full speed orbits */
  562.    debugflag = 0;            /* debugging flag(s) are off */
  563.    timerflag = 0;            /* timer flags are off         */
  564.    strcpy(FormFileName,"fractint.frm"); /* default formula file      */
  565.    FormName[0] = 0;
  566.    strcpy(LFileName,"fractint.l");
  567.    LName[0] = 0;
  568.    strcpy(CommandFile,"fractint.par");
  569.    CommandName[0] = CommandComment1[0] = CommandComment2[0] = 0;
  570.    CommandComment3[0] = CommandComment4[0] = 0;
  571.    strcpy(IFSFileName,"fractint.ifs");
  572.    IFSName[0] = 0;
  573.    reset_ifs_defn();
  574.    rflag = 0;                /* not a fixed srand() seed */
  575.    rseed = init_rseed;
  576.    strcpy(readname,DOTSLASH);           /* initially current directory */
  577.    showfile = 1;
  578.    /* next should perhaps be fractal re-init, not just <ins> ? */
  579.    initcyclelimit=55;            /* spin-DAC default speed limit */
  580.    mapset = 0;                /* no map= name active */
  581.    if (mapdacbox) {
  582.       farmemfree(mapdacbox);
  583.       mapdacbox = NULL;
  584.       }
  585.    TPlusFlag = 1;
  586.    MaxColorRes = 8;
  587.    PixelZoom = 0;
  588.    NonInterlaced = 0;
  589.  
  590.    Transparent3D = 0;
  591.    SolidCore = 1;
  592.    CoreRed   = 128;
  593.    CoreGreen = 128;
  594.    CoreBlue  = 128;
  595.    zzmin = -1.5;
  596.    zzmax = 1.5;
  597.    ttmin = 0.0;
  598.    ttmax = 0.0;
  599.    NumFrames = 1;
  600.    tpdepth = tptime = 0;
  601.  
  602.    AntiAliasing = 0;
  603.    Shadowing = 0;
  604.  
  605.    Printer_Type = DEFAULT_PRINTER;      /* assume an IBM/EPSON    */
  606.    Printer_Resolution = PRT_RESOLUTION; /* assume low resolution  */
  607.    Printer_Titleblock = 0;        /* assume no title block  */
  608.    Printer_ColorXlat = 0;        /* assume positive image  */
  609.    Printer_SetScreen = 0;               /* assume default screen  */
  610.    Printer_SFrequency = 45;             /* New screen frequency K */
  611.    Printer_SAngle = 45;                 /* New screen angle     K */
  612.    Printer_SStyle = 1;                  /* New screen style     K */
  613.    Printer_RFrequency = 45;             /* New screen frequency R */
  614.    Printer_RAngle = 75;                 /* New screen angle     R */
  615.    Printer_RStyle = 1;                  /* New screen style     R */
  616.    Printer_GFrequency = 45;             /* New screen frequency G */
  617.    Printer_GAngle = 15;                 /* New screen angle     G */
  618.    Printer_GStyle = 1;                  /* New screen style     G */
  619.    Printer_BFrequency = 45;             /* New screen frequency B */
  620.    Printer_BAngle = 0;                  /* New screen angle     B */
  621.    Printer_BStyle = 1;                  /* New screen style     B */
  622. #ifndef XFRACT
  623.    Print_To_File = 0;                   /* No print-to-file       */
  624.    Printer_CRLF = 0;                    /* Assume CR+LF           */
  625. #else
  626.    Print_To_File = 1;                   /* Print-to-file          */
  627.    Printer_CRLF = 2;                    /* Assume LF              */
  628.    Printer_Compress = 0;                /* Assume NO PostScript compression */
  629. #endif
  630.    EPSFileType = 0;            /* Assume no save to .EPS */
  631.    LPTNumber = 1;            /* assume LPT1 */
  632.    ColorPS = 0;                         /* Assume NO Color PostScr*/
  633.    major_method = minor_method = 0;    /* default inverse julia methods */
  634. }
  635.  
  636. static void initvars_fractal()        /* init vars affecting calculation */
  637. {
  638.    int i;
  639.    bios_palette = 0;                    /* don't force use of a BIOS palette */
  640.    escape_exit = 0;                     /* don't disable the "are you sure?" screen */
  641.    usr_periodicitycheck = 1;        /* turn on periodicity      */
  642.    inside = 1;                /* inside color = blue      */
  643.    fillcolor = -1;            /* no special fill color */
  644.    usr_biomorph = -1;            /* turn off biomorph flag */
  645.    outside = -1;            /* outside color = -1 (not used) */
  646.    maxit = 150;             /* initial maxiter      */
  647.    usr_stdcalcmode = 'g';               /* initial solid-guessing */
  648. #ifndef XFRACT
  649.    usr_floatflag = 0;            /* turn off the float flag */
  650. #else
  651.    usr_floatflag = 1;            /* turn on the float flag */
  652. #endif
  653.    finattract = 0;            /* disable finite attractor logic */
  654.    fractype = 0;            /* initial type Set flag  */
  655.    curfractalspecific = &fractalspecific[0];
  656.    initcorners = initparams = 0;
  657.    bailout = 0;             /* no user-entered bailout */
  658.    useinitorbit = 0;
  659.    for (i = 0; i < MAXPARAMS; i++) param[i] = 0.0;     /* initial parameter values */
  660.    for (i = 0; i < 3; i++) potparam[i]    = 0.0; /* initial potential values */
  661.    for (i = 0; i < 3; i++) inversion[i] = 0.0;    /* initial invert values */
  662.    initorbit[0] = initorbit[1] = 0.0;    /* initial orbit values */
  663.    invert = 0;
  664.    decomp[0] = decomp[1] = 0;
  665.    usr_distest = 0;
  666.    distestwidth = 71;
  667.    forcesymmetry = 999;         /* symmetry not forced */
  668.    xx3rd = xxmin = -2.5; xxmax = 1.5;    /* initial corner values  */
  669.    yy3rd = yymin = -1.5; yymax = 1.5;    /* initial corner values  */
  670.    pot16bit = potflag = 0;
  671.    LogFlag = 0;             /* no logarithmic palette */
  672.    set_trig_array(0,"sin");             /* trigfn defaults */
  673.    set_trig_array(1,"sqr");
  674.    set_trig_array(2,"sinh");
  675.    set_trig_array(3,"cosh");
  676.    if (rangeslen) {
  677.       farmemfree((char far *)ranges);
  678.       rangeslen = 0;
  679.       }
  680.    usemag = 0;                /* use corners, not center-mag */
  681.  
  682.    colorstate = colorpreloaded = 0;
  683.    rotate_lo = 1; rotate_hi = 255;    /* color cycling default range */
  684.  
  685.    display3d = 0;            /* 3D display is off        */
  686.    overlay3d = 0;            /* 3D overlay is off        */
  687.  
  688.    functionpreloaded = 0; /* for old bifs  JCO 7/5/92 */
  689.    mxminfp = -.83;
  690.    myminfp = -.25;
  691.    mxmaxfp = -.83;
  692.    mymaxfp =  .25;
  693.    originfp = 8;
  694.    heightfp = 7;
  695.    widthfp = 10;
  696.    distfp = 24;
  697.    eyesfp = 2.5;
  698.    depthfp = 8;
  699.    lastorbittype = -1;
  700.    neworbittype = JULIA;
  701.    zdots = 128;
  702.    initvars_3d();
  703. }
  704.  
  705. static void initvars_3d()        /* init vars affecting 3d */
  706. {
  707.    RAY     = 0;
  708.    BRIEF   = 0;
  709.    SPHERE = FALSE;
  710.    preview = 0;
  711.    showbox = 0;
  712.    xadjust = 0;
  713.    yadjust = 0;
  714.    eyeseparation = 0;
  715.    glassestype = 0;
  716.    previewfactor = 20;
  717.    red_crop_left   = 4;
  718.    red_crop_right  = 0;
  719.    blue_crop_left  = 0;
  720.    blue_crop_right = 4;
  721.    red_bright      = 80;
  722.    blue_bright     = 100;
  723.    transparent[0] = transparent[1] = 0; /* no min/max transparency */
  724.    set_3d_defaults();
  725. }
  726.  
  727. static void reset_ifs_defn()
  728. {
  729.    if (ifs_defn) {
  730.       farmemfree((char far *)ifs_defn);
  731.       ifs_defn = NULL;
  732.       }
  733. }
  734.  
  735.  
  736. static int cmdfile(FILE *handle,int mode)
  737.    /* mode = 0 command line @filename          */
  738.    /*         1 sstools.ini              */
  739.    /*         2 <@> command after startup      */
  740.    /*         3 command line @filename/setname */
  741. {
  742.    /* note that cmdfile could be open as text OR as binary */
  743.    /* binary is used in @ command processing for reasonable speed note/point */
  744.    int i;
  745.    int lineoffset = 0;
  746.    int changeflag = 0; /* &1 fractal stuff chgd, &2 3d stuff chgd */
  747.    char linebuf[513],cmdbuf[1001];
  748.    if (mode == 2 || mode == 3) {
  749.       while ((i = getc(handle)) != '{' && i != EOF) { }
  750.       CommandComment1[0] = CommandComment2[0] = 0;
  751.       CommandComment3[0] = CommandComment4[0] = 0;
  752.       }
  753.    linebuf[0] = 0;
  754.    while (next_command(cmdbuf,1000,handle,linebuf,&lineoffset,mode) > 0) {
  755.       if ((mode == 2 || mode == 3) && strcmp(cmdbuf,"}") == 0) break;
  756.       if ((i = cmdarg(cmdbuf,mode)) < 0) break;
  757.       changeflag |= i;
  758.       }
  759.    fclose(handle);
  760. #ifdef XFRACT
  761.    initmode = 0;        /* Skip credits if @file is used. */
  762. #endif
  763.    return changeflag;
  764. }
  765.  
  766. static int next_command(char *cmdbuf,int maxlen,
  767.               FILE *handle,char *linebuf,int *lineoffset,int mode)
  768. {
  769.    int cmdlen = 0;
  770.    char *lineptr;
  771.    lineptr = linebuf + *lineoffset;
  772.    while(1) {
  773.       while (*lineptr <= ' ' || *lineptr == ';') {
  774.      if (cmdlen) {            /* space or ; marks end of command */
  775.         cmdbuf[cmdlen] = 0;
  776.         *lineoffset = lineptr - linebuf;
  777.         return cmdlen;
  778.         }
  779.      while (*lineptr && *lineptr <= ' ')
  780.         ++lineptr;            /* skip spaces and tabs */
  781.      if (*lineptr == ';' || *lineptr == 0) {
  782.         if (*lineptr == ';'
  783.           && (mode == 2 || mode == 3)
  784.           && (CommandComment1[0] == 0 || CommandComment2[0] == 0 ||
  785.               CommandComment3[0] == 0 || CommandComment4[0] == 0)) {
  786.            /* save comment */
  787.            while (*(++lineptr)
  788.          && (*lineptr == ' ' || *lineptr == '\t')) { }
  789.            if (*lineptr) {
  790.           if (strlen(lineptr) > 56)
  791.              *(lineptr+56) = 0;
  792.           if (CommandComment1[0] == 0)
  793.              far_strcpy(CommandComment1,lineptr);
  794.           else if (CommandComment2[0] == 0)
  795.              far_strcpy(CommandComment2,lineptr);
  796.           else if (CommandComment3[0] == 0)
  797.              far_strcpy(CommandComment3,lineptr);
  798.           else
  799.              far_strcpy(CommandComment4,lineptr);
  800.           }
  801.            }
  802.         if (next_line(handle,linebuf,mode) != 0)
  803.            return(-1); /* eof */
  804.         lineptr = linebuf; /* start new line */
  805.         }
  806.      }
  807.       if (*lineptr == '\\'              /* continuation onto next line? */
  808.     && *(lineptr+1) == 0) {
  809.      if (next_line(handle,linebuf,mode) != 0) {
  810.         argerror(cmdbuf);        /* missing continuation */
  811.         return(-1);
  812.         }
  813.      lineptr = linebuf;
  814.      while (*lineptr && *lineptr <= ' ')
  815.         ++lineptr;            /* skip white space @ start next line */
  816.      continue;            /* loop to check end of line again */
  817.      }
  818.       cmdbuf[cmdlen] = *(lineptr++);    /* copy character to command buffer */
  819.       if (++cmdlen >= maxlen) {     /* command too long? */
  820.      argerror(cmdbuf);
  821.      return(-1);
  822.      }
  823.       }
  824. }
  825.  
  826. static int next_line(FILE *handle,char *linebuf,int mode)
  827. {
  828.    int toolssection;
  829.    char tmpbuf[10];
  830.    toolssection = 0;
  831.    while (file_gets(linebuf,512,handle) >= 0) {
  832.       if (mode == 1 && linebuf[0] == '[') {     /* check for [fractint] */
  833.      strncpy(tmpbuf,&linebuf[1],9);
  834.      tmpbuf[9] = 0;
  835.      strlwr(tmpbuf);
  836.      toolssection = strncmp(tmpbuf,"fractint]",9);
  837.      continue;                /* skip tools section heading */
  838.      }
  839.       if (toolssection == 0) return(0);
  840.       }
  841.    return(-1);
  842. }
  843.  
  844. /*
  845.   cmdarg(string,mode) processes a single command-line/command-file argument
  846.     return:
  847.       -1 error, >= 0 ok
  848.       if ok, return value:
  849.     | 1 means fractal parm has been set
  850.     | 2 means 3d parm has been set
  851.     | 4 means 3d=yes specified
  852.     | 8 means reset specified
  853. */
  854.  
  855. int cmdarg(char *curarg,int mode) /* process a single argument */
  856. {
  857.    char    variable[21];        /* variable name goes here   */
  858.    char    *value;            /* pointer to variable value */
  859.    int       valuelen;            /* length of value         */
  860.    int       numval;            /* numeric value of arg      */
  861. #define NONNUMERIC -32767
  862.    char    charval;            /* first character of arg    */
  863.    int       yesnoval;            /* 0 if 'n', 1 if 'y', -1 if not */
  864.    double  ftemp;
  865.    int       i, j, k, l;
  866.    char    *argptr,*argptr2;
  867.    int       totparms;            /* # of / delimited parms    */
  868.    int       intparms;            /* # of / delimited ints     */
  869.    int       floatparms;            /* # of / delimited floats   */
  870.    int       intval[64];            /* pre-parsed integer parms  */
  871.    double  floatval[16];        /* pre-parsed floating parms */
  872.    char    tmpc;
  873.    int       lastarg;
  874.  
  875.    argptr = curarg;
  876.    while (*argptr) {            /* convert to lower case */
  877.       if (*argptr >= 'A' && *argptr <= 'Z')
  878.      *argptr += 'a' - 'A';
  879.       if (*argptr == '=' && strncmp(curarg,"colors=",7) == 0)
  880.      break;             /* don't convert colors=value */
  881.       ++argptr;
  882.       }
  883.  
  884.    if ((value = strchr(&curarg[1],'='))) {
  885.       if ((j = (value++) - curarg) > 1 && curarg[j-1] == ':')
  886.      --j;                /* treat := same as =      */
  887.       }
  888.    else
  889.       value = curarg + (j = strlen(curarg));
  890.    if (j > 20) goto badarg;        /* keyword too long */
  891.    strncpy(variable,curarg,j);        /* get the variable name  */
  892.    variable[j] = 0;            /* truncate variable name */
  893.    valuelen = strlen(value);        /* note value's length    */
  894.    charval = value[0];            /* first letter of value  */
  895.    yesnoval = -1;            /* note yes|no value      */
  896.    if (charval == 'n') yesnoval = 0;
  897.    if (charval == 'y') yesnoval = 1;
  898.  
  899.    argptr = value;
  900.    numval = totparms = intparms = floatparms = 0;
  901.    while (*argptr) {            /* count and pre-parse parms */
  902.       long ll;
  903.       lastarg = 0;
  904.       if ((argptr2 = strchr(argptr,'/')) == NULL) {     /* find next '/' */
  905.      argptr2 = argptr + strlen(argptr);
  906.      *argptr2 = '/';
  907.      lastarg = 1;
  908.      }
  909.       if (totparms == 0) numval = NONNUMERIC;
  910.       i = -1;
  911.       charval = *argptr;            /* first letter of value  */
  912.       if (charval == 'n') yesnoval = 0;    /* allows only ONE y/n param */
  913.       if (charval == 'y') yesnoval = 1;
  914.       if (sscanf(argptr,"%c%c",&j,&tmpc) > 0    /* NULL entry */
  915.       && (j == '/' || j == '=') && tmpc == '/') {
  916.      j = 0;
  917.      ++floatparms; ++intparms;
  918.      if (totparms < 16) floatval[totparms] = j;
  919.      if (totparms < 64) intval[totparms] = j;
  920.      if (totparms == 0) numval = j;
  921.      }
  922.       else if (sscanf(argptr,"%ld%c",&ll,&tmpc) > 0       /* got an integer */
  923.     && tmpc == '/') {        /* needs a long int, ll, here for lyapunov */
  924.      ++floatparms; ++intparms;
  925.      if (totparms < 16) floatval[totparms] = ll;
  926.      if (totparms < 64) intval[totparms] = (int)ll;
  927.      if (totparms == 0) numval = (int)ll;
  928.      }
  929. #ifndef XFRACT
  930.       else if (sscanf(argptr,"%lg%c",&ftemp,&tmpc) > 0  /* got a float */
  931. #else
  932.       else if (sscanf(argptr,"%lf%c",&ftemp,&tmpc) > 0  /* got a float */
  933. #endif
  934.          && tmpc == '/') {
  935.      ++floatparms;
  936.      if (totparms < 16) floatval[totparms] = ftemp;
  937.      }
  938.       ++totparms;
  939.       argptr = argptr2;                 /* on to the next */
  940.       if (lastarg)
  941.      *argptr = 0;
  942.       else
  943.      ++argptr;
  944.       }
  945.  
  946.    if (mode != 2 || debugflag==110) {
  947.       /* these commands are allowed only at startup */
  948.  
  949.       if (strcmp(variable,s_batch) == 0 ) {     /* batch=?      */
  950.      if (yesnoval < 0) goto badarg;
  951. #ifdef XFRACT
  952.          initmode = yesnoval?0:-1; /* skip credits for batch mode */
  953. #endif
  954.      initbatch = yesnoval;
  955.      return 3;
  956.      }
  957.  
  958. #ifndef XFRACT
  959.       if (strcmp(variable,s_adapter) == 0 ) {   /* adapter==?     */
  960.          int i, j;
  961.          extern char supervga_list;    /* from the list in VIDEO.ASM */
  962.          char adapter_name[8];      /* entry lenth from VIDEO.ASM */
  963.          char *adapter_ptr;
  964.          
  965.          adapter_ptr = &supervga_list;
  966.          
  967.          for(i = 0 ; ; i++) {        /* find the SuperVGA entry */
  968.              memcpy(adapter_name , adapter_ptr, 8);
  969.              adapter_name[6] = ' ';
  970.              for (j = 0; j < 8; j++)
  971.                  if(adapter_name[j] == ' ')
  972.                      adapter_name[j] = 0;
  973.              if (adapter_name[0] == 0) break;  /* end-of-the-list */
  974.              if (strncmp(value,adapter_name,strlen(adapter_name)) == 0) {
  975.                 svga_type = i+1;
  976.                 adapter_ptr[6] = 1;
  977.                 break;
  978.                 }
  979.              adapter_ptr += 8;
  980.              }
  981.          if (svga_type != 0) return 3;
  982.  
  983.      video_type = 5;            /* assume video=vga */
  984.      if (strcmp(value,s_egamono) == 0) {
  985.         video_type = 3;
  986.         mode7text = 1;
  987.         }
  988.      else if (strcmp(value,s_hgc) == 0) {   /* video = hgc */
  989.         video_type = 1;
  990.         mode7text = 1;
  991.         }
  992.      else if (strcmp(value,s_ega) == 0)     /* video = ega */
  993.         video_type = 3;
  994.      else if (strcmp(value,s_cga) == 0)     /* video = cga */
  995.         video_type = 2;
  996.      else if (strcmp(value,s_mcga) == 0)    /* video = mcga */
  997.         video_type = 4;
  998.      else if (strcmp(value,s_vga) == 0)     /* video = vga */
  999.         video_type = 5;
  1000.      else
  1001.         goto badarg;
  1002.      return 3;
  1003.      }
  1004.  
  1005.       if (strcmp(variable,s_afi) == 0) {
  1006.        if (strncmp(value,"8514"  ,4) == 0
  1007.            || charval == 'y') ai_8514 = 1; /* set afi flag JCO 4/11/92 */
  1008.        return 3;
  1009.     }
  1010.  
  1011.       if (strcmp(variable,s_textsafe) == 0 ) {  /* textsafe==? */
  1012.      if (first_init) {
  1013.         if (charval == 'n') /* no */
  1014.            textsafe = 2;
  1015.         else if (charval == 'y') /* yes */
  1016.            textsafe = 1;
  1017.         else if (charval == 'b') /* bios */
  1018.            textsafe = 3;
  1019.         else if (charval == 's') /* save */
  1020.            textsafe = 4;
  1021.         else
  1022.            goto badarg;
  1023.         }   
  1024.      return 3;
  1025.      }
  1026.  
  1027.       if (strcmp(variable,s_vesadetect) == 0) {
  1028.      if (yesnoval < 0) goto badarg;
  1029.      vesa_detect = yesnoval;
  1030.      return 3;
  1031.      }
  1032.  
  1033.       if (strcmp(variable,s_biospalette) == 0) {
  1034.          if (yesnoval < 0) goto badarg;
  1035.          bios_palette = yesnoval;
  1036.          return 3;
  1037.          }
  1038.  
  1039.       if (strcmp(variable,s_fpu) == 0) {
  1040.      if (strcmp(value,s_iit) == 0) {
  1041.         fpu = 387;
  1042.         iit = 1;
  1043.         return 0;
  1044.         }
  1045.      if (strcmp(value,s_noiit) == 0) {
  1046.         iit = -2;
  1047.         return 0;
  1048.         }
  1049.      if (strcmp(value,s_387) == 0) {
  1050.         fpu = 387;
  1051.         iit = -2;
  1052.         return 0;
  1053.         }
  1054.      goto badarg;
  1055.      }
  1056. #endif
  1057.  
  1058.       if (strcmp(variable,s_exitnoask) == 0) {
  1059.          if (yesnoval < 0) goto badarg;
  1060.          escape_exit = yesnoval;
  1061.          return 3;
  1062.          }
  1063.  
  1064.       if (strcmp(variable,s_makedoc) == 0) {
  1065.      print_document(*value ? value : "fractint.doc", makedoc_msg_func, 0);
  1066. #ifndef WINFRACT
  1067.      goodbye();
  1068. #endif
  1069.      }
  1070.  
  1071.       } /* end of commands allowed only at startup */
  1072.  
  1073.    if (strcmp(variable,s_reset) == 0) {
  1074.       initvars_fractal();
  1075.  
  1076.       /* PAR release unknown unless specified */
  1077.       if (numval>=0) save_release = numval;
  1078.       else goto badarg;
  1079.       return 9;
  1080.       }
  1081.  
  1082.    if (strcmp(variable,s_filename) == 0) {      /* filename=?     */
  1083.       if (charval == '.') {
  1084.      if (valuelen > 4) goto badarg;
  1085.      gifmask[0] = '*';
  1086.      gifmask[1] = 0;
  1087.      strcat(gifmask,value);
  1088.      return 0;
  1089.      }
  1090.       if (valuelen > 79) goto badarg;
  1091.       if (mode == 2 && display3d == 0) /* can't do this in @ command */
  1092.      goto badarg;
  1093.       strcpy(readname,value);
  1094.       showfile = 0;
  1095.       return 3;
  1096.       }
  1097.  
  1098.    if (strcmp(variable,s_video) == 0) {         /* video=? */
  1099.       if (active_system == 0) {
  1100.      if ((k = check_vidmode_keyname(value)) == 0) goto badarg;
  1101.      initmode = -1;
  1102.      for (i = 0; i < MAXVIDEOTABLE; ++i) {
  1103.         if (videotable[i].keynum == k) {
  1104.            initmode = i;
  1105.            break;
  1106.            }
  1107.         }
  1108.      if (initmode == -1) goto badarg;
  1109.      }
  1110.       return 3;
  1111.       }
  1112.  
  1113.    if (strcmp(variable,s_map) == 0 ) {         /* map=, set default colors */
  1114.       if (valuelen > 79 || SetColorPaletteName(value) != 0) goto badarg;
  1115.       mapset = 1;
  1116.       strcpy(MAP_name,value);
  1117.       return 0;
  1118.       }
  1119.  
  1120.    if (strcmp(variable,s_colors) == 0) {       /* colors=, set current colors */
  1121.       if (parse_colors(value) < 0) goto badarg;
  1122.       return 0;
  1123.       }
  1124.  
  1125.    if (strcmp(variable,s_tplus) == 0) {       /* Use the TARGA+ if found? */
  1126.       if (yesnoval < 0) goto badarg;
  1127.       TPlusFlag = yesnoval;
  1128.       return 0;
  1129.       }
  1130.  
  1131.    if (strcmp(variable,s_noninterlaced) == 0) {
  1132.       if (yesnoval < 0) goto badarg;
  1133.       NonInterlaced = yesnoval;
  1134.       return 0;
  1135.       }
  1136.  
  1137.    if (strcmp(variable,s_maxcolorres) == 0) { /* Change default color resolution */
  1138.       if (numval == 1 || numval == 4 || numval == 8 ||
  1139.             numval == 16 || numval == 24) {
  1140.      MaxColorRes = numval;
  1141.      return 0;
  1142.      }
  1143.       goto badarg;
  1144.       }
  1145.  
  1146.    if (strcmp(variable,s_pixelzoom) == 0) {
  1147.       if (numval < 5)
  1148.      PixelZoom = numval;
  1149.       return 0;
  1150.       }
  1151.  
  1152.    /* keep this for backward compatibility */
  1153.    if (strcmp(variable,s_warn) == 0 ) {         /* warn=? */
  1154.       if (yesnoval < 0) goto badarg;
  1155.       overwrite = yesnoval ^ 1;
  1156.       return 0;
  1157.       }
  1158.    if (strcmp(variable,s_overwrite) == 0 ) {    /* overwrite=? */
  1159.       if (yesnoval < 0) goto badarg;
  1160.       overwrite = yesnoval;
  1161.       return 0;
  1162.       }
  1163.  
  1164.    if (strcmp(variable,s_gif87a) == 0 ) {       /* gif87a=? */
  1165.       if (yesnoval < 0) goto badarg;
  1166.       gif87a_flag = yesnoval;
  1167.       return 0;
  1168.       }
  1169.  
  1170.    if (strcmp(variable,s_dither) == 0 ) {       /* dither=? */
  1171.       if (yesnoval < 0) goto badarg;
  1172.       dither_flag = yesnoval;
  1173.       return 0;
  1174.       }
  1175.  
  1176.    if (strcmp(variable,s_savetime) == 0) {      /* savetime=? */
  1177.       initsavetime = numval;
  1178.       return 0;
  1179.       }
  1180.  
  1181.    if (strcmp(variable,s_autokey) == 0) {       /* autokey=? */
  1182.       if (strcmp(value,s_record)==0)
  1183.      slides=2;
  1184.       else if (strcmp(value,s_play)==0)
  1185.      slides=1;
  1186.       else
  1187.      goto badarg;
  1188.       return 0;
  1189.       }
  1190.  
  1191.    if(strcmp(variable,s_solidcore) == 0) {
  1192.       SolidCore = yesnoval;
  1193.       return(0);
  1194.       }
  1195. /* (nuked until antialiasing become an option)
  1196.    if(strcmp(variable,s_antialias) == 0) {
  1197.       if(numval < 0 || numval > 8)
  1198.      goto badarg;
  1199.       AntiAliasing = numval;
  1200.       return(0);
  1201.       }
  1202. */
  1203.    if(strcmp(variable,s_transparent3d) == 0) {
  1204.       Transparent3D = yesnoval;
  1205.       return(0);
  1206.       }
  1207.  
  1208.    if(strcmp(variable,s_corecolor) == 0) {
  1209.       if(floatparms != totparms || totparms != 3)
  1210.      goto badarg;
  1211.       CoreRed    = (int)floatval[0];
  1212.       CoreGreen = (int)floatval[1];
  1213.       CoreBlue    = (int)floatval[2];
  1214.       return(0);
  1215.       }
  1216.  
  1217.    if(strcmp(variable,s_mdcorners) == 0) {
  1218.       if(floatparms != totparms || totparms < 2 || totparms > 4)
  1219.      goto badarg;
  1220.       zzmin = floatval[0];
  1221.       zzmax = floatval[1];
  1222.       if(totparms >= 3)
  1223.      ttmin = floatval[2];
  1224.       if(totparms == 4)
  1225.      ttmax = floatval[3];
  1226.       return(0);
  1227.       }
  1228.  
  1229.    if(strcmp(variable,s_numframes) == 0) {
  1230.       NumFrames = numval;
  1231.       return(0);
  1232.       }
  1233.  
  1234.    if (strcmp(variable,s_autokeyname) == 0) {   /* autokeyname=? */
  1235.       strcpy(autoname,value);
  1236.       return 0;
  1237.       }
  1238.  
  1239.    if (strcmp(variable,s_type) == 0 ) {         /* type=? */
  1240.       if (value[valuelen-1] == '*')
  1241.      value[--valuelen] = 0;
  1242.       /* kludge because type ifs3d has an asterisk in front */
  1243.       if(strcmp(value,s_ifs3d)==0)
  1244.          value[3]=0;
  1245.       for (k = 0; fractalspecific[k].name != NULL; k++)
  1246.      if (strcmp(value,fractalspecific[k].name) == 0)
  1247.         break;
  1248.       if (fractalspecific[k].name == NULL) goto badarg;
  1249.       curfractalspecific = &fractalspecific[fractype = k];
  1250.       if (initcorners == 0) {
  1251.      xx3rd = xxmin = curfractalspecific->xmin;
  1252.      xxmax           = curfractalspecific->xmax;
  1253.      yy3rd = yymin = curfractalspecific->ymin;
  1254.      yymax           = curfractalspecific->ymax;
  1255.      }
  1256.       if (initparams == 0) {
  1257.      for (k = 0; k < 4; ++k) {
  1258.         param[k] = curfractalspecific->paramvalue[k];
  1259.         if(fractype != CELLULAR) /* don't round cellular */
  1260.            roundfloatd(¶m[k]);
  1261.       }
  1262.          if(curfractalspecific->flags&MORE) {
  1263.             int extra;
  1264.             if((extra=find_extra_param(fractype)) > -1)
  1265.             for(i=0;i<MAXPARAMS-4;i++) {
  1266.                param[i+4] = moreparams[extra].paramvalue[i];
  1267.            }
  1268.          }
  1269.       }   
  1270.       return 1;
  1271.       }
  1272.    if (strcmp(variable,s_inside) == 0 ) {       /* inside=? */
  1273.       if(strcmp(value,s_zmag)==0)
  1274.      inside = -59;
  1275.       else if(strcmp(value,s_bof60)==0)
  1276.      inside = -60;
  1277.       else if(strcmp(value,s_bof61)==0)
  1278.      inside = -61;
  1279.       else if(strncmp(value,s_epscross,3)==0)
  1280.      inside = -100;
  1281.       else if(strncmp(value,s_startrail,4)==0)
  1282.      inside = -101;
  1283.       else if(strncmp(value,s_period,3)==0)
  1284.      inside = -102;
  1285.       else if(strcmp(value,s_maxiter)==0)
  1286.      inside = -1;
  1287.       else if(numval == NONNUMERIC)
  1288.      goto badarg;
  1289.       else
  1290.      inside = numval;
  1291.       return 1;
  1292.       }
  1293.    if (strcmp(variable,s_fillcolor) == 0 ) {       /* fillcolor */
  1294.       if(strcmp(value,s_normal)==0)
  1295.      fillcolor = -1;
  1296.       else if(numval == NONNUMERIC)
  1297.      goto badarg;
  1298.       else
  1299.      fillcolor = numval;
  1300.       return 1;
  1301.       }
  1302.  
  1303.    if (strcmp(variable,s_finattract) == 0 ) {   /* finattract=? */
  1304.       if (yesnoval < 0) goto badarg;
  1305.       finattract = yesnoval;
  1306.       return 1;
  1307.       }
  1308.  
  1309.    if (strcmp(variable,s_function) == 0) {      /* function=?,? */
  1310.       k = 0;
  1311.       while (*value && k < 4) {
  1312.      if(set_trig_array(k++,value)) goto badarg;
  1313.      if ((value = strchr(value,'/')) == NULL) break;
  1314.      ++value;
  1315.      }
  1316.        functionpreloaded = 1; /* for old bifs  JCO 7/5/92 */
  1317.       return 1;
  1318.       }
  1319.  
  1320.    if (strcmp(variable,s_outside) == 0 ) {      /* outside=? */
  1321.       if(strcmp(value,s_iter)==0)
  1322.      outside = -1;
  1323.       else if(strcmp(value,s_real)==0)
  1324.      outside = -2;
  1325.       else if(strcmp(value,s_imag)==0)
  1326.      outside = -3;
  1327.       else if(strcmp(value,s_mult)==0)
  1328.      outside = -4;
  1329.       else if(strcmp(value,s_sum)==0)
  1330.      outside = -5;
  1331.  
  1332.       else if(numval == NONNUMERIC)
  1333.      goto badarg;
  1334.       else if(numval < -5 || numval > 255) goto badarg;
  1335.       else outside = numval;
  1336.       return 1;
  1337.       }
  1338.  
  1339.    if (strcmp(variable,s_maxiter) == 0) {       /* maxiter=? */
  1340.       if (numval < 2) goto badarg;
  1341.       maxit = numval;
  1342.       return 1;
  1343.       }
  1344.  
  1345.    if (strcmp(variable,s_iterincr) == 0)        /* iterincr=? */
  1346.       return 0;
  1347.  
  1348.    if (strcmp(variable,s_passes) == 0) {        /* passes=? */
  1349.       if ( charval != '1' && charval != '2'
  1350.     && charval != 'g' && charval != 'b'
  1351.     && charval != 't')
  1352.      goto badarg;
  1353.       usr_stdcalcmode = charval;
  1354.       return 1;
  1355.       }
  1356.  
  1357.    if (strcmp(variable,s_cyclelimit) == 0 ) {   /* cyclelimit=? */
  1358.       if (numval <= 1 || numval > 256) goto badarg;
  1359.       initcyclelimit = numval;
  1360.       return 0;
  1361.       }
  1362.  
  1363.    if (strcmp(variable,s_makemig) == 0) {
  1364.        int xmult, ymult;
  1365.        if (totparms < 2) goto badarg;
  1366.        xmult = intval[0];
  1367.        ymult = intval[1];
  1368.        make_mig(xmult, ymult);
  1369. #ifndef WINFRACT
  1370.        exit(0);
  1371. #endif
  1372.        }
  1373.  
  1374.    if (strcmp(variable,s_cyclerange) == 0) {
  1375.       if (totparms < 2) intval[1] = 255;
  1376.       if (totparms < 1) intval[0] = 1;
  1377.       if (totparms != intparms
  1378.     || intval[0] < 0 || intval[1] > 255 || intval[0] > intval[1])
  1379.      goto badarg;
  1380.       rotate_lo = intval[0];
  1381.       rotate_hi = intval[1];
  1382.       return 0;
  1383.       }
  1384.  
  1385.    if (strcmp(variable,s_ranges) == 0) {
  1386.       int i,j,entries,prev;
  1387.       int tmpranges[128];
  1388.       if (totparms != intparms) goto badarg;
  1389.       entries = prev = i = 0;
  1390.       while (i < totparms) {
  1391.      if ((j = intval[i++]) < 0) { /* striping */
  1392.         if ((j = 0-j) < 1 || j >= 16384 || i >= totparms) goto badarg;
  1393.         tmpranges[entries++] = -1; /* {-1,width,limit} for striping */
  1394.         tmpranges[entries++] = j;
  1395.         j = intval[i++];
  1396.         }
  1397.      if (j < prev) goto badarg;
  1398.      tmpranges[entries++] = prev = j;
  1399.      }
  1400.       if (prev == 0) goto badarg;
  1401.       if ((ranges = (int far *)farmemalloc(2L*entries)) == NULL) {
  1402.      static char far msg[] = {"Insufficient memory for ranges="};
  1403.      stopmsg(0,msg);
  1404.      return(-1);
  1405.      }
  1406.       rangeslen = entries;
  1407.       for (i = 0; i < rangeslen; ++i)
  1408.      ranges[i] = tmpranges[i];
  1409.       return 1;
  1410.       }
  1411.  
  1412.    if (strcmp(variable,s_savename) == 0) {      /* savename=? */
  1413.       if (valuelen > 79) goto badarg;
  1414.       if (first_init || mode == 2)
  1415.      strcpy(savename,value);
  1416.       return 0;
  1417.       }
  1418.  
  1419.    if (strcmp(variable,s_exitmode) == 0) {      /* exitmode=? */
  1420.       sscanf(value,"%x",&numval);
  1421.       exitmode = numval;
  1422.       return 0;
  1423.       }
  1424.  
  1425.    if (strcmp(variable,s_textcolors) == 0) {
  1426.       parse_textcolors(value);
  1427.       return 0;
  1428.       }
  1429.  
  1430.    if (strcmp(variable,s_potential) == 0) {     /* potential=? */
  1431.       k = 0;
  1432.       while (k < 3 && *value) {
  1433.          if(k==1)
  1434.         potparam[k] = atof(value);
  1435.      else
  1436.         potparam[k] = atoi(value);
  1437.      k++;
  1438.        if ((value = strchr(value,'/')) == NULL) k = 99;
  1439.      ++value;
  1440.      }
  1441.       pot16bit = 0;
  1442.       if (k < 99) {
  1443.      if (strcmp(value,s_16bit)) goto badarg;
  1444.      pot16bit = 1;
  1445.      }
  1446.       return 1;
  1447.       }
  1448.  
  1449.    if (strcmp(variable,s_params) == 0) {        /* params=?,? */
  1450.       if (totparms != floatparms || totparms > MAXPARAMS)
  1451.      goto badarg;
  1452.       for (k = 0; k < MAXPARAMS; ++k)
  1453.      param[k] = (k < totparms) ? floatval[k] : 0.0;
  1454.       initparams = 1;
  1455.       return 1;
  1456.       }
  1457.  
  1458.    if (strcmp(variable,s_miim) == 0) {        /* miim=?[/?[/?[/?]]] */
  1459.       k = 0;
  1460.       do {
  1461.      if (isdigit(*value) ||
  1462.          *value == '.' || *value == '-' || *value == '+') {
  1463.         if (k >= 4)
  1464.            goto badarg;
  1465.         param[k++] = atof(value);
  1466.      }
  1467.      else if (strncmp(value, "breadth", 7) == 0)
  1468.         major_method = 0;
  1469.      else if (strncmp(value, "depth",   5) == 0)
  1470.         major_method = 1;
  1471.      else if (strncmp(value, "walk",    4) == 0)
  1472.         major_method = 2;
  1473.      else if (strncmp(value, "run",     3) == 0)
  1474.         major_method = 3;
  1475.      else if (strncmp(value, "left",    4) == 0)
  1476.         minor_method = 0;
  1477.      else if (strncmp(value, "right",   5) == 0)
  1478.         minor_method = 1;
  1479.      else goto badarg;
  1480.      value = strchr(value, '/');
  1481.       } while (value++);
  1482.       return 1;
  1483.    }
  1484.  
  1485.    if (strcmp(variable,s_initorbit) == 0) {     /* initorbit=?,? */
  1486.       if(strcmp(value,s_pixel)==0)
  1487.      useinitorbit = 2;
  1488.       else {
  1489.      if (totparms != 2 || floatparms != 2) goto badarg;
  1490.      initorbit[0] = floatval[0];
  1491.      initorbit[1] = floatval[1];
  1492.      useinitorbit = 1;
  1493.      }
  1494.       return 1;
  1495.       }
  1496.  
  1497.    if (strcmp(variable,s_orbitname) == 0 ) {         /* orbitname=? */
  1498.       if(check_orbit_name(value))
  1499.          goto badarg;
  1500.       return 1;
  1501.       }
  1502.    if (strcmp(variable,s_3dmode) == 0 ) {         /* orbitname=? */
  1503.       int i,j;
  1504.       j = -1;
  1505.       for(i=0;i<4;i++)
  1506.          if(strcmp(value,juli3Doptions[i])==0)
  1507.             j = i; 
  1508.       if(j < 0)
  1509.          goto badarg;
  1510.       else
  1511.          juli3Dmode = j;
  1512.       return 1;
  1513.       }
  1514.  
  1515.    if (strcmp(variable,s_julibrot3d) == 0) {       /* julibrot3d=?,?,?,? */
  1516.       if (floatparms != totparms)
  1517.      goto badarg;
  1518.       if(totparms > 0)
  1519.          zdots = floatval[0];
  1520.       if (totparms > 1)
  1521.          originfp = floatval[1];
  1522.       if (totparms > 2)
  1523.          depthfp = floatval[2];
  1524.       if (totparms > 3)
  1525.          heightfp = floatval[3];
  1526.       if (totparms > 4)
  1527.          widthfp = floatval[4];
  1528.       if (totparms > 5)
  1529.          distfp = floatval[5];
  1530.       return 1;
  1531.       }
  1532.  
  1533.    if (strcmp(variable,s_julibroteyes) == 0) {       /* julibroteyes=?,?,?,? */
  1534.       if (floatparms != totparms || totparms != 1)
  1535.      goto badarg;
  1536.       eyesfp =  floatval[0];
  1537.       return 1;
  1538.       }
  1539.  
  1540.    if (strcmp(variable,s_julibrotfromto) == 0) {       /* julibrotfromto=?,?,?,? */
  1541.       if (floatparms != totparms || totparms != 4)
  1542.      goto badarg;
  1543.       mxmaxfp = floatval[0];
  1544.       mxminfp = floatval[1];
  1545.       mymaxfp = floatval[2];
  1546.       myminfp = floatval[3];
  1547.       return 1;
  1548.       }
  1549.  
  1550.    if (strcmp(variable,s_corners) == 0) {       /* corners=?,?,?,? */
  1551.       if (fractype == CELLULAR)
  1552.           return 1; /* skip setting the corners */
  1553.       if (floatparms != totparms || (totparms != 4 && totparms != 6))
  1554.      goto badarg;
  1555.       usemag = 0;
  1556.       initcorners = 1;
  1557.       xx3rd = xxmin = floatval[0];
  1558.       xxmax =          floatval[1];
  1559.       yy3rd = yymin = floatval[2];
  1560.       yymax =          floatval[3];
  1561.       if (totparms == 6) {
  1562.      xx3rd =      floatval[4];
  1563.      yy3rd =      floatval[5];
  1564.      }
  1565.       return 1;
  1566.       }
  1567.  
  1568.    if (strcmp(variable,s_viewwindows) == 0) {  /* viewwindows=?,?,?,?,? */
  1569.       if (totparms > 5 || floatparms-intparms > 2 || intparms > 4)
  1570.      goto badarg;
  1571.       viewwindow = 1;
  1572.       viewreduction = 4.2;  /* reset default values */
  1573.       finalaspectratio = screenaspect;
  1574.       viewcrop = 1; /* yes */
  1575.       viewxdots = viewydots = 0;
  1576.  
  1577.       if((totparms > 0) && (floatval[0] > 0.001))
  1578.         viewreduction = floatval[0];
  1579.       if((totparms > 1) && (floatval[1] > 0.001))
  1580.         finalaspectratio = floatval[1];
  1581.       if((totparms > 2) && (yesnoval == 0))
  1582.         viewcrop = yesnoval;
  1583.       if((totparms > 3) && (intval[3] > 0))
  1584.         viewxdots = intval[3];
  1585.       if((totparms == 5) && (intval[4] > 0))
  1586.         viewydots = intval[4];
  1587.       return 1;
  1588.       }
  1589.  
  1590.    if (strcmp(variable,s_centermag) == 0) {    /* center-mag=?,?,? */
  1591.       double Xctr, Yctr,Magnification,Ratio,Height, Width,Radius;
  1592.       if (totparms != floatparms
  1593.     || (totparms != 0 && totparms != 3)
  1594.     || (totparms == 3 && floatval[2] <= 0.0))
  1595.      goto badarg;
  1596.       usemag = 1;
  1597.       if (totparms == 0) return 0;
  1598.       initcorners = 1;
  1599.       Xctr = floatval[0];
  1600.       Yctr = floatval[1];
  1601.       Magnification = floatval[2];
  1602.       Radius = 1.0 / Magnification;
  1603.       Ratio = .75;    /* inverse aspect ratio of screen  */
  1604.       /* calculate bounds */
  1605.       Height = 2.0 * Radius;
  1606.       Width = Height / Ratio;
  1607.       yymax = Yctr + Radius;
  1608.       yy3rd = yymin = Yctr - Radius;
  1609.       xxmax = Xctr + Width / 2.0;
  1610.       xx3rd = xxmin = Xctr - Width / 2.0;
  1611.       return 1;
  1612.       }
  1613.  
  1614.    if (strcmp(variable,s_invert) == 0) {        /* invert=?,?,? */
  1615.       if (totparms != floatparms || (totparms != 1 && totparms != 3))
  1616.      goto badarg;
  1617.       invert = ((inversion[0] = floatval[0]) != 0.0) ? totparms : 0;
  1618.       if (totparms == 3) {
  1619.      inversion[1] = floatval[1];
  1620.      inversion[2] = floatval[2];
  1621.      }
  1622.       return 1;
  1623.       }
  1624.  
  1625.    if (strcmp(variable,s_askvideo) == 0 ) {     /* askvideo=?   */
  1626.       if (yesnoval < 0) goto badarg;
  1627.       askvideo = yesnoval;
  1628.       return 0;
  1629.       }
  1630.  
  1631.    if (strcmp(variable,s_ramvideo) == 0 )       /* ramvideo=?   */
  1632.       return 0; /* just ignore and return, for old time's sake */
  1633.  
  1634.    if (strcmp(variable,s_float) == 0 ) {        /* float=? */
  1635.       if (yesnoval < 0) goto badarg;
  1636.       usr_floatflag = yesnoval;
  1637.       return 3;
  1638.       }
  1639.  
  1640.    if (strcmp(variable,s_biomorph) == 0 ) {     /* biomorph=? */
  1641.       usr_biomorph = numval;
  1642.       return 1;
  1643.       }
  1644.  
  1645.    if (strcmp(variable,s_orbitsave) == 0 ) {     /* orbitsave=? */
  1646.       if (yesnoval < 0) goto badarg;
  1647.       orbitsave = yesnoval;
  1648.       return 1;
  1649.       }
  1650.  
  1651.    if (strcmp(variable,s_bailout) == 0 ) {      /* bailout=? */
  1652.       if (numval < 4 || numval > 32000) goto badarg;
  1653.       bailout = numval;
  1654.       return 1;
  1655.       }
  1656.  
  1657.    if (strcmp(variable,s_symmetry) == 0 ) {     /* symmetry=? */
  1658.       if     (strcmp(value,s_xaxis )==0) forcesymmetry = XAXIS;
  1659.       else if(strcmp(value,s_yaxis )==0) forcesymmetry = YAXIS;
  1660.       else if(strcmp(value,s_xyaxis)==0) forcesymmetry = XYAXIS;
  1661.       else if(strcmp(value,s_origin)==0) forcesymmetry = ORIGIN;
  1662.       else if(strcmp(value,s_pi    )==0) forcesymmetry = PI_SYM;
  1663.       else if(strcmp(value,s_none  )==0) forcesymmetry = NOSYM;
  1664.       else goto badarg;
  1665.       return 1;
  1666.       }
  1667.  
  1668.    if (strcmp(variable,s_printer) == 0 ) {      /* printer=? */
  1669.       if (parse_printer(value) < 0) goto badarg;
  1670.       return 0;
  1671.       }
  1672.  
  1673.    if (strcmp(variable,s_printfile) == 0) {     /* print-to-file? SWT */
  1674.       if (valuelen > 79) goto badarg;
  1675.       Print_To_File = 1;
  1676.       strcpy(PrintName,value);
  1677.       return 0;
  1678.       }
  1679.    if(strcmp(variable,s_rleps) == 0) {
  1680.       Printer_Compress = yesnoval;
  1681.       return(0);
  1682.       }
  1683.    if(strcmp(variable,s_colorps) == 0) {
  1684.       ColorPS = yesnoval;
  1685.       return(0);
  1686.       }
  1687.  
  1688.    if (strcmp(variable,s_epsf) == 0) {          /* EPS type? SWT */
  1689.       Print_To_File = 1;
  1690.       EPSFileType = numval;
  1691.       Printer_Type = 5;
  1692.       if (strcmp(PrintName,s_fract001prn)==0)
  1693.      strcpy(PrintName,"fract001.eps");
  1694.       return 0;
  1695.       }
  1696.  
  1697.    if (strcmp(variable,s_title) == 0) {         /* Printer title block? SWT */
  1698.       if (yesnoval < 0) goto badarg;
  1699.       Printer_Titleblock = yesnoval;
  1700.       return 0;
  1701.       }
  1702.  
  1703.    if (strcmp(variable,s_translate) == 0) {     /* Translate color? SWT */
  1704.       Printer_ColorXlat=0;
  1705.       if (charval == 'y')
  1706.      Printer_ColorXlat=1;
  1707.       else if (numval > 1 || numval < -1)
  1708.      Printer_ColorXlat=numval;
  1709.       return 0;
  1710.       }
  1711.  
  1712.    if (strcmp(variable,s_plotstyle) == 0) {     /* plot style? SWT */
  1713.       Printer_SStyle = numval;
  1714.       return 0;
  1715.       }
  1716.  
  1717.    if (strcmp(variable,s_halftone) == 0) {      /* New halftoning? SWT */
  1718.       if (totparms != intparms) goto badarg;
  1719.       Printer_SetScreen=1;
  1720.       if ((totparms >  0) && ( intval[ 0] >= 0))
  1721.                       Printer_SFrequency = intval[ 0];
  1722.       if ((totparms >  1) && ( intval[ 1] >= 0))
  1723.                       Printer_SAngle     = intval[ 1];
  1724.       if ((totparms >  2) && ( intval[ 2] >= 0))
  1725.                       Printer_SStyle     = intval[ 2];
  1726.       if ((totparms >  3) && ( intval[ 3] >= 0))
  1727.                       Printer_RFrequency = intval[ 3];
  1728.       if ((totparms >  4) && ( intval[ 4] >= 0))
  1729.                       Printer_RAngle     = intval[ 4];
  1730.       if ((totparms >  5) && ( intval[ 5] >= 0))
  1731.                       Printer_RStyle     = intval[ 5];
  1732.       if ((totparms >  6) && ( intval[ 6] >= 0))
  1733.                       Printer_GFrequency = intval[ 6];
  1734.       if ((totparms >  7) && ( intval[ 7] >= 0))
  1735.                       Printer_GAngle     = intval[ 7];
  1736.       if ((totparms >  8) && ( intval[ 8] >= 0))
  1737.                       Printer_GStyle     = intval[ 8];
  1738.       if ((totparms >  9) && ( intval[ 9] >= 0))
  1739.                       Printer_BFrequency = intval[ 9];
  1740.       if ((totparms > 10) && ( intval[10] >= 0))
  1741.                       Printer_BAngle     = intval[10];
  1742.       if ((totparms > 11) && ( intval[11] >= 0))
  1743.                       Printer_BStyle     = intval[11];
  1744.       return 0;
  1745.       }
  1746.  
  1747.    if (strcmp(variable,s_linefeed) == 0) {      /* Use LF for printer */
  1748.       if      (strcmp(value,s_cr)   == 0) Printer_CRLF = 1;
  1749.       else if (strcmp(value,s_lf)   == 0) Printer_CRLF = 2;
  1750.       else if (strcmp(value,s_crlf) == 0) Printer_CRLF = 0;
  1751.       else goto badarg;
  1752.       return 0;
  1753.       }
  1754.  
  1755.    if (strcmp(variable,s_comport) == 0 ) {      /* Set the COM parameters */
  1756.       if ((value=strchr(value,'/')) == NULL) goto badarg;
  1757.       switch (atoi(++value)) {
  1758.      case 110:  l = 0;   break;
  1759.      case 150:  l = 32;  break;
  1760.      case 300:  l = 64;  break;
  1761.      case 600:  l = 96;  break;
  1762.      case 1200: l = 128; break;
  1763.      case 2400: l = 160; break;
  1764.      case 4800: l = 192; break;
  1765.      case 9600:
  1766.      default:   l = 224; break;
  1767.      }
  1768.       if ((value=strchr(value,'/')) == NULL) goto badarg;
  1769.       for (k=0; k < strlen(value); k++) {
  1770.      switch (value[k]) {
  1771.         case '7':  l |= 2;  break;
  1772.         case '8':  l |= 3;  break;
  1773.         case 'o':  l |= 8;  break;
  1774.         case 'e':  l |= 24; break;
  1775.         case '2':  l |= 4;  break;
  1776.         }
  1777.      }
  1778. #ifndef XFRACT
  1779. #ifndef WINFRACT
  1780.       _bios_serialcom(0,numval-1,l);
  1781. #endif
  1782. #endif
  1783.       return 0;
  1784.       }
  1785.  
  1786.    if (strcmp(variable,s_sound) == 0 ) {        /* sound=? */
  1787.       soundflag = 0;
  1788.       if (strncmp(value,"ye",2) == 0) {
  1789.      soundflag = -1;
  1790.      return(0);
  1791.      }
  1792.       if (charval == 'x')
  1793.      soundflag = 1;
  1794.       if (charval == 'y')
  1795.      soundflag = 2;
  1796.       if (charval == 'z')
  1797.      soundflag = 3;
  1798.       return 0;
  1799.       }
  1800.  
  1801.    if (strcmp(variable,s_hertz) == 0) {         /* Hertz=? */
  1802.       if (numval < 200 || numval > 10000) goto badarg;
  1803.       basehertz = numval;
  1804.       return 0;
  1805.       }
  1806.  
  1807.    if (strcmp(variable,s_periodicity) == 0 ) {  /* periodicity=? */
  1808.       usr_periodicitycheck=1;
  1809.       if ((charval == 'n') || (numval == 0))
  1810.      usr_periodicitycheck=0;
  1811.       else if (charval == 'y')
  1812.      usr_periodicitycheck=1;
  1813.       else if (charval == 's')   /* 's' for 'show' */
  1814.      usr_periodicitycheck= -1;
  1815.       else if(numval == NONNUMERIC)
  1816.      goto badarg;
  1817.       else if(numval != 0)
  1818.      usr_periodicitycheck=numval;
  1819.       return 1;
  1820.       }
  1821.  
  1822.    if (strcmp(variable,s_logmap) == 0 ) {       /* logmap=? */
  1823.       if (charval == 'y')
  1824.      LogFlag = 1;                /* palette is logarithmic */
  1825.       else if (charval == 'n')
  1826.      LogFlag = 0;
  1827.       else if (charval == 'o')
  1828.      LogFlag = -1;                /* old log palette */
  1829.       else
  1830.      LogFlag = numval;
  1831.       return 1;
  1832.       }
  1833.  
  1834.    if (strcmp(variable,s_debugflag) == 0
  1835.      || strcmp(variable,s_debug) == 0) {        /* internal use only */
  1836.       debugflag = numval;
  1837.       timerflag = debugflag & 1;        /* separate timer flag */
  1838.       debugflag -= timerflag;
  1839.       return 0;
  1840.       }
  1841.  
  1842.    if (strcmp(variable,s_rseed) == 0) {
  1843.       rseed = numval;
  1844.       rflag = 1;
  1845.       return 1;
  1846.       }
  1847.  
  1848.    if (strcmp(variable,s_orbitdelay) == 0) {
  1849.       orbit_delay = numval;
  1850.       return 0;
  1851.       }
  1852.  
  1853.    if (strcmp(variable,s_showdot) == 0) {
  1854.       showdot=numval;
  1855.       if(showdot<0)
  1856.          showdot=0;
  1857.       return 0;
  1858.       }
  1859.  
  1860.    if (strcmp(variable,s_decomp) == 0) {
  1861.       if (totparms != intparms || totparms < 1) goto badarg;
  1862.       decomp[0] = intval[0];
  1863.       decomp[1] = 0;
  1864.       if (totparms > 1) /* backward compatibility */
  1865.      bailout = decomp[1] = intval[1];
  1866.       return 1;
  1867.       }
  1868.  
  1869.    if (strcmp(variable,s_distest) == 0) {
  1870.       if (totparms != intparms || totparms < 1) goto badarg;
  1871.       usr_distest = intval[0];
  1872.       distestwidth = 71;
  1873.       if (totparms > 1)
  1874.      distestwidth = intval[1];
  1875.       return 1;
  1876.       }
  1877.  
  1878.    if (strcmp(variable,s_formulafile) == 0) {   /* formulafile=? */
  1879.       if (valuelen > 79) goto badarg;
  1880.       strcpy(FormFileName,value);
  1881.       return 1;
  1882.       }
  1883.  
  1884.    if (strcmp(variable,s_formulaname) == 0) {   /* formulaname=? */
  1885.       if (valuelen > ITEMNAMELEN) goto badarg;
  1886.       strcpy(FormName,value);
  1887.       return 1;
  1888.       }
  1889.  
  1890.    if (strcmp(variable,s_lfile) == 0) {
  1891.       if (valuelen > 79) goto badarg;
  1892.       strcpy(LFileName,value);
  1893.       return 1;
  1894.       }
  1895.  
  1896.    if (strcmp(variable,s_lname) == 0) {
  1897.       if (valuelen > ITEMNAMELEN) goto badarg;
  1898.       strcpy(LName,value);
  1899.       return 1;
  1900.       }
  1901.  
  1902.    if (strcmp(variable,s_ifsfile) == 0) {
  1903.       if (valuelen > 79) goto badarg;
  1904.       strcpy(IFSFileName,value);
  1905.       reset_ifs_defn();
  1906.       return 1;
  1907.       }
  1908.  
  1909.    if (strcmp(variable,s_ifs) == 0
  1910.      || strcmp(variable,s_ifs3d) == 0) {        /* ifs3d for old time's sake */
  1911.       if (valuelen > ITEMNAMELEN) goto badarg;
  1912.       strcpy(IFSName,value);
  1913.       reset_ifs_defn();
  1914.       return 1;
  1915.       }
  1916.  
  1917.    if (strcmp(variable,s_parmfile) == 0) {
  1918.       if (valuelen > 79) goto badarg;
  1919.       strcpy(CommandFile,value);
  1920.       return 0;
  1921.       }
  1922.  
  1923.    if (strcmp(variable,s_stereo) == 0) {        /* stereo=? */
  1924.       if ((numval<0) || (numval>3)) goto badarg;
  1925.       glassestype = numval;
  1926.       return 3;
  1927.       }
  1928.  
  1929.    if (strcmp(variable,s_rotation) == 0) {      /* rotation=?/?/? */
  1930.       if (totparms != 3 || intparms != 3) goto badarg;
  1931.       XROT = intval[0];
  1932.       YROT = intval[1];
  1933.       ZROT = intval[2];
  1934.       return 3;
  1935.       }
  1936.  
  1937.    if (strcmp(variable,s_perspective) == 0) {   /* perspective=? */
  1938.       if (numval == NONNUMERIC) goto badarg;
  1939.       ZVIEWER = numval;
  1940.       return 3;
  1941.       }
  1942.  
  1943.    if (strcmp(variable,s_xyshift) == 0) {       /* xyshift=?/?  */
  1944.       if (totparms != 2 || intparms != 2) goto badarg;
  1945.       XSHIFT = intval[0];
  1946.       YSHIFT = intval[1];
  1947.       return 3;
  1948.       }
  1949.  
  1950.    if (strcmp(variable,s_interocular) == 0) {   /* interocular=? */
  1951.       eyeseparation = numval;
  1952.       return 3;
  1953.       }
  1954.  
  1955.    if (strcmp(variable,s_converge) == 0) {      /* converg=? */
  1956.       xadjust = numval;
  1957.       return 3;
  1958.       }
  1959.  
  1960.    if (strcmp(variable,s_crop) == 0) {          /* crop=? */
  1961.       if (totparms != 4 || intparms != 4
  1962.     || intval[0] < 0 || intval[0] > 100
  1963.     || intval[1] < 0 || intval[1] > 100
  1964.     || intval[2] < 0 || intval[2] > 100
  1965.     || intval[3] < 0 || intval[3] > 100)
  1966.       goto badarg;
  1967.       red_crop_left   = intval[0];
  1968.       red_crop_right  = intval[1];
  1969.       blue_crop_left  = intval[2];
  1970.       blue_crop_right = intval[3];
  1971.       return 3;
  1972.       }
  1973.  
  1974.    if (strcmp(variable,s_bright) == 0) {        /* bright=? */
  1975.       if (totparms != 2 || intparms != 2) goto badarg;
  1976.       red_bright  = intval[0];
  1977.       blue_bright = intval[1];
  1978.       return 3;
  1979.       }
  1980.  
  1981.    if (strcmp(variable,s_xyadjust) == 0) {      /* trans=? */
  1982.       if (totparms != 2 || intparms != 2) goto badarg;
  1983.       xtrans = intval[0];
  1984.       ytrans = intval[1];
  1985.       return 3;
  1986.       }
  1987.  
  1988.    if (strcmp(variable,s_3d) == 0) {            /* 3d=?/?/..    */
  1989.       if(strcmp(value,s_overlay)==0) {
  1990.          yesnoval=1;
  1991.          if(calc_status > -1) /* if no image, treat same as 3D=yes */
  1992.             overlay3d=1;
  1993.       }      
  1994.       else if (yesnoval < 0) goto badarg;
  1995.       display3d = yesnoval;
  1996.       initvars_3d();
  1997.       return (display3d) ? 6 : 2;
  1998.       }
  1999.  
  2000.    if (strcmp(variable,s_sphere) == 0 ) {       /* sphere=? */
  2001.       if (yesnoval < 0) goto badarg;
  2002.       SPHERE = yesnoval;
  2003.       return 2;
  2004.       }
  2005.  
  2006.    if (strcmp(variable,s_scalexyz) == 0) {      /* scalexyz=?/?/? */
  2007.       if (totparms < 2 || intparms != totparms) goto badarg;
  2008.       XSCALE = intval[0];
  2009.       YSCALE = intval[1];
  2010.       if (totparms > 2) ROUGH = intval[2];
  2011.       return 2;
  2012.       }
  2013.  
  2014.    /* "rough" is really scale z, but we add it here for convenience */
  2015.    if (strcmp(variable,s_roughness) == 0) {     /* roughness=?  */
  2016.       ROUGH = numval;
  2017.       return 2;
  2018.       }
  2019.  
  2020.    if (strcmp(variable,s_waterline) == 0) {     /* waterline=?  */
  2021.       if (numval<0) goto badarg;
  2022.       WATERLINE = numval;
  2023.       return 2;
  2024.       }
  2025.  
  2026.    if (strcmp(variable,s_filltype) == 0) {      /* filltype=?   */
  2027.       if (numval < -1 || numval > 6) goto badarg;
  2028.       FILLTYPE = numval;
  2029.       return 2;
  2030.       }
  2031.  
  2032.    if (strcmp(variable,s_lightsource) == 0) {   /* lightsource=?/?/? */
  2033.       if (totparms != 3 || intparms != 3) goto badarg;
  2034.       XLIGHT = intval[0];
  2035.       YLIGHT = intval[1];
  2036.       ZLIGHT = intval[2];
  2037.       return 2;
  2038.       }
  2039.  
  2040.    if (strcmp(variable,s_smoothing) == 0) {     /* smoothing=?  */
  2041.       if (numval<0) goto badarg;
  2042.       LIGHTAVG = numval;
  2043.       return 2;
  2044.       }
  2045.  
  2046.    if (strcmp(variable,s_latitude) == 0) {      /* latitude=?/? */
  2047.       if (totparms != 2 || intparms != 2) goto badarg;
  2048.       THETA1 = intval[0];
  2049.       THETA2 = intval[1];
  2050.       return 2;
  2051.       }
  2052.  
  2053.    if (strcmp(variable,s_longitude) == 0) {     /* longitude=?/? */
  2054.       if (totparms != 2 || intparms != 2) goto badarg;
  2055.       PHI1 = intval[0];
  2056.       PHI2 = intval[1];
  2057.       return 2;
  2058.       }
  2059.  
  2060.    if (strcmp(variable,s_radius) == 0) {        /* radius=? */
  2061.       if (numval < 0) goto badarg;
  2062.       RADIUS = numval;
  2063.       return 2;
  2064.       }
  2065.  
  2066.    if (strcmp(variable,s_transparent) == 0) {   /* transparent? */
  2067.       if (totparms != intparms || totparms < 1) goto badarg;
  2068.       transparent[1] = transparent[0] = intval[0];
  2069.       if (totparms > 1) transparent[1] = intval[1];
  2070.       return 2;
  2071.       }
  2072.  
  2073.    if (strcmp(variable,s_preview) == 0) {       /* preview? */
  2074.       if (yesnoval < 0) goto badarg;
  2075.       preview = yesnoval;
  2076.       return 2;
  2077.       }
  2078.  
  2079.    if (strcmp(variable,s_showbox) == 0) {       /* showbox? */
  2080.       if (yesnoval < 0) goto badarg;
  2081.       showbox = yesnoval;
  2082.       return 2;
  2083.       }
  2084.  
  2085.    if (strcmp(variable,s_coarse) == 0) {        /* coarse=? */
  2086.       if (numval < 3 || numval > 2000) goto badarg;
  2087.       previewfactor = numval;
  2088.       return 2;
  2089.       }
  2090.  
  2091.    if (strcmp(variable,s_randomize) == 0) {     /* RANDOMIZE=? */
  2092.       if (numval<0 || numval>7) goto badarg;
  2093.       RANDOMIZE = numval;
  2094.       return 2;
  2095.       }
  2096.  
  2097.    if (strcmp(variable,s_ambient) == 0) {       /* ambient=? */
  2098.       if (numval<0||numval>100) goto badarg;
  2099.       Ambient = numval;
  2100.       return 2;
  2101.       }
  2102.  
  2103.    if (strcmp(variable,s_haze) == 0) {          /* haze=? */
  2104.       if (numval<0||numval>100) goto badarg;
  2105.       haze = numval;
  2106.       return 2;
  2107.       }
  2108.  
  2109.    if (strcmp(variable,s_fullcolor) == 0) {     /* fullcolor=? */
  2110.       if (yesnoval < 0) goto badarg;
  2111.       Targa_Out = yesnoval;
  2112.       return 2;
  2113.       }
  2114.    if (strcmp(variable,s_targa_out) == 0) {     /* Targa Out? */
  2115.       if (yesnoval < 0) goto badarg;
  2116.       Targa_Out = yesnoval;
  2117.       return 2;
  2118.       }
  2119.  
  2120.    if (strcmp(variable,s_targa_overlay) == 0) {         /* Targa Overlay? */
  2121.       if (yesnoval < 0) goto badarg;
  2122.       Targa_Overlay = yesnoval;
  2123.       return 2;
  2124.       }
  2125.  
  2126.    if (strcmp(variable,s_background) == 0) {     /* background=?/? */
  2127.       if (totparms != 3 || intparms != 3) goto badarg;
  2128.                 for (i=0;i<3;i++)
  2129.                         if (intval[i] & 0xff)
  2130.                                 goto badarg;
  2131.       back_color[0] = intval[0];
  2132.       back_color[1] = intval[1];
  2133.       back_color[2] = intval[2];
  2134.       return 2;
  2135.       }
  2136.  
  2137.    if (strcmp(variable,s_lightname) == 0) {     /* lightname=?   */
  2138.       if (valuelen > 79) goto badarg;
  2139.       if (first_init || mode == 2)
  2140.      strcpy(light_name,value);
  2141.       return 0;
  2142.       }
  2143.  
  2144.    if (strcmp(variable,s_ray) == 0) {           /* RAY=? */
  2145.       if (numval < 0 || numval > 6) goto badarg;
  2146.       RAY = numval;
  2147.       return 2;
  2148.       }
  2149.  
  2150.    if (strcmp(variable,s_brief) == 0) {         /* BRIEF? */
  2151.       if (yesnoval < 0) goto badarg;
  2152.       BRIEF = yesnoval;
  2153.       return 2;
  2154.       }
  2155.  
  2156.    if (strcmp(variable,s_release) == 0) {       /* release */
  2157.       if (numval < 0) goto badarg;
  2158.  
  2159.       save_release = numval;
  2160.       return 2;
  2161.       }
  2162.  
  2163.  
  2164. badarg:
  2165.    argerror(curarg);
  2166.    return(-1);
  2167.  
  2168. }
  2169.  
  2170. /* Some routines broken out of above so compiler doesn't run out of heap: */
  2171.  
  2172. static void parse_textcolors(char *value)
  2173. {
  2174.    int i,j,k,hexval;
  2175.    if (strcmp(value,s_mono) == 0) {
  2176.       for (k = 0; k < sizeof(txtcolor); ++k)
  2177.      txtcolor[k] = BLACK*16+WHITE;
  2178.    /* C_HELP_CURLINK = C_PROMPT_INPUT = C_CHOICE_CURRENT = C_GENERAL_INPUT
  2179.              = C_AUTHDIV1 = C_AUTHDIV2 = WHITE*16+BLACK; */
  2180.       txtcolor[6] = txtcolor[12] = txtcolor[13] = txtcolor[14] = txtcolor[20]
  2181.           = txtcolor[27] = txtcolor[28] = WHITE*16+BLACK;
  2182.       /* C_TITLE = C_HELP_HDG = C_HELP_LINK = C_PROMPT_HI = C_CHOICE_SP_KEYIN
  2183.          = C_GENERAL_HI = C_DVID_HI = C_STOP_ERR
  2184.          = C_STOP_INFO = BLACK*16+L_WHITE; */
  2185.       txtcolor[0] = txtcolor[2] = txtcolor[5] = txtcolor[11] = txtcolor[16]
  2186.           = txtcolor[17] = txtcolor[22] = txtcolor[24]
  2187.           = txtcolor[25] = BLACK*16+L_WHITE;
  2188.       }
  2189.    else {
  2190.       k = 0;
  2191.       while ( k < sizeof(txtcolor)) {
  2192.      if (*value == 0) break;
  2193.      if (*value != '/') {
  2194.         sscanf(value,"%x",&hexval);
  2195.         i = (hexval / 16) & 7;
  2196.         j = hexval & 15;
  2197.         if (i == j || (i == 0 && j == 8)) /* force contrast */
  2198.            j = 15;
  2199.         txtcolor[k] = i * 16 + j;
  2200.         if ((value = strchr(value,'/')) == NULL) break;
  2201.         }
  2202.      ++value;
  2203.      ++k;
  2204.      }
  2205.       }
  2206. }
  2207.  
  2208. static int parse_colors(char *value)
  2209. {
  2210.    int i,j,k;
  2211.    if (*value == '@') {
  2212.       if (strlen(value) > 80 || ValidateLuts(&value[1]) != 0) goto badcolor;
  2213.       if (display3d) {
  2214.         mapset = 1;
  2215.         strcpy(MAP_name,&value[1]);
  2216.         }
  2217.       else {
  2218.         strcpy(colorfile,&value[1]);
  2219.         colorstate = 2;
  2220.         }
  2221.       }
  2222.    else {
  2223.       int smooth;
  2224.       i = smooth = 0;
  2225.       while (*value) {
  2226.      if (i >= 256) goto badcolor;
  2227.      if (*value == '<') {
  2228.         if (i == 0 || smooth
  2229.           || (smooth = atoi(value+1)) < 2
  2230.           || (value = strchr(value,'>')) == NULL)
  2231.            goto badcolor;
  2232.         i += smooth;
  2233.         ++value;
  2234.         }
  2235.      else {
  2236.         for (j = 0; j < 3; ++j) {
  2237.            if ((k = *(value++)) < '0')  goto badcolor;
  2238.            else if (k <= '9')       k -= '0';
  2239.            else if (k < 'A')            goto badcolor;
  2240.            else if (k <= 'Z')       k -= ('A'-10);
  2241.            else if (k < '_' || k > 'z') goto badcolor;
  2242.            else            k -= ('_'-36);
  2243.            dacbox[i][j] = k;
  2244.            if (smooth) {
  2245.           int start,spread,cnum;
  2246.           start = i - (spread = smooth + 1);
  2247.           cnum = 0;
  2248.           if ((k - (int)dacbox[start][j]) == 0) {
  2249.              while (++cnum < spread)
  2250.             dacbox[start+cnum][j] = k;
  2251.              }
  2252.           else {
  2253.              while (++cnum < spread)
  2254.             dacbox[start+cnum][j] =
  2255.                ( cnum         *dacbox[i][j]
  2256.                + (i-(start+cnum))*dacbox[start][j]
  2257.                + spread/2 )
  2258.                / spread;
  2259.              }
  2260.           }
  2261.            }
  2262.         smooth = 0;
  2263.         ++i;
  2264.         }
  2265.      }
  2266.       if (smooth) goto badcolor;
  2267.       while (i < 256)  { /* zap unset entries */
  2268.      dacbox[i][0] = dacbox[i][1] = dacbox[i][2] = 40;
  2269.      ++i;
  2270.      }
  2271.       colorstate = 1;
  2272.       }
  2273.    colorpreloaded = 1;
  2274.    return(0);
  2275. badcolor:
  2276.    return(-1);
  2277. }
  2278.  
  2279. static int parse_printer(char *value)
  2280. {
  2281.    int k;
  2282.    if (value[0]=='h' && value[1]=='p')
  2283.       Printer_Type=1;                 /* HP LaserJet           */
  2284.    if (value[0]=='i' && value[1]=='b')
  2285.       Printer_Type=2;                 /* IBM Graphics           */
  2286.    if (value[0]=='e' && value[1]=='p')
  2287.       Printer_Type=2;                 /* Epson (model?)           */
  2288.    if (value[0]=='c' && value[1]=='o')
  2289.       Printer_Type=3;                 /* Star (Epson-Comp?) color */
  2290.    if (value[0]=='p') {
  2291.       if (value[1]=='a')
  2292.      Printer_Type=4;             /* HP Paintjet (color)    */
  2293.       if ((value[1]=='o' || value[1]=='s')) {
  2294.      Printer_Type=5;             /* PostScript  SWT */
  2295.      if (value[2]=='h' || value[2]=='l')
  2296.         Printer_Type=6;
  2297.      }
  2298.       if (value[1]=='l')
  2299.      Printer_Type=7;             /* HP Plotter (semi-color) */
  2300.       }
  2301.    if (Printer_Type == 1)             /* assume low resolution */
  2302.       Printer_Resolution = 75;
  2303.    else
  2304.       Printer_Resolution = 60;
  2305.    if (EPSFileType > 0)              /* EPS save - force type 5 */
  2306.       Printer_Type = 5;
  2307.    if ((Printer_Type == 5) || (Printer_Type == 6))
  2308.       Printer_Resolution = 150;          /* PostScript def. res. */
  2309.    if ((value=strchr(value,'/'))) {
  2310.       if ((k=atoi(++value)) >= 0) Printer_Resolution=k;
  2311.       if ((value=strchr(value,'/'))) {
  2312.      if ((k=atoi(++value))> 0) LPTNumber = k;
  2313.      if (k < 0) {
  2314.         Print_To_File = 1;
  2315.         LPTNumber = 1;
  2316.         }
  2317.      }
  2318.       }
  2319.    return(0);
  2320. }
  2321.  
  2322.  
  2323.  
  2324. static void argerror(char *badarg)    /* oops. couldn't decode this */
  2325. {
  2326.    static char far argerrmsg1[]={"\
  2327. Oops. I couldn't understand the argument:\n  "};
  2328.    static char far argerrmsg2[]={"\n\n\
  2329. (see the Startup Help screens or documentation for a complete\n\
  2330.  argument list with descriptions)"};
  2331.    char msg[300];
  2332.    if (strlen(badarg) > 70) badarg[70] = 0;
  2333.    if (active_system == 0 /* DOS */
  2334.      && first_init)      /* & this is 1st call to cmdfiles */
  2335. #ifndef XFRACT
  2336.       sprintf(msg,"%Fs%s%Fs",argerrmsg1,badarg,argerrmsg2);
  2337.    else
  2338.       sprintf(msg,"%Fs%s",argerrmsg1,badarg);
  2339. #else
  2340.       sprintf(msg,"%s%s%s",argerrmsg1,badarg,argerrmsg2);
  2341.    else
  2342.       sprintf(msg,"%s%s",argerrmsg1,badarg);
  2343. #endif
  2344.    stopmsg(0,msg);
  2345. }
  2346.  
  2347. void set_3d_defaults()
  2348. {
  2349.    ENTER_OVLY(OVLY_CMDFILES);
  2350.    ROUGH     = 30;
  2351.    WATERLINE = 0;
  2352.    ZVIEWER   = 0;
  2353.    XSHIFT    = 0;
  2354.    YSHIFT    = 0;
  2355.    xtrans    = 0;
  2356.    ytrans    = 0;
  2357.    LIGHTAVG  = 0;
  2358.    Ambient   = 20;
  2359.    RANDOMIZE = 0;
  2360.    haze      = 0;
  2361.    back_color[0] = 51; back_color[1] = 153; back_color[2] = 200;
  2362.    if(SPHERE) {
  2363.       PHI1    =  180;
  2364.       PHI2    =  0;
  2365.       THETA1    =  -90;
  2366.       THETA2    =  90;
  2367.       RADIUS    =  100;
  2368.       FILLTYPE    = 2;
  2369.       XLIGHT    = 1;
  2370.       YLIGHT    = 1;
  2371.       ZLIGHT    = 1;
  2372.       }
  2373.    else {
  2374.       XROT    = 60;
  2375.       YROT    = 30;
  2376.       ZROT    = 0;
  2377.       XSCALE    = 90;
  2378.       YSCALE    = 90;
  2379.       FILLTYPE    = 0;
  2380.       if (active_system != 0)
  2381.      FILLTYPE = 2;
  2382.       XLIGHT    = 1;
  2383.       YLIGHT    = -1;
  2384.       ZLIGHT    = 1;
  2385.       }
  2386.     EXIT_OVLY;
  2387. }
  2388.