]> git.ipfire.org Git - thirdparty/bash.git/blame - variables.h
Bash-5.0 patch 4: the wait builtin without arguments only waits for known children...
[thirdparty/bash.git] / variables.h
CommitLineData
726f6388
JA
1/* variables.h -- data structures for shell variables. */
2
d233b485 3/* Copyright (C) 1987-2018 Free Software Foundation, Inc.
bb70624e
JA
4
5 This file is part of GNU Bash, the Bourne Again SHell.
6
3185942a
JA
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
bb70624e 11
3185942a
JA
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
bb70624e
JA
16
17 You should have received a copy of the GNU General Public License
3185942a
JA
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19*/
bb70624e 20
726f6388
JA
21#if !defined (_VARIABLES_H_)
22#define _VARIABLES_H_
23
24#include "stdc.h"
ccc6cda3 25#include "array.h"
3185942a 26#include "assoc.h"
726f6388
JA
27
28/* Shell variables and functions are stored in hash tables. */
ccc6cda3 29#include "hashlib.h"
726f6388 30
f73dda09 31#include "conftypes.h"
b72432fd 32
7117c2d2
JA
33/* A variable context. */
34typedef struct var_context {
35 char *name; /* empty or NULL means global context */
36 int scope; /* 0 means global context */
37 int flags;
38 struct var_context *up; /* previous function calls */
39 struct var_context *down; /* down towards global context */
40 HASH_TABLE *table; /* variables at this scope */
41} VAR_CONTEXT;
42
43/* Flags for var_context->flags */
44#define VC_HASLOCAL 0x01
45#define VC_HASTMPVAR 0x02
46#define VC_FUNCENV 0x04 /* also function if name != NULL */
47#define VC_BLTNENV 0x08 /* builtin_env */
48#define VC_TEMPENV 0x10 /* temporary_env */
49
50#define VC_TEMPFLAGS (VC_FUNCENV|VC_BLTNENV|VC_TEMPENV)
51
52/* Accessing macros */
53#define vc_isfuncenv(vc) (((vc)->flags & VC_FUNCENV) != 0)
54#define vc_isbltnenv(vc) (((vc)->flags & VC_BLTNENV) != 0)
55#define vc_istempenv(vc) (((vc)->flags & (VC_TEMPFLAGS)) == VC_TEMPENV)
56
57#define vc_istempscope(vc) (((vc)->flags & (VC_TEMPENV|VC_BLTNENV)) != 0)
58
59#define vc_haslocals(vc) (((vc)->flags & VC_HASLOCAL) != 0)
60#define vc_hastmpvars(vc) (((vc)->flags & VC_HASTMPVAR) != 0)
61
726f6388
JA
62/* What a shell variable looks like. */
63
7117c2d2 64typedef struct variable *sh_var_value_func_t __P((struct variable *));
3185942a 65typedef struct variable *sh_var_assign_func_t __P((struct variable *, char *, arrayind_t, char *));
7117c2d2
JA
66
67/* For the future */
68union _value {
69 char *s; /* string value */
70 intmax_t i; /* int value */
71 COMMAND *f; /* function */
72 ARRAY *a; /* array */
73 HASH_TABLE *h; /* associative array */
74 double d; /* floating point number */
b80f6443
JA
75#if defined (HAVE_LONG_DOUBLE)
76 long double ld; /* long double */
77#endif
78 struct variable *v; /* possible indirect variable use */
79 void *opaque; /* opaque data for future use */
7117c2d2 80};
726f6388
JA
81
82typedef struct variable {
83 char *name; /* Symbol that the user types. */
84 char *value; /* Value that is returned. */
bb70624e 85 char *exportstr; /* String for the environment. */
7117c2d2 86 sh_var_value_func_t *dynamic_value; /* Function called to return a `dynamic'
726f6388
JA
87 value for a variable, like $SECONDS
88 or $RANDOM. */
7117c2d2 89 sh_var_assign_func_t *assign_func; /* Function called when this `special
726f6388
JA
90 variable' is assigned a value in
91 bind_variable. */
92 int attributes; /* export, readonly, array, invisible... */
93 int context; /* Which context this variable belongs to. */
726f6388
JA
94} SHELL_VAR;
95
7117c2d2
JA
96typedef struct _vlist {
97 SHELL_VAR **list;
98 int list_size; /* allocated size */
99 int list_len; /* current number of entries */
100} VARLIST;
101
cce855bc 102/* The various attributes that a given variable can have. */
7117c2d2
JA
103/* First, the user-visible attributes */
104#define att_exported 0x0000001 /* export to environment */
105#define att_readonly 0x0000002 /* cannot change */
106#define att_array 0x0000004 /* value is an array */
107#define att_function 0x0000008 /* value is a function */
108#define att_integer 0x0000010 /* internal representation is int */
109#define att_local 0x0000020 /* variable is local to a function */
110#define att_assoc 0x0000040 /* variable is an associative array */
111#define att_trace 0x0000080 /* function is traced with DEBUG trap */
3185942a
JA
112#define att_uppercase 0x0000100 /* word converted to uppercase on assignment */
113#define att_lowercase 0x0000200 /* word converted to lowercase on assignment */
114#define att_capcase 0x0000400 /* word capitalized on assignment */
ac50fbac 115#define att_nameref 0x0000800 /* word is a name reference */
3185942a 116
ac50fbac 117#define user_attrs (att_exported|att_readonly|att_integer|att_local|att_trace|att_uppercase|att_lowercase|att_capcase|att_nameref)
7117c2d2
JA
118
119#define attmask_user 0x0000fff
120
121/* Internal attributes used for bookkeeping */
122#define att_invisible 0x0001000 /* cannot see */
123#define att_nounset 0x0002000 /* cannot unset */
124#define att_noassign 0x0004000 /* assignment not allowed */
125#define att_imported 0x0008000 /* came from environment */
126#define att_special 0x0010000 /* requires special handling */
3185942a 127#define att_nofree 0x0020000 /* do not free value on unset */
d233b485 128#define att_regenerate 0x0040000 /* regenerate when exported */
7117c2d2
JA
129
130#define attmask_int 0x00ff000
131
132/* Internal attributes used for variable scoping. */
133#define att_tempvar 0x0100000 /* variable came from the temp environment */
134#define att_propagate 0x0200000 /* propagate to previous scope */
135
136#define attmask_scope 0x0f00000
726f6388
JA
137
138#define exported_p(var) ((((var)->attributes) & (att_exported)))
139#define readonly_p(var) ((((var)->attributes) & (att_readonly)))
726f6388
JA
140#define array_p(var) ((((var)->attributes) & (att_array)))
141#define function_p(var) ((((var)->attributes) & (att_function)))
142#define integer_p(var) ((((var)->attributes) & (att_integer)))
ccc6cda3 143#define local_p(var) ((((var)->attributes) & (att_local)))
7117c2d2
JA
144#define assoc_p(var) ((((var)->attributes) & (att_assoc)))
145#define trace_p(var) ((((var)->attributes) & (att_trace)))
3185942a
JA
146#define uppercase_p(var) ((((var)->attributes) & (att_uppercase)))
147#define lowercase_p(var) ((((var)->attributes) & (att_lowercase)))
148#define capcase_p(var) ((((var)->attributes) & (att_capcase)))
ac50fbac 149#define nameref_p(var) ((((var)->attributes) & (att_nameref)))
7117c2d2
JA
150
151#define invisible_p(var) ((((var)->attributes) & (att_invisible)))
152#define non_unsettable_p(var) ((((var)->attributes) & (att_nounset)))
28ef6c31 153#define noassign_p(var) ((((var)->attributes) & (att_noassign)))
7117c2d2
JA
154#define imported_p(var) ((((var)->attributes) & (att_imported)))
155#define specialvar_p(var) ((((var)->attributes) & (att_special)))
3185942a 156#define nofree_p(var) ((((var)->attributes) & (att_nofree)))
d233b485 157#define regen_p(var) ((((var)->attributes) & (att_regenerate)))
7117c2d2
JA
158
159#define tempvar_p(var) ((((var)->attributes) & (att_tempvar)))
d233b485 160#define propagate_p(var) ((((var)->attributes) & (att_propagate)))
7117c2d2 161
a0c0a00f
CR
162/* Variable names: lvalues */
163#define name_cell(var) ((var)->name)
164
7117c2d2
JA
165/* Acessing variable values: rvalues */
166#define value_cell(var) ((var)->value)
167#define function_cell(var) (COMMAND *)((var)->value)
168#define array_cell(var) (ARRAY *)((var)->value)
3185942a 169#define assoc_cell(var) (HASH_TABLE *)((var)->value)
ac50fbac
CR
170#define nameref_cell(var) ((var)->value) /* so it can change later */
171
172#define NAMEREF_MAX 8 /* only 8 levels of nameref indirection */
7117c2d2 173
7117c2d2 174#define var_isset(var) ((var)->value != 0)
a0c0a00f
CR
175#define var_isunset(var) ((var)->value == 0)
176#define var_isnull(var) ((var)->value && *(var)->value == 0)
7117c2d2
JA
177
178/* Assigning variable values: lvalues */
179#define var_setvalue(var, str) ((var)->value = (str))
180#define var_setfunc(var, func) ((var)->value = (char *)(func))
181#define var_setarray(var, arr) ((var)->value = (char *)(arr))
3185942a 182#define var_setassoc(var, arr) ((var)->value = (char *)(arr))
ac50fbac 183#define var_setref(var, str) ((var)->value = (str))
726f6388 184
7117c2d2
JA
185/* Make VAR be auto-exported. */
186#define set_auto_export(var) \
187 do { (var)->attributes |= att_exported; array_needs_making = 1; } while (0)
ccc6cda3
JA
188
189#define SETVARATTR(var, attr, undo) \
bb70624e
JA
190 ((undo == 0) ? ((var)->attributes |= (attr)) \
191 : ((var)->attributes &= ~(attr)))
192
193#define VSETATTR(var, attr) ((var)->attributes |= (attr))
194#define VUNSETATTR(var, attr) ((var)->attributes &= ~(attr))
195
f73dda09
JA
196#define VGETFLAGS(var) ((var)->attributes)
197
198#define VSETFLAGS(var, flags) ((var)->attributes = (flags))
199#define VCLRFLAGS(var) ((var)->attributes = 0)
200
bb70624e
JA
201/* Macros to perform various operations on `exportstr' member of a SHELL_VAR. */
202#define CLEAR_EXPORTSTR(var) (var)->exportstr = (char *)NULL
203#define COPY_EXPORTSTR(var) ((var)->exportstr) ? savestring ((var)->exportstr) : (char *)NULL
204#define SET_EXPORTSTR(var, value) (var)->exportstr = (value)
205#define SAVE_EXPORTSTR(var, value) (var)->exportstr = (value) ? savestring (value) : (char *)NULL
206
207#define FREE_EXPORTSTR(var) \
7117c2d2 208 do { if ((var)->exportstr) free ((var)->exportstr); } while (0)
bb70624e 209
bb70624e 210#define CACHE_IMPORTSTR(var, value) \
7117c2d2 211 (var)->exportstr = savestring (value)
bb70624e
JA
212
213#define INVALIDATE_EXPORTSTR(var) \
214 do { \
215 if ((var)->exportstr) \
216 { \
7117c2d2 217 free ((var)->exportstr); \
bb70624e 218 (var)->exportstr = (char *)NULL; \
bb70624e
JA
219 } \
220 } while (0)
a0c0a00f
CR
221
222#define ifsname(s) ((s)[0] == 'I' && (s)[1] == 'F' && (s)[2] == 'S' && (s)[3] == '\0')
223
d233b485
CR
224/* Flag values for make_local_variable */
225#define MKLOC_INHERIT 0x01
226
a0c0a00f
CR
227/* Special value for nameref with invalid value for creation or assignment */
228extern SHELL_VAR nameref_invalid_value;
229#define INVALID_NAMEREF_VALUE (void *)&nameref_invalid_value
bb70624e 230
726f6388 231/* Stuff for hacking variables. */
f73dda09
JA
232typedef int sh_var_map_func_t __P((SHELL_VAR *));
233
7117c2d2
JA
234/* Where we keep the variables and functions */
235extern VAR_CONTEXT *global_variables;
236extern VAR_CONTEXT *shell_variables;
237
238extern HASH_TABLE *shell_functions;
239extern HASH_TABLE *temporary_env;
240
726f6388 241extern int variable_context;
726f6388
JA
242extern char *dollar_vars[];
243extern char **export_env;
726f6388 244
d233b485
CR
245extern int tempenv_assign_error;
246extern int array_needs_making;
247extern int shell_level;
248
249/* XXX */
250extern WORD_LIST *rest_of_args;
251extern pid_t dollar_dollar_pid;
252
ccc6cda3 253extern void initialize_shell_variables __P((char **, int));
d233b485
CR
254
255extern int validate_inherited_value __P((SHELL_VAR *, int));
256
ccc6cda3 257extern SHELL_VAR *set_if_not __P((char *, char *));
28ef6c31 258
7117c2d2 259extern void sh_set_lines_and_columns __P((int, int));
28ef6c31 260extern void set_pwd __P((void));
b72432fd 261extern void set_ppid __P((void));
bb70624e
JA
262extern void make_funcname_visible __P((int));
263
7117c2d2 264extern SHELL_VAR *var_lookup __P((const char *, VAR_CONTEXT *));
f73dda09
JA
265
266extern SHELL_VAR *find_function __P((const char *));
b80f6443 267extern FUNCTION_DEF *find_function_def __P((const char *));
f73dda09 268extern SHELL_VAR *find_variable __P((const char *));
ac50fbac 269extern SHELL_VAR *find_variable_noref __P((const char *));
a0c0a00f
CR
270extern SHELL_VAR *find_variable_last_nameref __P((const char *, int));
271extern SHELL_VAR *find_global_variable_last_nameref __P((const char *, int));
ac50fbac 272extern SHELL_VAR *find_variable_nameref __P((SHELL_VAR *));
a0c0a00f
CR
273extern SHELL_VAR *find_variable_nameref_for_create __P((const char *, int));
274extern SHELL_VAR *find_variable_nameref_for_assignment __P((const char *, int));
275/*extern SHELL_VAR *find_variable_internal __P((const char *, int));*/
ac50fbac
CR
276extern SHELL_VAR *find_variable_tempenv __P((const char *));
277extern SHELL_VAR *find_variable_notempenv __P((const char *));
495aee44 278extern SHELL_VAR *find_global_variable __P((const char *));
ac50fbac
CR
279extern SHELL_VAR *find_global_variable_noref __P((const char *));
280extern SHELL_VAR *find_shell_variable __P((const char *));
281extern SHELL_VAR *find_tempenv_variable __P((const char *));
a0c0a00f
CR
282extern SHELL_VAR *find_variable_no_invisible __P((const char *));
283extern SHELL_VAR *find_variable_for_assignment __P((const char *));
d233b485 284extern char *nameref_transform_name __P((char *, int));
726f6388 285extern SHELL_VAR *copy_variable __P((SHELL_VAR *));
d233b485 286extern SHELL_VAR *make_local_variable __P((const char *, int));
95732b49 287extern SHELL_VAR *bind_variable __P((const char *, char *, int));
ac50fbac 288extern SHELL_VAR *bind_global_variable __P((const char *, char *, int));
f73dda09 289extern SHELL_VAR *bind_function __P((const char *, COMMAND *));
bb70624e 290
d233b485 291extern void bind_function_def __P((const char *, FUNCTION_DEF *, int));
b80f6443 292
7117c2d2
JA
293extern SHELL_VAR **map_over __P((sh_var_map_func_t *, VAR_CONTEXT *));
294SHELL_VAR **map_over_funcs __P((sh_var_map_func_t *));
295
726f6388
JA
296extern SHELL_VAR **all_shell_variables __P((void));
297extern SHELL_VAR **all_shell_functions __P((void));
298extern SHELL_VAR **all_visible_variables __P((void));
299extern SHELL_VAR **all_visible_functions __P((void));
bb70624e 300extern SHELL_VAR **all_exported_variables __P((void));
7117c2d2
JA
301extern SHELL_VAR **local_exported_variables __P((void));
302extern SHELL_VAR **all_local_variables __P((void));
bb70624e
JA
303#if defined (ARRAY_VARS)
304extern SHELL_VAR **all_array_variables __P((void));
305#endif
f73dda09 306extern char **all_variables_matching_prefix __P((const char *));
726f6388
JA
307
308extern char **make_var_array __P((HASH_TABLE *));
d166f048 309extern char **add_or_supercede_exported_var __P((char *, int));
726f6388 310
7117c2d2 311extern char *get_variable_value __P((SHELL_VAR *));
28ef6c31 312extern char *get_string_value __P((const char *));
7117c2d2 313extern char *sh_get_env_value __P((const char *));
95732b49 314extern char *make_variable_value __P((SHELL_VAR *, char *, int));
726f6388 315
95732b49 316extern SHELL_VAR *bind_variable_value __P((SHELL_VAR *, char *, int));
d233b485 317extern SHELL_VAR *bind_int_variable __P((char *, char *, int));
7117c2d2 318extern SHELL_VAR *bind_var_to_int __P((char *, intmax_t));
bb70624e 319
495aee44 320extern int assign_in_env __P((WORD_DESC *, int));
95732b49 321
f73dda09 322extern int unbind_variable __P((const char *));
a0c0a00f 323extern int check_unbind_variable __P((const char *));
ac50fbac 324extern int unbind_nameref __P((const char *));
a0c0a00f 325extern int unbind_variable_noref __P((const char *));
7117c2d2 326extern int unbind_func __P((const char *));
b80f6443 327extern int unbind_function_def __P((const char *));
ac50fbac 328extern int delete_var __P((const char *, VAR_CONTEXT *));
7117c2d2 329extern int makunbound __P((const char *, VAR_CONTEXT *));
f73dda09 330extern int kill_local_variable __P((const char *));
726f6388 331extern void delete_all_variables __P((HASH_TABLE *));
7117c2d2
JA
332extern void delete_all_contexts __P((VAR_CONTEXT *));
333
334extern VAR_CONTEXT *new_var_context __P((char *, int));
335extern void dispose_var_context __P((VAR_CONTEXT *));
336extern VAR_CONTEXT *push_var_context __P((char *, int, HASH_TABLE *));
337extern void pop_var_context __P((void));
338extern VAR_CONTEXT *push_scope __P((int, HASH_TABLE *));
339extern void pop_scope __P((int));
340
341extern void push_context __P((char *, int, HASH_TABLE *));
342extern void pop_context __P((void));
343extern void push_dollar_vars __P((void));
344extern void pop_dollar_vars __P((void));
345extern void dispose_saved_dollar_vars __P((void));
726f6388 346
d233b485
CR
347extern void init_bash_argv __P((void));
348extern void save_bash_argv __P((void));
b80f6443
JA
349extern void push_args __P((WORD_LIST *));
350extern void pop_args __P((void));
351
726f6388
JA
352extern void adjust_shell_level __P((int));
353extern void non_unsettable __P((char *));
354extern void dispose_variable __P((SHELL_VAR *));
ccc6cda3 355extern void dispose_used_env_vars __P((void));
726f6388
JA
356extern void dispose_function_env __P((void));
357extern void dispose_builtin_env __P((void));
ccc6cda3 358extern void merge_temporary_env __P((void));
a0c0a00f 359extern void flush_temporary_env __P((void));
ccc6cda3 360extern void merge_builtin_env __P((void));
726f6388 361extern void kill_all_local_variables __P((void));
7117c2d2 362
726f6388 363extern void set_var_read_only __P((char *));
f73dda09 364extern void set_func_read_only __P((const char *));
726f6388 365extern void set_var_auto_export __P((char *));
f73dda09 366extern void set_func_auto_export __P((const char *));
7117c2d2 367
726f6388 368extern void sort_variables __P((SHELL_VAR **));
7117c2d2 369
2bbe8058 370extern int chkexport __P((char *));
726f6388 371extern void maybe_make_export_env __P((void));
b72432fd 372extern void update_export_env_inplace __P((char *, int, char *));
726f6388 373extern void put_command_name_into_env __P((char *));
7117c2d2
JA
374extern void put_gnu_argv_flags_into_env __P((intmax_t, char *));
375
726f6388 376extern void print_var_list __P((SHELL_VAR **));
28ef6c31 377extern void print_func_list __P((SHELL_VAR **));
726f6388 378extern void print_assignment __P((SHELL_VAR *));
ccc6cda3 379extern void print_var_value __P((SHELL_VAR *, int));
726f6388
JA
380extern void print_var_function __P((SHELL_VAR *));
381
ccc6cda3
JA
382#if defined (ARRAY_VARS)
383extern SHELL_VAR *make_new_array_variable __P((char *));
ac50fbac 384extern SHELL_VAR *make_local_array_variable __P((char *, int));
cce855bc 385
3185942a 386extern SHELL_VAR *make_new_assoc_variable __P((char *));
d233b485 387extern SHELL_VAR *make_local_assoc_variable __P((char *, int));
3185942a 388
7117c2d2 389extern void set_pipestatus_array __P((int *, int));
495aee44
CR
390extern ARRAY *save_pipestatus_array __P((void));
391extern void restore_pipestatus_array __P((ARRAY *));
ccc6cda3
JA
392#endif
393
cce855bc
JA
394extern void set_pipestatus_from_exit __P((int));
395
396/* The variable in NAME has just had its state changed. Check to see if it
397 is one of the special ones where something special happens. */
398extern void stupidly_hack_special_variables __P((char *));
399
3185942a
JA
400/* Reinitialize some special variables that have external effects upon unset
401 when the shell reinitializes itself. */
402extern void reinit_special_variables __P((void));
403
28ef6c31
JA
404extern int get_random_number __P((void));
405
cce855bc
JA
406/* The `special variable' functions that get called when a particular
407 variable is set. */
7117c2d2 408extern void sv_ifs __P((char *));
f73dda09
JA
409extern void sv_path __P((char *));
410extern void sv_mail __P((char *));
495aee44 411extern void sv_funcnest __P((char *));
a0c0a00f 412extern void sv_execignore __P((char *));
f73dda09
JA
413extern void sv_globignore __P((char *));
414extern void sv_ignoreeof __P((char *));
415extern void sv_strict_posix __P((char *));
416extern void sv_optind __P((char *));
417extern void sv_opterr __P((char *));
418extern void sv_locale __P((char *));
0001803f 419extern void sv_xtracefd __P((char *));
ac50fbac 420extern void sv_shcompat __P((char *));
cce855bc
JA
421
422#if defined (READLINE)
b80f6443 423extern void sv_comp_wordbreaks __P((char *));
f73dda09
JA
424extern void sv_terminal __P((char *));
425extern void sv_hostfile __P((char *));
95732b49 426extern void sv_winsize __P((char *));
cce855bc
JA
427#endif
428
95732b49
JA
429#if defined (__CYGWIN__)
430extern void sv_home __P((char *));
cce855bc
JA
431#endif
432
433#if defined (HISTORY)
f73dda09
JA
434extern void sv_histsize __P((char *));
435extern void sv_histignore __P((char *));
436extern void sv_history_control __P((char *));
cce855bc 437# if defined (BANG_HISTORY)
f73dda09 438extern void sv_histchars __P((char *));
cce855bc 439# endif
b80f6443 440extern void sv_histtimefmt __P((char *));
cce855bc
JA
441#endif /* HISTORY */
442
ac50fbac 443#if defined (HAVE_TZSET)
95732b49
JA
444extern void sv_tz __P((char *));
445#endif
446
ac50fbac
CR
447#if defined (JOB_CONTROL)
448extern void sv_childmax __P((char *));
449#endif
450
726f6388 451#endif /* !_VARIABLES_H_ */