xref: /csrg-svn/usr.bin/rdist/lookup.c (revision 15200)
115110Sralph #ifndef lint
2*15200Sralph static	char *sccsid = "@(#)lookup.c	4.3 (Berkeley) 83/10/10";
315110Sralph #endif
415110Sralph 
515110Sralph #include "defs.h"
615110Sralph 
715110Sralph /*
815110Sralph  * Define a variable from a command line argument.
915110Sralph  */
1015110Sralph define(name)
1115110Sralph 	char *name;
1215110Sralph {
1315110Sralph 	register char *cp, *s;
1415110Sralph 	register struct block *bp, *value;
1515110Sralph 
1615110Sralph 	if (debug)
1715110Sralph 		printf("define(%s)\n", name);
1815110Sralph 
1915110Sralph 	cp = index(name, '=');
20*15200Sralph 	if (cp == NULL)
2115110Sralph 		value = NULL;
22*15200Sralph 	else if (cp[1] == '\0') {
2315110Sralph 		*cp++ = '\0';
24*15200Sralph 		value = NULL;
25*15200Sralph 	} else if (cp[1] != '(') {
26*15200Sralph 		*cp++ = '\0';
2715110Sralph 		value = makeblock(NAME, cp);
2815110Sralph 	} else {
2915110Sralph 		bp = NULL;
3015110Sralph 		*cp++ = '\0';
3115110Sralph 		do
3215110Sralph 			cp++;
3315110Sralph 		while (*cp == ' ' || *cp == '\t');
3415110Sralph 		for (s = cp; ; s++) {
3515110Sralph 			switch (*s) {
3615110Sralph 			case ')':
3715110Sralph 				*s = '\0';
3815110Sralph 			case '\0':
3915110Sralph 				break;
4015110Sralph 			case ' ':
4115110Sralph 			case '\t':
4215110Sralph 				*s++ = '\0';
4315110Sralph 				while (*s == ' ' || *s == '\t')
4415110Sralph 					s++;
4515110Sralph 				if (*s == ')')
4615110Sralph 					*s = '\0';
4715110Sralph 				break;
4815110Sralph 			default:
4915110Sralph 				continue;
5015110Sralph 			}
5115110Sralph 			if (bp == NULL)
5215110Sralph 				value = bp = makeblock(NAME, cp);
5315110Sralph 			else {
5415110Sralph 				bp->b_next = makeblock(NAME, cp);
5515110Sralph 				bp = bp->b_next;
5615110Sralph 			}
5715110Sralph 			if (*s == '\0')
5815110Sralph 				break;
5915110Sralph 			cp = s;
6015110Sralph 		}
6115110Sralph 	}
6215110Sralph 	bp = makeblock(VAR, name);
6315110Sralph 	bp->b_args = value;
6415110Sralph 	(void) lookup(bp->b_name, bp, 1);
6515110Sralph }
6615110Sralph 
6715110Sralph static struct block *hashtab[HASHSIZE];
6815110Sralph 
6915110Sralph /*
7015110Sralph  * Lookup name in the table and return a pointer to it.
7115110Sralph  * Insert == 0 - just do lookup, return NULL if not found.
7215110Sralph  * insert == 1 - insert name with value, error if already defined.
7315110Sralph  * insert == 2 - replace name with value if not entered with insert == 1.
7415110Sralph  */
7515110Sralph 
7615110Sralph struct block *
7715110Sralph lookup(name, value, insert)
7815110Sralph 	char *name;
7915110Sralph 	struct block *value;
8015110Sralph 	int insert;
8115110Sralph {
8215110Sralph 	register unsigned n;
8315110Sralph 	register char *cp;
8415110Sralph 	register struct block *b, *f;
8515110Sralph 
8615110Sralph 	if (debug)
8715110Sralph 		printf("lookup(%s, %x, %d)\n", name, value, insert);
8815110Sralph 
8915110Sralph 	n = 0;
9015110Sralph 	for (cp = name; *cp; )
9115110Sralph 		n += *cp++;
9215110Sralph 	n %= HASHSIZE;
9315110Sralph 
9415110Sralph 	for (b = hashtab[n]; b != NULL; b = b->b_next) {
9515110Sralph 		if (strcmp(name, b->b_name))
9615110Sralph 			continue;
9715110Sralph 		if (insert) {
9815110Sralph 			if (b->b_type == NAME) {
9915110Sralph 				warn("%s redefined\n", name);
10015110Sralph 				f = b->b_args;
10115110Sralph 				b->b_args = value->b_args;
10215110Sralph 				value->b_args = f;
10315110Sralph 			} else if (value->b_type == VAR)
10415110Sralph 				fatal("%s redefined\n", name);
10515110Sralph 		}
10615110Sralph 		return(b);
10715110Sralph 	}
10815110Sralph 
10915110Sralph 	if (!insert)
11015110Sralph 		fatal("%s not defined", name);
11115110Sralph 
11215110Sralph 	value->b_next = hashtab[n];
11315110Sralph 	hashtab[n] = value;
11415110Sralph 	return(value);
11515110Sralph }
11615110Sralph 
11715110Sralph /*
11815110Sralph  * Make a block for lists of variables, commands, etc.
11915110Sralph  */
12015110Sralph struct block *
12115110Sralph makeblock(type, name)
12215110Sralph 	int type;
12315110Sralph 	register char *name;
12415110Sralph {
12515110Sralph 	register char *cp;
12615110Sralph 	register struct block *bp;
12715110Sralph 
12815110Sralph 	bp = ALLOC(block);
12915110Sralph 	if (bp == NULL)
13015110Sralph 		fatal("ran out of memory\n");
13115110Sralph 	bp->b_type = type;
13215110Sralph 	bp->b_next = bp->b_args = NULL;
13315110Sralph 	if (type == NAME || type == VAR) {
134*15200Sralph 		bp->b_name = cp = malloc(strlen(name) + 1);
13515110Sralph 		if (cp == NULL)
13615110Sralph 			fatal("ran out of memory\n");
13715110Sralph 		while (*cp++ = *name++)
13815110Sralph 			;
13915110Sralph 	} else
14015110Sralph 		bp->b_name = NULL;
14115110Sralph 	return(bp);
14215110Sralph }
143