]> git.ipfire.org Git - thirdparty/bash.git/blame - variables.h
Bash-4.2 patch 16
[thirdparty/bash.git] / variables.h
CommitLineData
726f6388
JA
1/* variables.h -- data structures for shell variables. */
2
495aee44 3/* Copyright (C) 1987-2010 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 */
115
116#define user_attrs (att_exported|att_readonly|att_integer|att_local|att_trace|att_uppercase|att_lowercase|att_capcase)
7117c2d2
JA
117
118#define attmask_user 0x0000fff
119
120/* Internal attributes used for bookkeeping */
121#define att_invisible 0x0001000 /* cannot see */
122#define att_nounset 0x0002000 /* cannot unset */
123#define att_noassign 0x0004000 /* assignment not allowed */
124#define att_imported 0x0008000 /* came from environment */
125#define att_special 0x0010000 /* requires special handling */
3185942a 126#define att_nofree 0x0020000 /* do not free value on unset */
7117c2d2
JA
127
128#define attmask_int 0x00ff000
129
130/* Internal attributes used for variable scoping. */
131#define att_tempvar 0x0100000 /* variable came from the temp environment */
132#define att_propagate 0x0200000 /* propagate to previous scope */
133
134#define attmask_scope 0x0f00000
726f6388
JA
135
136#define exported_p(var) ((((var)->attributes) & (att_exported)))
137#define readonly_p(var) ((((var)->attributes) & (att_readonly)))
726f6388
JA
138#define array_p(var) ((((var)->attributes) & (att_array)))
139#define function_p(var) ((((var)->attributes) & (att_function)))
140#define integer_p(var) ((((var)->attributes) & (att_integer)))
ccc6cda3 141#define local_p(var) ((((var)->attributes) & (att_local)))
7117c2d2
JA
142#define assoc_p(var) ((((var)->attributes) & (att_assoc)))
143#define trace_p(var) ((((var)->attributes) & (att_trace)))
3185942a
JA
144#define uppercase_p(var) ((((var)->attributes) & (att_uppercase)))
145#define lowercase_p(var) ((((var)->attributes) & (att_lowercase)))
146#define capcase_p(var) ((((var)->attributes) & (att_capcase)))
7117c2d2
JA
147
148#define invisible_p(var) ((((var)->attributes) & (att_invisible)))
149#define non_unsettable_p(var) ((((var)->attributes) & (att_nounset)))
28ef6c31 150#define noassign_p(var) ((((var)->attributes) & (att_noassign)))
7117c2d2
JA
151#define imported_p(var) ((((var)->attributes) & (att_imported)))
152#define specialvar_p(var) ((((var)->attributes) & (att_special)))
3185942a 153#define nofree_p(var) ((((var)->attributes) & (att_nofree)))
7117c2d2
JA
154
155#define tempvar_p(var) ((((var)->attributes) & (att_tempvar)))
156
157/* Acessing variable values: rvalues */
158#define value_cell(var) ((var)->value)
159#define function_cell(var) (COMMAND *)((var)->value)
160#define array_cell(var) (ARRAY *)((var)->value)
3185942a 161#define assoc_cell(var) (HASH_TABLE *)((var)->value)
7117c2d2
JA
162
163#define var_isnull(var) ((var)->value == 0)
164#define var_isset(var) ((var)->value != 0)
165
166/* Assigning variable values: lvalues */
167#define var_setvalue(var, str) ((var)->value = (str))
168#define var_setfunc(var, func) ((var)->value = (char *)(func))
169#define var_setarray(var, arr) ((var)->value = (char *)(arr))
3185942a 170#define var_setassoc(var, arr) ((var)->value = (char *)(arr))
726f6388 171
7117c2d2
JA
172/* Make VAR be auto-exported. */
173#define set_auto_export(var) \
174 do { (var)->attributes |= att_exported; array_needs_making = 1; } while (0)
ccc6cda3
JA
175
176#define SETVARATTR(var, attr, undo) \
bb70624e
JA
177 ((undo == 0) ? ((var)->attributes |= (attr)) \
178 : ((var)->attributes &= ~(attr)))
179
180#define VSETATTR(var, attr) ((var)->attributes |= (attr))
181#define VUNSETATTR(var, attr) ((var)->attributes &= ~(attr))
182
f73dda09
JA
183#define VGETFLAGS(var) ((var)->attributes)
184
185#define VSETFLAGS(var, flags) ((var)->attributes = (flags))
186#define VCLRFLAGS(var) ((var)->attributes = 0)
187
bb70624e
JA
188/* Macros to perform various operations on `exportstr' member of a SHELL_VAR. */
189#define CLEAR_EXPORTSTR(var) (var)->exportstr = (char *)NULL
190#define COPY_EXPORTSTR(var) ((var)->exportstr) ? savestring ((var)->exportstr) : (char *)NULL
191#define SET_EXPORTSTR(var, value) (var)->exportstr = (value)
192#define SAVE_EXPORTSTR(var, value) (var)->exportstr = (value) ? savestring (value) : (char *)NULL
193
194#define FREE_EXPORTSTR(var) \
7117c2d2 195 do { if ((var)->exportstr) free ((var)->exportstr); } while (0)
bb70624e 196
bb70624e 197#define CACHE_IMPORTSTR(var, value) \
7117c2d2 198 (var)->exportstr = savestring (value)
bb70624e
JA
199
200#define INVALIDATE_EXPORTSTR(var) \
201 do { \
202 if ((var)->exportstr) \
203 { \
7117c2d2 204 free ((var)->exportstr); \
bb70624e 205 (var)->exportstr = (char *)NULL; \
bb70624e
JA
206 } \
207 } while (0)
208
726f6388 209/* Stuff for hacking variables. */
f73dda09
JA
210typedef int sh_var_map_func_t __P((SHELL_VAR *));
211
7117c2d2
JA
212/* Where we keep the variables and functions */
213extern VAR_CONTEXT *global_variables;
214extern VAR_CONTEXT *shell_variables;
215
216extern HASH_TABLE *shell_functions;
217extern HASH_TABLE *temporary_env;
218
726f6388 219extern int variable_context;
726f6388
JA
220extern char *dollar_vars[];
221extern char **export_env;
726f6388 222
ccc6cda3
JA
223extern void initialize_shell_variables __P((char **, int));
224extern SHELL_VAR *set_if_not __P((char *, char *));
28ef6c31 225
7117c2d2 226extern void sh_set_lines_and_columns __P((int, int));
28ef6c31 227extern void set_pwd __P((void));
b72432fd 228extern void set_ppid __P((void));
bb70624e
JA
229extern void make_funcname_visible __P((int));
230
7117c2d2 231extern SHELL_VAR *var_lookup __P((const char *, VAR_CONTEXT *));
f73dda09
JA
232
233extern SHELL_VAR *find_function __P((const char *));
b80f6443 234extern FUNCTION_DEF *find_function_def __P((const char *));
f73dda09
JA
235extern SHELL_VAR *find_variable __P((const char *));
236extern SHELL_VAR *find_variable_internal __P((const char *, int));
237extern SHELL_VAR *find_tempenv_variable __P((const char *));
495aee44 238extern SHELL_VAR *find_global_variable __P((const char *));
726f6388 239extern SHELL_VAR *copy_variable __P((SHELL_VAR *));
f73dda09 240extern SHELL_VAR *make_local_variable __P((const char *));
95732b49 241extern SHELL_VAR *bind_variable __P((const char *, char *, int));
f73dda09 242extern SHELL_VAR *bind_function __P((const char *, COMMAND *));
bb70624e 243
b80f6443
JA
244extern void bind_function_def __P((const char *, FUNCTION_DEF *));
245
7117c2d2
JA
246extern SHELL_VAR **map_over __P((sh_var_map_func_t *, VAR_CONTEXT *));
247SHELL_VAR **map_over_funcs __P((sh_var_map_func_t *));
248
726f6388
JA
249extern SHELL_VAR **all_shell_variables __P((void));
250extern SHELL_VAR **all_shell_functions __P((void));
251extern SHELL_VAR **all_visible_variables __P((void));
252extern SHELL_VAR **all_visible_functions __P((void));
bb70624e 253extern SHELL_VAR **all_exported_variables __P((void));
7117c2d2
JA
254extern SHELL_VAR **local_exported_variables __P((void));
255extern SHELL_VAR **all_local_variables __P((void));
bb70624e
JA
256#if defined (ARRAY_VARS)
257extern SHELL_VAR **all_array_variables __P((void));
258#endif
f73dda09 259extern char **all_variables_matching_prefix __P((const char *));
726f6388
JA
260
261extern char **make_var_array __P((HASH_TABLE *));
d166f048 262extern char **add_or_supercede_exported_var __P((char *, int));
726f6388 263
7117c2d2 264extern char *get_variable_value __P((SHELL_VAR *));
28ef6c31 265extern char *get_string_value __P((const char *));
7117c2d2 266extern char *sh_get_env_value __P((const char *));
95732b49 267extern char *make_variable_value __P((SHELL_VAR *, char *, int));
726f6388 268
95732b49 269extern SHELL_VAR *bind_variable_value __P((SHELL_VAR *, char *, int));
bb70624e 270extern SHELL_VAR *bind_int_variable __P((char *, char *));
7117c2d2 271extern SHELL_VAR *bind_var_to_int __P((char *, intmax_t));
bb70624e 272
495aee44 273extern int assign_in_env __P((WORD_DESC *, int));
95732b49 274
f73dda09 275extern int unbind_variable __P((const char *));
7117c2d2 276extern int unbind_func __P((const char *));
b80f6443 277extern int unbind_function_def __P((const char *));
7117c2d2 278extern int makunbound __P((const char *, VAR_CONTEXT *));
f73dda09 279extern int kill_local_variable __P((const char *));
726f6388 280extern void delete_all_variables __P((HASH_TABLE *));
7117c2d2
JA
281extern void delete_all_contexts __P((VAR_CONTEXT *));
282
283extern VAR_CONTEXT *new_var_context __P((char *, int));
284extern void dispose_var_context __P((VAR_CONTEXT *));
285extern VAR_CONTEXT *push_var_context __P((char *, int, HASH_TABLE *));
286extern void pop_var_context __P((void));
287extern VAR_CONTEXT *push_scope __P((int, HASH_TABLE *));
288extern void pop_scope __P((int));
289
290extern void push_context __P((char *, int, HASH_TABLE *));
291extern void pop_context __P((void));
292extern void push_dollar_vars __P((void));
293extern void pop_dollar_vars __P((void));
294extern void dispose_saved_dollar_vars __P((void));
726f6388 295
b80f6443
JA
296extern void push_args __P((WORD_LIST *));
297extern void pop_args __P((void));
298
726f6388
JA
299extern void adjust_shell_level __P((int));
300extern void non_unsettable __P((char *));
301extern void dispose_variable __P((SHELL_VAR *));
ccc6cda3 302extern void dispose_used_env_vars __P((void));
726f6388
JA
303extern void dispose_function_env __P((void));
304extern void dispose_builtin_env __P((void));
ccc6cda3
JA
305extern void merge_temporary_env __P((void));
306extern void merge_builtin_env __P((void));
726f6388 307extern void kill_all_local_variables __P((void));
7117c2d2 308
726f6388 309extern void set_var_read_only __P((char *));
f73dda09 310extern void set_func_read_only __P((const char *));
726f6388 311extern void set_var_auto_export __P((char *));
f73dda09 312extern void set_func_auto_export __P((const char *));
7117c2d2 313
726f6388 314extern void sort_variables __P((SHELL_VAR **));
7117c2d2 315
2bbe8058 316extern int chkexport __P((char *));
726f6388 317extern void maybe_make_export_env __P((void));
b72432fd 318extern void update_export_env_inplace __P((char *, int, char *));
726f6388 319extern void put_command_name_into_env __P((char *));
7117c2d2
JA
320extern void put_gnu_argv_flags_into_env __P((intmax_t, char *));
321
726f6388 322extern void print_var_list __P((SHELL_VAR **));
28ef6c31 323extern void print_func_list __P((SHELL_VAR **));
726f6388 324extern void print_assignment __P((SHELL_VAR *));
ccc6cda3 325extern void print_var_value __P((SHELL_VAR *, int));
726f6388
JA
326extern void print_var_function __P((SHELL_VAR *));
327
ccc6cda3
JA
328#if defined (ARRAY_VARS)
329extern SHELL_VAR *make_new_array_variable __P((char *));
330extern SHELL_VAR *make_local_array_variable __P((char *));
cce855bc 331
3185942a
JA
332extern SHELL_VAR *make_new_assoc_variable __P((char *));
333extern SHELL_VAR *make_local_assoc_variable __P((char *));
334
7117c2d2 335extern void set_pipestatus_array __P((int *, int));
495aee44
CR
336extern ARRAY *save_pipestatus_array __P((void));
337extern void restore_pipestatus_array __P((ARRAY *));
ccc6cda3
JA
338#endif
339
cce855bc
JA
340extern void set_pipestatus_from_exit __P((int));
341
342/* The variable in NAME has just had its state changed. Check to see if it
343 is one of the special ones where something special happens. */
344extern void stupidly_hack_special_variables __P((char *));
345
3185942a
JA
346/* Reinitialize some special variables that have external effects upon unset
347 when the shell reinitializes itself. */
348extern void reinit_special_variables __P((void));
349
28ef6c31
JA
350extern int get_random_number __P((void));
351
cce855bc
JA
352/* The `special variable' functions that get called when a particular
353 variable is set. */
7117c2d2 354extern void sv_ifs __P((char *));
f73dda09
JA
355extern void sv_path __P((char *));
356extern void sv_mail __P((char *));
495aee44 357extern void sv_funcnest __P((char *));
f73dda09
JA
358extern void sv_globignore __P((char *));
359extern void sv_ignoreeof __P((char *));
360extern void sv_strict_posix __P((char *));
361extern void sv_optind __P((char *));
362extern void sv_opterr __P((char *));
363extern void sv_locale __P((char *));
0001803f 364extern void sv_xtracefd __P((char *));
cce855bc
JA
365
366#if defined (READLINE)
b80f6443 367extern void sv_comp_wordbreaks __P((char *));
f73dda09
JA
368extern void sv_terminal __P((char *));
369extern void sv_hostfile __P((char *));
95732b49 370extern void sv_winsize __P((char *));
cce855bc
JA
371#endif
372
95732b49
JA
373#if defined (__CYGWIN__)
374extern void sv_home __P((char *));
cce855bc
JA
375#endif
376
377#if defined (HISTORY)
f73dda09
JA
378extern void sv_histsize __P((char *));
379extern void sv_histignore __P((char *));
380extern void sv_history_control __P((char *));
cce855bc 381# if defined (BANG_HISTORY)
f73dda09 382extern void sv_histchars __P((char *));
cce855bc 383# endif
b80f6443 384extern void sv_histtimefmt __P((char *));
cce855bc
JA
385#endif /* HISTORY */
386
95732b49
JA
387#if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE)
388extern void sv_tz __P((char *));
389#endif
390
726f6388 391#endif /* !_VARIABLES_H_ */