107 lines
2.4 KiB
C
Executable File
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);
|
|
}
|
|
|