1*033a88b1Smarc /*
2*033a88b1Smarc 
3*033a88b1Smarc  *      Copyright (c) 1984, 1985, 1986 AT&T
4*033a88b1Smarc  *      All Rights Reserved
5*033a88b1Smarc 
6*033a88b1Smarc  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE
7*033a88b1Smarc  *      CODE OF AT&T.
8*033a88b1Smarc  *      The copyright notice above does not
9*033a88b1Smarc  *      evidence any actual or intended
10*033a88b1Smarc  *      publication of such source code.
11*033a88b1Smarc 
12*033a88b1Smarc  */
13*033a88b1Smarc /* @(#)linknod.c	1.1 */
14*033a88b1Smarc 
15*033a88b1Smarc /*
16*033a88b1Smarc  *   LINKNOD.C
17*033a88b1Smarc  *
18*033a88b1Smarc  *   Programmer:  D. G. Korn
19*033a88b1Smarc  *
20*033a88b1Smarc  *        Owner:  D. A. Lambeth
21*033a88b1Smarc  *
22*033a88b1Smarc  *         Date:  April 17, 1980
23*033a88b1Smarc  *
24*033a88b1Smarc  *
25*033a88b1Smarc  *
26*033a88b1Smarc  *   LINKNOD (NODP, ROOT)
27*033a88b1Smarc  *
28*033a88b1Smarc  *        Link the node given by NODP into the memory tree
29*033a88b1Smarc  *        given by ROOT.
30*033a88b1Smarc  *
31*033a88b1Smarc  *   RMNVAL (NV)
32*033a88b1Smarc  *
33*033a88b1Smarc  *        Remove freeable space associated with the Nodval NV.
34*033a88b1Smarc  *
35*033a88b1Smarc  *
36*033a88b1Smarc  *
37*033a88b1Smarc  *   See Also:  findnod(III), gettree(III)
38*033a88b1Smarc  */
39*033a88b1Smarc 
40*033a88b1Smarc #include	"name.h"
41*033a88b1Smarc #include	<stdio.h>
42*033a88b1Smarc #include        "flags.h"
43*033a88b1Smarc 
44*033a88b1Smarc void	linknod();
45*033a88b1Smarc void	rmnval ();
46*033a88b1Smarc 
47*033a88b1Smarc extern struct Namaray *growaray();
48*033a88b1Smarc extern struct Namnod *mak_nod();
49*033a88b1Smarc extern unsigned	chkid();
50*033a88b1Smarc extern void	free();
51*033a88b1Smarc 
52*033a88b1Smarc /*
53*033a88b1Smarc  *   LINKNOD (NODP, ROOT)
54*033a88b1Smarc  *
55*033a88b1Smarc  *        struct Namnod *NODP;
56*033a88b1Smarc  *
57*033a88b1Smarc  *        struct Amemory *ROOT;
58*033a88b1Smarc  *
59*033a88b1Smarc  *   Link the Namnod pointed to by NODP into the memory tree
60*033a88b1Smarc  *   denoted by ROOT.  If ROOT contains another Namnod with
61*033a88b1Smarc  *   the same namid as NODP, an array is created, with the
62*033a88b1Smarc  *   previously inserted Namnod as its first element and NODP as
63*033a88b1Smarc  *   its second.  If a previously inserted node of the same namid
64*033a88b1Smarc  *   already denotes an array of n elements, NODP becomes the
65*033a88b1Smarc  *   n+1st element.
66*033a88b1Smarc  */
67*033a88b1Smarc 
68*033a88b1Smarc #ifdef KSHELL
69*033a88b1Smarc /* save code space */
linknod(nodp,root)70*033a88b1Smarc void	linknod(nodp,root)
71*033a88b1Smarc register struct Namnod *nodp;
72*033a88b1Smarc register struct Amemory *root;
73*033a88b1Smarc {
74*033a88b1Smarc 	register int i = chkid(nodp->namid);
75*033a88b1Smarc 	i &= root->memsize-1;
76*033a88b1Smarc 	nodp->namnxt = root->memhead[i];
77*033a88b1Smarc 	root->memhead[i] = nodp;
78*033a88b1Smarc }
79*033a88b1Smarc #else
linknod(nodp,root)80*033a88b1Smarc void	linknod(nodp,root)
81*033a88b1Smarc struct Namnod *nodp;
82*033a88b1Smarc struct Amemory *root;
83*033a88b1Smarc {
84*033a88b1Smarc 	register struct Namnod *np,*nq,**npp;
85*033a88b1Smarc 	struct Nodval *nv;
86*033a88b1Smarc 	struct Namaray *ap;
87*033a88b1Smarc 	int dot;
88*033a88b1Smarc 	char *cp = nodp->namid;
89*033a88b1Smarc 	int i = chkid(cp);
90*033a88b1Smarc 
91*033a88b1Smarc 	i &= root->memsize-1;
92*033a88b1Smarc 	nodp->namnxt = NULL;
93*033a88b1Smarc 	for(npp= &root->memhead[i],np= *npp;np;npp= &np->namnxt,np= *npp)
94*033a88b1Smarc 		if(strcmp(cp,np->namid)==0)
95*033a88b1Smarc 		{
96*033a88b1Smarc 			if (!(attest (np, ARRAY)))
97*033a88b1Smarc 			{
98*033a88b1Smarc 				nq = mak_nod(cp);
99*033a88b1Smarc 				nq->namnxt = np->namnxt;
100*033a88b1Smarc 				*npp = nq;
101*033a88b1Smarc 				nq->value.namflg =  np->value.namflg|ARRAY;
102*033a88b1Smarc 				nq->value.namval.aray = ap = growaray((struct Namaray *)NULL,0);
103*033a88b1Smarc 				ap->val[0] = &np->value;
104*033a88b1Smarc 				nq->namsz = np->namsz;
105*033a88b1Smarc 				np = nq;
106*033a88b1Smarc 			}
107*033a88b1Smarc 			ap = arayp (np);
108*033a88b1Smarc 			dot = ++ap->adot;
109*033a88b1Smarc 			if (dot > ap->maxi)
110*033a88b1Smarc 				np->value.namval.aray = ap = growaray(ap,dot);
111*033a88b1Smarc 			if (nv = ap->val[dot])
112*033a88b1Smarc 				if (freeble (nv))
113*033a88b1Smarc 					rmnval (unmark (nv));
114*033a88b1Smarc 			ap->val[dot] = &nodp->value;
115*033a88b1Smarc 			return;
116*033a88b1Smarc 		}
117*033a88b1Smarc 	*npp = nodp;
118*033a88b1Smarc }
119*033a88b1Smarc #endif	/* KSHELL */
120*033a88b1Smarc 
121*033a88b1Smarc 
122*033a88b1Smarc /*
123*033a88b1Smarc  *   RMNVAL (NV)
124*033a88b1Smarc  *
125*033a88b1Smarc  *        struct Nodval *NV;
126*033a88b1Smarc  *
127*033a88b1Smarc  *   Remove freeable string space attached to NV, and then
128*033a88b1Smarc  *   free the Nodval structure itself.
129*033a88b1Smarc  *
130*033a88b1Smarc  */
131*033a88b1Smarc 
rmnval(nv)132*033a88b1Smarc void	rmnval (nv)
133*033a88b1Smarc struct Nodval *nv;
134*033a88b1Smarc {
135*033a88b1Smarc 	register int flag = nv->namflg;
136*033a88b1Smarc 	register union Namval *up = &nv->namval;
137*033a88b1Smarc 	register char *cp;
138*033a88b1Smarc 
139*033a88b1Smarc 	if (!(flag & N_FREE))
140*033a88b1Smarc 	{
141*033a88b1Smarc 		if (flag & IN_DIR)
142*033a88b1Smarc 		up = up->up;
143*033a88b1Smarc 		if (flag & INT_GER)
144*033a88b1Smarc 			if ((flag & L_FLAG) && (up->lp != NULL))
145*033a88b1Smarc 				free ((char*)(up->lp));
146*033a88b1Smarc 			else if ((cp = up->cp) != NULL)
147*033a88b1Smarc 				free (cp);
148*033a88b1Smarc 	}
149*033a88b1Smarc 	free ((char*)nv);
150*033a88b1Smarc 	return;
151*033a88b1Smarc }
152