home *** CD-ROM | disk | FTP | other *** search
/ Computerworld 1996 March / Computerworld_1996-03_cd.bin / idg_cd3 / grafika / fraktaly / frasr192 / cmdfiles.c < prev    next >
C/C++ Source or Header  |  1995-04-11  |  90KB  |  2,785 lines

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