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 /* @(#)valup.c 1.1 */ 14 15 /* 16 * VALUP.C 17 * 18 * Programmer: D. G. Korn 19 * 20 * Owner: D. A. Lambeth 21 * 22 * Date: April 17, 1980 23 * 24 * 25 * 26 * VALUP (NODP) 27 * 28 * Return a pointer to the value of the node given by NODP. 29 * 30 * 31 * 32 * See Also: assign(III), asscadr(III), assiadr(III), assnum(III), 33 * unassign(III) 34 */ 35 36 #include "name.h" 37 #include "flags.h" 38 39 #ifdef NAME_SCOPE 40 extern struct Namnod *copy_nod(); 41 #endif 42 extern char *utos(); 43 extern char *ltos(); 44 extern char *itos(); 45 extern void failed(); 46 47 48 /* 49 * VALUP (NODP) 50 * 51 * struct Namnod *NODP; 52 * 53 * Return a pointer to a character string that denotes the value 54 * of NODP. If NODP refers to an array, return a pointer to 55 * the value associated with the current index. 56 * 57 * If NODP is blocked, N_AVAIL, then the value of the node 58 * with the same name in the last tree is returned. 59 * Thus a node can become blocked after the lookup but 60 * before retrieving its value and still work correctly. 61 * 62 * If the value of NODP is an integer, the string returned will 63 * be overwritten by the next call to valup. 64 * 65 * If NODP has no value, NULL is returned. 66 */ 67 68 char *valup(nodp) 69 struct Namnod *nodp; 70 { 71 int dot; 72 register struct Namnod *np=nodp; 73 register union Namval *up= &np->value.namval; 74 register struct Nodval *nv; 75 #ifdef NAME_SCOPE 76 if (attest (np,N_AVAIL)) /* node blocked */ 77 /* use node with same name in last tree */ 78 np = copy_nod(np,0); 79 #endif 80 if (attest (np, ARRAY)) 81 { 82 dot = up->aray->adot; 83 if (dot > abound (np)) 84 failed (itos(dot), subscript); 85 if ((nv = up->aray->val[dot]) == NULL) 86 return (NULL); 87 else 88 up = &(unmark (nv)->namval); 89 } 90 if ((attest (np, IN_DIR)) && up->cp) 91 up = up->up; 92 if (attest (np, INT_GER)) 93 { 94 long l; 95 if (attest (np, CPOIN_TER)) 96 return(up->cp); 97 else if(attest (np, (BLT_NOD))) 98 l = ((*up->fp->f_vp)()); 99 else 100 { 101 if(up->lp == NULL) 102 return(NULL); 103 l = *(up->lp); 104 } 105 if (attest (np, (BLT_NOD|UN_SIGN))) 106 #ifdef pdp11 107 return(utos(l,np->namsz)); 108 #else 109 return(utos((unsigned long)l,np->namsz)); 110 #endif /* pdp11 */ 111 return(ltos(l,np->namsz)); 112 } 113 return (up->cp); 114 } 115 116