/* * astgmo.c ATARI ST Kermit GEM interface to option handling */ #include /* TOS binding */ #include /* common I/O defs */ #include /* common Object definitions */ #include /* 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); }