summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshell/common/include/name.h
blob: cf46c92b5ffc2338a663ae79b283900b77115ef9 (plain)
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 */