1: /*
   2:  * Copyright (c) 1980 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: static char *sccsid = "@(#)vars.c	5.2 (Berkeley) 6/21/85";
   9: #endif not lint
  10: 
  11: #include "rcv.h"
  12: 
  13: /*
  14:  * Mail -- a mail program
  15:  *
  16:  * Variable handling stuff.
  17:  */
  18: 
  19: /*
  20:  * Assign a value to a variable.
  21:  */
  22: 
  23: assign(name, value)
  24:     char name[], value[];
  25: {
  26:     register struct var *vp;
  27:     register int h;
  28: 
  29:     h = hash(name);
  30:     vp = lookup(name);
  31:     if (vp == NOVAR) {
  32:         vp = (struct var *) calloc(sizeof *vp, 1);
  33:         vp->v_name = vcopy(name);
  34:         vp->v_link = variables[h];
  35:         variables[h] = vp;
  36:     }
  37:     else
  38:         vfree(vp->v_value);
  39:     vp->v_value = vcopy(value);
  40: }
  41: 
  42: /*
  43:  * Free up a variable string.  We do not bother to allocate
  44:  * strings whose value is "" since they are expected to be frequent.
  45:  * Thus, we cannot free same!
  46:  */
  47: 
  48: vfree(cp)
  49:     register char *cp;
  50: {
  51:     if (!equal(cp, ""))
  52:         cfree(cp);
  53: }
  54: 
  55: /*
  56:  * Copy a variable value into permanent (ie, not collected after each
  57:  * command) space.  Do not bother to alloc space for ""
  58:  */
  59: 
  60: char *
  61: vcopy(str)
  62:     char str[];
  63: {
  64:     register char *top, *cp, *cp2;
  65: 
  66:     if (equal(str, ""))
  67:         return("");
  68:     if ((top = calloc(strlen(str)+1, 1)) == NULL)
  69:         panic ("Out of memory");
  70:     cp = top;
  71:     cp2 = str;
  72:     while (*cp++ = *cp2++)
  73:         ;
  74:     return(top);
  75: }
  76: 
  77: /*
  78:  * Get the value of a variable and return it.
  79:  * Look in the environment if its not available locally.
  80:  */
  81: 
  82: char *
  83: value(name)
  84:     char name[];
  85: {
  86:     register struct var *vp;
  87: 
  88:     if ((vp = lookup(name)) == NOVAR)
  89:         return(getenv(name));
  90:     return(vp->v_value);
  91: }
  92: 
  93: /*
  94:  * Locate a variable and return its variable
  95:  * node.
  96:  */
  97: 
  98: struct var *
  99: lookup(name)
 100:     char name[];
 101: {
 102:     register struct var *vp;
 103:     register int h;
 104: 
 105:     h = hash(name);
 106:     for (vp = variables[h]; vp != NOVAR; vp = vp->v_link)
 107:         if (equal(vp->v_name, name))
 108:             return(vp);
 109:     return(NOVAR);
 110: }
 111: 
 112: /*
 113:  * Locate a group name and return it.
 114:  */
 115: 
 116: struct grouphead *
 117: findgroup(name)
 118:     char name[];
 119: {
 120:     register struct grouphead *gh;
 121:     register int h;
 122: 
 123:     h = hash(name);
 124:     for (gh = groups[h]; gh != NOGRP; gh = gh->g_link)
 125:         if (equal(gh->g_name, name))
 126:             return(gh);
 127:     return(NOGRP);
 128: }
 129: 
 130: /*
 131:  * Print a group out on stdout
 132:  */
 133: 
 134: printgroup(name)
 135:     char name[];
 136: {
 137:     register struct grouphead *gh;
 138:     register struct group *gp;
 139: 
 140:     if ((gh = findgroup(name)) == NOGRP) {
 141:         printf("\"%s\": not a group\n", name);
 142:         return;
 143:     }
 144:     printf("%s\t", gh->g_name);
 145:     for (gp = gh->g_list; gp != NOGE; gp = gp->ge_link)
 146:         printf(" %s", gp->ge_name);
 147:     printf("\n");
 148: }
 149: 
 150: /*
 151:  * Hash the passed string and return an index into
 152:  * the variable or group hash table.
 153:  */
 154: 
 155: hash(name)
 156:     char name[];
 157: {
 158:     register unsigned h;
 159:     register char *cp;
 160: 
 161:     for (cp = name, h = 0; *cp; h = (h << 2) + *cp++)
 162:         ;
 163:     if (h < 0)
 164:         h = -h;
 165:     if (h < 0)
 166:         h = 0;
 167:     return(h % HSHSIZE);
 168: }

Defined functions

assign defined in line 23; used 3 times
findgroup defined in line 116; used 5 times
hash defined in line 155; used 8 times
lookup defined in line 98; used 4 times
printgroup defined in line 134; used 2 times
vcopy defined in line 60; used 5 times
vfree defined in line 48; used 5 times

Defined variables

sccsid defined in line 8; never used
Last modified: 1985-06-22
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 801
Valid CSS Valid XHTML 1.0 Strict