📄 prompts2.c
字号:
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
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -