/* Various routines that prompt for things. This module is linked as an overlay, use ENTER_OVLY and EXIT_OVLY. */ #include #include #include #include #ifndef XFRACT #include #elif !defined(__386BSD__) #include #include #include #endif #ifdef __TURBOC__ #include #elif !defined(__386BSD__) #include #endif #ifdef __hpux #include #define getwd(a) getcwd(a,MAXPATHLEN) #endif #include "fractint.h" #include "fractype.h" #include "helpdefs.h" #include "prototyp.h" /* Routines defined in prompts1.c */ extern int prompt_checkkey(int curkey); extern long get_file_entry(int,char *,char *,char *,char *); /* Routines used in prompts1.c */ int get_corners(void); int edit_ifs_params(void ); int lccompare(VOIDCONSTPTR, VOIDCONSTPTR); /* Needed in prompts1.c PAV */ /* Routines in this module */ static int findfirst(char *path); static int check_f6_key(int curkey,int choice); static int findnext(void ); int splitpath(char *template,char *drive,char *dir,char *fname,char *ext); static int makepath(char *template,char *drive,char *dir,char *fname,char *ext); static void fix_dirname(char *dirname); static int expand_dirname(char *dirname,char *drive); static int filename_speedstr(int, int, int, char *, int); static int isadirectory(char *s); static int check_f6_key(int curkey,int choice); extern int dotmode; extern int orbit_delay; extern char diskfilename[]; extern char *fract_dir1, *fract_dir2; #ifndef XFRACT extern int strncasecmp(char *s,char *t,int ct); #endif extern char temp1[256]; /* temporary strings */ extern double xxmin,xxmax; /* initial corner values */ extern double yymin,yymax; /* initial corner values */ extern BYTE usemag; extern int AntiAliasing; extern double zzmin, zzmax, ttmin, ttmax; extern int Transparent3D; extern double xx3rd,yy3rd; /* initial corner values */ extern int invert; /* non-zero if inversion active */ extern double inversion[3]; /* radius, xcenter, ycenter */ extern int pot16bit; extern int disk16bit; extern double potparam[3]; /* three potential parameters*/ extern int fractype; /* if == 0, use Mandelbrot */ extern char usr_floatflag; /* floating-point fractals? */ extern int maxit; /* try this many iterations */ extern int inside; /* inside color */ extern int fillcolor; /* fill color */ extern int outside; /* outside color */ extern int finattract; /* finite attractor switch */ extern char savename[80]; /* save files using this name */ extern int decomp[]; /* decomposition parameters */ extern int usr_distest; /* distance estimator option */ extern int distestwidth; extern char usr_stdcalcmode; /* '1', '2', 'g', 'b' */ extern char overwrite; /* overwrite= flag */ extern int soundflag; /* sound option */ extern int LogFlag; /* non-zero if logarithmic palettes */ extern int usr_biomorph; /* Biomorph flag */ #if 0 //extern long xmin, xmax, ymin, ymax; /* screen corner values */ #endif extern int xdots, ydots; /* coordinates of dots on the screen */ extern int colors; /* maximum colors available */ extern int row, col; extern int viewwindow; extern float viewreduction; extern int viewcrop; extern float finalaspectratio; extern int viewxdots,viewydots; extern int textcbase; extern int textrow,textcol; extern int resave_flag; /* resaving after a timed save */ extern int started_resaves; extern char boxy[]; extern int rotate_lo,rotate_hi; extern int rangeslen; extern float screenaspect; extern int cmdarg(char *,int); extern char CommandFile[]; extern char CommandName[]; extern float far *ifs_defn; extern int ifs_type; extern int ifs_changed; extern int initbatch; /* 1 if batch run (no kbd) */ /* speed key state values */ #define MATCHING 0 /* string matches list - speed key mode */ #define TEMPLATE -2 /* wild cards present - buiding template */ #define SEARCHPATH -3 /* no match - building path search name */ #define FILEATTR 0x37 /* File attributes; select all but volume labels */ #define HIDDEN 2 #define SYSTEM 4 #define SUBDIR 16 #define MAXNUMFILES 300 #define FILE_MAX_PATH 80 #define FILE_MAX_DIR 80 #define FILE_MAX_DRIVE 3 #define FILE_MAX_FNAME 9 #define FILE_MAX_EXT 5 struct /* Allocate DTA and define structure */ { char path[21]; /* DOS path and filespec */ char attribute; /* File attributes wanted */ int ftime; /* File creation time */ int fdate; /* File creation date */ long size; /* File size in bytes */ char filename[13]; /* Filename and extension */ } DTA; /* Disk Transfer Area */ #define GETFORMULA 0 #define GETLSYS 1 #define GETIFS 2 #define GETPARM 3 /* --------------------------------------------------------------------- */ extern char s_iter[]; extern char s_real[]; extern char s_mult[]; extern char s_sum[]; extern char s_imag[]; extern char s_zmag[]; extern char s_bof60[]; extern char s_bof61[]; extern char s_maxiter[]; extern char s_epscross[]; extern char s_startrail[]; extern char s_normal[]; extern char s_period[]; char commandmask[13] = {"*.par"}; void prompts2_overlay() { } /* for restore_active_ovly */ #if 0 /* --------------------------------------------------------------------- */ extern int promptfkeys; int edit_ifs_params() /* prompt for IFS params */ { int totcols; int i, j, k, numlines, ret; FILE *tempfile; char msg[81]; char filename[81]; float ftemp; int oldhelpmode; int low, hi; if (!ifs_defn && !ifsload()) return(-1); totcols = (ifs_type == 0) ? IFSPARM : IFS3DPARM; ret = 0; oldhelpmode = helpmode; helpmode = HT_IFS; low = 0; for ( ;; ) { static char far ifshdg2[]={"2D IFS Parameters"}; static char far ifshdg3[]={"3D IFS Parameters"}; static char far ifsparmmsg1[]={"# a b c d e f"}; static char far ifsparmmsg2[]={" g h i j k l"}; static char far ifsprompt[]={"\ Enter the number of the line you want to edit,\n\ S to save, F6 for corners, or ENTER to end ==>"}; int leftcol,promptrow,promptcol; #define IFS_NUM 12 for (numlines = 0; numlines < NUMIFS; numlines++) /* find the first zero entry */ if (ifs_defn[(numlines * totcols) + totcols - 1] <= 0.0001) break; helptitle(); setattr(1,0,C_PROMPT_BKGRD,24*80); /* init rest of screen to background */ putstringcenter(2,0,80,C_GENERAL_HI,(ifs_type == 0) ? ifshdg2 : ifshdg3); leftcol = (ifs_type == 0) ? 15 : 0; putstring(4,leftcol+1,C_GENERAL_HI,ifsparmmsg1); if (ifs_type != 0) putstring(-1,-1,C_GENERAL_HI,ifsparmmsg2); putstring(-1,-1,C_GENERAL_HI," prob \n\n"); hi = low+IFS_NUM; if (hi>numlines) hi = numlines; for (i = low; i < hi; i++) { sprintf(msg,"%2d", i+1); putstring(5+i-low,leftcol,C_GENERAL_HI,msg); for (j = 0; j < totcols; j++) { sprintf(msg,"%6.2f",ifs_defn[(i*totcols)+j]); putstring(-1,-1,C_GENERAL_MED,msg); } } if (hinumlines) low=numlines-IFS_NUM; if (low<0) low=0; } else if (i==PAGE_DOWN) { low += IFS_NUM; if (low+IFS_NUM>numlines) low=numlines-IFS_NUM; if (low<0) low=0; } else if (i==F6) { if (get_corners()) { ret = 1; } } else if (i==0) { if (temp1[0]==0) break; } else { continue; } putstring(promptrow,promptcol,C_GENERAL_HI,temp1); if (temp1[0] == 's' || temp1[0] == 'S') { stackscreen(); filename[0] = 0; i = field_prompt(0,"Enter the name of the .IFS file to save:", NULL,filename,60,NULL); unstackscreen(); if (i != -1) { if (strchr(filename,'.') == NULL) strcat(filename,".ifs"); if ((tempfile=fopen(filename,"w")) != NULL) { for (i = 0; i < numlines; i++) { for (j = 0; j < totcols; j++) fprintf(tempfile, "%6.2f", (float)ifs_defn[(i*totcols)+j]); fprintf(tempfile, "\n"); } fclose(tempfile); ifs_changed = 0; } else { static char far msg[]={"Could not create file"}; stopmsg(0,msg); } } continue; } i = atoi(temp1) - 1; if (i >= 0 && i < numlines) { for (j = 0; j < totcols; j++) { if (j < totcols-1) sprintf(msg,"Parameter %c",'a'+j); else sprintf(msg,"Probability"); putstring(promptrow+2,25,C_GENERAL_HI,msg); sprintf(temp1,"%6.2f",(float)ifs_defn[k=(i*totcols)+j]); if (input_field(1,C_GENERAL_INPUT,temp1,6, textrow,textcol+1,NULL) < 0) break; if (ifs_defn[k] != (ftemp = atof(temp1))) { ifs_defn[k] = ftemp; ret = ifs_changed = 1; } } memset(msg,' ',80); msg[81] = 0; putstring(promptrow+2,0,C_PROMPT_BKGRD,msg); } } helpmode = oldhelpmode; return(ret); } #endif /* --------------------------------------------------------------------- */ /* get_toggles() is called from FRACTINT.C whenever the 'x' key is pressed. This routine prompts for several options, sets the appropriate variables, and returns the following code to the calling routine: -1 routine was ESCAPEd - no need to re-generate the image. 0 nothing changed, or minor variable such as "overwrite=". No need to re-generate the image. 1 major variable changed (such as "inside="). Re-generate the image. Finally, remember to insert variables in the list *and* check for them in the same order!!! */ #define LOADCHOICES(X) {\ static char far tmp[] = { X };\ choices[++k]= tmp;\ } int get_toggles() { static char far hdg[]={" Basic Options\n\ (not all combinations make sense)"}; char far *choices[20]; int oldhelpmode; char prevsavename[81]; struct fullscreenvalues uvalues[25]; int i, j, k; char old_usr_stdcalcmode; int old_maxit,old_inside,old_outside,old_soundflag; int old_logflag,old_biomorph,old_decomp; int old_fillcolor; static char *calcmodes[] ={"1","2","g","b","t"}; static char *soundmodes[5]={"yes","no","x","y","z"}; ENTER_OVLY(OVLY_PROMPTS2); k = -1; LOADCHOICES("Passes (1, 2, g[uessing], b[oundary trace], t[esseral])"); uvalues[k].type = 'l'; uvalues[k].uval.ch.vlen = 3; uvalues[k].uval.ch.llen = sizeof(calcmodes)/sizeof(*calcmodes); uvalues[k].uval.ch.list = calcmodes; uvalues[k].uval.ch.val = (usr_stdcalcmode == '1') ? 0 : (usr_stdcalcmode == '2') ? 1 : (usr_stdcalcmode == 'g') ? 2 : (usr_stdcalcmode == 'b') ? 3 :4 ; old_usr_stdcalcmode = usr_stdcalcmode; LOADCHOICES("Floating Point Algorithm"); uvalues[k].type = 'y'; uvalues[k].uval.ch.val = usr_floatflag; LOADCHOICES("Maximum Iterations (2 to 32767)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_maxit = maxit; LOADCHOICES("Inside Color (,maxiter,zmag,bof60,bof61,epscr,star,per)"); uvalues[k].type = 's'; if(inside == -59) strcpy(uvalues[k].uval.sval,s_zmag); else if(inside == -60) strcpy(uvalues[k].uval.sval,s_bof60); else if(inside == -61) strcpy(uvalues[k].uval.sval,s_bof61); else if(inside == -100) strcpy(uvalues[k].uval.sval,s_epscross); else if(inside == -101) strcpy(uvalues[k].uval.sval,s_startrail); else if(inside == -102) strcpy(uvalues[k].uval.sval,s_period); else if(inside == -1) strcpy(uvalues[k].uval.sval,s_maxiter); else sprintf(uvalues[k].uval.sval,"%d",inside); old_inside = inside; LOADCHOICES("Outside Color (,iter,real,imag,mult,summ)"); uvalues[k].type = 's'; if(outside == -1) strcpy(uvalues[k].uval.sval,s_iter); else if(outside == -2) strcpy(uvalues[k].uval.sval,s_real); else if(outside == -3) strcpy(uvalues[k].uval.sval,s_imag); else if(outside == -4) strcpy(uvalues[k].uval.sval,s_mult); else if(outside == -5) strcpy(uvalues[k].uval.sval,s_sum); else sprintf(uvalues[k].uval.sval,"%d",outside); old_outside = outside; LOADCHOICES("Savename (.GIF implied)"); uvalues[k].type = 's'; strcpy(prevsavename,savename); strcpy(uvalues[k].uval.sval,savename); LOADCHOICES("File Overwrite ('overwrite=')"); uvalues[k].type = 'y'; uvalues[k].uval.ch.val = overwrite; LOADCHOICES("Sound (no, yes, x, y, z)"); uvalues[k].type = 'l'; uvalues[k].uval.ch.vlen = 3; uvalues[k].uval.ch.llen = 5; uvalues[k].uval.ch.list = soundmodes; uvalues[k].uval.ch.val = 1 + (old_soundflag = soundflag); if (rangeslen == 0) { LOADCHOICES("Log Palette (0=no,1=yes,-1=old,+n=cmprsd,-n=sqrt)"); uvalues[k].type = 'i'; } else { LOADCHOICES("Log Palette (n/a, ranges= parameter is in effect)"); uvalues[k].type = '*'; } uvalues[k].uval.ival = old_logflag = LogFlag; LOADCHOICES("Biomorph Color (-1 means OFF)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_biomorph = usr_biomorph; LOADCHOICES("Decomp Option (2,4,8,..,256, 0=OFF)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_decomp = decomp[0]; LOADCHOICES("Fill Color (normal,) (works with passes=t and =b)"); uvalues[k].type = 's'; if(fillcolor < 0) strcpy(uvalues[k].uval.sval,s_normal); else sprintf(uvalues[k].uval.sval,"%d",fillcolor); old_fillcolor = fillcolor; LOADCHOICES("Orbit delay (0 = none)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = orbit_delay; /* LOADCHOICES("Antialiasing (0 to 8)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = AntiAliasing; */ oldhelpmode = helpmode; helpmode = HELPXOPTS; i = fullscreen_prompt(hdg,k+1,choices,uvalues,0,0,NULL); helpmode = oldhelpmode; if (i < 0) { EXIT_OVLY; return(-1); } /* now check out the results (*hopefully* in the same order ) */ k = -1; j = 0; /* return code */ usr_stdcalcmode = calcmodes[uvalues[++k].uval.ch.val][0]; if (old_usr_stdcalcmode != usr_stdcalcmode) j = 1; if (uvalues[++k].uval.ch.val != usr_floatflag) { usr_floatflag = uvalues[k].uval.ch.val; j = 1; } ++k; maxit = uvalues[k].uval.ival; if (maxit < 2) maxit = 2; /* 'maxit' is an int so it is always <= 32767, MCP 12-3-91 if (maxit > 32767) maxit = 32767; */ if (maxit != old_maxit) j = 1; if(strncmp(strlwr(uvalues[++k].uval.sval),s_zmag,4)==0) inside = -59; else if(strncmp(strlwr(uvalues[k].uval.sval),s_bof60,5)==0) inside = -60; else if(strncmp(strlwr(uvalues[k].uval.sval),s_bof61,5)==0) inside = -61; else if(strncmp(strlwr(uvalues[k].uval.sval),s_epscross,3)==0) inside = -100; else if(strncmp(strlwr(uvalues[k].uval.sval),s_startrail,4)==0) inside = -101; else if(strncmp(strlwr(uvalues[k].uval.sval),s_period,3)==0) inside = -102; else if(strncmp(strlwr(uvalues[k].uval.sval),s_maxiter,5)==0) inside = -1; else inside = atoi(uvalues[k].uval.sval); if (inside != old_inside) j = 1; if(strncmp(strlwr(uvalues[++k].uval.sval),s_real,4)==0) outside = -2; else if(strncmp(strlwr(uvalues[k].uval.sval),s_imag,4)==0) outside = -3; else if(strncmp(strlwr(uvalues[k].uval.sval),s_mult,4)==0) outside = -4; else if(strncmp(strlwr(uvalues[k].uval.sval),s_sum,4)==0) outside = -5; else if(strncmp(strlwr(uvalues[k].uval.sval),s_iter,4)==0) outside = -1; else outside = atoi(uvalues[k].uval.sval); if (outside != old_outside) j = 1; strcpy(savename,uvalues[++k].uval.sval); if (strcmp(savename,prevsavename)) resave_flag = started_resaves = 0; /* forget pending increment */ overwrite = uvalues[++k].uval.ch.val; soundflag = uvalues[++k].uval.ch.val - 1; if (soundflag != old_soundflag && (soundflag > 1 || old_soundflag > 1)) j = 1; LogFlag = uvalues[++k].uval.ival; if (LogFlag != old_logflag) j = 1; usr_biomorph = uvalues[++k].uval.ival; if (usr_biomorph != old_biomorph) j = 1; decomp[0] = uvalues[++k].uval.ival; if (decomp[0] != old_decomp) j = 1; if(strncmp(strlwr(uvalues[++k].uval.sval),s_normal,4)==0) fillcolor = -1; else fillcolor = atoi(uvalues[k].uval.sval); if (fillcolor != old_fillcolor) j = 1; orbit_delay = uvalues[++k].uval.ival; /* if(AntiAliasing != uvalues[++k].uval.ival) j = 1; AntiAliasing = uvalues[k].uval.ival; if(AntiAliasing < 0) AntiAliasing = 0; if(AntiAliasing > 8) AntiAliasing = 8; */ EXIT_OVLY; return(j); } /* get_toggles2() is similar to get_toggles, invoked by 'y' key */ int get_toggles2() { static char far hdg[]={" Extended Options\n\ (not all combinations make sense)"}; char far *choices[20]; int oldhelpmode; struct fullscreenvalues uvalues[25]; int i, j, k; int old_rotate_lo,old_rotate_hi; int old_usr_distest,old_distestwidth; double old_potparam[3],old_inversion[3]; ENTER_OVLY(OVLY_PROMPTS2); /* fill up the choices (and previous values) arrays */ k = -1; LOADCHOICES("Look for finite attractor (0=no,>0=yes,<0=phase)"); uvalues[k].type = 'i'; uvalues[k].uval.ch.val = finattract; LOADCHOICES("Potential Max Color (0 means off)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_potparam[0] = potparam[0]; LOADCHOICES(" Slope"); uvalues[k].type = 'd'; uvalues[k].uval.dval = old_potparam[1] = potparam[1]; LOADCHOICES(" Bailout"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_potparam[2] = potparam[2]; LOADCHOICES(" 16 bit values"); uvalues[k].type = 'y'; uvalues[k].uval.ch.val = pot16bit; LOADCHOICES("Distance Estimator (0=off, <0=edge, >0=on):"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_usr_distest = usr_distest; LOADCHOICES(" width factor:"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_distestwidth = distestwidth; LOADCHOICES("Inversion radius or \"auto\" (0 means off)"); LOADCHOICES(" center X coordinate or \"auto\""); LOADCHOICES(" center Y coordinate or \"auto\""); k = k - 3; for (i= 0; i < 3; i++) { uvalues[++k].type = 's'; if ((old_inversion[i] = inversion[i]) == AUTOINVERT) sprintf(uvalues[k].uval.sval,"auto"); else sprintf(uvalues[k].uval.sval,"%g",inversion[i]); } LOADCHOICES(" (use fixed radius & center when zooming)"); uvalues[k].type = '*'; LOADCHOICES("Color cycling from color (0 ... 254)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_rotate_lo = rotate_lo; LOADCHOICES(" to color (1 ... 255)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = old_rotate_hi = rotate_hi; oldhelpmode = helpmode; helpmode = HELPYOPTS; i = fullscreen_prompt(hdg,k+1,choices,uvalues,0,0,NULL); helpmode = oldhelpmode; if (i < 0) { EXIT_OVLY; return(-1); } /* now check out the results (*hopefully* in the same order ) */ k = -1; j = 0; /* return code */ if (uvalues[++k].uval.ch.val != finattract) { finattract = uvalues[k].uval.ch.val; j = 1; } potparam[0] = uvalues[++k].uval.ival; if (potparam[0] != old_potparam[0]) j = 1; potparam[1] = uvalues[++k].uval.dval; if (potparam[0] != 0.0 && potparam[1] != old_potparam[1]) j = 1; potparam[2] = uvalues[++k].uval.ival; if (potparam[0] != 0.0 && potparam[2] != old_potparam[2]) j = 1; if (uvalues[++k].uval.ch.val != pot16bit) { pot16bit = uvalues[k].uval.ch.val; if (pot16bit) { /* turned it on */ if (potparam[0] != 0.0) j = 1; } else /* turned it off */ if (dotmode != 11) /* ditch the disk video */ enddisk(); else /* keep disk video, but ditch the fraction part at end */ disk16bit = 0; } ++k; usr_distest = (uvalues[k].uval.ival > 32000) ? 32000 : uvalues[k].uval.ival; if (usr_distest != old_usr_distest) j = 1; ++k; distestwidth = uvalues[k].uval.ival; if (usr_distest && distestwidth != old_distestwidth) j = 1; for (i = 0; i < 3; i++) { if (uvalues[++k].uval.sval[0] == 'a' || uvalues[k].uval.sval[0] == 'A') inversion[i] = AUTOINVERT; else inversion[i] = atof(uvalues[k].uval.sval); if (old_inversion[i] != inversion[i] && (i == 0 || inversion[0] != 0.0)) j = 1; } invert = (inversion[0] == 0.0) ? 0 : 3; ++k; rotate_lo = uvalues[++k].uval.ival; rotate_hi = uvalues[++k].uval.ival; if (rotate_lo < 0 || rotate_hi > 255 || rotate_lo > rotate_hi) { rotate_lo = old_rotate_lo; rotate_hi = old_rotate_hi; } EXIT_OVLY; return(j); } /* --------------------------------------------------------------------- */ /* get_view_params() is called from FRACTINT.C whenever the 'v' key is pressed. Return codes are: -1 routine was ESCAPEd - no need to re-generate the image. 0 minor variable changed. No need to re-generate the image. 1 View changed. Re-generate the image. */ int get_view_params() { static char far hdg[]={"View Window Options"}; char far *choices[8]; int oldhelpmode; struct fullscreenvalues uvalues[25]; int i, k; float old_viewreduction,old_aspectratio; int old_viewwindow,old_viewcrop,old_viewxdots,old_viewydots; ENTER_OVLY(OVLY_PROMPTS2); stackscreen(); old_viewwindow = viewwindow; old_viewcrop = viewcrop; old_viewreduction = viewreduction; old_aspectratio = finalaspectratio; old_viewxdots = viewxdots; old_viewydots = viewydots; get_view_restart: /* fill up the previous values arrays */ k = -1; LOADCHOICES("Preview display? (no for full screen)"); uvalues[k].type = 'y'; uvalues[k].uval.ch.val = viewwindow; LOADCHOICES("Auto window size reduction factor"); uvalues[k].type = 'f'; uvalues[k].uval.dval = viewreduction; LOADCHOICES("Final media overall aspect ratio, y/x"); uvalues[k].type = 'f'; uvalues[k].uval.dval = finalaspectratio; LOADCHOICES("Crop starting coordinates to new aspect ratio?"); uvalues[k].type = 'y'; uvalues[k].uval.ch.val = viewcrop; LOADCHOICES("Explicit size x pixels (0 for auto size)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = viewxdots; LOADCHOICES(" y pixels (0 to base on aspect ratio)"); uvalues[k].type = 'i'; uvalues[k].uval.ival = viewydots; LOADCHOICES(""); uvalues[k].type = '*'; LOADCHOICES("Press F4 to reset view parameters to defaults."); uvalues[k].type = '*'; oldhelpmode = helpmode; /* this prevents HELP from activating */ helpmode = HELPVIEW; i = fullscreen_prompt(hdg,k+1,choices,uvalues,0,16,NULL); helpmode = oldhelpmode; /* re-enable HELP */ if (i < 0) { viewwindow = old_viewwindow; viewcrop = old_viewcrop; viewreduction = old_viewreduction; finalaspectratio = old_aspectratio; viewxdots = old_viewxdots; viewydots = old_viewydots; unstackscreen(); EXIT_OVLY; return(-1); } if (i == F4) { viewwindow = viewxdots = viewydots = 0; viewreduction = 4.2; viewcrop = 1; finalaspectratio = screenaspect; goto get_view_restart; } /* now check out the results (*hopefully* in the same order ) */ k = -1; viewwindow = uvalues[++k].uval.ch.val; viewreduction = uvalues[++k].uval.dval; if ((finalaspectratio = uvalues[++k].uval.dval) == 0) finalaspectratio = screenaspect; viewcrop = uvalues[++k].uval.ch.val; viewxdots = uvalues[++k].uval.ival; viewydots = uvalues[++k].uval.ival; if (finalaspectratio != old_aspectratio && viewcrop) aspectratio_crop(old_aspectratio,finalaspectratio); i = 0; if (viewwindow != old_viewwindow || (viewwindow && ( viewreduction != old_viewreduction || finalaspectratio != old_aspectratio || viewxdots != old_viewxdots || (viewydots != old_viewydots && viewxdots) ) ) ) i = 1; unstackscreen(); EXIT_OVLY; return(i); } /* get_cmd_string() is called from FRACTINT.C whenever the 'g' key is pressed. Return codes are: -1 routine was ESCAPEd - no need to re-generate the image. 0 parameter changed, no need to regenerate >0 parameter changed, regenerate */ int get_cmd_string() { int oldhelpmode; int i; char cmdbuf[61]; ENTER_OVLY(OVLY_PROMPTS2); oldhelpmode = helpmode; helpmode = HELPCOMMANDS; cmdbuf[0] = 0; i = field_prompt(0,"Enter command string to use.",NULL,cmdbuf,60,NULL); helpmode = oldhelpmode; if (i >= 0 && cmdbuf[0] != 0) i = cmdarg(cmdbuf, 2); EXIT_OVLY; return(i); } /* --------------------------------------------------------------------- */ int Distribution = 30, Offset = 0, Slope = 25; long con; static char far sf1[] = {"Star Density in Pixels per Star"}; static char far sf2[] = {"Percent Clumpiness"}; static char far sf3[] = {"Ratio of Dim stars to Bright"}; static char far *starfield_prompts[] = {sf1,sf2,sf3}; static double starfield_values[4] = { 30.0,100.0,5.0,0.0 }; char GreyFile[] = "altern.map"; int starfield(void) { int c; extern char busy; busy = 1; if (starfield_values[0] < 1.0) starfield_values[0] = 1.0; if (starfield_values[0] > 100.0) starfield_values[0] = 100.0; if (starfield_values[1] < 1.0) starfield_values[1] = 1.0; if (starfield_values[1] > 100.0) starfield_values[1] = 100.0; if (starfield_values[2] < 1.0) starfield_values[2] = 1.0; if (starfield_values[2] > 100.0) starfield_values[2] = 100.0; Distribution = (int)(starfield_values[0]); con = (long)(((starfield_values[1]) / 100.0) * (1L << 16)); Slope = (int)(starfield_values[2]); if (ValidateLuts(GreyFile) != 0) { static char far msg[]={"Unable to load ALTERN.MAP"}; stopmsg(0,msg); busy = 0; return(-1); } spindac(0,1); /* load it, but don't spin */ for(row = 0; row < ydots; row++) { for(col = 0; col < xdots; col++) { if(keypressed()) { buzzer(1); busy = 0; return(1); } c = getcolor(col, row); if(c == inside) c = colors-1; putcolor(col, row, GausianNumber(c, colors)); } } buzzer(0); busy = 0; return(0); } int get_starfield_params(void) { static char far hdg[]={"Starfield Parameters"}; struct fullscreenvalues uvalues[3]; int oldhelpmode, status; int i; ENTER_OVLY(OVLY_PROMPTS2); if(colors < 255) { static char far msg[]={"starfield requires 256 color mode"}; stopmsg(0,msg); EXIT_OVLY; return(-1); } for (i = 0; i < 3; i++) { uvalues[i].uval.dval = starfield_values[i]; uvalues[i].type = 'f'; } stackscreen(); oldhelpmode = helpmode; helpmode = HELPSTARFLD; i = fullscreen_prompt(hdg,3,starfield_prompts,uvalues,0,0,NULL); helpmode = oldhelpmode; if (i < 0) { unstackscreen(); EXIT_OVLY; return(-1); } unstackscreen(); for (i = 0; i < 3; i++) starfield_values[i] = uvalues[i].uval.dval; EXIT_OVLY; return(0); } int get_a_number(double *x, double *y) { static char far hdg[]={"Set Cursor Coordinates"}; double x1,y2; char far *choices[2]; int oldhelpmode; struct fullscreenvalues uvalues[2]; int i, k; ENTER_OVLY(OVLY_PROMPTS2); stackscreen(); /* fill up the previous values arrays */ k = -1; LOADCHOICES("X coordinate at cursor"); uvalues[k].type = 'd'; uvalues[k].uval.dval = *x; LOADCHOICES("Y coordinate at cursor"); uvalues[k].type = 'd'; uvalues[k].uval.dval = *y; i = fullscreen_prompt(hdg,k+1,choices,uvalues,0,25,NULL); if (i < 0) { unstackscreen(); EXIT_OVLY; return(-1); } /* now check out the results (*hopefully* in the same order ) */ k = -1; *x = uvalues[++k].uval.dval; *y = uvalues[++k].uval.dval; unstackscreen(); EXIT_OVLY; return(i); } /* --------------------------------------------------------------------- */ int get_commands() /* execute commands from file */ { int ret; FILE *parmfile; long point; int oldhelpmode; ENTER_OVLY(OVLY_PROMPTS2); ret = 0; oldhelpmode = helpmode; helpmode = HELPPARMFILE; if ((point = get_file_entry(GETPARM,"Parameter Set", commandmask,CommandFile,CommandName)) >= 0 && (parmfile = fopen(CommandFile,"rb"))) { fseek(parmfile,point,SEEK_SET); ret = load_commands(parmfile); } helpmode = oldhelpmode; EXIT_OVLY; return(ret); } /* --------------------------------------------------------------------- */ void goodbye() /* we done. Bail out */ { static char far goodbyemessage[]={" Thank You for using FRACTINT"}; extern BYTE exitmode; extern int mode7text; extern int made_dsktemp; #ifndef XFRACT union REGS r; #endif #ifdef WINFRACT return; #endif setvideotext(); #ifdef XFRACT UnixDone(); printf("\n\n\n%s\n",goodbyemessage); /* printf takes far pointer */ #else r.h.al = (mode7text == 0) ? exitmode : 7; r.h.ah = 0; int86(0x10, &r, &r); printf("\n\n\n%Fs\n",goodbyemessage); /* printf takes far pointer */ #endif movecursor(6,0); discardgraphics(); /* if any emm/xmm tied up there, release it */ stopslideshow(); #ifndef XFRACT if (made_dsktemp) remove(diskfilename); #endif end_help(); if (initbatch == 3) /* exit with error code for batch file */ exit(2); else if (initbatch == 4) exit(1); else exit(0); } /* --------------------------------------------------------------------- */ #ifdef XFRACT static char searchdir[FILE_MAX_DIR]; static char searchname[FILE_MAX_PATH]; static char searchext[FILE_MAX_EXT]; static DIR *currdir = NULL; #endif static int findfirst(char *path) /* Find 1st file (or subdir) meeting path/filespec */ { #ifndef XFRACT union REGS regs; regs.h.ah = 0x1A; /* Set DTA to filedata */ regs.x.dx = (unsigned)&DTA; intdos(®s, ®s); regs.h.ah = 0x4E; /* Find 1st file meeting path */ regs.x.dx = (unsigned)path; regs.x.cx = FILEATTR; intdos(®s, ®s); return(regs.x.ax); /* Return error code */ #else if (currdir != NULL) { closedir(currdir); currdir = NULL; } splitpath(path,NULL,searchdir,searchname,searchext); if (searchdir[0]=='\0') { currdir = opendir("."); } else { currdir = opendir(searchdir); } if (currdir==NULL) { return -1; } else { return findnext(); } #endif } static int findnext() /* Find next file (or subdir) meeting above path/filespec */ { #ifndef XFRACT union REGS regs; regs.h.ah = 0x4F; /* Find next file meeting path */ regs.x.dx = (unsigned)&DTA; intdos(®s, ®s); return(regs.x.ax); #else #ifdef DIRENT struct dirent *dirEntry; #else struct direct *dirEntry; #endif struct stat sbuf; char thisname[FILE_MAX_PATH]; char tmpname[FILE_MAX_PATH]; char thisext[FILE_MAX_EXT]; while (1) { dirEntry = readdir(currdir); if (dirEntry == NULL) { closedir(currdir); currdir = NULL; return -1; } else if (dirEntry->d_ino != 0) { splitpath(dirEntry->d_name,NULL,NULL,thisname,thisext); if ((searchname[0]=='*' || strcmp(searchname,thisname)==0) && (searchext[0]=='*' || strcmp(searchext,thisext)==0)) { strncpy(DTA.filename,dirEntry->d_name,20); DTA.filename[20]=='\0'; strcpy(tmpname,searchdir); strcat(tmpname,"/"); strcat(tmpname,dirEntry->d_name); stat(tmpname,&sbuf); if ((sbuf.st_mode&S_IFMT)==S_IFREG) { DTA.attribute = 0; } else if ((sbuf.st_mode&S_IFMT)==S_IFDIR) { DTA.attribute = SUBDIR; } else { continue; } DTA.size = sbuf.st_size; return 0; } } } #endif } int lccompare(VOIDCONSTPTR arg1, VOIDCONSTPTR arg2) /* for qsort */ { return(strncasecmp(*((char **)arg1),*((char **)arg2),40)); } static char *masks[] = {"*.pot","*.gif"}; static int speedstate; int getafilename(char *hdg,char *template,char *flname) { static char far instr[]={"Press F6 for default or environment directory"}; int masklen; char filename[13]; char speedstr[81]; char tmpmask[FILE_MAX_PATH]; /* used to locate next file in list */ static int numtemplates = 1; int i,j; int out; int retried; struct CHOICE { char name[13]; char type; } *choices[MAXNUMFILES]; int attributes[MAXNUMFILES]; int filecount; /* how many files */ int dircount; /* how many directories */ int notroot; /* not the root directory */ char drive[FILE_MAX_DRIVE]; char dir[FILE_MAX_DIR]; char fname[FILE_MAX_FNAME]; char ext[FILE_MAX_EXT]; ENTER_OVLY(OVLY_PROMPTS2); /* steal existing array for "choices" */ choices[0] = (struct CHOICE *)boxy; attributes[0] = 1; for(i=1;iname,DTA.filename,13); choices[filecount]->name[12] = '\0'; choices[filecount]->type = 1; dircount++; if(strcmp(DTA.filename,"..")==0) notroot = 1; } out = findnext(); } tmpmask[masklen] = 0; if(template[0]) makepath(tmpmask,drive,dir,fname,ext); do { if(numtemplates > 1) strcpy(&(tmpmask[masklen]),masks[j]); out = findfirst(tmpmask); while(out == 0 && filecount < MAXNUMFILES) { if(!(DTA.attribute & SUBDIR)) { strlwr(DTA.filename); strncpy(choices[++filecount]->name,DTA.filename,13); choices[filecount]->type = 0; } out = findnext(); } } while (++j < numtemplates); if (++filecount == 0) { strcpy(choices[filecount]->name,"*nofiles*"); choices[filecount]->type = 0; ++filecount; } qsort(choices,filecount,sizeof(char *),lccompare); /* sort type list */ if(notroot == 0 && dir[0] && dir[0] != SLASHC) /* must be in root directory */ { splitpath(tmpmask,drive,dir,fname,ext); strcpy(dir,SLASH); makepath(tmpmask,drive,dir,fname,ext); } if(numtemplates > 1) strcat(tmpmask," *.pot"); strcpy(temp1,hdg); strcat(temp1,"\nTemplate: "); strcat(temp1,tmpmask); strcpy(speedstr,filename); if (speedstr[0] == 0) { for (i=0; itype == 0) break; if (i >= filecount) i = 0; } i = fullscreen_choice(8,temp1,NULL,instr,filecount,(char **)choices, attributes,5,99,12,i,NULL,speedstr,filename_speedstr,check_f6_key); if (i==-F6) { static int lastdir=0; if (lastdir==0) { strcpy(dir,fract_dir1); } else { strcpy(dir,fract_dir2); } fix_dirname(dir); makepath(flname,drive,dir,"",""); lastdir = 1-lastdir; goto restart; } if (i < 0) { EXIT_OVLY; return(-1); } if(speedstr[0] == 0 || speedstate == MATCHING) { if(choices[i]->type) { if(strcmp(choices[i]->name,"..") == 0) /* go up a directory */ { if(strcmp(dir,DOTSLASH) == 0) strcpy(dir,DOTDOTSLASH); else { char *s; if(s = strrchr(dir,SLASHC)) /* trailing slash */ { *s = 0; if(s = strrchr(dir,SLASHC)) *(s+1) = 0; } } } else /* go down a directory */ strcat(dir,choices[i]->name); fix_dirname(dir); makepath(flname,drive,dir,"",""); goto restart; } splitpath(choices[i]->name,NULL,NULL,fname,ext); makepath(flname,drive,dir,fname,ext); } else { if (speedstate == SEARCHPATH && strchr(speedstr,'*') == 0 && strchr(speedstr,'?') == 0 && findfirst(speedstr) == 0 && (DTA.attribute & SUBDIR)) /* it is a directory */ speedstate = TEMPLATE; if(speedstate == TEMPLATE) { /* extract from tempstr the pathname and template information, being careful not to overwrite drive and directory if not newly specified */ char drive1[FILE_MAX_DRIVE]; char dir1[FILE_MAX_DIR]; char fname1[FILE_MAX_FNAME]; char ext1[FILE_MAX_EXT]; splitpath(speedstr,drive1,dir1,fname1,ext1); if(drive1[0]) strcpy(drive,drive1); if(dir1[0]) strcpy(dir,dir1); makepath(flname,drive,dir,fname1,ext1); if(strchr(fname1,'*') || strchr(fname1,'?') || strchr(ext1 ,'*') || strchr(ext1 ,'?')) makepath(template,"","",fname1,ext1); else if(isadirectory(flname)) fix_dirname(flname); goto restart; } else /* speedstate == SEARCHPATH */ { char fullpath[80]; /* if (strchr(speedstr,'.') == NULL) strcat(speedstr,".gif"); */ findpath(speedstr,fullpath); if(fullpath[0]) strcpy(flname,fullpath); else { /* failed, make diagnostic useful: */ strcpy(flname,speedstr); if (strchr(speedstr,SLASHC) == NULL) { splitpath(speedstr,NULL,NULL,fname,ext); makepath(flname,drive,dir,fname,ext); } } } } EXIT_OVLY; return(0); } static int check_f6_key(int curkey,int choice) { if (curkey == F6) return 0-F6; return 0; } static int filename_speedstr(int row, int col, int vid, char *speedstring, int speed_match) { extern char speed_prompt[]; char *prompt; if ( strchr(speedstring,':') || strchr(speedstring,'*') || strchr(speedstring,'*') || strchr(speedstring,'?')) { speedstate = TEMPLATE; /* template */ prompt = "File Template"; } else if (speed_match) { speedstate = SEARCHPATH; /* does not match list */ prompt = "Search Path for"; } else { speedstate = MATCHING; prompt = speed_prompt; } putstring(row,col,vid,prompt); return(strlen(prompt)); } static int isadirectory(char *s) { if(strchr(s,'*') || strchr(s,'?')) return(0); /* for my purposes, not a directory */ if(findfirst(s) != 0) /* couldn't find it */ { /* any better ideas?? */ if(strchr(s,SLASHC)) /* we'll guess it is a directory */ return(1); else return(0); /* no slashes - we'll guess it's a file */ } else if(DTA.attribute & SUBDIR) return(1); /* we're SURE it's a directory */ else return(0); } #ifndef XFRACT /* This routine moved to unix.c so we can use it in hc.c */ int splitpath(char *template,char *drive,char *dir,char *fname,char *ext) { int length; int len; int offset; char *tmp; if(drive) drive[0] = 0; if(dir) dir[0] = 0; if(fname) fname[0] = 0; if(ext) ext[0] = 0; if((length = strlen(template)) == 0) return(0); offset = 0; /* get drive */ if(length >= 2) if(template[1] == ':') { if(drive) { drive[0] = template[offset++]; drive[1] = template[offset++]; drive[2] = 0; } else { offset++; offset++; } } /* get dir */ if(offset < length) { tmp = strrchr(template,SLASHC); if(tmp) { tmp++; /* first character after slash */ len = tmp - &template[offset]; if(len >=0 && len < 80 && dir) strncpy(dir,&template[offset],len); if(len < 80 && dir) dir[len] = 0; offset += len; } } else return(0); /* get fname */ if(offset < length) { tmp = strrchr(template,'.'); if(tmp < strrchr(template,SLASHC) || tmp < strrchr(template,':')) tmp = 0; /* in this case the '.' must be a directory */ if(tmp) { tmp++; /* first character past "." */ len = tmp - &template[offset]; if((len > 0) && (offset+len < length) && fname) { strncpy(fname,&template[offset],len); fname[len] = 0; } offset += len; if((offset < length) && ext) strcpy(ext,&template[offset]); } else if((offset < length) && fname) strcpy(fname,&template[offset]); } return(0); } #endif static makepath(char *template,char *drive,char *dir,char *fname,char *ext) { #ifndef XFRACT strcpy(template,drive); strcat(template,dir); #else strcpy(template,dir); #endif strcat(template,fname); strcat(template,ext); return(0); } /* fix up directory names */ static void fix_dirname(char *dirname) { int length; /* scrub white space from end for safety */ length = strlen(dirname); /* index of last character */ while (--length >= 0 && isspace(dirname[length])) { } dirname[++length] = 0; /* make sure dirname ends with a slash */ if(length == 0 || dirname[length-1] != SLASHC) strcat(dirname,SLASH); } static int expand_dirname(char *dirname,char *drive) { fix_dirname(dirname); if (dirname[0] != SLASHC) { char buf[81],curdir[81]; #ifndef XFRACT union REGS regs; struct SREGS sregs; curdir[0] = 0; regs.h.ah = 0x47; /* get current directory */ regs.h.dl = 0; if (drive[0] && drive[0] != ' ') regs.h.dl = tolower(drive[0])-'a'+1; regs.x.si = (unsigned int) &curdir[0]; segread(&sregs); intdosx(®s, ®s, &sregs); #else getwd(curdir); #endif strcat(curdir,SLASH); while (strncmp(dirname,DOTSLASH,2) == 0) { strcpy(buf,&dirname[2]); strcpy(dirname,buf); } while (strncmp(dirname,DOTDOTSLASH,3) == 0) { char *s; curdir[strlen(curdir)-1] = 0; /* strip trailing slash */ if (s = strrchr(curdir,SLASHC)) *s = 0; strcat(curdir,SLASH); strcpy(buf,&dirname[3]); strcpy(dirname,buf); } strcpy(buf,dirname); dirname[0] = 0; if (curdir[0] != SLASHC) strcpy(dirname,SLASH); strcat(dirname,curdir); strcat(dirname,buf); } return(0); } #define LOADPROMPTS(X) {\ static char far tmp[] = { X };\ prompts[++nump]= tmp;\ } int get_corners() { struct fullscreenvalues values[15]; char far *prompts[15]; static char far xprompt[]={" X"}; static char far yprompt[]={" Y"}; static char far zprompt[]={" Z"}; int i,nump,prompt_ret; int cmag,transp3d; double Xctr,Yctr,Mag; BYTE ousemag; double oxxmin,oxxmax,oyymin,oyymax,oxx3rd,oyy3rd; double ozzmin,ozzmax,ottmin,ottmax; /* note that hdg[15] is used for non-transparent heading: */ static char far hdg[]={"Transparent 3d Image Coordinates"}; int oldhelpmode; transp3d = (Transparent3D && fractalspecific[fractype].orbitcalc == Formula); oldhelpmode = helpmode; ousemag = usemag; oxxmin = xxmin; oxxmax = xxmax; oyymin = yymin; oyymax = yymax; oxx3rd = xx3rd; oyy3rd = yy3rd; ozzmin = zzmin; ozzmax = zzmax; ottmin = ttmin; ottmax = ttmax; gc_loop: for (i = 0; i < 15; ++i) values[i].type = 'd'; /* most values on this screen are type d */ cmag = (!transp3d && usemag && cvtcentermag(&Xctr, &Yctr, &Mag)); nump = -1; if (cmag) { LOADPROMPTS("Center X"); values[nump].uval.dval = Xctr; LOADPROMPTS("Center Y"); values[nump].uval.dval = Yctr; LOADPROMPTS("Magnification"); values[nump].uval.dval = Mag; LOADPROMPTS(""); values[nump].type = '*'; LOADPROMPTS("Press F7 to switch to \"corners\" mode"); values[nump].type = '*'; } else { LOADPROMPTS("Top-Left Corner"); values[nump].type = '*'; prompts[++nump] = xprompt; values[nump].uval.dval = xxmin; prompts[++nump] = yprompt; values[nump].uval.dval = yymax; if (transp3d) { prompts[++nump] = zprompt; values[nump].uval.dval = zzmin; } LOADPROMPTS("Bottom-Right Corner"); values[nump].type = '*'; prompts[++nump] = xprompt; values[nump].uval.dval = xxmax; prompts[++nump] = yprompt; values[nump].uval.dval = yymin; if (transp3d) { prompts[++nump] = zprompt; values[nump].uval.dval = zzmax; } if (transp3d) { LOADPROMPTS("Time Step"); values[nump].type = '*'; LOADPROMPTS(" From"); values[nump].uval.dval = ttmin; LOADPROMPTS(" To"); values[nump].uval.dval = ttmax; } else { if (xxmin == xx3rd && yymin == yy3rd) xx3rd = yy3rd = 0; LOADPROMPTS("Bottom-left (zeros for top-left X, bottom-right Y)"); values[nump].type = '*'; prompts[++nump] = xprompt; values[nump].uval.dval = xx3rd; prompts[++nump] = yprompt; values[nump].uval.dval = yy3rd; LOADPROMPTS("Press F7 to switch to \"center-mag\" mode"); values[nump].type = '*'; } } LOADPROMPTS("Press F4 to reset to type default values"); values[nump].type = '*'; oldhelpmode = helpmode; helpmode = HELPCOORDS; prompt_ret = fullscreen_prompt((transp3d) ? hdg : &hdg[15], nump+1, prompts, values, 0, (transp3d) ? 0x10 : 0x90, /* function keys */ NULL); helpmode = oldhelpmode; if (prompt_ret < 0) { usemag = ousemag; xxmin = oxxmin; xxmax = oxxmax; yymin = oyymin; yymax = oyymax; xx3rd = oxx3rd; yy3rd = oyy3rd; zzmin = ozzmin; zzmax = ozzmax; ttmin = ottmin; ttmax = ottmax; return -1; } if (prompt_ret == F4) { /* reset to type defaults */ xx3rd = xxmin = curfractalspecific->xmin; xxmax = curfractalspecific->xmax; yy3rd = yymin = curfractalspecific->ymin; yymax = curfractalspecific->ymax; if (viewcrop && finalaspectratio != screenaspect) aspectratio_crop(screenaspect,finalaspectratio); goto gc_loop; } if (cmag) { if ( values[0].uval.dval != Xctr || values[1].uval.dval != Yctr || values[2].uval.dval != Mag) { double radius,width; radius = 1.0 / values[2].uval.dval; width = radius * (1.0 / screenaspect); yymax = values[1].uval.dval + radius; yy3rd = yymin = values[1].uval.dval - radius; xxmax = values[0].uval.dval + width; xx3rd = xxmin = values[0].uval.dval - width; } } else { nump = 1; xxmin = values[nump++].uval.dval; yymax = values[nump++].uval.dval; if (transp3d) zzmin = values[nump++].uval.dval; nump++; xxmax = values[nump++].uval.dval; yymin = values[nump++].uval.dval; if (transp3d) zzmax = values[nump++].uval.dval; nump++; if (transp3d) { ttmin = values[nump++].uval.dval; ttmax = values[nump++].uval.dval; } else { xx3rd = values[nump++].uval.dval; yy3rd = values[nump++].uval.dval; if (xx3rd == 0 && yy3rd == 0) { xx3rd = xxmin; yy3rd = yymin; } } } if (prompt_ret == F7) { /* toggle corners/center-mag mode */ if (usemag == 0) if (cvtcentermag(&Xctr, &Yctr, &Mag) == 0) { static char far msg[] = {"Corners rotated or stretched, can't use center-mag"}; stopmsg(0,msg); } else usemag = 1; else usemag = 0; goto gc_loop; } return((xxmin == oxxmin && xxmax == oxxmax && yymin == oyymin && yymax == oyymax && xx3rd == oxx3rd && yy3rd == oyy3rd && zzmin == ozzmin && zzmax == ozzmax && ttmin == ottmin && ttmax == ottmax) ? 0 : 1); }