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