home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume16 / conf2 / part02 / confopts.c < prev   
Encoding:
C/C++ Source or Header  |  1988-09-14  |  9.2 KB  |  451 lines

  1. #include "conf.h"
  2.  
  3. int set_name(), set_ptrstr();
  4.  
  5. gettcap()
  6. {
  7.     char *ptr;
  8.     char buf[1024];
  9.  
  10.     if (tgetent(buf, getenv("TERM")) == 1)
  11.     {
  12.     columns=tgetnum("co");
  13.     lines=tgetnum("li");
  14.     tcapstr("cl", &cls);
  15.     }
  16.     else
  17.     puts("Unknown terminal type.  I'll wing it.\n");
  18.  
  19.     if ((ptr = getenv("COLUMNS")) != NULL)
  20.     columns = atoi(ptr);
  21.  
  22.     if ((ptr = getenv("LINES")) != NULL)
  23.     lines = atoi(ptr);
  24.  
  25.     if ((ptr = getenv("SHELL")) != NULL)
  26.     {
  27.     shell = myrealloc(shell, strlen(ptr)+1);
  28.     (void) strcpy(shell, ptr);
  29.     }
  30.  
  31.     if ((ptr = getenv("PG")) != NULL)
  32.     {
  33.     pager = myrealloc(pager, strlen(ptr)+1);
  34.     (void) strcpy(pager, ptr);
  35.     }
  36.  
  37.     if ((ptr = getenv("PAGER")) != NULL)
  38.     {
  39.     pager = myrealloc(pager, strlen(ptr)+1);
  40.     (void) strcpy(pager, ptr);
  41.     }
  42. }
  43.  
  44. getrc()
  45. {
  46.     char *fname;
  47.     char tmp[100];
  48.     char *bp, *p;
  49.     int c;
  50.     FILE *fp;
  51.  
  52.     if (homedir == NULL)
  53.     {
  54.     (void) fprintf(stderr, "%s: Can't figure you out!  Not using %s.\n",
  55.                progname, CONFRC);
  56.     return;
  57.     }
  58.  
  59.     fname = mymalloc((unsigned)(strlen(homedir) + 1 + strlen(CONFRC) + 1));
  60.  
  61.     (void) strcpy(fname, homedir);
  62.     (void) strcat(fname, "/");
  63.     (void) strcat(fname, CONFRC);
  64.  
  65.     if ((fp = fopen(fname, "r")) == (FILE *)NULL)
  66.     {
  67.     if (errno == ENOENT)
  68.         return;                /* no confrc file...  sigh */
  69.     else
  70.     {
  71.         (void) fprintf(stderr,
  72.                "%s: Couldn't open confrc file %s (%s).\n",
  73.                progname, fname, puterr(errno));
  74.     free(fname);
  75.     exit(-1);
  76.     }
  77.     }
  78.  
  79.     forever
  80.     {
  81.     p = bp = tmp;
  82.  
  83.     while (((c = getc(fp)) != EOF) && (c != '\n'))
  84.         *p++ = c;
  85.  
  86.     if (c == EOF)
  87.         break;
  88.  
  89.     *p = '\0';
  90.  
  91.     while (isspace(*bp))
  92.         bp++;
  93.  
  94.     if ((*bp == '#') || (*bp == ';') || (*bp == '\0'))
  95.         continue;
  96.  
  97.     if (*bp == ':')            /* a colon command? */
  98.     {
  99.         linelen = strlen(bp+1);
  100.         if (!intpret(bp+1))
  101.         {
  102.         (void) printf("Invalid confrc line in %s @\"%s\".\n",
  103.                   fname,bp);
  104.         return;
  105.         }
  106.     }
  107.     else
  108.     {
  109.         if ((bp = parsestr(bp, p-bp, NEXTWORD)) == NULL)
  110.         continue;
  111.  
  112.         do
  113.         {
  114.         if ((c = setopts(bp)) != FOUNDOPT)
  115.         {
  116.             if (c == AMBIGUOUS)
  117.             (void)fputs("Ambiguous", stdout);
  118.             else
  119.             (void)fputs("Invalid", stdout);
  120.  
  121.             (void) printf(" confrc file %s @\"%s\"\n", fname, bp);
  122.             free(fname);
  123.             return;
  124.         }
  125.         } while ((bp = parsestr((char *)NULL, 0, NEXTWORD)) != NULL);
  126.     }
  127.     }
  128.  
  129.     free(fname);
  130.     (void) fclose(fp);
  131. }
  132.  
  133. getopts()
  134. {
  135.     char *ptr;
  136.     int x;
  137.  
  138.     if ((ptr = getenv("COLUMNS")) != NULL)
  139.     columns = atoi(ptr);
  140.  
  141.     if ((ptr = getenv("LINES")) != NULL)
  142.     lines = atoi(ptr);
  143.  
  144.     if ((ptr = getenv("SHELL")) != NULL)
  145.     {
  146.     shell = myrealloc(shell, strlen(ptr)+1);
  147.     (void) strcpy(shell, ptr);
  148.     }
  149.  
  150.     if ((ptr = getenv("PG")) != NULL)
  151.     {
  152.     pager = myrealloc(pager, strlen(ptr)+1);
  153.     (void) strcpy(pager, ptr);
  154.     }
  155.  
  156.     if ((ptr = getenv("PAGER")) != NULL)
  157.     {
  158.     pager = myrealloc(pager, strlen(ptr)+1);
  159.     (void) strcpy(pager, ptr);
  160.     }
  161.  
  162.     if ((ptr = getenv(CONFOPTS)) != NULL)
  163.     {
  164.     ptr = parsestr(ptr, strlen(ptr), NEXTWORD);
  165.  
  166.     do
  167.     {
  168.         if ((x = setopts(ptr)) != FOUNDOPT)
  169.         {
  170.         if (x == AMBIGUOUS)
  171.             (void)fputs("Ambiuous", stdout);
  172.         else
  173.             (void)fputs("Invalid", stdout);
  174.  
  175.         (void)printf(" %s environment variable @%s\n", CONFOPTS, ptr);
  176.         break;
  177.         }
  178.     } while ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL);
  179.     }
  180. }
  181.  
  182. setopts(opt)
  183. char *opt;
  184. {
  185.     int found;
  186.  
  187.     static struct varopts vartab[] =
  188.     {
  189.     { "banner", BOOLEAN|DISPLAY, &banner, TRUE, },
  190.     { "nobanner", BOOLEAN|DISPLAY, &banner, FALSE, },
  191.     { "!banner", BOOLEAN|NODISPLAY, &banner, FALSE, },
  192.     { "beep", BOOLEAN|DISPLAY, &beep, TRUE, },
  193.     { "nobeep", BOOLEAN|DISPLAY, &beep, FALSE, },
  194.     { "!beep", BOOLEAN|NODISPLAY, &beep, FALSE, },
  195.     { "expand8bit", BOOLEAN|DISPLAY, &expand8bit, TRUE, },
  196.     { "noexpand8bit", BOOLEAN|DISPLAY, &expand8bit, FALSE, },
  197.     { "!expand8bit", BOOLEAN|NODISPLAY, &expand8bit, FALSE, },
  198.     { "expandctrl", BOOLEAN|DISPLAY, &expandctrl, TRUE, },
  199.     { "noexpandctrl", BOOLEAN|DISPLAY, &expandctrl, FALSE, },
  200.     { "!expandctrl", BOOLEAN|NODISPLAY, &expandctrl, FALSE, },
  201.     { "inform-format", STRING|DISPLAY, (int *)&informform, POINTER, set_ptrstr, },
  202.     { "line", NUMBER|DISPLAY, &cuser.cu_line, 0, do_to, },
  203.     { "line-format", STRING|DISPLAY, (int *)&lineform, POINTER, set_ptrstr, },
  204.     { "name", STRING|DISPLAY, (int *)cuser.cu_cname, ROUTINE, set_name, },
  205.     { "normal-format", STRING|DISPLAY, (int *)&normform, POINTER, set_ptrstr, },
  206.     { "pager", STRING|DISPLAY, (int *)&pager, POINTER, set_ptrstr, },
  207.     { "recfile", STRING|DISPLAY, (int *)&recfile, POINTER, set_ptrstr, },
  208.     { "seeme", BOOLEAN|DISPLAY, &seeme, TRUE, },
  209.     { "noseeme", BOOLEAN|DISPLAY, &seeme, FALSE, },
  210.     { "!seeme", BOOLEAN|NODISPLAY, &seeme, FALSE, },
  211.     { "seemyinform", BOOLEAN|DISPLAY, &informe, TRUE, },
  212.     { "noseemyinform", BOOLEAN|DISPLAY, &informe, FALSE, },
  213.     { "!seemyinform", BOOLEAN|NODISPLAY, &informe, FALSE, },
  214.     { "send-format", STRING|DISPLAY, (int *)&sendform, POINTER, set_ptrstr, },
  215.     { "shell", STRING|DISPLAY, (int *)&shell, POINTER, set_ptrstr, },
  216.     { "shout-format", STRING|DISPLAY, (int *)&shoutform, POINTER, set_ptrstr, },
  217.     { NULL, }
  218.     }, *varptr, *keepptr;
  219.  
  220.     if (opt == NULL)
  221.     {
  222.     char *string;
  223.     int tmp;
  224.     int len=0;
  225.  
  226.     for (varptr = vartab; varptr->name != NULL; varptr++)
  227.         if ((varptr->type == BOOLEAN) && (*varptr->var == varptr->extra))
  228.         if ((tmp = strlen(varptr->name)) > len)
  229.             len = tmp;
  230.  
  231.     len += TABAGE;
  232.  
  233.     (void)fputs("Boolean flags:\n\n", stdout);
  234.  
  235.     for (varptr = vartab; varptr->name != NULL; varptr++)
  236.         if ((varptr->type == BOOLEAN) && (*varptr->var == varptr->extra))
  237.         colprnt(varptr->name, len);
  238.  
  239.     terpri();
  240.  
  241.     len = 0;
  242.  
  243.     for (varptr = vartab; varptr->name != NULL; varptr++)
  244.         if (varptr->type == NUMBER)
  245.         if ((tmp = strlen(varptr->name)+1+declen(varptr->var)) > len)
  246.             len = tmp;
  247.  
  248.     len += TABAGE;
  249.  
  250.     (void)fputs("\nNumeric options:\n\n", stdout);
  251.  
  252.     string = mymalloc((unsigned)(len+1));
  253.     for (varptr = vartab; varptr->name != NULL; varptr++)
  254.         if (varptr->type == NUMBER)
  255.         {
  256.         (void) sprintf(string, "%s=%d", varptr->name, *varptr->var);
  257.         colprnt(string, len);
  258.         }
  259.  
  260.     terpri();
  261.  
  262.     len = 0;
  263.  
  264.     for (varptr = vartab; varptr->name != NULL; varptr++)
  265.         if (varptr->type == STRING)
  266.         if (varptr->extra&POINTER)
  267.         {
  268.             if ((tmp=strlen(varptr->name) + vislen(*varptr->var)+3) > len)
  269.             len = tmp;
  270.         }
  271.         else
  272.         {
  273.             if ((tmp= strlen(varptr->name) + vislen(varptr->var)+3) > len)
  274.             len = tmp;
  275.         }
  276.  
  277.     len += TABAGE;
  278.  
  279.     (void)fputs("\nString options:\n\n", stdout);
  280.  
  281.     string = myrealloc(string, (unsigned)(len+1));
  282.     for (varptr = vartab; varptr->name != NULL; varptr++)
  283.         if (varptr->type == STRING)
  284.         {
  285.         if (varptr->extra&POINTER)
  286.             (void) sprintf(string, "%s=\"%s\"", varptr->name,
  287.                 *varptr->var);
  288.         else
  289.             (void) sprintf(string, "%s=\"%s\"", varptr->name,
  290.                 varptr->var);
  291.         colprnt(string, len);
  292.         }
  293.  
  294.     terpri();
  295.     free(string);
  296.  
  297.     return FOUNDOPT;
  298.     }
  299.  
  300.     keepptr = (struct varopts *)NULL;
  301.     found = 0;
  302.     for (varptr = vartab; varptr->name != NULL; varptr++)
  303.     if (!strncmp(varptr->name, opt, strlen(opt)))
  304.     {
  305.         if (!found)
  306.         keepptr = varptr;
  307.  
  308.         if (found >= 0)
  309.         ++found;
  310.  
  311.         if (strlen(varptr->name) == strlen(opt))
  312.         {
  313.         found = -1;
  314.         keepptr = varptr;
  315.         }
  316.     }
  317.  
  318.     if (!found)
  319.     return NOOPT;
  320.  
  321.     if (found > 1)
  322.     return AMBIGUOUS;
  323.  
  324.     switch(keepptr->type&VARMASK)
  325.     {
  326.     case BOOLEAN:
  327.         *keepptr->var = keepptr->extra;
  328.         break;
  329.  
  330.     case NUMBER:
  331.         return (*keepptr->var_func)(keepptr->name, keepptr->var);
  332.  
  333.     case STRING:
  334.         return (*keepptr->var_func)(keepptr->name, keepptr->var);
  335.  
  336.     default:
  337.         return NOOPT;
  338.     }
  339.  
  340.     return FOUNDOPT;
  341. }
  342.  
  343. set_name()
  344. {
  345.     char *ptr, *ptr2;
  346.     char nbuf[20+MAXNAMELEN];
  347.  
  348.     if ((ptr = ptr2 = parsestr((char *)NULL, 0, NEXTWORD)) == NULL)
  349.     {
  350.     if (confing)
  351.     {
  352.         (void) printf("name = \"%s\"\n", cuser.cu_cname);
  353.         return TRUE;
  354.     }
  355.  
  356.     return FALSE;
  357.     }
  358.  
  359.     while(*ptr2 != '\0')
  360.     {
  361.     if ((*ptr2 > ' ') && !strchr(",:/", *ptr2))
  362.         ptr2++;
  363.     else
  364.         *ptr2 = '\0';
  365.     }
  366.  
  367.     if (*ptr == '\0')
  368.     {
  369.     if (confing)
  370.     {
  371.         (void)puts("Invalid name given.");
  372.         return TRUE;
  373.     }
  374.  
  375.     return FALSE;
  376.     }
  377.  
  378.     (void) sprintf(nbuf, "Changed name from %s", cuser.cu_cname);
  379.  
  380.     (void) strncpy(cuser.cu_cname, ptr, MAXNAMELEN);
  381.     cuser.cu_cname[MAXNAMELEN-1] = '\0';
  382.     clog.f_usrlen = strlen(cuser.cu_cname) + 1;
  383.  
  384.     if (confing)
  385.     {
  386.     write_log(INFORM, nbuf, (char *)NULL, 0, (unsigned)strlen(nbuf));
  387.     write_usr();
  388.     (void)printf("Name changed to \"%s\"\n", cuser.cu_cname);
  389.     }
  390.  
  391.     return TRUE;
  392. }
  393.  
  394. /*set_integer(name, var)
  395.  *char *name;
  396.  *int *var;
  397.  *{
  398.  *    char *ptr;
  399.  *
  400.  *    if ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL)
  401.  *    *var = atoi(ptr);
  402.  *
  403.  *    (void) printf("%s = %d\n", name, *var);
  404.  *    return FOUNDOPT;
  405.  *}
  406.  */
  407.  
  408. set_ptrstr(name, var)
  409. char *name, **var;
  410. {
  411.     char *ptr;
  412.  
  413.     if ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL)
  414.     {
  415.     *var = myrealloc(*var, strlen(ptr)+1);
  416.     (void) strcpy(*var, ptr);
  417.     }
  418.  
  419.     (void) printf("%s = \"", name);
  420.     visprnt(*var, stdout);
  421.     (void) puts("\"");
  422.  
  423.     return FOUNDOPT;
  424. }
  425.  
  426. declen(num)
  427. register int num;
  428. {
  429.     register int places = 1;
  430.  
  431.     while ((num /= 10) >= 1)
  432.     ++places;
  433.  
  434.     return places;
  435. }
  436.  
  437. tcapstr(string, var)
  438. char *string, **var;
  439. {
  440.     char tcapbuf[1024];
  441.     char *tmp = tcapbuf;
  442.  
  443.     if (tgetstr(string, &tmp) == NULL)
  444.     *var = NULL;
  445.     else
  446.     {
  447.     *var = myrealloc(*var, tmp-tcapbuf);
  448.     (void) strcpy(*var, tcapbuf);
  449.     }
  450. }
  451.