1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1982-2012 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
18da2e3ebdSchin *                                                                      *
19da2e3ebdSchin ***********************************************************************/
20da2e3ebdSchin #pragma prototyped
21da2e3ebdSchin #ifndef NV_DEFAULT
22da2e3ebdSchin /*
23da2e3ebdSchin  * David Korn
24da2e3ebdSchin  * AT&T Labs
25da2e3ebdSchin  *
26da2e3ebdSchin  * Interface definitions of structures for name-value pairs
27da2e3ebdSchin  * These structures are used for named variables, functions and aliases
28da2e3ebdSchin  *
29da2e3ebdSchin  */
30da2e3ebdSchin 
31da2e3ebdSchin 
32da2e3ebdSchin #include	<ast.h>
33da2e3ebdSchin #include	<cdt.h>
347c2fbfb3SApril Chin #include	<option.h>
35da2e3ebdSchin 
36da2e3ebdSchin /* for compatibility with old hash library */
37da2e3ebdSchin #define Hashtab_t	Dt_t
38da2e3ebdSchin #define HASH_BUCKET	1
39da2e3ebdSchin #define HASH_NOSCOPE	2
40da2e3ebdSchin #define HASH_SCOPE	4
41da2e3ebdSchin #define hashscope(x)	dtvnext(x)
42da2e3ebdSchin 
43da2e3ebdSchin typedef struct Namval Namval_t;
44da2e3ebdSchin typedef struct Namfun Namfun_t;
45da2e3ebdSchin typedef struct Namdisc Namdisc_t;
46da2e3ebdSchin typedef struct Nambfun Nambfun_t;
47da2e3ebdSchin typedef struct Namarray Namarr_t;
487c2fbfb3SApril Chin typedef struct Namdecl Namdecl_t;
49da2e3ebdSchin 
50da2e3ebdSchin /*
51da2e3ebdSchin  * This defines the template for nodes that have their own assignment
52da2e3ebdSchin  * and or lookup functions
53da2e3ebdSchin  */
54da2e3ebdSchin struct Namdisc
55da2e3ebdSchin {
56da2e3ebdSchin 	size_t	dsize;
57da2e3ebdSchin 	void	(*putval)(Namval_t*, const char*, int, Namfun_t*);
58da2e3ebdSchin 	char	*(*getval)(Namval_t*, Namfun_t*);
59da2e3ebdSchin 	Sfdouble_t	(*getnum)(Namval_t*, Namfun_t*);
60da2e3ebdSchin 	char	*(*setdisc)(Namval_t*, const char*, Namval_t*, Namfun_t*);
61da2e3ebdSchin 	Namval_t *(*createf)(Namval_t*, const char*, int, Namfun_t*);
62da2e3ebdSchin 	Namfun_t *(*clonef)(Namval_t*, Namval_t*, int, Namfun_t*);
63da2e3ebdSchin 	char	*(*namef)(Namval_t*, Namfun_t*);
64da2e3ebdSchin 	Namval_t *(*nextf)(Namval_t*, Dt_t*, Namfun_t*);
65da2e3ebdSchin 	Namval_t *(*typef)(Namval_t*, Namfun_t*);
66da2e3ebdSchin 	int	(*readf)(Namval_t*, Sfio_t*, int, Namfun_t*);
677c2fbfb3SApril Chin 	int	(*writef)(Namval_t*, Sfio_t*, int, Namfun_t*);
68da2e3ebdSchin };
69da2e3ebdSchin 
70da2e3ebdSchin struct Namfun
71da2e3ebdSchin {
72da2e3ebdSchin 	const Namdisc_t	*disc;
73da2e3ebdSchin 	char		nofree;
747c2fbfb3SApril Chin 	unsigned char	subshell;
75*b30d1939SAndy Fiddaman 	uint32_t	dsize;
76da2e3ebdSchin 	Namfun_t	*next;
77da2e3ebdSchin 	char		*last;
78da2e3ebdSchin 	Namval_t	*type;
79da2e3ebdSchin };
80da2e3ebdSchin 
81da2e3ebdSchin struct Nambfun
82da2e3ebdSchin {
83da2e3ebdSchin 	Namfun_t        fun;
84da2e3ebdSchin 	int		num;
85da2e3ebdSchin 	const char	**bnames;
86da2e3ebdSchin 	Namval_t	*bltins[1];
87da2e3ebdSchin };
88da2e3ebdSchin 
89da2e3ebdSchin /* This is an array template header */
90da2e3ebdSchin struct Namarray
91da2e3ebdSchin {
92da2e3ebdSchin 	Namfun_t	hdr;
93da2e3ebdSchin 	long		nelem;				/* number of elements */
94da2e3ebdSchin 	void	*(*fun)(Namval_t*,const char*,int);	/* associative arrays */
95*b30d1939SAndy Fiddaman 	void		*fixed;			/* for fixed sized arrays */
967c2fbfb3SApril Chin 	Dt_t		*table;			/* for subscripts */
977c2fbfb3SApril Chin 	void		*scope;			/* non-zerp when scoped */
98da2e3ebdSchin };
99da2e3ebdSchin 
1007c2fbfb3SApril Chin /* The context pointer for declaration command */
1017c2fbfb3SApril Chin struct Namdecl
102da2e3ebdSchin {
1037c2fbfb3SApril Chin 	Namval_t	*tp;			/* point to type */
104da2e3ebdSchin 	const char	*optstring;
105da2e3ebdSchin 	void		*optinfof;
106da2e3ebdSchin };
107da2e3ebdSchin 
108da2e3ebdSchin /* attributes of name-value node attribute flags */
109da2e3ebdSchin 
110da2e3ebdSchin #define NV_DEFAULT 0
111da2e3ebdSchin /* This defines the attributes for an attributed name-value pair node */
112da2e3ebdSchin struct Namval
113da2e3ebdSchin {
114da2e3ebdSchin 	Dtlink_t	nvlink;		/* space for cdt links */
115da2e3ebdSchin 	char		*nvname;	/* pointer to name of the node */
116*b30d1939SAndy Fiddaman #if _ast_sizeof_pointer == 8
117*b30d1939SAndy Fiddaman #   if _ast_intswap > 0
118*b30d1939SAndy Fiddaman 	unsigned short	nvflag; 	/* attributes */
119*b30d1939SAndy Fiddaman 	unsigned short	pad1;
120*b30d1939SAndy Fiddaman #   else
121*b30d1939SAndy Fiddaman 	unsigned short	pad1;
122*b30d1939SAndy Fiddaman 	unsigned short	nvflag; 	/* attributes */
123*b30d1939SAndy Fiddaman #   endif
124*b30d1939SAndy Fiddaman 	uint32_t  	nvsize;		/* size or base */
125*b30d1939SAndy Fiddaman #else
126da2e3ebdSchin 	unsigned short	nvflag; 	/* attributes */
127da2e3ebdSchin 	unsigned short 	nvsize;		/* size or base */
128*b30d1939SAndy Fiddaman #endif
129da2e3ebdSchin #ifdef _NV_PRIVATE
130da2e3ebdSchin 	_NV_PRIVATE
131da2e3ebdSchin #else
132da2e3ebdSchin 	Namfun_t	*nvfun;
133da2e3ebdSchin 	char		*nvalue;
134da2e3ebdSchin 	char		*nvprivate;
135da2e3ebdSchin #endif /* _NV_PRIVATE */
136da2e3ebdSchin };
137da2e3ebdSchin 
138da2e3ebdSchin #define NV_CLASS	".sh.type"
1397c2fbfb3SApril Chin #define NV_DATA		"_"	/* special class or instance variable */
140da2e3ebdSchin #define NV_MINSZ	(sizeof(struct Namval)-sizeof(Dtlink_t)-sizeof(char*))
141da2e3ebdSchin #define nv_namptr(p,n)	((Namval_t*)((char*)(p)+(n)*NV_MINSZ-sizeof(Dtlink_t)))
142da2e3ebdSchin 
143da2e3ebdSchin /* The following attributes are for internal use */
144da2e3ebdSchin #define NV_NOFREE	0x200	/* don't free the space when releasing value */
145da2e3ebdSchin #define NV_ARRAY	0x400	/* node is an array */
146da2e3ebdSchin #define NV_REF		0x4000	/* reference bit */
147da2e3ebdSchin #define NV_TABLE	0x800	/* node is a dictionary table */
148da2e3ebdSchin #define NV_IMPORT	0x1000	/* value imported from environment */
149da2e3ebdSchin #define NV_MINIMAL	NV_IMPORT	/* node does not contain all fields */
150da2e3ebdSchin 
151da2e3ebdSchin #define NV_INTEGER	0x2	/* integer attribute */
152da2e3ebdSchin /* The following attributes are valid only when NV_INTEGER is off */
153da2e3ebdSchin #define NV_LTOU		0x4	/* convert to uppercase */
154da2e3ebdSchin #define NV_UTOL		0x8	/* convert to lowercase */
155da2e3ebdSchin #define NV_ZFILL	0x10	/* right justify and fill with leading zeros */
156da2e3ebdSchin #define NV_RJUST	0x20	/* right justify and blank fill */
157da2e3ebdSchin #define NV_LJUST	0x40	/* left justify and blank fill */
158da2e3ebdSchin #define NV_BINARY	0x100	/* fixed size data buffer */
159da2e3ebdSchin #define NV_RAW		NV_LJUST	/* used only with NV_BINARY */
160da2e3ebdSchin #define NV_HOST		(NV_RJUST|NV_LJUST)	/* map to host filename */
161da2e3ebdSchin 
162da2e3ebdSchin /* The following attributes do not effect the value */
163da2e3ebdSchin #define NV_RDONLY	0x1	/* readonly bit */
164da2e3ebdSchin #define NV_EXPORT	0x2000	/* export bit */
165da2e3ebdSchin #define NV_TAGGED	0x8000	/* user define tag bit */
166da2e3ebdSchin 
167da2e3ebdSchin /* The following are used with NV_INTEGER */
168da2e3ebdSchin #define NV_SHORT	(NV_RJUST)	/* when integers are not long */
169da2e3ebdSchin #define NV_LONG		(NV_UTOL)	/* for long long and long double */
170da2e3ebdSchin #define NV_UNSIGN	(NV_LTOU)	/* for unsigned quantities */
1717c2fbfb3SApril Chin #define NV_DOUBLE	(NV_INTEGER|NV_ZFILL)	/* for floating point */
172da2e3ebdSchin #define NV_EXPNOTE	(NV_LJUST)	/* for scientific notation */
1737c2fbfb3SApril Chin #define NV_HEXFLOAT	(NV_LTOU)	/* for C99 base16 float notation */
174da2e3ebdSchin 
175da2e3ebdSchin /*  options for nv_open */
176da2e3ebdSchin 
177da2e3ebdSchin #define NV_APPEND	0x10000		/* append value */
1787c2fbfb3SApril Chin #define NV_MOVE		0x8000000	/* for use with nv_clone */
179da2e3ebdSchin #define NV_ADD		8
180da2e3ebdSchin 					/* add node if not found */
181da2e3ebdSchin #define NV_ASSIGN	NV_NOFREE	/* assignment is possible */
182da2e3ebdSchin #define NV_NOASSIGN	0		/* backward compatibility */
183da2e3ebdSchin #define NV_NOARRAY	0x200000	/* array name not possible */
184da2e3ebdSchin #define NV_IARRAY	0x400000	/* for indexed array */
185da2e3ebdSchin #define NV_NOREF	NV_REF		/* don't follow reference */
186da2e3ebdSchin #define NV_IDENT	0x80		/* name must be identifier */
187da2e3ebdSchin #define NV_VARNAME	0x20000		/* name must be ?(.)id*(.id) */
188da2e3ebdSchin #define NV_NOADD	0x40000		/* do not add node */
189da2e3ebdSchin #define NV_NOSCOPE	0x80000		/* look only in current scope */
190da2e3ebdSchin #define NV_NOFAIL	0x100000	/* return 0 on failure, no msg */
191da2e3ebdSchin #define NV_NODISC	NV_IDENT	/* ignore disciplines */
192da2e3ebdSchin 
193da2e3ebdSchin #define NV_FUNCT	NV_IDENT	/* option for nv_create */
1947c2fbfb3SApril Chin #define NV_BLTINOPT	NV_ZFILL	/* mark builtins in libcmd */
195da2e3ebdSchin 
196da2e3ebdSchin #define NV_PUBLIC	(~(NV_NOSCOPE|NV_ASSIGN|NV_IDENT|NV_VARNAME|NV_NOADD))
197da2e3ebdSchin 
198da2e3ebdSchin /* numeric types */
1997c2fbfb3SApril Chin #define NV_INT16P	(NV_LJUST|NV_SHORT|NV_INTEGER)
200da2e3ebdSchin #define NV_INT16	(NV_SHORT|NV_INTEGER)
201da2e3ebdSchin #define NV_UINT16	(NV_UNSIGN|NV_SHORT|NV_INTEGER)
2027c2fbfb3SApril Chin #define NV_UINT16P	(NV_LJUSTNV_UNSIGN|NV_SHORT|NV_INTEGER)
203da2e3ebdSchin #define NV_INT32	(NV_INTEGER)
204da2e3ebdSchin #define NV_UNT32	(NV_UNSIGN|NV_INTEGER)
205da2e3ebdSchin #define NV_INT64	(NV_LONG|NV_INTEGER)
206da2e3ebdSchin #define NV_UINT64	(NV_UNSIGN|NV_LONG|NV_INTEGER)
2077c2fbfb3SApril Chin #define NV_FLOAT	(NV_SHORT|NV_DOUBLE)
2087c2fbfb3SApril Chin #define NV_LDOUBLE	(NV_LONG|NV_DOUBLE)
209da2e3ebdSchin 
210da2e3ebdSchin /* name-value pair macros */
211da2e3ebdSchin #define nv_isattr(np,f)		((np)->nvflag & (f))
212da2e3ebdSchin #define nv_onattr(n,f)		((n)->nvflag |= (f))
213da2e3ebdSchin #define nv_offattr(n,f)		((n)->nvflag &= ~(f))
214da2e3ebdSchin #define nv_isarray(np)		(nv_isattr((np),NV_ARRAY))
215da2e3ebdSchin 
216da2e3ebdSchin /* The following are operations for associative arrays */
217da2e3ebdSchin #define NV_AINIT	1	/* initialize */
218da2e3ebdSchin #define NV_AFREE	2	/* free array */
219da2e3ebdSchin #define NV_ANEXT	3	/* advance to next subscript */
220da2e3ebdSchin #define NV_ANAME	4	/* return subscript name */
221da2e3ebdSchin #define NV_ADELETE	5	/* delete current subscript */
222da2e3ebdSchin #define NV_AADD		6	/* add subscript if not found */
223da2e3ebdSchin #define NV_ACURRENT	7	/* return current subscript Namval_t* */
2247c2fbfb3SApril Chin #define NV_ASETSUB	8	/* set current subscript */
225da2e3ebdSchin 
226da2e3ebdSchin /* The following are for nv_disc */
227da2e3ebdSchin #define NV_FIRST	1
228da2e3ebdSchin #define NV_LAST		2
229da2e3ebdSchin #define NV_POP		3
230da2e3ebdSchin #define NV_CLONE	4
231da2e3ebdSchin 
232da2e3ebdSchin /* The following are operations for nv_putsub() */
2337c2fbfb3SApril Chin #define ARRAY_BITS	22
234da2e3ebdSchin #define ARRAY_ADD	(1L<<ARRAY_BITS)	/* add subscript if not found */
235da2e3ebdSchin #define	ARRAY_SCAN	(2L<<ARRAY_BITS)	/* For ${array[@]} */
236da2e3ebdSchin #define ARRAY_UNDEF	(4L<<ARRAY_BITS)	/* For ${array} */
237da2e3ebdSchin 
238da2e3ebdSchin 
239da2e3ebdSchin /* These  are disciplines provided by the library for use with nv_discfun */
240da2e3ebdSchin #define NV_DCADD	0	/* used to add named disciplines */
241da2e3ebdSchin #define NV_DCRESTRICT	1	/* variable that are restricted in rsh */
242da2e3ebdSchin 
243da2e3ebdSchin #if defined(__EXPORT__) && defined(_DLL)
244da2e3ebdSchin #   ifdef _BLD_shell
245da2e3ebdSchin #	define extern __EXPORT__
246da2e3ebdSchin #   else
247da2e3ebdSchin #	define extern __IMPORT__
248da2e3ebdSchin #   endif /* _BLD_shell */
249da2e3ebdSchin #endif /* _DLL */
250da2e3ebdSchin /* prototype for array interface*/
2517c2fbfb3SApril Chin extern Namarr_t	*nv_arrayptr(Namval_t*);
252da2e3ebdSchin extern Namarr_t	*nv_setarray(Namval_t*,void*(*)(Namval_t*,const char*,int));
2537c2fbfb3SApril Chin extern int	nv_arraynsub(Namarr_t*);
254da2e3ebdSchin extern void	*nv_associative(Namval_t*,const char*,int);
255da2e3ebdSchin extern int	nv_aindex(Namval_t*);
256da2e3ebdSchin extern int	nv_nextsub(Namval_t*);
257da2e3ebdSchin extern char	*nv_getsub(Namval_t*);
258da2e3ebdSchin extern Namval_t	*nv_putsub(Namval_t*, char*, long);
259da2e3ebdSchin extern Namval_t	*nv_opensub(Namval_t*);
260da2e3ebdSchin 
261da2e3ebdSchin /* name-value pair function prototypes */
262da2e3ebdSchin extern int		nv_adddisc(Namval_t*, const char**, Namval_t**);
263da2e3ebdSchin extern int		nv_clone(Namval_t*, Namval_t*, int);
264da2e3ebdSchin extern void 		nv_close(Namval_t*);
265da2e3ebdSchin extern void		*nv_context(Namval_t*);
266da2e3ebdSchin extern Namval_t		*nv_create(const char*, Dt_t*, int,Namfun_t*);
2677c2fbfb3SApril Chin extern void		nv_delete(Namval_t*, Dt_t*, int);
268da2e3ebdSchin extern Dt_t		*nv_dict(Namval_t*);
269da2e3ebdSchin extern Sfdouble_t	nv_getn(Namval_t*, Namfun_t*);
270da2e3ebdSchin extern Sfdouble_t	nv_getnum(Namval_t*);
271da2e3ebdSchin extern char 		*nv_getv(Namval_t*, Namfun_t*);
272da2e3ebdSchin extern char 		*nv_getval(Namval_t*);
273da2e3ebdSchin extern Namfun_t		*nv_hasdisc(Namval_t*, const Namdisc_t*);
274da2e3ebdSchin extern int		nv_isnull(Namval_t*);
2757c2fbfb3SApril Chin extern Namfun_t		*nv_isvtree(Namval_t*);
276da2e3ebdSchin extern Namval_t		*nv_lastdict(void);
2777c2fbfb3SApril Chin extern Namval_t		*nv_mkinttype(char*, size_t, int, const char*, Namdisc_t*);
278da2e3ebdSchin extern void 		nv_newattr(Namval_t*,unsigned,int);
27934f9b3eeSRoland Mainz extern void 		nv_newtype(Namval_t*);
280da2e3ebdSchin extern Namval_t		*nv_open(const char*,Dt_t*,int);
281da2e3ebdSchin extern void 		nv_putval(Namval_t*,const char*,int);
282da2e3ebdSchin extern void 		nv_putv(Namval_t*,const char*,int,Namfun_t*);
2837c2fbfb3SApril Chin extern int		nv_rename(Namval_t*,int);
284da2e3ebdSchin extern int		nv_scan(Dt_t*,void(*)(Namval_t*,void*),void*,int,int);
285da2e3ebdSchin extern char 		*nv_setdisc(Namval_t*,const char*,Namval_t*,Namfun_t*);
286da2e3ebdSchin extern void		nv_setref(Namval_t*, Dt_t*,int);
287da2e3ebdSchin extern int		nv_settype(Namval_t*, Namval_t*, int);
288da2e3ebdSchin extern void 		nv_setvec(Namval_t*,int,int,char*[]);
289da2e3ebdSchin extern void		nv_setvtree(Namval_t*);
290da2e3ebdSchin extern int 		nv_setsize(Namval_t*,int);
291da2e3ebdSchin extern Namfun_t		*nv_disc(Namval_t*,Namfun_t*,int);
2927c2fbfb3SApril Chin extern void 		nv_unset(Namval_t*);	 /*obsolete */
2937c2fbfb3SApril Chin extern void 		_nv_unset(Namval_t*,int);
294da2e3ebdSchin extern Namval_t		*nv_search(const char *, Dt_t*, int);
295da2e3ebdSchin extern char		*nv_name(Namval_t*);
296da2e3ebdSchin extern Namval_t		*nv_type(Namval_t*);
2977c2fbfb3SApril Chin extern void		nv_addtype(Namval_t*,const char*, Optdisc_t*, size_t);
298da2e3ebdSchin extern const Namdisc_t	*nv_discfun(int);
299da2e3ebdSchin 
300da2e3ebdSchin #ifdef _DLL
301da2e3ebdSchin #   undef extern
302da2e3ebdSchin #endif /* _DLL */
303da2e3ebdSchin 
3047c2fbfb3SApril Chin #define nv_unset(np)		_nv_unset(np,0)
305da2e3ebdSchin #define nv_size(np)		nv_setsize((np),-1)
306da2e3ebdSchin #define nv_stack(np,nf)		nv_disc(np,nf,0)
307da2e3ebdSchin 
308da2e3ebdSchin #if 0
309da2e3ebdSchin /*
310da2e3ebdSchin  * The names of many functions were changed in early '95
311da2e3ebdSchin  * Here is a mapping to the old names
312da2e3ebdSchin  */
313da2e3ebdSchin #   define nv_istype(np)	nv_isattr(np)
314da2e3ebdSchin #   define nv_newtype(np)	nv_newattr(np)
315da2e3ebdSchin #   define nv_namset(np,a,b)	nv_open(np,a,b)
3167c2fbfb3SApril Chin #   define nv_free(np)		nv_unset(np,0)
317da2e3ebdSchin #   define nv_settype(np,a,b,c)	nv_setdisc(np,a,b,c)
318da2e3ebdSchin #   define nv_search(np,a,b)	nv_open(np,a,((b)?0:NV_NOADD))
319da2e3ebdSchin #   define settype	setdisc
320da2e3ebdSchin #endif
321da2e3ebdSchin 
322da2e3ebdSchin #endif /* NV_DEFAULT */
323