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

131 lines
2.7 KiB
C
Executable File

#ident "@(#)linknod.c 1.6 93/06/08 SMI" /* From AT&T Toolchest */
/*
* LINKNOD.C
*
* Programmer: D. G. Korn
*
* Owner: D. A. Lambeth
*
* Date: April 17, 1980
*
*
* NAM_LINK (NODP, ROOT)
*
* Link the node given by NODP into the memory tree
* given by ROOT.
*
* RMNVAL (NV)
*
* Remove freeable space associated with the Nodval NV.
*
*
* See Also: nam_search(III), gettree(III)
*/
#include "name.h"
#ifndef KSHELL
void rmnval ();
extern void free();
#endif /* !KSHELL */
/*
* NAM_LINK (NODP, ROOT)
*
* struct namnod *NODP;
*
* struct Amemory *ROOT;
*
* Link the namnod pointed to by NODP into the memory tree
* denoted by ROOT. If ROOT contains another namnod with
* the same namid as NODP, an array is created, with the
* previously inserted namnod as its first element and NODP as
* its second. If a previously inserted node of the same namid
* already denotes an array of n elements, NODP becomes the
* n+1st element.
*/
#ifdef KSHELL
/* save code space by not handling the case of linking array elements */
void nam_link(nodp,root)
register struct namnod *nodp;
register struct Amemory *root;
{
register int i = nam_hash(nodp->namid);
i &= root->memsize;
nodp->namnxt = root->memhead[i];
root->memhead[i] = nodp;
}
#else
void nam_link(nodp,root)
struct namnod *nodp;
struct Amemory *root;
{
register struct namnod *np,*nq,**npp;
struct Nodval *nv;
struct Namaray *ap;
int dot;
char *cp = nodp->namid;
int i = nam_hash(cp);
i &= root->memsize;
nodp->namnxt = NULL;
for(npp= &root->memhead[i],np= *npp;np;npp= &np->namnxt,np= *npp)
if(strcmp(cp,np->namid)==0)
{
if (!(nam_istype (np, N_ARRAY)))
{
nq = nam_alloc(cp);
nq->namnxt = np->namnxt;
*npp = nq;
nq->value.namflg = np->value.namflg|N_ARRAY;
nq->value.namval.aray = ap = array_grow((struct Namaray *)NULL,0);
ap->val[0] = &np->value;
nq->value.namsz = np->value.namsz;
np = nq;
}
ap = array_ptr(np);
dot = ++ap->adot;
if (dot >= ap->maxi)
np->value.namval.aray = ap = array_grow(ap,dot);
if (nv = ap->val[dot])
if (freeble (nv))
rmnval (unmark (nv));
ap->val[dot] = &nodp->value;
return;
}
*npp = nodp;
}
/*
* RMNVAL (NV)
*
* struct Nodval *NV;
*
* Remove freeable string space attached to NV, and then
* free the Nodval structure itself.
*
*/
void rmnval (nv)
struct Nodval *nv;
{
register int flag = nv->namflg;
register union Namval *up = &nv->namval;
up->cp = NULL;
if (!(flag & N_FREE))
{
if (flag & N_INDIRECT)
up = up->up;
if (up->cp != NULL)
free (up->cp);
}
free ((char*)nv);
return;
}
#endif /* KSHELL */