Files
seta75D 7c4988eac0 Init
2021-10-11 19:38:01 -03:00

107 lines
2.4 KiB
C
Executable File

#ident "@(#)valup.c 1.6 93/06/08 SMI" /* From AT&T Toolchest */
/*
* VALUP.C
*
* Programmer: D. G. Korn
*
* Owner: D. A. Lambeth
*
* Date: April 17, 1980
*
*
* NAM_STRVAL (NP)
*
* Return a pointer to the value of the node given by NP.
*
*
* See Also: nam_putval(III), nam_longput(III), nam_free(III)
*/
#include "name.h"
extern char *utos();
extern char *ltos();
#ifdef FLOAT
extern char *ftos();
extern char *etos();
#endif /* FLOAT */
/*
* NAM_STRVAL (NP)
*
* struct namnod *NP;
*
* Return a pointer to a character string that denotes the value
* of NP. If NP refers to an array, return a pointer to
* the value associated with the current index.
*
* If NP is blocked, N_AVAIL, then the value of the node
* with the same name in the last tree is returned.
* Thus a node can become blocked after the lookup but
* before retrieving its value and still work correctly.
*
* If the value of NP is an integer, the string returned will
* be overwritten by the next call to nam_strval.
*
* If NP has no value, NULL is returned.
*/
char *nam_strval(np)
register struct namnod *np;
{
register union Namval *up= &np->value.namval;
register struct Nodval *nv;
#ifdef NAME_SCOPE
if (nam_istype (np,N_AVAIL)) /* node blocked */
/* use node with same name in last tree */
np = nam_copy(np,0);
#endif /* NAME_SCOPE */
if (!nam_istype(np,N_ARRAY|N_INDIRECT|N_INTGER))
return(up->cp);
else if (nam_istype (np, N_ARRAY))
{
if((nv = array_find(np,A_LOOKUP)) == NULL)
return (NULL);
up = &nv->namval;
}
if ((nam_istype (np, N_INDIRECT)) && up->cp)
up = up->up;
if (nam_istype (np, N_INTGER))
{
#ifndef pdp11
register
#endif /* pdp11 */
long l;
if (nam_istype (np, N_CPOINTER))
return(up->cp);
#ifdef FLOAT
else if (nam_istype (np, N_DOUBLE))
{
if(nam_istype (np, N_EXPNOTE))
return(etos(*up->dp,np->value.namsz));
else
return(ftos(*up->dp,np->value.namsz));
}
#endif /* FLOAT */
else if(nam_istype (np, (N_BLTNOD)))
l = ((*up->fp->f_vp)());
else
{
if(up->lp == NULL)
return(NULL);
l = *(up->lp);
}
if (nam_istype (np, (N_BLTNOD|N_UNSIGN)))
#ifdef pdp11
return(utos(l,np->value.namsz));
#else
return(utos((unsigned long)l,np->value.namsz));
#endif /* pdp11 */
return(ltos(l,np->value.namsz));
}
return (up->cp);
}