1*35201Smarc /*
2*35201Smarc
3*35201Smarc * Copyright (c) 1984, 1985, 1986 AT&T
4*35201Smarc * All Rights Reserved
5*35201Smarc
6*35201Smarc * THIS IS UNPUBLISHED PROPRIETARY SOURCE
7*35201Smarc * CODE OF AT&T.
8*35201Smarc * The copyright notice above does not
9*35201Smarc * evidence any actual or intended
10*35201Smarc * publication of such source code.
11*35201Smarc
12*35201Smarc */
13*35201Smarc /* @(#)unassign.c 1.1 */
14*35201Smarc
15*35201Smarc /*
16*35201Smarc * UNASSIGN.C
17*35201Smarc *
18*35201Smarc * Programmer: D. G. Korn
19*35201Smarc *
20*35201Smarc * Owner: D. A. Lambeth
21*35201Smarc *
22*35201Smarc * Date: April 17, 1980
23*35201Smarc *
24*35201Smarc *
25*35201Smarc *
26*35201Smarc * UNASSIGN (NODE)
27*35201Smarc *
28*35201Smarc * Nullify the value and the attributes of the Namnod
29*35201Smarc * given by NODE.
30*35201Smarc *
31*35201Smarc *
32*35201Smarc *
33*35201Smarc * See Also: assign(III), assnum(III), assiadr(III), asscadr(III),
34*35201Smarc * valup(III)
35*35201Smarc */
36*35201Smarc
37*35201Smarc #include "name.h"
38*35201Smarc #include "flags.h"
39*35201Smarc
40*35201Smarc
41*35201Smarc /*
42*35201Smarc * UNASSIGN (NODE)
43*35201Smarc *
44*35201Smarc * struct Namnod *NODE;
45*35201Smarc *
46*35201Smarc * Set the value of NODE to NULL, and nullify any attributes
47*35201Smarc * that NODE may have had. Free any freeable space occupied
48*35201Smarc * by the value of NODE. If NODE denotes an array member, it
49*35201Smarc * will retain its attributes. Any node that has the
50*35201Smarc * indirect (IN_DIR) attribute will retain that attribute.
51*35201Smarc */
52*35201Smarc
53*35201Smarc extern void free();
54*35201Smarc
unassign(node)55*35201Smarc void unassign(node)
56*35201Smarc struct Namnod *node;
57*35201Smarc {
58*35201Smarc register struct Namnod *np=node;
59*35201Smarc register union Namval *up = &np->value.namval;
60*35201Smarc #ifdef NAME_SCOPE
61*35201Smarc if (attest (np, C_WRITE))
62*35201Smarc {
63*35201Smarc np->value.namflg |= N_AVAIL;
64*35201Smarc return;
65*35201Smarc }
66*35201Smarc #endif
67*35201Smarc if (attest (np, ARRAY))
68*35201Smarc {
69*35201Smarc register struct Namaray *ap = up->aray;
70*35201Smarc if(ap->adot != NO_SUBSCRIPT)
71*35201Smarc {
72*35201Smarc struct Nodval *nv = unmark(ap->val[ap->adot]);
73*35201Smarc if(ap->adot == ap->maxi)
74*35201Smarc ap->maxi--;
75*35201Smarc if(nv==NULL || (up = &nv->namval)==NULL)
76*35201Smarc return;
77*35201Smarc }
78*35201Smarc else
79*35201Smarc {
80*35201Smarc for(ap->adot=0;ap->adot <= ap->maxi;ap->adot++)
81*35201Smarc unassign(np);
82*35201Smarc free((char*)ap);
83*35201Smarc up->cp = NULL;
84*35201Smarc np->value.namflg = 0;
85*35201Smarc return;
86*35201Smarc }
87*35201Smarc }
88*35201Smarc if (attest (np, IN_DIR))
89*35201Smarc up = up->up;
90*35201Smarc if (attest (np, INT_GER))
91*35201Smarc {
92*35201Smarc if ((attest (np, L_FLAG)) && (up->lp != NULL))
93*35201Smarc free((char *)up->lp);
94*35201Smarc }
95*35201Smarc else if ((!attest (np, N_FREE)) && (!isnull (np)))
96*35201Smarc free(up->cp);
97*35201Smarc up->cp = NULL;
98*35201Smarc if (!attest (np, ARRAY))
99*35201Smarc {
100*35201Smarc np->value.namflg &= IN_DIR;
101*35201Smarc np->namsz = 0;
102*35201Smarc }
103*35201Smarc }
104