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