#pragma prototyped
#ifndef NV_DEFAULT
#include <ast.h>
#include <cdt.h>
#include <option.h>
#define Hashtab_t Dt_t
#define HASH_BUCKET 1
#define HASH_NOSCOPE 2
#define HASH_SCOPE 4
#define hashscope(x) dtvnext(x)
typedef struct Namval Namval_t;
typedef struct Namfun Namfun_t;
typedef struct Namdisc Namdisc_t;
typedef struct Nambfun Nambfun_t;
typedef struct Namarray Namarr_t;
typedef struct Namdecl Namdecl_t;
struct Namdisc
{
size_t dsize;
void (*putval)(Namval_t*, const char*, int, Namfun_t*);
char *(*getval)(Namval_t*, Namfun_t*);
Sfdouble_t (*getnum)(Namval_t*, Namfun_t*);
char *(*setdisc)(Namval_t*, const char*, Namval_t*, Namfun_t*);
Namval_t *(*createf)(Namval_t*, const char*, int, Namfun_t*);
Namfun_t *(*clonef)(Namval_t*, Namval_t*, int, Namfun_t*);
char *(*namef)(Namval_t*, Namfun_t*);
Namval_t *(*nextf)(Namval_t*, Dt_t*, Namfun_t*);
Namval_t *(*typef)(Namval_t*, Namfun_t*);
int (*readf)(Namval_t*, Sfio_t*, int, Namfun_t*);
int (*writef)(Namval_t*, Sfio_t*, int, Namfun_t*);
};
struct Namfun
{
const Namdisc_t *disc;
char nofree;
unsigned char subshell;
unsigned short dsize;
Namfun_t *next;
char *last;
Namval_t *type;
};
struct Nambfun
{
Namfun_t fun;
int num;
const char **bnames;
Namval_t *bltins[1];
};
struct Namarray
{
Namfun_t hdr;
long nelem;
void *(*fun)(Namval_t*,const char*,int);
void *fixed;
Dt_t *table;
void *scope;
};
struct Namdecl
{
Namval_t *tp;
const char *optstring;
void *optinfof;
};
#define NV_DEFAULT 0
struct Namval
{
Dtlink_t nvlink;
char *nvname;
unsigned short nvflag;
unsigned short nvsize;
#ifdef _NV_PRIVATE
_NV_PRIVATE
#else
Namfun_t *nvfun;
char *nvalue;
char *nvprivate;
#endif
};
#define NV_CLASS ".sh.type"
#define NV_DATA "_"
#define NV_MINSZ (sizeof(struct Namval)-sizeof(Dtlink_t)-sizeof(char*))
#define nv_namptr(p,n) ((Namval_t*)((char*)(p)+(n)*NV_MINSZ-sizeof(Dtlink_t)))
#define NV_NOFREE 0x200
#define NV_ARRAY 0x400
#define NV_REF 0x4000
#define NV_TABLE 0x800
#define NV_IMPORT 0x1000
#define NV_MINIMAL NV_IMPORT
#define NV_INTEGER 0x2
#define NV_LTOU 0x4
#define NV_UTOL 0x8
#define NV_ZFILL 0x10
#define NV_RJUST 0x20
#define NV_LJUST 0x40
#define NV_BINARY 0x100
#define NV_RAW NV_LJUST
#define NV_HOST (NV_RJUST|NV_LJUST)
#define NV_RDONLY 0x1
#define NV_EXPORT 0x2000
#define NV_TAGGED 0x8000
#define NV_SHORT (NV_RJUST)
#define NV_LONG (NV_UTOL)
#define NV_UNSIGN (NV_LTOU)
#define NV_DOUBLE (NV_INTEGER|NV_ZFILL)
#define NV_EXPNOTE (NV_LJUST)
#define NV_HEXFLOAT (NV_LTOU)
#define NV_APPEND 0x10000
#define NV_MOVE 0x8000000
#define NV_ADD 8
#define NV_ASSIGN NV_NOFREE
#define NV_NOASSIGN 0
#define NV_NOARRAY 0x200000
#define NV_IARRAY 0x400000
#define NV_NOREF NV_REF
#define NV_IDENT 0x80
#define NV_VARNAME 0x20000
#define NV_NOADD 0x40000
#define NV_NOSCOPE 0x80000
#define NV_NOFAIL 0x100000
#define NV_NODISC NV_IDENT
#define NV_FUNCT NV_IDENT
#define NV_BLTINOPT NV_ZFILL
#define NV_PUBLIC (~(NV_NOSCOPE|NV_ASSIGN|NV_IDENT|NV_VARNAME|NV_NOADD))
#define NV_INT16P (NV_LJUST|NV_SHORT|NV_INTEGER)
#define NV_INT16 (NV_SHORT|NV_INTEGER)
#define NV_UINT16 (NV_UNSIGN|NV_SHORT|NV_INTEGER)
#define NV_UINT16P (NV_LJUSTNV_UNSIGN|NV_SHORT|NV_INTEGER)
#define NV_INT32 (NV_INTEGER)
#define NV_UNT32 (NV_UNSIGN|NV_INTEGER)
#define NV_INT64 (NV_LONG|NV_INTEGER)
#define NV_UINT64 (NV_UNSIGN|NV_LONG|NV_INTEGER)
#define NV_FLOAT (NV_SHORT|NV_DOUBLE)
#define NV_LDOUBLE (NV_LONG|NV_DOUBLE)
#define nv_isattr(np,f) ((np)->nvflag & (f))
#define nv_onattr(n,f) ((n)->nvflag |= (f))
#define nv_offattr(n,f) ((n)->nvflag &= ~(f))
#define nv_isarray(np) (nv_isattr((np),NV_ARRAY))
#define NV_AINIT 1
#define NV_AFREE 2
#define NV_ANEXT 3
#define NV_ANAME 4
#define NV_ADELETE 5
#define NV_AADD 6
#define NV_ACURRENT 7
#define NV_ASETSUB 8
#define NV_FIRST 1
#define NV_LAST 2
#define NV_POP 3
#define NV_CLONE 4
#define ARRAY_BITS 22
#define ARRAY_ADD (1L<<ARRAY_BITS)
#define ARRAY_SCAN (2L<<ARRAY_BITS)
#define ARRAY_UNDEF (4L<<ARRAY_BITS)
#define NV_DCADD 0
#define NV_DCRESTRICT 1
#if defined(__EXPORT__) && defined(_DLL)
# ifdef _BLD_shell
# define extern __EXPORT__
# else
# define extern __IMPORT__
# endif
#endif
extern Namarr_t *nv_arrayptr(Namval_t*);
extern Namarr_t *nv_setarray(Namval_t*,void*(*)(Namval_t*,const char*,int));
extern int nv_arraynsub(Namarr_t*);
extern void *nv_associative(Namval_t*,const char*,int);
extern int nv_aindex(Namval_t*);
extern int nv_nextsub(Namval_t*);
extern char *nv_getsub(Namval_t*);
extern Namval_t *nv_putsub(Namval_t*, char*, long);
extern Namval_t *nv_opensub(Namval_t*);
extern int nv_adddisc(Namval_t*, const char**, Namval_t**);
extern int nv_clone(Namval_t*, Namval_t*, int);
extern void nv_close(Namval_t*);
extern void *nv_context(Namval_t*);
extern Namval_t *nv_create(const char*, Dt_t*, int,Namfun_t*);
extern void nv_delete(Namval_t*, Dt_t*, int);
extern Dt_t *nv_dict(Namval_t*);
extern Sfdouble_t nv_getn(Namval_t*, Namfun_t*);
extern Sfdouble_t nv_getnum(Namval_t*);
extern char *nv_getv(Namval_t*, Namfun_t*);
extern char *nv_getval(Namval_t*);
extern Namfun_t *nv_hasdisc(Namval_t*, const Namdisc_t*);
extern int nv_isnull(Namval_t*);
extern Namfun_t *nv_isvtree(Namval_t*);
extern Namval_t *nv_lastdict(void);
extern Namval_t *nv_mkinttype(char*, size_t, int, const char*, Namdisc_t*);
extern void nv_newattr(Namval_t*,unsigned,int);
extern void nv_newtype(Namval_t*);
extern Namval_t *nv_open(const char*,Dt_t*,int);
extern void nv_putval(Namval_t*,const char*,int);
extern void nv_putv(Namval_t*,const char*,int,Namfun_t*);
extern int nv_rename(Namval_t*,int);
extern int nv_scan(Dt_t*,void(*)(Namval_t*,void*),void*,int,int);
extern char *nv_setdisc(Namval_t*,const char*,Namval_t*,Namfun_t*);
extern void nv_setref(Namval_t*, Dt_t*,int);
extern int nv_settype(Namval_t*, Namval_t*, int);
extern void nv_setvec(Namval_t*,int,int,char*[]);
extern void nv_setvtree(Namval_t*);
extern int nv_setsize(Namval_t*,int);
extern Namfun_t *nv_disc(Namval_t*,Namfun_t*,int);
extern void nv_unset(Namval_t*);
extern void _nv_unset(Namval_t*,int);
extern Namval_t *nv_search(const char *, Dt_t*, int);
extern char *nv_name(Namval_t*);
extern Namval_t *nv_type(Namval_t*);
extern void nv_addtype(Namval_t*,const char*, Optdisc_t*, size_t);
extern const Namdisc_t *nv_discfun(int);
#ifdef _DLL
# undef extern
#endif
#define nv_unset(np) _nv_unset(np,0)
#define nv_size(np) nv_setsize((np),-1)
#define nv_stack(np,nf) nv_disc(np,nf,0)
#if 0
# define nv_istype(np) nv_isattr(np)
# define nv_newtype(np) nv_newattr(np)
# define nv_namset(np,a,b) nv_open(np,a,b)
# define nv_free(np) nv_unset(np,0)
# define nv_settype(np,a,b,c) nv_setdisc(np,a,b,c)
# define nv_search(np,a,b) nv_open(np,a,((b)?0:NV_NOADD))
# define settype setdisc
#endif
#endif