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