home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / auucp+-1.02 / fuucp_plus_src.lzh / dmail / set.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-21  |  2.8 KB  |  154 lines

  1.  
  2. /*
  3.  *  SET.C
  4.  *
  5.  *  $Header: Beta:src/uucp/src/dmail/RCS/set.c,v 1.1 90/02/02 12:04:15 dillon Exp Locker: dillon $
  6.  *
  7.  *  (C) Copyright 1985-1990 by Matthew Dillon,  All Rights Reserved.
  8.  *
  9.  *  Variable set/unset/get/reset routines
  10.  *
  11.  */
  12.  
  13.  
  14. #include <stdio.h>
  15. #include "dmail.h"
  16. #define MAXLEVELS 3
  17.  
  18. struct MASTER {
  19.     struct MASTER *next;
  20.     struct MASTER *last;
  21.     char *name;
  22.     char *text;
  23. };
  24.  
  25. struct MASTER *Mbase[MAXLEVELS];
  26.  
  27. void
  28. set_var (level, name, str)
  29. register char *name, *str;
  30. {
  31.     register struct MASTER *base = Mbase[level];
  32.     register struct MASTER *last;
  33.  
  34.     push_break();
  35.     while (base != NULL) {
  36.     if (strcmp (name, base->name) == 0) {
  37.         xfree (base->text);
  38.         goto gotit;
  39.     }
  40.     last = base;
  41.     base = base->next;
  42.     }
  43.     if (base == Mbase[level]) {
  44.     base = Mbase[level] = (struct MASTER *)malloc (sizeof (struct MASTER));
  45.     base->last = NULL;
  46.     } else {
  47.     base = (struct MASTER *)malloc (sizeof (struct MASTER));
  48.     base->last = last;
  49.     last->next = base;
  50.     }
  51.     base->name = malloc (strlen (name) + 1);
  52.     strcpy (base->name, name);
  53.     base->next = NULL;
  54. gotit:
  55.     base->text    = malloc (strlen (str) + 1);
  56.     strcpy (base->text, str);
  57.     pop_break();
  58. }
  59.  
  60.  
  61. unset_var(level, name)
  62. register char *name;
  63. {
  64.     register struct MASTER *base = Mbase[level];
  65.     register struct MASTER *last = NULL;
  66.  
  67.     push_break();
  68.     while (base != NULL) {
  69.     if (strcmp (name, base->name) == 0) {
  70.         if (base != Mbase[level])
  71.         last->next = base->next;
  72.         else
  73.         Mbase[level] = base->next;
  74.         if (base->next != NULL)
  75.         base->next->last = last;
  76.         if (base == Mbase[level])
  77.         Mbase[level] = base->next;
  78.         xfree (base->name);
  79.         xfree (base->text);
  80.         xfree (base);
  81.         pop_break();
  82.         return (1);
  83.     }
  84.     last = base;
  85.     base = base->next;
  86.     }
  87.     pop_break();
  88.     return (-1);
  89. }
  90.  
  91.  
  92. char *
  93. get_var(level, name)
  94. register char *name;
  95. {
  96.     register struct MASTER *base = Mbase[level];
  97.  
  98.     while (base != NULL) {
  99.     if (strcmp (name, base->name) == 0)
  100.         return (base->text);
  101.     base = base->next;
  102.     }
  103.     return (NULL);
  104. }
  105.  
  106.  
  107. do_unset_var(str, level)
  108. char *str;
  109. {
  110.     int i;
  111.  
  112.     push_break();
  113.     for (i = 1; i < ac; ++i)
  114.     unset_var (level, av[i]);
  115.     fix_globals();
  116.     pop_break();
  117.     return (1);
  118. }
  119.  
  120. void
  121. do_set_var(command, level)
  122. char *command;
  123. {
  124.     register struct MASTER *base = Mbase[level];
  125.     register char *str;
  126.  
  127.     if (ac == 1) {
  128.     while (base) {
  129.         printf ("%-10s %s\n", base->name, base->text);
  130.         base = base->next;
  131.     }
  132.     }
  133.     if (ac == 2) {
  134.     str = get_var (level, av[1]);
  135.     if (str) {
  136.         printf ("%-10s %s\n", av[1], str);
  137.     } else {
  138.         push_break();
  139.         set_var (level, av[1], "");
  140.         fix_globals();
  141.         pop_break();
  142.     }
  143.     }
  144.     if (ac > 2) {
  145.     push_break();
  146.     set_var (level, av[1], next_word (next_word (command)));
  147.     fix_globals();
  148.     pop_break();
  149.     }
  150. }
  151.  
  152.  
  153.  
  154.