#ifndef VUNSET
#define VUNSET 0x0001
#define VEXPORT 0x0002
#define VREADONLY 0x0004
#define VNOEXPORT 0x0008
#define VSTRFIXED 0x0010
#define VTEXTFIXED 0x0020
#define VSTACK 0x0040
#define VUNSAFE 0x0080
#define VNOFUNC 0x0100
#define VFUNCREF 0x0200
#define VFUNCPOST 0x0400
#define VSPECIAL 0x1000
#define VDOEXPORT 0x2000
#define VNOSET 0x4000
#define VNOERROR 0x8000
struct var;
union var_func_union {
void (*set_func)(const char *, int, struct var *);
char*(*ref_func)(struct var *);
};
struct var {
struct var *next;
int flags;
char *text;
int name_len;
union var_func_union v_u;
};
struct localvar {
struct localvar *next;
struct var *vp;
int flags;
char *text;
union var_func_union v_u;
};
extern struct localvar *localvars;
extern struct var vifs;
extern char ifs_default[];
extern struct var vmail;
extern struct var vmpath;
extern struct var vpath;
extern struct var vps1;
extern struct var vps2;
extern struct var vps4;
extern struct var line_num;
#ifndef SMALL
extern struct var editrc;
extern struct var vterm;
extern struct var vtermcap;
extern struct var vhistappend;
extern struct var vhistfile;
extern struct var vhistsize;
extern struct var ps_lit;
extern struct var euname;
extern struct var random_num;
extern intmax_t sh_start_time;
extern struct var lc_all;
extern struct var lc_collate;
extern struct var lc_ctype;
extern struct var lc_messages;
extern struct var lc_monetary;
extern struct var lc_numeric;
extern struct var lc_time;
extern struct var lc_lang;
#endif
extern int line_number;
extern int funclinebase;
extern int funclineabs;
#define ifsset() ((vifs.flags & VUNSET) == 0)
#define ifsval() (ifsset() ? (vifs.text + 4) : ifs_default)
#define mailval() (vmail.text + 5)
#define mpathval() (vmpath.text + 9)
#define pathval() (vpath.text + 5)
#define ps1val() (vps1.text + 4)
#define ps2val() (vps2.text + 4)
#define ps4val() (vps4.text + 4)
#define optindval() (voptind.text + 7)
#ifndef SMALL
#define histsizeval() (vhistsize.text + 9)
#define histsizeflags() (vhistsize.flags)
#define histfileval() (vhistfile.text + 9)
#define histfileflags() (vhistfile.flags)
#define histappval() (vhistappend.text + 11)
#define histappflags() (vhistappend.flags)
#define termval() (vterm.text + 5)
#endif
#define mpathset() ((vmpath.flags & VUNSET) == 0)
void initvar(void);
void setvar(const char *, const char *, int);
void setvareq(char *, int);
struct strlist;
void listsetvar(struct strlist *, int);
char *lookupvar(const char *);
char *bltinlookup(const char *, int);
char **environment(void);
void shprocvar(void);
int showvars(const char *, int, int, const char *);
void mklocal(const char *, int);
void listmklocal(struct strlist *, int);
void poplocalvars(void);
int unsetvar(const char *, int);
void choose_ps1(void);
void setvar_invocation(int, char **);
int setvarsafe(const char *, const char *, int);
void setvareqsafe(char *, int);
void print_quoted(const char *);
int validname(const char *, int, int *);
#endif