1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
|
/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1982-2010 AT&T Intellectual Property *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* http://www.opensource.org/licenses/cpl1.0.txt *
* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* David Korn <dgk@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
#ifndef _NV_PRIVATE
/*
* This is the implementation header file for name-value pairs
*/
#define _NV_PRIVATE \
Namfun_t *nvfun; /* pointer to trap functions */ \
union Value nvalue; /* value field */ \
char *nvenv; /* pointer to environment name */
#include <ast.h>
#include <cdt.h>
#include "shtable.h"
/* Nodes can have all kinds of values */
union Value
{
const char *cp;
int *ip;
char c;
int i;
unsigned int u;
int32_t *lp;
Sflong_t *llp; /* for long long arithmetic */
int16_t s;
int16_t *sp;
double *dp; /* for floating point arithmetic */
Sfdouble_t *ldp; /* for long floating point arithmetic */
struct Namarray *array; /* for array node */
struct Namval *np; /* for Namval_t node */
union Value *up; /* for indirect node */
struct Ufunction *rp; /* shell user defined functions */
struct Namfun *funp; /* discipline pointer */
struct Namref *nrp; /* name reference */
int (*bfp)(int,char*[],void*);/* builtin entry point function pointer */
};
#include "nval.h"
/* used for arrays */
#define ARRAY_MAX (1L<<ARRAY_BITS) /* maximum number of elements in an array */
#define ARRAY_MASK (ARRAY_MAX-1) /* For index values */
#define ARRAY_INCR 32 /* number of elements to grow when array
bound exceeded. Must be a power of 2 */
#define ARRAY_FILL (8L<<ARRAY_BITS) /* used with nv_putsub() */
#define ARRAY_NOCLONE (16L<<ARRAY_BITS) /* do not clone array disc */
#define ARRAY_NOCHILD (32L<<ARRAY_BITS) /* skip compound arrays */
#define ARRAY_SETSUB (64L<<ARRAY_BITS) /* set subscript */
#define ARRAY_NOSCOPE (128L<<ARRAY_BITS) /* top level scope only */
#define ARRAY_TREE (256L<<ARRAY_BITS) /* arrays of compound vars */
#define NV_ASETSUB 8 /* set subscript */
/* These flags are used as options to array_get() */
#define ARRAY_ASSIGN 0
#define ARRAY_LOOKUP 1
#define ARRAY_DELETE 2
struct Namref
{
Namval_t *np;
Namval_t *table;
Dt_t *root;
char *sub;
};
/* This describes a user shell function node */
struct Ufunction
{
int *ptree; /* address of parse tree */
int lineno; /* line number of function start */
off_t hoffset; /* offset into source or history file */
Namval_t *nspace; /* pointer to name space */
char *fname; /* file name where function defined */
char *help; /* help string */
Dt_t *sdict; /* dictionary for statics */
Dt_t *fdict; /* dictionary node belongs to */
Namval_t *np; /* function node pointer */
};
#ifndef ARG_RAW
struct argnod;
#endif /* !ARG_RAW */
/* attributes of Namval_t items */
/* The following attributes are for internal use */
#define NV_NOCHANGE (NV_EXPORT|NV_IMPORT|NV_RDONLY|NV_TAGGED|NV_NOFREE|NV_ARRAY)
#define NV_ATTRIBUTES (~(NV_NOSCOPE|NV_ARRAY|NV_NOARRAY|NV_IDENT|NV_ASSIGN|NV_REF|NV_VARNAME|NV_STATIC))
#define NV_PARAM NV_NODISC /* expansion use positional params */
/* This following are for use with nodes which are not name-values */
#define NV_TYPE 0x1000000
#define NV_STATIC 0x2000000
#define NV_COMVAR 0x4000000
#define NV_UNJUST 0x8000000 /* clear justify attributes */
#define NV_FUNCTION (NV_RJUST|NV_FUNCT) /* value is shell function */
#define NV_FPOSIX NV_LJUST /* posix function semantics */
#define NV_FTMP NV_ZFILL /* function source in tmpfile */
#define NV_NOPRINT (NV_LTOU|NV_UTOL) /* do not print */
#define NV_NOALIAS (NV_NOPRINT|NV_IMPORT)
#define NV_NOEXPAND NV_RJUST /* do not expand alias */
#define NV_BLTIN (NV_NOPRINT|NV_EXPORT)
#define BLT_ENV (NV_RDONLY) /* non-stoppable,
* can modify enviornment */
#define BLT_SPC (NV_LJUST) /* special built-ins */
#define BLT_EXIT (NV_RJUST) /* exit value can be > 255 */
#define BLT_DCL (NV_TAGGED) /* declaration command */
#define BLT_NOSFIO (NV_IMPORT) /* doesn't use sfio */
#define NV_OPTGET (NV_BINARY) /* function calls getopts */
#define nv_isref(n) (nv_isattr((n),NV_REF|NV_TAGGED|NV_FUNCT)==NV_REF)
#define nv_istable(n) (nv_isattr((n),NV_TABLE|NV_LJUST|NV_RJUST|NV_INTEGER)==NV_TABLE)
#define is_abuiltin(n) (nv_isattr(n,NV_BLTIN|NV_INTEGER)==NV_BLTIN)
#define is_afunction(n) (nv_isattr(n,NV_FUNCTION|NV_REF)==NV_FUNCTION)
#define nv_funtree(n) ((n)->nvalue.rp->ptree)
#define funptr(n) ((n)->nvalue.bfp)
#define NV_SUBQUOTE (NV_ADD<<1) /* used with nv_endsubscript */
/* NAMNOD MACROS */
/* ... for attributes */
#define nv_setattr(n,f) ((n)->nvflag = (f))
#define nv_context(n) ((void*)(n)->nvfun) /* for builtins */
/* The following are for name references */
#define nv_refnode(n) ((n)->nvalue.nrp->np)
#define nv_reftree(n) ((n)->nvalue.nrp->root)
#define nv_reftable(n) ((n)->nvalue.nrp->table)
#define nv_refsub(n) ((n)->nvalue.nrp->sub)
/* ... etc */
#define nv_setsize(n,s) ((n)->nvsize = (s))
#undef nv_size
#define nv_size(np) ((np)->nvsize)
#define _nv_hasget(np) ((np)->nvfun && (np)->nvfun->disc && nv_hasget(np))
#define nv_isnull(np) (!(np)->nvalue.cp && (nv_isattr(np,NV_SHORT|NV_INTEGER)!=(NV_SHORT|NV_INTEGER)) && !_nv_hasget(np))
/* ... for arrays */
#define array_elem(ap) ((ap)->nelem&ARRAY_MASK)
#define array_assoc(ap) ((ap)->fun)
extern int array_maxindex(Namval_t*);
extern char *nv_endsubscript(Namval_t*, char*, int);
extern Namfun_t *nv_cover(Namval_t*);
extern Namarr_t *nv_arrayptr(Namval_t*);
extern int nv_arrayisset(Namval_t*, Namarr_t*);
extern int nv_arraysettype(Namval_t*, Namval_t*,const char*,int);
extern int nv_aimax(Namval_t*);
extern int nv_atypeindex(Namval_t*, const char*);
extern int nv_setnotify(Namval_t*,char **);
extern int nv_unsetnotify(Namval_t*,char **);
extern void nv_setlist(struct argnod*, int, Namval_t*);
extern struct argnod* nv_onlist(struct argnod*, const char*);
extern void nv_optimize(Namval_t*);
extern void nv_outname(Sfio_t*,char*, int);
extern void nv_unref(Namval_t*);
extern void _nv_unset(Namval_t*,int);
extern int nv_hasget(Namval_t*);
extern int nv_clone(Namval_t*, Namval_t*, int);
void clone_all_disc(Namval_t*, Namval_t*, int);
extern Namfun_t *nv_clone_disc(Namfun_t*, int);
extern void *nv_diropen(Namval_t*, const char*);
extern char *nv_dirnext(void*);
extern void nv_dirclose(void*);
extern char *nv_getvtree(Namval_t*, Namfun_t*);
extern void nv_attribute(Namval_t*, Sfio_t*, char*, int);
extern Namval_t *nv_bfsearch(const char*, Dt_t*, Namval_t**, char**);
extern Namval_t *nv_mkclone(Namval_t*);
extern Namval_t *nv_mktype(Namval_t**, int);
extern Namval_t *nv_addnode(Namval_t*, int);
extern Namval_t *nv_parent(Namval_t*);
extern char *nv_getbuf(size_t);
extern Namval_t *nv_mount(Namval_t*, const char *name, Dt_t*);
extern Namval_t *nv_arraychild(Namval_t*, Namval_t*, int);
extern int nv_compare(Dt_t*, Void_t*, Void_t*, Dtdisc_t*);
extern void nv_outnode(Namval_t*,Sfio_t*, int, int);
extern int nv_subsaved(Namval_t*);
extern void nv_typename(Namval_t*, Sfio_t*);
extern void nv_newtype(Namval_t*);
extern const Namdisc_t RESTRICTED_disc;
extern const Namdisc_t ENUM_disc;
extern char nv_local;
extern Dtdisc_t _Nvdisc;
extern const char *nv_discnames[];
extern const char e_subscript[];
extern const char e_nullset[];
extern const char e_notset[];
extern const char e_noparent[];
extern const char e_notelem[];
extern const char e_readonly[];
extern const char e_badfield[];
extern const char e_restricted[];
extern const char e_ident[];
extern const char e_varname[];
extern const char e_noalias[];
extern const char e_noarray[];
extern const char e_notenum[];
extern const char e_aliname[];
extern const char e_badexport[];
extern const char e_badref[];
extern const char e_badsubscript[];
extern const char e_noref[];
extern const char e_selfref[];
extern const char e_envmarker[];
extern const char e_badlocale[];
extern const char e_loop[];
extern const char e_redef[];
extern const char e_required[];
extern const char e_badappend[];
extern const char e_unknowntype[];
extern const char e_globalref[];
#endif /* _NV_PRIVATE */
|