home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / duucp-1.17 / AU-117b4-src.lha / src / dmail / set.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-18  |  3.0 KB  |  152 lines

  1. /*
  2.  *  SET.C
  3.  *
  4.  *  (C) Copyright 1985-1990 by Matthew Dillon,    All Rights Reserved.
  5.  *
  6.  *  Variable set/unset/get/reset routines
  7.  *
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <string.h>
  12.  
  13. #include "dmail.h"
  14.  
  15. #define MAXLEVELS 3
  16.  
  17. struct MASTER {
  18.     struct MASTER *next;
  19.     struct MASTER *last;
  20.     char *name;
  21.     char *text;
  22. };
  23.  
  24. struct MASTER
  25.     *Mbase [MAXLEVELS];
  26.  
  27. Prototype void set_var (int level, register char *name, register char *str);
  28. Prototype int  unset_var (int level, register char *name);
  29. Prototype char *get_var (int level, register char *name);
  30. Prototype int  do_unset_var (char *str, int level);
  31. Prototype int  do_set_var (char *command, int level);
  32.  
  33. void
  34. set_var (int level, register char *name, register char *str)
  35. {
  36.     register struct MASTER *base = Mbase[level];
  37.     register struct MASTER *last;
  38.  
  39.     push_break();
  40.     while (base != NULL) {
  41.     if (strcmp (name, base->name) == 0) {
  42.         xfree (base->text);
  43.         goto gotit;
  44.     }
  45.     last = base;
  46.     base = base->next;
  47.     }
  48.     if (base == Mbase[level]) {
  49.     base = Mbase[level] = (struct MASTER *)xmalloc (sizeof (struct MASTER));
  50.     base->last = NULL;
  51.     } else {
  52.     base = (struct MASTER *)xmalloc (sizeof (struct MASTER));
  53.     base->last = last;
  54.     last->next = base;
  55.     }
  56.     base->name = xmalloc (strlen (name) + 1);
  57.     strcpy (base->name, name);
  58.     base->next = NULL;
  59. gotit:
  60.     base->text    = xmalloc (strlen (str) + 1);
  61.     strcpy (base->text, str);
  62.     pop_break();
  63. }
  64.  
  65. int
  66. unset_var (int level, register char *name)
  67. {
  68.     register struct MASTER *base = Mbase[level];
  69.     register struct MASTER *last = NULL;
  70.  
  71.     push_break();
  72.     while (base != NULL) {
  73.     if (strcmp (name, base->name) == 0) {
  74.         if (base != Mbase[level])
  75.         last->next = base->next;
  76.         else
  77.         Mbase[level] = base->next;
  78.         if (base->next != NULL)
  79.         base->next->last = last;
  80.         if (base == Mbase[level])
  81.         Mbase[level] = base->next;
  82.         xfree (base->name);
  83.         xfree (base->text);
  84.         xfree (base);
  85.         pop_break();
  86.         return (1);
  87.     }
  88.     last = base;
  89.     base = base->next;
  90.     }
  91.     pop_break();
  92.     return (-1);
  93. }
  94.  
  95. char *
  96. get_var (int level, register char *name)
  97. {
  98.     register struct MASTER *base = Mbase[level];
  99.  
  100.     while (base != NULL) {
  101.     if (strcmp (name, base->name) == 0)
  102.         return (base->text);
  103.     base = base->next;
  104.     }
  105.     return (NULL);
  106. }
  107.  
  108. int
  109. do_unset_var (char *str, int level)
  110. {
  111.     int i;
  112.  
  113.     push_break();
  114.     for (i = 1; i < ac; ++i)
  115.     unset_var (level, av[i]);
  116.     fix_globals();
  117.     pop_break();
  118.     return (1);
  119. }
  120.  
  121. int
  122. do_set_var (char *command, int level)
  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.     return 0;
  151. }
  152.