home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
atarist.tar.gz
/
atarist.tar
/
astgmo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-06-19
|
8KB
|
250 lines
/*
* astgmo.c ATARI ST Kermit GEM interface to option handling
*/
#include <osbind.h> /* TOS binding */
#include <stdio.h> /* common I/O defs */
#include <obdefs.h> /* common Object definitions */
#include <gemdefs.h> /* common GEM definitions */
#include "astinc.h" /* common KERMIT defintions */
#include "astobj.h" /* KERMIT object definitions */
extern FILE *fopenb(),*fopen();
typedef struct opt_entry {
int *kopt_addr;
int kopt_save;
int kopt_init;
int kopt_rindex;
int kopt_rsubindex;
int kopt_form;
} KOPT;
KOPT kopts [] = {
{&rpsiz, TRUE, MAXPACKSIZ, KERPARAM, KPRPCKL, 'd'},
{&spsiz, TRUE, MAXPACKSIZ, KERPARAM, KPSPCKL, 'd'},
{&spad, TRUE, 0, KERPARAM, KPPADL, 'd'},
{&rtimint, TRUE, YOURTIME, KERPARAM, KPRTIMO, 'd'},
{&stimint, TRUE, MYTIME, KERPARAM, KPSTIMO, 'd'},
{&maxtry, TRUE, MAXTRY, KERPARAM, KPMAXTRY, 'd'},
{&ibmmode, TRUE, TRUE, KERMENU, OHANDSHA, 'x'},
{&padding, TRUE, FALSE, KERMENU, OPADDING, 0},
{&dotimout, TRUE, TRUE, KERMENU, OTIMOUT, 0},
{&debug, FALSE, FALSE, KERMENU, ODEBUG, 0},
{&translog, FALSE, FALSE, KERMENU, OTRANLOG, 0},
{&image, TRUE, FALSE, KERMENU, OBINTRAN, 0},
{&filnamwarn, TRUE, TRUE, KERMENU, OFILWARN, 0},
{&rpcks, TRUE, SOH, KERPARAM, KPRPCKST, 'x'},
{&spcks, TRUE, SOH, KERPARAM, KPSPCKST, 'x'},
{&spadc, TRUE, MYPCHAR, KERPARAM, KPSPADC, 'x'},
{&reol, TRUE, MYEOL, KERPARAM, KPREOL, 'x'},
{&seol, TRUE, MYEOL, KERPARAM, KPSEOL, 'x'},
{&rquote, TRUE, MYQUOTE, KERPARAM, KPRQUOTE, 'c'},
{&squote, TRUE, MYQUOTE, KERPARAM, KPSQUOTE, 'c'},
{&rturnchar, TRUE, MYTURNCHAR, KERPARAM, KPRTURN, 'x'},
NIL
};
/*
* look for kermit.opt file
* if not found do default initialization
*/
init_params()
{int ix;
if (!undump_params(KER_INI))
/* no init file file present */
{
for (ix=0; kopts[ix].kopt_addr != NIL; ix++)
*(kopts[ix].kopt_addr) = kopts[ix].kopt_init;
};
for (ix=0; kopts[ix].kopt_addr != NIL; ix++)
if (!kopts[ix].kopt_save)
*(kopts[ix].kopt_addr) = kopts[ix].kopt_init;
}
/*
* read parameters from file
*/
int undump_params(optfilename)
char *optfilename;
{FILE *pf;
int ix;
pf = fopen(optfilename,"r");
if (pf == NIL) return FALSE;
for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
if (kopts[ix].kopt_save)
fscanf(pf,"%x",kopts[ix].kopt_addr);
fclose(pf);
return TRUE;
}
/*
* save parameters on file
*/
int dump_params(optfilename)
char *optfilename;
{FILE *pf;
int ix;
pf = fopen(optfilename,"w");
if (pf == NIL) return FALSE;
for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
if (kopts[ix].kopt_save)
fprintf(pf,"%x\n",*(kopts[ix].kopt_addr));
fclose(pf);
return TRUE;
}
/*
* handle clicking on the option menu
*/
do_option(option_ix)
int option_ix;
{char fn[80];
OBJECT *obj_addr;
int ix;
switch (option_ix)
{case OPARSAVE:
displ_object(KRODOSAV,-1,0,MOPTION,&obj_addr);
if (fgetfilename(kpathname,KER_INI,fn))
if (!dump_params(fn))
displ_alert(1,KRINIERR);
else displ_alert(1,KRSAVDON);
destroy_object(KRODOSAV,-1,0,MOPTION);
break;
case OPARGET:
displ_object(KRODOGET,-1,0,MOPTION,&obj_addr);
if (fgetfilename(kpathname,KER_INI,fn))
if (!undump_params(fn))
displ_alert(1,KRFILNEX);
else
displ_alert(1,KRGETDON);
destroy_object(KRODOGET,-1,0,MOPTION);
break;
case OPARCHAN:
opt_dialog();
break;
case ODEBUG:
if (debug)
{
fclose(deb);
displ_alert(1,KRDBCLSD);
}
else
{
displ_object(KRODODEB,-1,0,MOPTION,&obj_addr);
if (fgetfilename(kpathname,KER_DEB,fn))
{
deb = fopen(fn,"w");
if (deb == NIL)
{
debug = TRUE;
displ_alert(1,KERRFOPN);
}
else deblevel = displ_alert(1,KRDEBDON);
}
else
debug = TRUE;
destroy_object(KRODODEB,-1,0,MOPTION);
};
break;
case OTRANLOG:
if (translog)
{
fclose(log);
displ_alert(1,KRTFCLSD);
}
else
{
displ_object(KRODOTF,-1,0,MOPTION,&obj_addr);
if (fgetfilename(kpathname,KER_LOG,fn))
{
log = fopen(fn,"w");
if (log == NIL)
{
translog = TRUE;
displ_alert(1,KERRFOPN);
}
else displ_alert(1,KRTFDON);
}
else
translog = TRUE;
destroy_object(KRODOTF,-1,0,MOPTION);
};
break;
}; /* switch */
for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
{
if ((kopts[ix].kopt_rindex == KERMENU) &&
(kopts[ix].kopt_rsubindex == option_ix))
{
*(kopts[ix].kopt_addr) = !(*(kopts[ix].kopt_addr));
};
};
check_options();
}
/*
* set check marks in menu
*/
check_options()
{int ix;
long addr;
rsrc_gaddr(R_TREE,KERMENU,&addr);
for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
if (kopts[ix].kopt_rindex == KERMENU)
menu_icheck(addr,kopts[ix].kopt_rsubindex,
*(kopts[ix].kopt_addr));
};
/*
* set option values individually
*/
opt_dialog()
{char *valsp;
int ix, val, minoix, res;
OBJECT *opp;
rsrc_gaddr(R_TREE,KERPARAM,&opp);
/* update parameter table with values */
for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
if (kopts[ix].kopt_rindex == KERPARAM)
{valsp = opp[kopts[ix].kopt_rsubindex].ob_spec->te_ptext;
val = *(kopts[ix].kopt_addr);
switch (kopts[ix].kopt_form)
{case 'c': sprintf(valsp,"%c",val); break;
case 'd': sprintf(valsp,"%2d",val); break;
case 'x': sprintf(valsp,"%02x",val);break;
}
};
/* search for start object */
minoix = 32000;
for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
if (kopts[ix].kopt_rindex == KERPARAM)
minoix = ((minoix < kopts[ix].kopt_rsubindex) ?
minoix : (kopts[ix].kopt_rsubindex));
/* display object and and analyze inputs */
change_state(opp,KPEXITOK,NORMAL);
change_state(opp,KPABORT,NORMAL);
displ_object(KERPARAM,-1,-1,MOPTION,&opp);
if (form_do(opp,minoix) == KPEXITOK)
for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
if (kopts[ix].kopt_rindex == KERPARAM)
{valsp = opp[kopts[ix].kopt_rsubindex].ob_spec->te_ptext;
if (*valsp != '\0')
{switch (kopts[ix].kopt_form)
{case 'c': val = *valsp; res = 1; break;
case 'd': res = sscanf(valsp,"%d",&val); break;
case 'x': res = sscanf(valsp,"%x",&val); break;
};
if (res > 0)
*(kopts[ix].kopt_addr) = val;
};
};
destroy_object(KERPARAM,-1,-1,MOPTION);
}