]> git.ipfire.org Git - thirdparty/bash.git/blame - variables.h
Imported from ../bash-4.0.tar.gz.
[thirdparty/bash.git] / variables.h
CommitLineData
726f6388
JA
1/* variables.h -- data structures for shell variables. */
2
3185942a 3/* Copyright (C) 1987-2009 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 *));
726f6388 238extern SHELL_VAR *copy_variable __P((SHELL_VAR *));
f73dda09 239extern SHELL_VAR *make_local_variable __P((const char *));
95732b49 240extern SHELL_VAR *bind_variable __P((const char *, char *, int));
f73dda09 241extern SHELL_VAR *bind_function __P((const char *, COMMAND *));
bb70624e 242
b80f6443
JA
243extern void bind_function_def __P((const char *, FUNCTION_DEF *));
244
7117c2d2
JA
245extern SHELL_VAR **map_over __P((sh_var_map_func_t *, VAR_CONTEXT *));
246SHELL_VAR **map_over_funcs __P((sh_var_map_func_t *));
247
726f6388
JA
248extern SHELL_VAR **all_shell_variables __P((void));
249extern SHELL_VAR **all_shell_functions __P((void));
250extern SHELL_VAR **all_visible_variables __P((void));
251extern SHELL_VAR **all_visible_functions __P((void));
bb70624e 252extern SHELL_VAR **all_exported_variables __P((void));
7117c2d2
JA
253extern SHELL_VAR **local_exported_variables __P((void));
254extern SHELL_VAR **all_local_variables __P((void));
bb70624e
JA
255#if defined (ARRAY_VARS)
256extern SHELL_VAR **all_array_variables __P((void));
257#endif
f73dda09 258extern char **all_variables_matching_prefix __P((const char *));
726f6388
JA
259
260extern char **make_var_array __P((HASH_TABLE *));
d166f048 261extern char **add_or_supercede_exported_var __P((char *, int));
726f6388 262
7117c2d2 263extern char *get_variable_value __P((SHELL_VAR *));
28ef6c31 264extern char *get_string_value __P((const char *));
7117c2d2 265extern char *sh_get_env_value __P((const char *));
95732b49 266extern char *make_variable_value __P((SHELL_VAR *, char *, int));
726f6388 267
95732b49 268extern SHELL_VAR *bind_variable_value __P((SHELL_VAR *, char *, int));
bb70624e 269extern SHELL_VAR *bind_int_variable __P((char *, char *));
7117c2d2 270extern SHELL_VAR *bind_var_to_int __P((char *, intmax_t));
bb70624e 271
95732b49
JA
272extern int assign_in_env __P((WORD_DESC *));
273
f73dda09 274extern int unbind_variable __P((const char *));
7117c2d2 275extern int unbind_func __P((const char *));
b80f6443 276extern int unbind_function_def __P((const char *));
7117c2d2 277extern int makunbound __P((const char *, VAR_CONTEXT *));
f73dda09 278extern int kill_local_variable __P((const char *));
726f6388 279extern void delete_all_variables __P((HASH_TABLE *));
7117c2d2
JA
280extern void delete_all_contexts __P((VAR_CONTEXT *));
281
282extern VAR_CONTEXT *new_var_context __P((char *, int));
283extern void dispose_var_context __P((VAR_CONTEXT *));
284extern VAR_CONTEXT *push_var_context __P((char *, int, HASH_TABLE *));
285extern void pop_var_context __P((void));
286extern VAR_CONTEXT *push_scope __P((int, HASH_TABLE *));
287extern void pop_scope __P((int));
288
289extern void push_context __P((char *, int, HASH_TABLE *));
290extern void pop_context __P((void));
291extern void push_dollar_vars __P((void));
292extern void pop_dollar_vars __P((void));
293extern void dispose_saved_dollar_vars __P((void));
726f6388 294
b80f6443
JA
295extern void push_args __P((WORD_LIST *));
296extern void pop_args __P((void));
297
726f6388
JA
298extern void adjust_shell_level __P((int));
299extern void non_unsettable __P((char *));
300extern void dispose_variable __P((SHELL_VAR *));
ccc6cda3 301extern void dispose_used_env_vars __P((void));
726f6388
JA
302extern void dispose_function_env __P((void));
303extern void dispose_builtin_env __P((void));
ccc6cda3
JA
304extern void merge_temporary_env __P((void));
305extern void merge_builtin_env __P((void));
726f6388 306extern void kill_all_local_variables __P((void));
7117c2d2 307
726f6388 308extern void set_var_read_only __P((char *));
f73dda09 309extern void set_func_read_only __P((const char *));
726f6388 310extern void set_var_auto_export __P((char *));
f73dda09 311extern void set_func_auto_export __P((const char *));
7117c2d2 312
726f6388 313extern void sort_variables __P((SHELL_VAR **));
7117c2d2 314
726f6388 315extern void maybe_make_export_env __P((void));
b72432fd 316extern void update_export_env_inplace __P((char *, int, char *));
726f6388 317extern void put_command_name_into_env __P((char *));
7117c2d2
JA
318extern void put_gnu_argv_flags_into_env __P((intmax_t, char *));
319
726f6388 320extern void print_var_list __P((SHELL_VAR **));
28ef6c31 321extern void print_func_list __P((SHELL_VAR **));
726f6388 322extern void print_assignment __P((SHELL_VAR *));
ccc6cda3 323extern void print_var_value __P((SHELL_VAR *, int));
726f6388
JA
324extern void print_var_function __P((SHELL_VAR *));
325
ccc6cda3
JA
326#if defined (ARRAY_VARS)
327extern SHELL_VAR *make_new_array_variable __P((char *));
328extern SHELL_VAR *make_local_array_variable __P((char *));
cce855bc 329
3185942a
JA
330extern SHELL_VAR *make_new_assoc_variable __P((char *));
331extern SHELL_VAR *make_local_assoc_variable __P((char *));
332
7117c2d2 333extern void set_pipestatus_array __P((int *, int));
ccc6cda3
JA
334#endif
335
cce855bc
JA
336extern void set_pipestatus_from_exit __P((int));
337
338/* The variable in NAME has just had its state changed. Check to see if it
339 is one of the special ones where something special happens. */
340extern void stupidly_hack_special_variables __P((char *));
341
3185942a
JA
342/* Reinitialize some special variables that have external effects upon unset
343 when the shell reinitializes itself. */
344extern void reinit_special_variables __P((void));
345
28ef6c31
JA
346extern int get_random_number __P((void));
347
cce855bc
JA
348/* The `special variable' functions that get called when a particular
349 variable is set. */
7117c2d2 350extern void sv_ifs __P((char *));
f73dda09
JA
351extern void sv_path __P((char *));
352extern void sv_mail __P((char *));
353extern void sv_globignore __P((char *));
354extern void sv_ignoreeof __P((char *));
355extern void sv_strict_posix __P((char *));
356extern void sv_optind __P((char *));
357extern void sv_opterr __P((char *));
358extern void sv_locale __P((char *));
cce855bc
JA
359
360#if defined (READLINE)
b80f6443 361extern void sv_comp_wordbreaks __P((char *));
f73dda09
JA
362extern void sv_terminal __P((char *));
363extern void sv_hostfile __P((char *));
95732b49 364extern void sv_winsize __P((char *));
cce855bc
JA
365#endif
366
95732b49
JA
367#if defined (__CYGWIN__)
368extern void sv_home __P((char *));
cce855bc
JA
369#endif
370
371#if defined (HISTORY)
f73dda09
JA
372extern void sv_histsize __P((char *));
373extern void sv_histignore __P((char *));
374extern void sv_history_control __P((char *));
cce855bc 375# if defined (BANG_HISTORY)
f73dda09 376extern void sv_histchars __P((char *));
cce855bc 377# endif
b80f6443 378extern void sv_histtimefmt __P((char *));
cce855bc
JA
379#endif /* HISTORY */
380
95732b49
JA
381#if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE)
382extern void sv_tz __P((char *));
383#endif
384
726f6388 385#endif /* !_VARIABLES_H_ */