home *** CD-ROM | disk | FTP | other *** search
/ Der Mediaplex Sampler - Die 6 von Plex / 6_v_plex.zip / 6_v_plex / DISK5 / DOS_50 / PVIC.ZIP / PARAM.C < prev    next >
C/C++ Source or Header  |  1993-04-21  |  5KB  |  157 lines

  1. /* 
  2.  * Code to handle user-settable parameters. This is all pretty much table-
  3.  * driven. To add a new parameter, put it in the params array, and add a
  4.  * macro for it in param.h. If it's a numeric parameter, add any necessary
  5.  * bounds checks to do_set(). String parameters aren't currently supported.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include "pvic.h"
  10. #include "locdefs.h"
  11.  
  12. struct  param   params[] = {
  13.  
  14.     { "lines",      "lines",        24,     NUMERIC_PARAMETER },
  15.     { "report",     "report",       5,      NUMERIC_PARAMETER },
  16.     { "scroll",     "scroll",       12,     NUMERIC_PARAMETER },
  17.     { "tabstop",    "ts",           8,      NUMERIC_PARAMETER },
  18.  
  19.     { "autoindent", "ai",           0,      BOOLEAN_PARAMETER },
  20.     { "backup",     "bk",           0,      BOOLEAN_PARAMETER },
  21.     { "errorbells", "eb",           0,      BOOLEAN_PARAMETER },
  22.     { "ignorecase", "ic",           0,      BOOLEAN_PARAMETER },
  23.     { "list",       "list",         0,      BOOLEAN_PARAMETER },
  24.     { "modelines",  "ml",           1,      BOOLEAN_PARAMETER },
  25.     { "number",     "nu",           0,      BOOLEAN_PARAMETER },
  26.     { "showmatch",  "sm",           0,      BOOLEAN_PARAMETER },
  27.     { "showmode",   "mo",           1,      BOOLEAN_PARAMETER },
  28.     { "vbell",      "vb",           0,      BOOLEAN_PARAMETER },
  29.     { "wrapscan",   "ws",           1,      BOOLEAN_PARAMETER },
  30.     { "",           "",             0,      0, }            /* end marker */
  31.  
  32. };
  33.  
  34. static  void    showparms();
  35.  
  36. void
  37. do_set(arg)
  38. char    *arg;           /* parameter string */
  39. {
  40.     register int    i;
  41.     register char   *s;
  42.     int     did_lines = (0);
  43.     int     state = (1);            /* new state of boolean parms. */
  44.  
  45.     if (arg == NULL) {
  46.         showparms((0));
  47.         return;
  48.     }
  49.     if (strncmp(arg, "all", 3) == 0) {
  50.         showparms((1));
  51.         return;
  52.     }
  53.     if (strncmp(arg, "no", 2) == 0) {
  54.         state = (0);
  55.         arg += 2;
  56.     }
  57.  
  58.     for (i=0; params[i].fullname[0] != '\0' ;i++) {
  59.         s = params[i].fullname;
  60.         if (strncmp(arg, s, strlen(s)) == 0)    /* matched full name */
  61.             break;
  62.         s = params[i].shortname;
  63.         if (strncmp(arg, s, strlen(s)) == 0)    /* matched short name */
  64.             break;
  65.     }
  66.  
  67.     if (params[i].fullname[0] != '\0') {    /* found a match */
  68.         if (params[i].flags & NUMERIC_PARAMETER) {
  69.             did_lines = (i == PARAMETER_LINES);
  70.             if (arg[strlen(s)] != '=' || state == (0))
  71.                 error_message("Invalid set of numeric parameter");
  72.             else {
  73.                 params[i].value = atoi(arg+strlen(s)+1);
  74.                 params[i].flags |= PARAMETER_HAS_CHANGED;
  75.             }
  76.         } else /* boolean */ {
  77.             if (arg[strlen(s)] == '=')
  78.                 error_message("Invalid set of boolean parameter");
  79.             else {
  80.                 params[i].value = state;
  81.                 params[i].flags |= PARAMETER_HAS_CHANGED;
  82.             }
  83.         }
  84.     } else
  85.         error_message("Unrecognized 'set' option");
  86.  
  87.     /*
  88.      * Update the screen in case we changed something like "tabstop"
  89.      * or "list" that will change its appearance.
  90.      */
  91.     update_screen(0);
  92.  
  93.     if (did_lines) {
  94.         current_lines=PARAMETER_VALUE(PARAMETER_LINES);
  95.         if(current_lines<4)current_lines=
  96.             PARAMETER_VALUE(PARAMETER_LINES)=4;
  97.         else if(current_lines>termcap_lines)current_lines=
  98.             PARAMETER_VALUE(PARAMETER_LINES)=termcap_lines;
  99.         if (alloc_screen() == -1) return;        /* allocate new screen buffers */
  100.         clear_screen();
  101.         update_screen(0);
  102.     }
  103.     /*
  104.      * Check the bounds for numeric parameters here
  105.      */
  106.     if (PARAMETER_VALUE(PARAMETER_TABSTOP) <= 0 || PARAMETER_VALUE(PARAMETER_TABSTOP) > 32) {
  107.         error_message("Invalid tab size specified");
  108.         PARAMETER_VALUE(PARAMETER_TABSTOP) = 8;
  109.         return;
  110.     }
  111.  
  112.     if (PARAMETER_VALUE(PARAMETER_SCROLL) <= 0 || PARAMETER_VALUE(PARAMETER_SCROLL) > termcap_lines) {
  113.         error_message("Invalid scroll size specified");
  114.         PARAMETER_VALUE(PARAMETER_SCROLL) = 12;
  115.         return;
  116.     }
  117.  
  118.     /*
  119.      * Check for another argument, and call do_set() recursively, if
  120.      * found. If any argument results in an error, no further
  121.      * parameters are processed.
  122.      */
  123.     while (*arg != ' ' && *arg != '\t') {   /* skip to next white space */
  124.         if (*arg == '\0')
  125.             return;                 /* end of parameter list */
  126.         arg++;
  127.     }
  128.     while (*arg == ' ' || *arg == '\t')     /* skip to next non-white */
  129.         arg++;
  130.  
  131.     if (*arg)
  132.         do_set(arg);     /* recurse on next parameter */
  133. }
  134.  
  135. static  void
  136. showparms(all)
  137. int     all;    /* show ALL parameters */
  138. {
  139.     register struct param   *p;
  140.     char    buf[64];
  141.  
  142.     goto_command((1), 0);
  143.     fprintf(stdout,"Parameters:\n");
  144.  
  145.     for (p = ¶ms[0]; p->fullname[0] != '\0' ;p++) {
  146.         if (!all && ((p->flags & PARAMETER_HAS_CHANGED) == 0))
  147.             continue;
  148.         if (p->flags & BOOLEAN_PARAMETER)
  149.             fprintf(stdout,"\t%s%s\n",
  150.                 (p->value ? "" : "no"), p->fullname);
  151.         else
  152.             fprintf(stdout,"\t%s=%d\n",p->fullname, p->value);
  153.  
  154.     }
  155.     wait_return();
  156. }
  157.