home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / atarist / astgmo.c < prev    next >
C/C++ Source or Header  |  2020-01-01  |  8KB  |  250 lines

  1. /*
  2.  * astgmo.c ATARI ST Kermit GEM interface to option handling
  3.  */
  4.  
  5. #include <osbind.h>   /* TOS binding */
  6. #include <stdio.h>    /* common I/O defs */
  7. #include <obdefs.h>   /* common Object definitions */
  8. #include <gemdefs.h>  /* common GEM definitions */
  9. #include "astinc.h"   /* common KERMIT defintions */
  10. #include "astobj.h"   /* KERMIT object definitions */
  11.  
  12.  
  13. extern FILE *fopenb(),*fopen();
  14.  
  15. typedef struct opt_entry {
  16.      int *kopt_addr;
  17.      int  kopt_save;
  18.      int  kopt_init;
  19.      int  kopt_rindex;
  20.      int  kopt_rsubindex;
  21.      int  kopt_form;
  22. } KOPT;
  23.  
  24.  
  25. KOPT kopts [] = {
  26. {&rpsiz,      TRUE, MAXPACKSIZ, KERPARAM, KPRPCKL,  'd'},
  27. {&spsiz,      TRUE, MAXPACKSIZ, KERPARAM, KPSPCKL,  'd'},
  28. {&spad,       TRUE,          0, KERPARAM, KPPADL,   'd'},
  29. {&rtimint,    TRUE,   YOURTIME, KERPARAM, KPRTIMO,  'd'},
  30. {&stimint,    TRUE,     MYTIME, KERPARAM, KPSTIMO,  'd'},
  31. {&maxtry,     TRUE,     MAXTRY, KERPARAM, KPMAXTRY, 'd'},
  32. {&ibmmode,    TRUE,       TRUE,  KERMENU, OHANDSHA, 'x'},
  33. {&padding,    TRUE,      FALSE,  KERMENU, OPADDING,   0},
  34. {&dotimout,  TRUE,       TRUE,   KERMENU, OTIMOUT,    0},
  35. {&debug,     FALSE,      FALSE,  KERMENU, ODEBUG,     0},
  36. {&translog,  FALSE,      FALSE,  KERMENU, OTRANLOG,   0},
  37. {&image,      TRUE,      FALSE,  KERMENU, OBINTRAN,   0},
  38. {&filnamwarn, TRUE,       TRUE,  KERMENU, OFILWARN,   0},
  39. {&rpcks,      TRUE,        SOH, KERPARAM, KPRPCKST, 'x'},
  40. {&spcks,      TRUE,        SOH, KERPARAM, KPSPCKST, 'x'},
  41. {&spadc,      TRUE,    MYPCHAR, KERPARAM, KPSPADC,  'x'},
  42. {&reol,       TRUE,      MYEOL, KERPARAM, KPREOL,   'x'},
  43. {&seol,       TRUE,      MYEOL, KERPARAM, KPSEOL,   'x'},
  44. {&rquote,     TRUE,    MYQUOTE, KERPARAM, KPRQUOTE, 'c'},
  45. {&squote,     TRUE,    MYQUOTE, KERPARAM, KPSQUOTE, 'c'},
  46. {&rturnchar,  TRUE, MYTURNCHAR, KERPARAM, KPRTURN,  'x'},
  47. NIL
  48. };
  49.  
  50. /*
  51.  * look for kermit.opt file
  52.  * if not found do default initialization
  53.  */
  54. init_params()
  55. {int ix;
  56.  if (!undump_params(KER_INI))
  57.   /* no init file file present */
  58.   {
  59.    for (ix=0; kopts[ix].kopt_addr != NIL; ix++)
  60.        *(kopts[ix].kopt_addr) = kopts[ix].kopt_init;
  61.   };
  62.  for (ix=0; kopts[ix].kopt_addr != NIL; ix++)
  63.      if (!kopts[ix].kopt_save)
  64.         *(kopts[ix].kopt_addr) = kopts[ix].kopt_init;
  65. }
  66.  
  67. /*
  68.  * read parameters from file
  69.  */
  70. int undump_params(optfilename)
  71. char *optfilename;
  72. {FILE *pf;
  73.  int ix;
  74.  pf = fopen(optfilename,"r");
  75.  if (pf == NIL) return FALSE;
  76.  for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
  77.      if (kopts[ix].kopt_save)
  78.          fscanf(pf,"%x",kopts[ix].kopt_addr);
  79.  fclose(pf);
  80.  return TRUE;
  81. }
  82.  
  83. /*
  84.  * save parameters on file
  85.  */
  86.  
  87. int dump_params(optfilename)
  88. char *optfilename;
  89. {FILE *pf;
  90.  int ix;
  91.  pf = fopen(optfilename,"w");
  92.  if (pf == NIL) return FALSE;
  93.  for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
  94.      if (kopts[ix].kopt_save)
  95.          fprintf(pf,"%x\n",*(kopts[ix].kopt_addr));
  96.  fclose(pf);
  97.  return TRUE;
  98. }
  99.  
  100. /*
  101.  * handle clicking on the option menu
  102.  */
  103. do_option(option_ix)
  104. int option_ix;
  105. {char fn[80];
  106.  OBJECT *obj_addr;
  107.  int ix;
  108.  switch (option_ix)
  109.          {case OPARSAVE:
  110.                displ_object(KRODOSAV,-1,0,MOPTION,&obj_addr);
  111.                if (fgetfilename(kpathname,KER_INI,fn))
  112.                   if (!dump_params(fn))
  113.                      displ_alert(1,KRINIERR);
  114.                   else displ_alert(1,KRSAVDON);
  115.                destroy_object(KRODOSAV,-1,0,MOPTION);
  116.                break;
  117.           case OPARGET:
  118.                displ_object(KRODOGET,-1,0,MOPTION,&obj_addr);
  119.                if (fgetfilename(kpathname,KER_INI,fn))
  120.                   if (!undump_params(fn))
  121.                      displ_alert(1,KRFILNEX);
  122.                   else
  123.                      displ_alert(1,KRGETDON);
  124.                destroy_object(KRODOGET,-1,0,MOPTION);
  125.                break;
  126.           case OPARCHAN:
  127.                opt_dialog();
  128.                break;
  129.           case ODEBUG:
  130.                if (debug)
  131.                   {
  132.                    fclose(deb);
  133.                    displ_alert(1,KRDBCLSD);
  134.                   }
  135.                else
  136.                   {
  137.                    displ_object(KRODODEB,-1,0,MOPTION,&obj_addr);
  138.                    if (fgetfilename(kpathname,KER_DEB,fn))
  139.                       {
  140.                        deb = fopen(fn,"w");
  141.                        if (deb == NIL)
  142.                           {
  143.                            debug = TRUE;
  144.                            displ_alert(1,KERRFOPN);
  145.                           }
  146.                        else deblevel = displ_alert(1,KRDEBDON);
  147.                       }
  148.                    else
  149.                       debug = TRUE;
  150.                    destroy_object(KRODODEB,-1,0,MOPTION);
  151.                   };
  152.                break;
  153.           case OTRANLOG:
  154.                if (translog)
  155.                   {
  156.                    fclose(log);
  157.                    displ_alert(1,KRTFCLSD);
  158.                   }
  159.                else
  160.                   {
  161.                    displ_object(KRODOTF,-1,0,MOPTION,&obj_addr);
  162.                    if (fgetfilename(kpathname,KER_LOG,fn))
  163.                       {
  164.                        log = fopen(fn,"w");
  165.                        if (log == NIL)
  166.                           {
  167.                            translog = TRUE;
  168.                            displ_alert(1,KERRFOPN);
  169.                           }
  170.                        else displ_alert(1,KRTFDON);
  171.                       }
  172.                    else
  173.                      translog = TRUE;
  174.                    destroy_object(KRODOTF,-1,0,MOPTION);
  175.                   };
  176.                break;
  177.          }; /* switch */
  178.  for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
  179.      {
  180.       if ((kopts[ix].kopt_rindex == KERMENU) &&
  181.           (kopts[ix].kopt_rsubindex == option_ix))
  182.          {
  183.           *(kopts[ix].kopt_addr) = !(*(kopts[ix].kopt_addr));
  184.          };
  185.      };
  186.  check_options();
  187. }
  188.  
  189. /*
  190.  * set check marks in menu
  191.  */
  192. check_options()
  193. {int ix;
  194.  long addr;
  195.  rsrc_gaddr(R_TREE,KERMENU,&addr);
  196.  for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
  197.      if (kopts[ix].kopt_rindex == KERMENU)
  198.          menu_icheck(addr,kopts[ix].kopt_rsubindex,
  199.                      *(kopts[ix].kopt_addr));
  200. };
  201.  
  202. /*
  203.  * set option values individually
  204.  */
  205. opt_dialog()
  206. {char *valsp;
  207.  int ix, val, minoix, res;
  208.  OBJECT *opp;
  209.  
  210.  rsrc_gaddr(R_TREE,KERPARAM,&opp);
  211.  /* update parameter table with values */
  212.  for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
  213.      if (kopts[ix].kopt_rindex == KERPARAM)
  214.         {valsp = opp[kopts[ix].kopt_rsubindex].ob_spec->te_ptext;
  215.          val = *(kopts[ix].kopt_addr);
  216.          switch (kopts[ix].kopt_form)
  217.                 {case 'c': sprintf(valsp,"%c",val);  break;
  218.                  case 'd': sprintf(valsp,"%2d",val); break;
  219.                  case 'x': sprintf(valsp,"%02x",val);break;
  220.                 }
  221.         };
  222.  
  223.  /* search for start object */
  224.  minoix = 32000;
  225.  for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
  226.      if (kopts[ix].kopt_rindex == KERPARAM)
  227.         minoix = ((minoix < kopts[ix].kopt_rsubindex) ?
  228.                   minoix : (kopts[ix].kopt_rsubindex));
  229.  
  230.  /* display object and and analyze inputs */
  231.  change_state(opp,KPEXITOK,NORMAL);
  232.  change_state(opp,KPABORT,NORMAL);
  233.  displ_object(KERPARAM,-1,-1,MOPTION,&opp);
  234.  if (form_do(opp,minoix) == KPEXITOK)
  235.      for (ix = 0; kopts[ix].kopt_addr != NIL; ix++)
  236.           if (kopts[ix].kopt_rindex == KERPARAM)
  237.              {valsp = opp[kopts[ix].kopt_rsubindex].ob_spec->te_ptext;
  238.               if (*valsp != '\0')
  239.                  {switch (kopts[ix].kopt_form)
  240.                          {case 'c': val = *valsp; res = 1; break;
  241.                           case 'd': res = sscanf(valsp,"%d",&val); break;
  242.                           case 'x': res = sscanf(valsp,"%x",&val); break;
  243.                          };
  244.                   if (res > 0)
  245.                      *(kopts[ix].kopt_addr) = val;
  246.                  };
  247.              };
  248.  destroy_object(KERPARAM,-1,-1,MOPTION);
  249. }
  250.