1/* variables.h -- data structures for shell variables. */ 2 3/* Copyright (C) 1987-2009 Free Software Foundation, Inc. 4 5 This file is part of GNU Bash, the Bourne Again SHell. 6 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. 11 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. 16 17 You should have received a copy of the GNU General Public License 18 along with Bash. If not, see <http://www.gnu.org/licenses/>. 19*/ 20 21#if !defined (_VARIABLES_H_) 22#define _VARIABLES_H_ 23 24#include "stdc.h" 25#include "array.h" 26#include "assoc.h" 27 28/* Shell variables and functions are stored in hash tables. */ 29#include "hashlib.h" 30 31#include "conftypes.h" 32 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 62/* What a shell variable looks like. */ 63 64typedef struct variable *sh_var_value_func_t __P((struct variable *)); 65typedef struct variable *sh_var_assign_func_t __P((struct variable *, char *, arrayind_t, char *)); 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 */ 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 */ 80}; 81 82typedef struct variable { 83 char *name; /* Symbol that the user types. */ 84 char *value; /* Value that is returned. */ 85 char *exportstr; /* String for the environment. */ 86 sh_var_value_func_t *dynamic_value; /* Function called to return a `dynamic' 87 value for a variable, like $SECONDS 88 or $RANDOM. */ 89 sh_var_assign_func_t *assign_func; /* Function called when this `special 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. */ 94} SHELL_VAR; 95 96typedef struct _vlist { 97 SHELL_VAR **list; 98 int list_size; /* allocated size */ 99 int list_len; /* current number of entries */ 100} VARLIST; 101 102/* The various attributes that a given variable can have. */ 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 */ 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) 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 */ 126#define att_nofree 0x0020000 /* do not free value on unset */ 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 135 136#define exported_p(var) ((((var)->attributes) & (att_exported))) 137#define readonly_p(var) ((((var)->attributes) & (att_readonly))) 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))) 141#define local_p(var) ((((var)->attributes) & (att_local))) 142#define assoc_p(var) ((((var)->attributes) & (att_assoc))) 143#define trace_p(var) ((((var)->attributes) & (att_trace))) 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))) 147 148#define invisible_p(var) ((((var)->attributes) & (att_invisible))) 149#define non_unsettable_p(var) ((((var)->attributes) & (att_nounset))) 150#define noassign_p(var) ((((var)->attributes) & (att_noassign))) 151#define imported_p(var) ((((var)->attributes) & (att_imported))) 152#define specialvar_p(var) ((((var)->attributes) & (att_special))) 153#define nofree_p(var) ((((var)->attributes) & (att_nofree))) 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) 161#define assoc_cell(var) (HASH_TABLE *)((var)->value) 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)) 170#define var_setassoc(var, arr) ((var)->value = (char *)(arr)) 171 172/* Make VAR be auto-exported. */ 173#define set_auto_export(var) \ 174 do { (var)->attributes |= att_exported; array_needs_making = 1; } while (0) 175 176#define SETVARATTR(var, attr, undo) \ 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 183#define VGETFLAGS(var) ((var)->attributes) 184 185#define VSETFLAGS(var, flags) ((var)->attributes = (flags)) 186#define VCLRFLAGS(var) ((var)->attributes = 0) 187 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) \ 195 do { if ((var)->exportstr) free ((var)->exportstr); } while (0) 196 197#define CACHE_IMPORTSTR(var, value) \ 198 (var)->exportstr = savestring (value) 199 200#define INVALIDATE_EXPORTSTR(var) \ 201 do { \ 202 if ((var)->exportstr) \ 203 { \ 204 free ((var)->exportstr); \ 205 (var)->exportstr = (char *)NULL; \ 206 } \ 207 } while (0) 208 209/* Stuff for hacking variables. */ 210typedef int sh_var_map_func_t __P((SHELL_VAR *)); 211 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 219extern int variable_context; 220extern char *dollar_vars[]; 221extern char **export_env; 222 223extern void initialize_shell_variables __P((char **, int)); 224extern SHELL_VAR *set_if_not __P((char *, char *)); 225 226extern void sh_set_lines_and_columns __P((int, int)); 227extern void set_pwd __P((void)); 228extern void set_ppid __P((void)); 229extern void make_funcname_visible __P((int)); 230 231extern SHELL_VAR *var_lookup __P((const char *, VAR_CONTEXT *)); 232 233extern SHELL_VAR *find_function __P((const char *)); 234extern FUNCTION_DEF *find_function_def __P((const char *)); 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 *)); 238extern SHELL_VAR *copy_variable __P((SHELL_VAR *)); 239extern SHELL_VAR *make_local_variable __P((const char *)); 240extern SHELL_VAR *bind_variable __P((const char *, char *, int)); 241extern SHELL_VAR *bind_function __P((const char *, COMMAND *)); 242 243extern void bind_function_def __P((const char *, FUNCTION_DEF *)); 244 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 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)); 252extern SHELL_VAR **all_exported_variables __P((void)); 253extern SHELL_VAR **local_exported_variables __P((void)); 254extern SHELL_VAR **all_local_variables __P((void)); 255#if defined (ARRAY_VARS) 256extern SHELL_VAR **all_array_variables __P((void)); 257#endif 258extern char **all_variables_matching_prefix __P((const char *)); 259 260extern char **make_var_array __P((HASH_TABLE *)); 261extern char **add_or_supercede_exported_var __P((char *, int)); 262 263extern char *get_variable_value __P((SHELL_VAR *)); 264extern char *get_string_value __P((const char *)); 265extern char *sh_get_env_value __P((const char *)); 266extern char *make_variable_value __P((SHELL_VAR *, char *, int)); 267 268extern SHELL_VAR *bind_variable_value __P((SHELL_VAR *, char *, int)); 269extern SHELL_VAR *bind_int_variable __P((char *, char *)); 270extern SHELL_VAR *bind_var_to_int __P((char *, intmax_t)); 271 272extern int assign_in_env __P((WORD_DESC *)); 273 274extern int unbind_variable __P((const char *)); 275extern int unbind_func __P((const char *)); 276extern int unbind_function_def __P((const char *)); 277extern int makunbound __P((const char *, VAR_CONTEXT *)); 278extern int kill_local_variable __P((const char *)); 279extern void delete_all_variables __P((HASH_TABLE *)); 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)); 294 295extern void push_args __P((WORD_LIST *)); 296extern void pop_args __P((void)); 297 298extern void adjust_shell_level __P((int)); 299extern void non_unsettable __P((char *)); 300extern void dispose_variable __P((SHELL_VAR *)); 301extern void dispose_used_env_vars __P((void)); 302extern void dispose_function_env __P((void)); 303extern void dispose_builtin_env __P((void)); 304extern void merge_temporary_env __P((void)); 305extern void merge_builtin_env __P((void)); 306extern void kill_all_local_variables __P((void)); 307 308extern void set_var_read_only __P((char *)); 309extern void set_func_read_only __P((const char *)); 310extern void set_var_auto_export __P((char *)); 311extern void set_func_auto_export __P((const char *)); 312 313extern void sort_variables __P((SHELL_VAR **)); 314 315extern void maybe_make_export_env __P((void)); 316extern void update_export_env_inplace __P((char *, int, char *)); 317extern void put_command_name_into_env __P((char *)); 318extern void put_gnu_argv_flags_into_env __P((intmax_t, char *)); 319 320extern void print_var_list __P((SHELL_VAR **)); 321extern void print_func_list __P((SHELL_VAR **)); 322extern void print_assignment __P((SHELL_VAR *)); 323extern void print_var_value __P((SHELL_VAR *, int)); 324extern void print_var_function __P((SHELL_VAR *)); 325 326#if defined (ARRAY_VARS) 327extern SHELL_VAR *make_new_array_variable __P((char *)); 328extern SHELL_VAR *make_local_array_variable __P((char *)); 329 330extern SHELL_VAR *make_new_assoc_variable __P((char *)); 331extern SHELL_VAR *make_local_assoc_variable __P((char *)); 332 333extern void set_pipestatus_array __P((int *, int)); 334#endif 335 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 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 346extern int get_random_number __P((void)); 347 348/* The `special variable' functions that get called when a particular 349 variable is set. */ 350extern void sv_ifs __P((char *)); 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 *)); 359 360#if defined (READLINE) 361extern void sv_comp_wordbreaks __P((char *)); 362extern void sv_terminal __P((char *)); 363extern void sv_hostfile __P((char *)); 364extern void sv_winsize __P((char *)); 365#endif 366 367#if defined (__CYGWIN__) 368extern void sv_home __P((char *)); 369#endif 370 371#if defined (HISTORY) 372extern void sv_histsize __P((char *)); 373extern void sv_histignore __P((char *)); 374extern void sv_history_control __P((char *)); 375# if defined (BANG_HISTORY) 376extern void sv_histchars __P((char *)); 377# endif 378extern void sv_histtimefmt __P((char *)); 379#endif /* HISTORY */ 380 381#if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE) 382extern void sv_tz __P((char *)); 383#endif 384 385#endif /* !_VARIABLES_H_ */ 386