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