home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 287.lha / TY_v1.3 / src / option.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-07  |  9.8 KB  |  246 lines

  1. /*************************************************************************
  2.  ***                        option.c                     (JJB TEMPLAR) ***
  3.  *** Date modifications begun: 7/8/89.                                 ***
  4.  *** Last modified: 26/8/89.                                           ***
  5.  *************************************************************************/
  6. /*** Process command line options.                                     ***
  7.  *************************************************************************/
  8.  
  9. #include "less.h"
  10.  
  11. #include <libraries/dosextens.h>
  12. #include <workbench/workbench.h>
  13. #include <proto/icon.h>
  14.  
  15. extern APTR             WBenchMsg;      /* A lie, to ... etc */
  16. extern struct IconBase  *IconBase;
  17. extern char             *_ProgramName;
  18.  
  19. extern int  gotenv();
  20.  
  21. #define DEF_F_NBUFS     5   /* Default for f_nbufs. This value has been
  22.     * hard coded into some of the printf statements, so if you change it,
  23.     * don't forget to modify them too. */
  24.  
  25. int     f_nbufs     = DEF_F_NBUFS;  /* Number of buffers to use. */
  26. int     top_scroll  = 0;            /* Repaint screen from top? */
  27. int     pr_type     = PR_SHORT;     /* Type of prompt (short, medium, long) */
  28. int     quit_at_eof = 0;            /* Quit after hitting end of file twice */
  29. int     squeeze     = 0;            /* Squeeze multiple blank lines into 1 */
  30. int     back_scroll = 30;           /* Repaint screen on backwards movement */
  31. int     twiddle     = 1;            /* Display "~" for lines after EOF */
  32. int     fast_line   = 1;            /* Ignore special characters? */
  33. int     scroll_bar  = 0;            /* Use scroll bar? */
  34. int     maxim       = 0;            /* Open maximum window? */
  35. int     quiet       = 0;            /* Don't use me audio bell? */
  36.  
  37. extern int  nbufs;
  38. extern char version[];
  39.  
  40. extern int  pat_opt;        /* Flag that new pattern has been set */
  41. extern char pat[];          /* Holds pattern. User may crash if pattern is
  42.                              * too long */
  43.  
  44. char    *usage[] = {
  45. "",version," :text display program.\n",
  46. "USAGE: ",NULL," [<{+|-}{mode}>] [#{num}] <filename>\n",
  47. "    where filename = the name of a file to read.\n",
  48. "          mode = f         [+] fast line mode (ignore's special chars).\n",
  49. "                 t         [+] twiddle mode (marks lines after EOF with ~).\n",
  50. "                 b         [+] back scroll.\n",
  51. "                 T         [-] top scroll.\n",
  52. "                 q         [-] quit after two attempts to go past EOF.\n",
  53. "                 s         [-] squeeze multiple blank lines together.\n",
  54. "                 S         [-] scroll bar.\n",
  55. "                 p{s|m|l}  [s] prompt type (short|medium|long).\n",
  56. "                 m         [-] maximise window size.\n",
  57. "                 P{str}    [ ] set default search pattern to str (max 20).\n",
  58. "                 Q         [-] be quiet (use DisplayBeep for bell).\n",
  59. "    '+' means turn mode on, '-' means turn mode off, defaults are above.\n",
  60. "          num = number of buffers to use [min/default = 5].\n",
  61. "NOTE: [] - optional, <> - 1 or more, {} - mandatory.\n"};
  62.  
  63. char    *tooltypes[] = {
  64.     "FAST",
  65.     "TWIDDLE",
  66.     "BACKSCROLL",
  67.     "TOPSCROLL",
  68.     "QUITEOF",
  69.     "SQUEEZE",
  70.     "SCROLLBAR",
  71.     "PROMPT",
  72.     "NUMBUFS",
  73.     "MAXIM",
  74.     "PATTERN",
  75.     "QUIET"};
  76.  
  77. void    doenv();
  78. int     toolval(char *);
  79.  
  80. int     toolval(val) /*==================================================*/
  81. char    *val;
  82. {
  83.     return((MatchToolValue(val,"ON"))? 1: 0);
  84. }
  85.  
  86. int     getint(cp) /*====================================================*/
  87. register char   *cp;
  88. {
  89. register char   *st = cp;
  90. register int    ret,place;
  91.   /*** Don't swallow whitespace ------------------------------------------
  92.     while (*st == ' ') *st++;
  93.     cp = st;
  94.    ------------------------------------------------------------------- ***/
  95.     while ((*cp >= '0') && (*cp <= '9')) *cp++;
  96.     ret = 0;    place = 1;
  97.     while (--cp >= st) {
  98.         ret += (*cp - '0') * place;
  99.         place *= 10;
  100.     }
  101.     return(ret);
  102. }
  103.  
  104. void    opticon(fname) /*================================================*/
  105. char    *fname;
  106. {
  107. register struct DiskObject *icon;
  108. register char   *val;
  109. register int    j;
  110.  
  111.   /* Fails if no library, from CLI, or no icon */
  112.     if (!IconBase || !WBenchMsg || !(icon = GetDiskObject(fname)))
  113.         return;
  114.  
  115.     for (j = 0; j < sizeof(tooltypes)/4; j++) {
  116.         val = (char *)FindToolType(icon->do_ToolTypes,tooltypes[j]);
  117.         if (val) switch (j) {
  118.             case (0): fast_line   = toolval(val);       break;
  119.             case (1): twiddle     = toolval(val);       break;
  120.             case (2): back_scroll = toolval(val) * 30;  break;
  121.             case (3): top_scroll  = toolval(val);       break;
  122.             case (4): quit_at_eof = toolval(val);       break;
  123.             case (5): squeeze     = toolval(val);       break;
  124.             case (6): scroll_bar  = toolval(val);       break;
  125.             case (7): switch (*val) {
  126.                     case ('S'): pr_type = PR_SHORT;     break;
  127.                     case ('M'): pr_type = PR_MEDIUM;    break;
  128.                     case ('L'): pr_type = PR_LONG;      break;
  129.                 }
  130.                 break;
  131.             case (8): f_nbufs = getint(val);
  132.                       if (f_nbufs < DEF_F_NBUFS) f_nbufs = DEF_F_NBUFS;
  133.                       break;
  134.             case (9): maxim       = toolval(val);       break;
  135.             case (10):  pat_opt = 1;
  136.                         strcpy(pat,val);
  137.                         break;
  138.             case (11): quiet      = toolval(val);       break;
  139.         }
  140.     }
  141.     FreeDiskObject(icon);
  142. }
  143.  
  144. void    doopts(argc,argv) /*=============================================*/
  145. register int    argc;     /* main processes filenames. This routine     */
  146. register char   *argv[];  /* just does the options (+|-|#)c             */
  147. {
  148. register int    on,j;
  149.     doenv();                /* Check ENV:ty */
  150.     if (!argc) {            /* From WB. Get args from program's icon */
  151.         opticon(_ProgramName);
  152.         return;
  153.     }
  154.     while (--argc) {
  155.         on = 0;            /* '-' turns option off */
  156.         switch (argv[argc][0]) {
  157.             case ('+'): on = 1;     /* And fall through */
  158.             case ('-'): switch (argv[argc][1]) {
  159.                     case ('f'): fast_line = on;     break;
  160.                     case ('t'): twiddle = on;       break;
  161.                     case ('b'): back_scroll = on*30;    break;
  162.                     case ('s'): squeeze = on;       break;
  163.                     case ('q'): quit_at_eof = on;   break;
  164.                     case ('T'): top_scroll = on;    break;
  165.                     case ('S'): scroll_bar = on;    break;
  166.                     case ('p'): switch (argv[argc][2]) {
  167.                             case ('s'): pr_type = PR_SHORT;  break;
  168.                             case ('m'): pr_type = PR_MEDIUM; break;
  169.                             case ('l'): pr_type = PR_LONG;   break;
  170.                         }
  171.                         break;
  172.                     case ('m'): maxim = on;         break;
  173.                     case ('P'): pat_opt = 1;
  174.                                 strcpy(pat,&argv[argc][2]);
  175.                                 break;
  176.                     case ('Q'): quiet = on;         break;
  177.                 }
  178.                 break;
  179.             case ('#'): f_nbufs = getint(&argv[argc][1]);
  180.                         if (f_nbufs < DEF_F_NBUFS) {
  181.                             printf("WARNING: # doesn't go less than 5!\n");
  182.                             f_nbufs = DEF_F_NBUFS;
  183.                         }
  184.                         break;
  185.             case ('?'): usage[4] = argv[0];
  186.                         for (j = 0; j < sizeof(usage)/4; j++) printf(usage[j]);
  187.                         cleanup(NULL,0);
  188.         }
  189.     }
  190. }
  191.  
  192. void    doenv() /*=======================================================*/
  193. {               /* This function could be cleaned up a bit!              */
  194. BPTR    file;
  195. char    buf[80];
  196. int     len;
  197. register int    on,j;
  198. register char   *name;
  199.  
  200.     if (!gotenv()) return;                           /* Didn't find ENV: */
  201.     if (!(file = Open("ENV:ty",MODE_OLDFILE))) return; /* No ty variable */
  202.     if ((len = Read(file,buf,79)) <= 0) {
  203.         Close(file);                  /* Either empty file, or DOS error */
  204.         return;
  205.     }
  206.     Close(file);
  207.     buf[len] = 0;       name = buf;
  208.     while (*name) {
  209.         on = 0;
  210.         switch (*name++) {
  211.             case ('+'): on = 1;
  212.             case ('-'): switch (*name) {
  213.                     case ('f'): fast_line = on;     break;
  214.                     case ('t'): twiddle = on;       break;
  215.                     case ('b'): back_scroll = on*30;    break;
  216.                     case ('s'): squeeze = on;       break;
  217.                     case ('q'): quit_at_eof = on;   break;
  218.                     case ('T'): top_scroll = on;    break;
  219.                     case ('S'): scroll_bar = on;    break;
  220.                     case ('p'): switch (*(++name)) {
  221.                             case ('s'): pr_type = PR_SHORT;  break;
  222.                             case ('m'): pr_type = PR_MEDIUM; break;
  223.                             case ('l'): pr_type = PR_LONG;   break;
  224.                         }
  225.                         break;
  226.                     case ('m'): maxim = on;         break;
  227.                     case ('P'): pat_opt = 1;    j = 0;      name++;
  228.                                 while (*name && (*name != ' '))
  229.                                     pat[j++] = *name++;
  230.                                 pat[j] = 0;
  231.                                 break;
  232.                     case ('Q'): quiet = on;         break;
  233.                     default: name--;
  234.                 }
  235.                 if (*name) name++;
  236.                 break;
  237.             case ('#'): f_nbufs = getint(name);
  238.                         if (f_nbufs < DEF_F_NBUFS) {
  239.                             printf("WARNING: # doesn't go less than 5!\n");
  240.                             f_nbufs = DEF_F_NBUFS;
  241.                         }
  242.                         break;
  243.     }
  244.     }
  245. }
  246.