7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/***********************************************************************
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* and is licensed under the *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* A copy of the License is available at *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* http://www.opensource.org/licenses/cpl1.0.txt *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Information and Software Systems Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* AT&T Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Florham Park NJ *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* David Korn <dgk@research.att.com> *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin***********************************************************************/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#pragma prototyped
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * David Korn
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * AT&T Labs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#include "defs.h"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const char sh_opttype[] =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[-1c?\n@(#)$Id: type (AT&T Labs Research) 2008-07-01 $\n]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinUSAGE_LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+NAME?\f?\f - set the type of variables to \b\f?\f\b]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+DESCRIPTION?\b\f?\f\b sets the type on each of the variables specified "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "by \aname\a to \b\f?\f\b. If \b=\b\avalue\a is specified, "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "the variable \aname\a is set to \avalue\a before the variable "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "is converted to \b\f?\f\b.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+?If no \aname\as are specified then the names and values of all "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "variables of this type are written to standard output.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+?\b\f?\f\b is built-in to the shell as a declaration command so that "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "field splitting and pathname expansion are not performed on "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "the arguments. Tilde expansion occurs on \avalue\a.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[r?Enables readonly. Once enabled, the value cannot be changed or unset.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[a]:?[type?Indexed array. Each \aname\a will converted to an index "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "array of type \b\f?\f\b. If a variable already exists, the current "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "value will become index \b0\b. If \b[\b\atype\a\b]]\b is "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "specified, each subscript is interpreted as a value of enumeration "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "type \atype\a.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[A?Associative array. Each \aname\a will converted to an associate "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "array of type \b\f?\f\b. If a variable already exists, the current "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "value will become subscript \b0\b.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[h]:[string?Used within a type definition to provide a help string "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "for variable \aname\a. Otherwise, it is ignored.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[S?Used with a type definition to indicate that the variable is shared by "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "each instance of the type. When used inside a function defined "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "with the \bfunction\b reserved word, the specified variables "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "will have function static scope. Otherwise, the variable is "
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "unset prior to processing the assignment list.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+DETAILS]\ftypes\f"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"\n"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"\n[name[=value]...]\n"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"\n"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+EXIT STATUS?]{"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "[+0?Successful completion.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "[+>0?An error occurred.]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+SEE ALSO?\fother\f \breadonly\b(1), \btypeset\b(1)]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypedef struct Namtype Namtype_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypedef struct Namchld
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t fun;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *ptype;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *ttype;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin} Namchld_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstruct Namtype
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t fun;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *sh;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *parent;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *bp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *nodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namchld_t childfun;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int numnodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char **names;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size_t dsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin short strsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned short ndisc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned short current;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned short nref;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstruct type
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t hdr;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned short ndisc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned short current;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned short nref;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypedef struct
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char _cSfdouble_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Sfdouble_t _dSfdouble_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char _cdouble;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin double _ddouble;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char _cfloat;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin float _dfloat;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char _cSflong_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Sflong_t _dSflong_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char _clong;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin long _dlong;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char _cshort;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin short _dshort;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char _cpointer;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *_dpointer;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin} _Align_;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define alignof(t) ((char*)&((_Align_*)0)->_d##t-(char*)&((_Align_*)0)->_c##t)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic void put_type(Namval_t*, const char*, int, Namfun_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namval_t* create_type(Namval_t*, const char*, int, Namfun_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namfun_t* clone_type(Namval_t*, Namval_t*, int, Namfun_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namval_t* next_type(Namval_t*, Dt_t*, Namfun_t*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t type_disc =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sizeof(Namtype_t),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin put_type,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin create_type,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin clone_type,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin next_type,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin read_type
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic size_t datasize(Namval_t *np, size_t *offset)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size_t s=0, a=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namarr_t *ap;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(np,NV_INTEGER))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(np,NV_DOUBLE)==NV_DOUBLE)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(np, NV_LONG))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = alignof(Sfdouble_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = sizeof(Sfdouble_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(nv_isattr(np, NV_SHORT))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = alignof(float);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = sizeof(float);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = alignof(double);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = sizeof(double);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(np, NV_LONG))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = alignof(Sflong_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = sizeof(Sflong_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(nv_isattr(np, NV_SHORT))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = alignof(short);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = sizeof(short);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = alignof(long);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = sizeof(long);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(nv_isattr(np, NV_BINARY) || nv_isattr(np,NV_LJUST|NV_RJUST|NV_ZFILL))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = nv_size(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = alignof(pointer);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = nv_size(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(a>1 && offset)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *offset = a*((*offset +a-1)/a);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isarray(np) && (ap = nv_arrayptr(np)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s *= array_elem(ap);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(s);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic char *name_chtype(Namval_t *np, Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namchld_t *pp = (Namchld_t*)fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *cp, *sub;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *tp = sh.last_table;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nq = pp->ptype->np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namarr_t *ap;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(np,NV_REF|NV_TAGGED)==(NV_REF|NV_TAGGED))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh.last_table = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = nv_name(nq);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((ap = nv_arrayptr(nq)) && !(ap->nelem&ARRAY_UNDEF) && (sub= nv_getsub(nq)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sh.strbuf,"%s[%s].%s",cp,sub,np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sh.strbuf,"%s.%s",cp,np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh.last_table = tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(sfstruse(sh.strbuf));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic void put_chtype(Namval_t* np, const char* val, int flag, Namfun_t* fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!val && nv_isattr(np,NV_REF))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putv(np,val,flag,fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!val)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namchld_t *pp = (Namchld_t*)fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size_t dsize=0,offset = (char*)np-(char*)pp->ptype;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *mp = (Namval_t*)((char*)pp->ttype+offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dsize = datasize(mp,&dsize);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(mp->nvalue.cp >= pp->ttype->data && mp->nvalue.cp < (char*)pp+pp->ttype->fun.dsize)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvalue.cp = pp->ptype->data + (mp->nvalue.cp-pp->ptype->data);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((char*)np->nvalue.cp,mp->nvalue.cp,dsize);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(!nv_isarray(mp) && mp->nvalue.cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvalue.cp = mp->nvalue.cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(np,NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvsize = mp->nvsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvflag = mp->nvflag&~NV_RDONLY;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic Namfun_t *clone_chtype(Namval_t* np, Namval_t *mp, int flags, Namfun_t *fp)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(flags&NV_NODISC)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return(0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return(nv_clone_disc(fp,flags));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t chtype_disc =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sizeof(Namchld_t),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin put_chtype,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz clone_chtype,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name_chtype
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namval_t *findref(void *nodes, int n)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *tp,*np = nv_namptr(nodes,n);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *name = np->nvname;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int i=n, len= strrchr(name,'.')-name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while(--i>0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = nv_namptr(nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np->nvname[len]==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp = nv_type(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp = (Namtype_t*)nv_hasdisc(tp,&type_disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(nv_namptr(pp->nodes,n-i-1));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int fixnode(Namtype_t *dp, Namtype_t *pp, int i, struct Namref *nrp,int flag)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nq = nv_namptr(dp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fp=nv_hasdisc(nq,&chtype_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(nq, fp, NV_POP);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(nq,NV_REF))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.nrp = nrp++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setsize(nq,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strchr(nq->nvname,'.'))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.nrp->np = findref(dp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.nrp->np = nv_namptr(pp->childfun.ttype->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.nrp->root = sh.last_root;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.nrp->table = pp->np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq ->nvflag = NV_REF|NV_NOFREE|NV_MINIMAL;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nq->nvalue.cp || nq->nvfun)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin const char *data = nq->nvalue.cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nq->nvfun)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *np = nv_namptr(pp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isarray(nq))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvfun = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isarray(nq) && nv_type(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin clone_all_disc(np,nq,flag&~NV_TYPE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin clone_all_disc(np,nq,flag);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(np, fp, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nq->nvalue.cp >= pp->data && nq->nvalue.cp < (char*)pp +pp->fun.dsize)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = dp->data + (nq->nvalue.cp-pp->data);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(data >= pp->data && data < (char*)pp +pp->fun.dsize)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = dp->data + (data-pp->data);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(!nq->nvfun && pp->childfun.ttype!=pp->childfun.ptype)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nr = nv_namptr( pp->childfun.ttype->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nr->nvalue.cp!=nq->nvalue.cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(i=nv_size(nq))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin const char *cp = nq->nvalue.cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = (char*)malloc(i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((char*)nq->nvalue.cp,cp,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = strdup(nq->nvalue.cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_offattr(nq,NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(nq, &dp->childfun.fun, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namfun_t *clone_type(Namval_t* np, Namval_t *mp, int flags, Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *dp, *pp=(Namtype_t*)fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Namval_t *nq, *nr;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size_t size = fp->dsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int save, offset=staktell();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Dt_t *root = sh.last_root;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *last_table = sh.last_table;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin struct Namref *nrp = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namarr_t *ap;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(flags&NV_MOVE)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->np = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.ptype = pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(flags&NV_TYPE)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(nv_clone_disc(fp,flags));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(size==0 && (!fp->disc || (size=fp->disc->dsize)==0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size = sizeof(Namfun_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp = (Namtype_t*)malloc(size+pp->nref*sizeof(struct Namref));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(pp->nref)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nrp = (struct Namref*)((char*)dp + size);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memset((void*)nrp,0,pp->nref*sizeof(struct Namref));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((void*)dp,(void*)pp,size);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->parent = nv_lastdict();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->parent = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->fun.nofree = (flags&NV_RDONLY?1:0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->np = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->childfun.ptype = dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->childfun.ttype = (Namtype_t*)nv_hasdisc(dp->fun.type,&type_disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->nodes = (char*)(dp+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->data = (char*)dp + (pp->data - (char*)pp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=dp->numnodes; --i >= 0; )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(dp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fixnode(dp,pp,i,nrp,NV_TYPE))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nrp++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nq->nvalue.nrp->np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(nq->nvalue.cp || !nv_isvtree(nq) || nv_isattr(nq,NV_RDONLY))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* see if default value has been overwritten */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!mp->nvname)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh.last_table = last_table;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(pp->strsize<0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = nv_name(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = nv_name(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc('.');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(nq->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin root = nv_dict(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin save = fp->nofree;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nr = nv_create(stakptr(offset),root,NV_VARNAME|NV_NOADD,fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->nofree = save;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nr)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(nq,NV_RDONLY) && (nq->nvalue.cp || nv_isattr(nq,NV_INTEGER)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_exit(1),e_readonly, nq->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isref(nq))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_refnode(nq);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((size = datasize(nr,(size_t*)0)) && size==datasize(nq,(size_t*)0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((char*)nq->nvalue.cp,nr->nvalue.cp,size);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(ap=nv_arrayptr(nr))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putsub(nr,NIL(char*),ARRAY_SCAN|ARRAY_NOSCOPE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(array_assoc(ap))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = (char*)((*ap->fun)(nr,NIL(char*),NV_ANAME));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = nv_getsub(nr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putsub(nq,cp,ARRAY_ADD|ARRAY_NOSCOPE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(array_assoc(ap))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *mp = (Namval_t*)((*ap->fun)(nr,NIL(char*),NV_ACURRENT));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *mq = (Namval_t*)((*ap->fun)(nq,NIL(char*),NV_ACURRENT));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_clone(mp,mq,NV_MOVE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ap->nelem--;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_delete(mp,ap->table,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = nv_getval(nr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(nq,cp,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while(nv_nextsub(nr));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(nq,nv_getval(nr),NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_TYPEDEF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sh.mktype)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_addnode(nr,1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif /* SHOPT_TYPEDEF */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(pp->strsize<0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _nv_unset(nr,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_isattr(nr,NV_MINIMAL))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_delete(nr,sh.last_root,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(nv_isattr(nq,NV_RDONLY) && !nq->nvalue.cp && !nv_isattr(nq,NV_INTEGER))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_exit(1),e_required,nq->nvname,nv_name(mp));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(mp,NV_BINARY))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvalue.cp = dp->data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(pp->strsize<0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->strsize = -pp->strsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(&dp->fun);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * return Namval_t* corresponding to child <name> in <np>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namval_t *create_type(Namval_t *np,const char *name,int flag,Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *dp = (Namtype_t*)fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register const char *cp=name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int i=0,n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nq=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(dp->parent);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((n=*cp++) && n != '=' && n != '+' && n!='[');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = (cp-1) -name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(dp->numnodes && dp->strsize<0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *base = (char*)np-sizeof(Dtlink_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int m=strlen(np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((nq=nv_namptr(base,++i)) && memcmp(nq->nvname,np->nvname,m)==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nq->nvname[m]=='.' && memcmp(name,&nq->nvname[m+1],n)==0 && nq->nvname[m+n+1]==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto found;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else for(i=0; i < dp->numnodes; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(dp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((n==0||memcmp(name,nq->nvname,n)==0) && nq->nvname[n]==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while(nv_isref(nq))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nq->nvalue.nrp->np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto found;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfound:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nq)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->last = (char*)&name[n];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh.last_table = dp->parent;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name[n]!='=') for(i=0; i < dp->ndisc; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((memcmp(name,dp->names[i],n)==0) && dp->names[i][n]==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(nq);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_exit(1),e_notelem,n,name,nv_name(np));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(nq);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic void put_type(Namval_t* np, const char* val, int flag, Namfun_t* fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nq;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(val && (nq=nv_open(val,sh.var_tree,NV_VARNAME|NV_ARRAY|NV_NOADD|NV_NOFAIL)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((pp=nv_hasdisc(nq,fp->disc)) && pp->type==fp->type)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _nv_unset(np, flag);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_clone(nq,np,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putv(np,val,flag,fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!val)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *dp = (Namtype_t*)fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nq;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namarr_t *ap;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isarray(np) && (ap=nv_arrayptr(np)) && ap->nelem>0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0; i < dp->numnodes; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(dp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ap=nv_arrayptr(nq))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ap->nelem |= ARRAY_UNDEF;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_hasdisc(nq,&type_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _nv_unset(nq,flag|NV_TYPE|nv_isattr(nq,NV_RDONLY));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(np,fp,NV_POP);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!(fp->nofree&1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin free((void*)fp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namval_t *next_type(register Namval_t* np, Dt_t *root,Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *dp = (Namtype_t*)fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!root)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namarr_t *ap = nv_arrayptr(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ap && (ap->nelem&ARRAY_UNDEF))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putsub(np,(char*)0,ARRAY_SCAN);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->current = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(++dp->current>=dp->numnodes)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(nv_namptr(dp->nodes,dp->current));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Namfun_t *clone_inttype(Namval_t* np, Namval_t *mp, int flags, Namfun_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *pp= (Namfun_t*)malloc(fp->dsize);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((void*)pp, (void*)fp, fp->dsize);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->nofree &= ~1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(mp,NV_NOFREE) && mp->nvalue.cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((void*)mp->nvalue.cp,np->nvalue.cp, fp->dsize-sizeof(*fp));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvalue.cp = (char*)(fp+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_isattr(mp,NV_MINIMAL))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvenv = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_offattr(mp,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(pp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int typeinfo(Opt_t* op, Sfio_t *out, const char *str, Optdisc_t *fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *cp,**help,buffer[256];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *np,*nq,*tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int n, i, offset=staktell();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Sfio_t *sp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = *(Namval_t**)(fp+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(NV_CLASS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc('.');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = nv_open(stakptr(offset), sh.var_tree, NV_NOADD|NV_VARNAME);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!np)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstderr,"%s: no such variable\n",np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(-1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!(dp=(Namtype_t*)nv_hasdisc(np,&type_disc)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(fp=np->nvfun;fp;fp=fp->next)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fp->disc && fp->disc->clonef==clone_inttype)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!fp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstderr,"%s: not a type\n",np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(-1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(str,"other")==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp = fp->type;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_offattr(np,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->type = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np->nvenv)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"[+?\b%s\b is a %s.]\n", tp->nvname, np->nvenv);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = (char*)out->_next;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"[+?\b%s\b is a %n ", tp->nvname, &i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_attribute(np,out,(char*)0, 1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(cp[i+1]=='i')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp[i-1]='n';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->type = tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(np,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out," with default value \b%s\b.]",nv_getval(np));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(str,"other")==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Nambfun_t *bp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(bp=(Nambfun_t*)nv_hasdisc(np,nv_discfun(NV_DCADD)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0; i < bp->num; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(bp->bltins[i],NV_OPTGET))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"\b%s.%s\b(3), ",np->nvname,bp->bnames[i]);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin help = &dp->names[dp->ndisc];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp = sfnew((Sfio_t*)0,buffer,sizeof(buffer),-1,SF_STRING|SF_WRITE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"[+?\b%s\b defines the following fields:]{\n",np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0; i < dp->numnodes; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(dp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(tp=nv_type(nq))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *pp = nv_hasdisc(nq,&type_disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"\t[+%s?%s.\n",nq->nvname,tp->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = strlen(nq->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((cp=nv_namptr(dp->nodes,i+1)->nvname) && memcmp(cp,nq->nvname,n)==0 && cp[n]=='.')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin i++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfseek(sp,(Sfoff_t)0, SEEK_SET);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_attribute(nq,sp,(char*)0,1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_isattr(nq,NV_REF))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = sh_fmtq(nv_getval(nq));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfputc(sp,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(n=strlen(buffer); n>0 && buffer[n-1]==' '; n--);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buffer[n] = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"\t[+%s?%s, default value is %s.\n",nq->nvname,*buffer?buffer:"string",cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"\t[+%s?%s.\n",nq->nvname,*buffer?buffer:"string");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(help[i])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out," %s.",help[i]);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfputc(out,']');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"}\n");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(dp->ndisc>0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(NV_CLASS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc('.');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc('.');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = staktell();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"[+?\b%s\b defines the following discipline functions:]{\n",np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0; i < dp->ndisc; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(dp->names[i]);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((nq = nv_search(stakptr(offset),sh.fun_tree,0)) && nq->nvalue.cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = nq->nvalue.rp->help;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"\t[+%s?%s]\n",dp->names[i],cp?cp:Empty);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfputc(out,'.');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(n);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"}\n");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfclose(sp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int std_disc(Namval_t *mp, Namtype_t *pp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register const char *sp, *cp = strrchr(mp->nvname,'.');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register const char **argv;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *np=0,*nq;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = mp->nvname;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(cp,"create")==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(pp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->cp = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(argv=nv_discnames; sp=*argv; argv++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(cp,sp)==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!pp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto found;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfound:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(memcmp(sp=mp->nvname,NV_CLASS,sizeof(NV_CLASS)-1)==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp += sizeof(NV_CLASS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp += strlen(pp->fun.type->nvname)+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sp == cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = pp->fun.type;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else for(i=1; i < pp->numnodes; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(memcmp(nq->nvname, sp, cp-sp-1)==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = nq;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(mp,NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_setdisc(np,cp, mp, (Namfun_t*)np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstderr," nvsetdisc failed name=%s sp=%s cp=%s\n",np->nvname,sp,cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstderr,"can't set discipline %s cp=%s \n",sp,cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinvoid nv_addtype(Namval_t *np, const char *optstr, Optdisc_t *op, size_t optsz)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namdecl_t *cp = newof((Namdecl_t*)0,Namdecl_t,1,optsz);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Optdisc_t *dp = (Optdisc_t*)(cp+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Shell_t *shp = sh_getinterp();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *mp,*bp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(optstr)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp->optstring = optstr;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp->optstring = sh_opttype;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((void*)dp,(void*)op, optsz);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp->optinfof = (void*)dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp->tp = np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp = nv_search("typeset",shp->bltin_tree,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name=strrchr(np->nvname,'.'))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name = np->nvname;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((bp=nv_search(name,shp->fun_tree,NV_NOSCOPE)) && !bp->nvalue.ip)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_delete(bp,shp->fun_tree,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin bp = sh_addbuiltin(name, mp->nvalue.bfp, (void*)cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(bp,nv_isattr(mp,NV_PUBLIC));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(np, NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzvoid nv_newtype(Namval_t *mp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin struct {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Optdisc_t opt;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin } optdisc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memset(&optdisc,0,sizeof(optdisc));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin optdisc.opt.infof = typeinfo;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin optdisc.np = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_addtype(mp,sh_opttype, &optdisc.opt, sizeof(optdisc));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * This function creates a type out of the <numnodes> nodes in the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * array <nodes>. The first node is the name for the type
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinNamval_t *nv_mktype(Namval_t **nodes, int numnodes)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *mp=nodes[0], *bp=0, *np, *nq, **mnodes=nodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int i,j,k,m,n,nd=0,nref=0,iref=0,inherit=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int size=sizeof(NV_DATA), dsize=0, nnodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size_t offset=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *name=0, *cp, *sp, **help;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *pp,*qp=0,*dp,*tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Dt_t *root = nv_dict(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin struct Namref *nrp = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m = strlen(mp->nvname)+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(nnodes=1,i=1; i <numnodes; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np=nodes[i];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(is_afunction(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!std_disc(np, (Namtype_t*)0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size += strlen(np->nvname+m)+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(memcmp(np->nvname,NV_CLASS,sizeof(NV_CLASS)-1)==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size -= sizeof(NV_CLASS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nd++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(np,NV_REF))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin iref++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np->nvenv)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size += strlen((char*)np->nvenv)+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(&np->nvname[m],NV_DATA)==0 && !nv_type(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(qp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin { /* delete duplicates */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(j=0; j < qp->numnodes;j++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(qp->nodes,j);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(nq->nvname,&np->nvname[m])==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(j < qp->numnodes)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nnodes++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name && memcmp(&name[m],&np->nvname[m],n)==0 && np->nvname[m+n]=='.')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset -= sizeof(char*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dsize = datasize(np,&offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_isarray(np) && (dp=(Namtype_t*)nv_hasdisc(np, &type_disc)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nnodes += dp->numnodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((n=dp->strsize)<0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = -n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin iref = nref += dp->nref;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np->nvname[m]=='_' && np->nvname[m+1]==0 && (bp=nv_type(np)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin qp = dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nd = dp->ndisc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nnodes = dp->numnodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dsize = nv_size(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size += n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size += n + dp->numnodes*(strlen(&np->nvname[m])+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = strlen(np->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((i+1) < numnodes && (cp=nodes[i+1]->nvname) && memcmp(cp,np->nvname,n)==0 && cp[n]=='.')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin i++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(nv_isattr(np,NV_REF))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nref++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset += (dsize?dsize:4);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size += (n=strlen(name=np->nvname)-m+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset = roundof(offset,sizeof(char*));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setsize(mp,offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nd)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nd++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin k = roundof(sizeof(Namtype_t),sizeof(Sfdouble_t)) - sizeof(Namtype_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp = newof(NiL, Namtype_t, 1, nnodes*NV_MINSZ + offset + size + (nnodes+nd)*sizeof(char*) + iref*sizeof(struct Namref)+k);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->fun.dsize = sizeof(Namtype_t)+nnodes*NV_MINSZ +offset+k;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->fun.type = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->parent = nv_lastdict();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->np = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->bp = bp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.fun.disc = &chtype_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.fun.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.ttype = pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.ptype = pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->fun.disc = &type_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->nodes = (char*)(pp+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->numnodes = nnodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->data = pp->nodes + nnodes*NV_MINSZ +k;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->dsize = offset;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nrp = (struct Namref*)(pp->data+offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->names = (char**)(nrp+iref);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin help = &pp->names[nd];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->strsize = size;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = (char*)&pp->names[nd+nnodes];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(qp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mnodes = newof(NiL, Namval_t*, nd+1, 0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nd = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvname = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_MINIMAL);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = strcopy(cp,NV_DATA);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *cp++ = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(name=0, offset=0, k=i=1; i < numnodes; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np=nodes[i];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(is_afunction(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp = np->nvname+m;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(memcmp(np->nvname,NV_CLASS,sizeof(NV_CLASS)-1)==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp += sizeof(NV_CLASS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!std_disc(np, pp))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* see if discipline already defined */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(j=0; j< nd; j++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(sp,pp->names[j])==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mnodes[j] = nodes[i];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(j>=nd)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->names[nd] = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mnodes[nd++] = nodes[i];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = strcopy(cp,sp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *cp++ = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(mnodes[j],NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(inherit)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(j=0; j < k ; j++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,j);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(nq->nvname,&np->nvname[m])==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(j < k)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp = nv_getval(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isvtree(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstderr,"initialization not implemented\n");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(sp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(nq,sp,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto skip;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(&np->nvname[m],NV_DATA)==0 && !nv_type(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *val=nv_getval(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvfun = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(nq,(val?val:0),nv_isattr(np,~(NV_IMPORT|NV_EXPORT|NV_ARRAY)));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvflag = np->nvflag|NV_NOFREE|NV_MINIMAL;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto skip;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(qp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Nambfun_t *bp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp = (Namtype_t*)nv_hasdisc(nv_type(np), &type_disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy(pp->nodes,dp->nodes,dp->numnodes*NV_MINSZ);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset = nv_size(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy(pp->data,dp->data,offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(k=0;k < dp->numnodes; k++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nr = nv_namptr(qp->nodes,k);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,k);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fixnode(pp,dp,k,nrp,0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nrp++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nq->nvalue.nrp->np;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_isattr(nr,NV_REF) && !nv_hasdisc(nr,&type_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nr->nvsize)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((char*)nq->nvalue.cp,nr->nvalue.cp,size=datasize(nr,(size_t*)0));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = nr->nvalue.cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(bp=(Nambfun_t*)nv_hasdisc(np,nv_discfun(NV_DCADD)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(j=0; j < bp->num; j++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->names[nd++] = (char*)bp->bnames[j];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mnodes[j] = bp->bltins[j];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin qp = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin inherit=1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto skip;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,k);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np->nvenv)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* need to save the string pointer */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_offattr(np,NV_EXPORT);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin help[k] = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = strcopy(cp,np->nvenv);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin j = *help[k];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(islower(j))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *help[k] = toupper(j);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *cp++ = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvenv = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvname = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name && memcmp(name,&np->nvname[m],n)==0 && np->nvname[m+n]=='.')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset -= sizeof(char*);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dsize = datasize(np,&offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = strcopy(name=cp, &np->nvname[m]);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = cp-name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *cp++ = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvsize = np->nvsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvflag = (np->nvflag&~(NV_IMPORT|NV_EXPORT))|NV_NOFREE|NV_MINIMAL;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(dp = (Namtype_t*)nv_hasdisc(np, &type_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int r,kfirst=k;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *cname = &np->nvname[m];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * If field is a type, mark the type by setting
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * strsize<0. This changes create_type()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin clone_all_disc(np,nq,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isarray(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(nq, &pp->childfun.fun, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin k++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto skip;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fp=nv_hasdisc(nq,&chtype_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(nq, &pp->childfun.fun, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(tp = (Namtype_t*)nv_hasdisc(nq, &type_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp->strsize = -tp->strsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinelse sfprintf(sfstderr,"tp==NULL\n");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(r=0; r < dp->numnodes; r++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nr = nv_namptr(dp->nodes,r);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,++k);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvname = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dsize = datasize(nr,&offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvflag = nr->nvflag;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nr->nvalue.cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namchld_t *xp = (Namchld_t*)nv_hasdisc(nr,&chtype_disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(xp && nr->nvalue.cp >= xp->ptype->data && nr->nvalue.cp < xp->ptype->data+xp->ptype->fun.dsize)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = pp->data+offset;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((char*)nq->nvalue.cp,nr->nvalue.cp,dsize);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = strdup(nr->nvalue.cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(nq, &pp->childfun.fun, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvsize = nr->nvsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset += dsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(*cname!='_' || cname[1])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = strcopy(cp,cname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *cp++ = '.';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = strcopy(cp,nr->nvname);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *cp++ = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while((i+1) < numnodes && (cname=&nodes[i+1]->nvname[m]) && memcmp(cname,&np->nvname[m],n)==0 && cname[n]=='.')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int j=kfirst;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_unset(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_delete(np,root,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = nodes[++i];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while(j < k)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,++j);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strcmp(nq->nvname,cname)==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstderr,"%s found at k=%d\n",nq->nvname,k);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nq->nvalue.cp>=pp->data && nq->nvalue.cp< (char*)pp->names)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((char*)nq->nvalue.cp,np->nvalue.cp,datasize(np,0));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin j = nv_isattr(np,NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvfun = np->nvfun;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvfun = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isarray(nq) && !nq->nvfun)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putsub(nq, (char*)0, ARRAY_FILL);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(nv_isattr(nq,NV_INTEGER))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_putval(nq, "0",0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ((Namarr_t*)nq->nvfun)->nelem--;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(nq, &pp->childfun.fun, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nq->nvfun)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(fp=nq->nvfun; fp; fp = fp->next)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->nofree |= 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = np->nvalue.cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(dsize)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = pp->data+offset;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp = (char*)np->nvalue.cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isattr(np,NV_INT16P) ==NV_INT16)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp= (char*)&np->nvalue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_INT16P);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner j = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((char*)nq->nvalue.cp,sp,dsize);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(nv_isattr(np,NV_LJUST|NV_RJUST))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memset((char*)nq->nvalue.cp,' ',dsize);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!j)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin free((void*)np->nvalue.cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!nq->nvalue.cp && nq->nvfun== &pp->childfun.fun)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nq->nvalue.cp = Empty;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvalue.cp = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset += dsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset += (dsize?dsize:4);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin k++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin skip:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_isnull(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _nv_unset(np,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_delete(np,root,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->ndisc = nd;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->nref = nref;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(k>1)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setsize(mp,offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvalue.cp = pp->data;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(mp,NV_NOFREE|NV_BINARY|NV_RAW);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(!mp->nvalue.cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvalue.cp = Empty;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(mp, &pp->fun, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nd>0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->names[nd] = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_adddisc(mp, (const char**)pp->names, mnodes);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(mnodes!=nodes)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin free((void*)mnodes);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_newtype(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinNamval_t *nv_mkinttype(char *name, size_t size, int sign, const char *help, Namdisc_t *ep)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namdisc_t *dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int offset=staktell();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(NV_CLASS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc('.');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(name);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp = nv_open(stakptr(offset), sh.var_tree, NV_VARNAME);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin offset = size + sizeof(Namdisc_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp = newof(NiL, Namfun_t, 1, offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->type = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->nofree |= 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->dsize = sizeof(Namfun_t)+size;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp = (Namdisc_t*)(fp+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ep)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *dp = *ep;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->clonef = clone_inttype;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->disc = dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvalue.cp = (char*)(fp+1) + sizeof(Namdisc_t);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setsize(mp,10);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvenv = (char*)help;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(mp,NV_NOFREE|NV_RDONLY|NV_INTEGER|NV_EXPORT);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(size==16)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(mp,NV_INT16P);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(size==64)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(mp,NV_INT64);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!sign)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(mp,NV_UNSIGN);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(mp, fp, NV_LAST);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_newtype(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinvoid nv_typename(Namval_t *tp, Sfio_t *out)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *v,*cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *dp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = nv_name(tp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(v=strrchr(cp,'.'))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = v+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((dp = (Namtype_t*)nv_hasdisc(tp,&type_disc)) && dp->bp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_typename(dp->bp,out);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(out,"%s.%s",sfstruse(out),cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfputr(out,cp,-1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinNamval_t *nv_type(Namval_t *np)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *fp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(nv_isattr(np,NV_BLTIN|BLT_DCL)==(NV_BLTIN|BLT_DCL))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Namdecl_t *ntp = (Namdecl_t*)nv_context(np);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return(ntp?ntp->tp:0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(fp=np->nvfun; fp; fp=fp->next)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fp->type)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(fp->type);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(fp->disc && fp->disc->typef && (np= (*fp->disc->typef)(np,fp)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * call any and all create functions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic void type_init(Namval_t *np)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *dp, *pp=(Namtype_t*)nv_hasdisc(np,&type_disc);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *nq;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!pp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0; i < pp->numnodes; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((dp=(Namtype_t*)nv_hasdisc(nq,&type_disc)) && dp->cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_fun(dp->cp,nq, (char**)0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(pp->cp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_fun(pp->cp, np, (char**)0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * This function turns variable <np> to the type <tp>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinint nv_settype(Namval_t* np, Namval_t *tp, int flags)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int isnull = nv_isnull(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int rdonly = nv_isattr(np,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *val=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namarr_t *ap=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int nelem=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_TYPEDEF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *tq;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_type(np)==tp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_isarray(np) && (tq=nv_type(np)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(tp==tq)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_exit(1),e_redef,nv_name(np));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((ap=nv_arrayptr(np)) && ap->nelem>0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putsub(np,NIL(char*),ARRAY_SCAN);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ap->hdr.type = tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_arraysettype(np, tp, nv_getsub(np),flags);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while(nv_nextsub(np));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(ap || nv_isarray(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin flags &= ~NV_APPEND;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!ap)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putsub(np,"0",ARRAY_FILL);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ap = nv_arrayptr(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nelem = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif /*SHOPT_TYPEDEF */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(isnull)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin flags &= ~NV_APPEND;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(!nv_isvtree(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin val = strdup(nv_getval(np));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!(flags&NV_APPEND))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _nv_unset(np, NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!nv_clone(tp,np,flags|NV_NOFREE))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(ap)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int nofree;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(np,&ap->hdr,NV_POP);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvalue.up = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_clone(tp,np,flags|NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(np->nvalue.cp && !nv_isattr(np,NV_NOFREE))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin free((void*)np->nvalue.cp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np->nvalue.up = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nofree = ap->hdr.nofree;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ap->hdr.nofree = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ap->hdr.type = tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(np, &ap->hdr, NV_FIRST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ap->hdr.nofree = nofree;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(np,NV_ARRAY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nelem)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ap->nelem++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putsub(np,"0",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _nv_unset(np,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ap->nelem--;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin type_init(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!rdonly)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_offattr(np,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(val)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(np,val,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin free((void*)val);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define S(x) #x
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define FIELD(x,y) { S(y##x), S(x##_t), offsetof(struct stat,st_##y##x) }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypedef struct _field_
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *type;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int offset;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin} Fields_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinFields_t foo[]=
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(dev,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(ino,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(nlink,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(mode,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(uid,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(gid,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(size,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(time,a),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(time,m),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(time,c),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(blksize,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin FIELD(blocks,),
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinNamval_t *nv_mkstruct(const char *name, int rsize, Fields_t *fields)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *mp, *nq, *nr, *tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Fields_t *fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namtype_t *dp, *pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *cp, *sp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int nnodes=0, offset=staktell(), n, r, i, j;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size_t m, size=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(NV_CLASS);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc('.');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin r = staktell();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(name);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp = nv_open(stakptr(offset), sh.var_tree, NV_VARNAME);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(r);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(fp=fields; fp->name; fp++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m = strlen(fp->name)+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size += m;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nnodes++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(memcmp(fp->type,"typeset",7))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(fp->type);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp = nv_open(stakptr(offset), sh.var_tree, NV_VARNAME|NV_NOADD|NV_NOFAIL);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(r);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!tp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_exit(1),e_unknowntype,strlen(fp->type),fp->type);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(dp = (Namtype_t*)nv_hasdisc(tp,&type_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nnodes += dp->numnodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((i=dp->strsize) < 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin i = -i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size += i + dp->numnodes*m;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp = newof(NiL,Namtype_t, 1, nnodes*NV_MINSZ + rsize + size);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->fun.dsize = sizeof(Namtype_t)+nnodes*NV_MINSZ +rsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->fun.type = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->np = mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.fun.disc = &chtype_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.fun.nofree = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.ttype = pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->childfun.ptype = pp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->fun.disc = &type_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->nodes = (char*)(pp+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->numnodes = nnodes;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->strsize = size;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin pp->data = pp->nodes + nnodes*NV_MINSZ;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = pp->data + rsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0,fp=fields; fp->name; fp++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,i++);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvname = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = pp->data + fp->offset;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_MINIMAL|NV_NOFREE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m = strlen(fp->name)+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy(cp, fp->name, m);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp += m;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(memcmp(fp->type,"typeset",7))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputs(fp->type);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakputc(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp = nv_open(stakptr(offset), sh.var_tree, NV_VARNAME);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(r);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin clone_all_disc(tp,nq,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvflag = tp->nvflag|NV_MINIMAL|NV_NOFREE;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvsize = tp->nvsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(dp = (Namtype_t*)nv_hasdisc(nq,&type_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin dp->strsize = -dp->strsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(dp = (Namtype_t*)nv_hasdisc(tp,&type_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nv_hasdisc(nq,&chtype_disc))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(nq, &pp->childfun.fun, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sp = (char*)nq->nvalue.cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy(sp, dp->data, nv_size(tp));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(j=0; j < dp->numnodes; j++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nr = nv_namptr(dp->nodes,j);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq = nv_namptr(pp->nodes,i++);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvname = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy(cp,fp->name,m);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp[m-1] = '.';
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp += m;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin n = strlen(nr->nvname)+1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy(cp,nr->nvname,n);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp += n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nr->nvalue.cp>=dp->data && nr->nvalue.cp < (char*)pp + pp->fun.dsize)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvalue.cp = sp + (nr->nvalue.cp-dp->data);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvflag = nr->nvflag;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nq->nvsize = nr->nvsize;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(strmatch(fp->type+7,"*-*i*")==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_NOFREE|NV_RDONLY|NV_INTEGER);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strmatch(fp->type+7,"*-*s*")==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_INT16P);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(strmatch(fp->type+7,"*-*l*")==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_INT64);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(strmatch(fp->type+7,"*-*u*")==0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(nq,NV_UNSIGN);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stakseek(offset);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(mp,NV_RDONLY|NV_NOFREE|NV_BINARY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setsize(mp,rsize);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(mp, &pp->fun, NV_LAST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mp->nvalue.cp = pp->data;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_newtype(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(mp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic void put_stat(Namval_t* np, const char* val, int flag, Namfun_t* nfp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(val)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(stat(val,(struct stat*)np->nvalue.cp)<0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sfstderr,"stat of %s failed\n",val);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putv(np,val,flag,nfp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(np,nfp,NV_POP);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!(nfp->nofree&1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin free((void*)nfp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const Namdisc_t stat_disc =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin put_stat
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinvoid nv_mkstat(void)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namval_t *tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *fp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tp = nv_mkstruct("stat_t", sizeof(struct stat), foo);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_offattr(tp,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setvtree(tp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp = newof(NiL,Namfun_t,1,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->type = tp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fp->disc = &stat_disc;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_disc(tp,fp,NV_FIRST);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(tp,"/dev/null",0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_onattr(tp,NV_RDONLY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}