#if !defined (_SUBST_H_)
#define _SUBST_H_
#include "stdc.h"
#define Q_DOUBLE_QUOTES 0x001
#define Q_HERE_DOCUMENT 0x002
#define Q_KEEP_BACKSLASH 0x004
#define Q_PATQUOTE 0x008
#define Q_QUOTED 0x010
#define Q_ADDEDQUOTES 0x020
#define Q_QUOTEDNULL 0x040
#define Q_DOLBRACE 0x080
#define Q_ARITH 0x100
#define Q_ARRAYSUB 0x200
#define ASS_APPEND 0x0001
#define ASS_MKLOCAL 0x0002
#define ASS_MKASSOC 0x0004
#define ASS_MKGLOBAL 0x0008
#define ASS_NAMEREF 0x0010
#define ASS_FORCE 0x0020
#define ASS_CHKLOCAL 0x0040
#define ASS_NOEXPAND 0x0080
#define ASS_NOEVAL 0x0100
#define ASS_NOLONGJMP 0x0200
#define ASS_NOINVIS 0x0400
#define ASS_ALLOWALLSUB 0x0800
#define ASS_ONEWORD 0x1000
#define ASS_NOTEMPENV 0x2000
#define ASS_XTRACE 0x4000
#define SX_NOALLOC 0x0001
#define SX_VARNAME 0x0002
#define SX_REQMATCH 0x0004
#define SX_COMMAND 0x0008
#define SX_NOCTLESC 0x0010
#define SX_NOESCCTLNUL 0x0020
#define SX_NOLONGJMP 0x0040
#define SX_FUNSUB 0x0080
#define SX_POSIXEXP 0x0100
#define SX_WORD 0x0200
#define SX_COMPLETE 0x0400
#define SX_STRIPDQ 0x0800
#define SX_NOERROR 0x1000
extern char * de_backslash (char *, int);
extern void unquote_bang (char *);
extern char *extract_command_subst (const char *, size_t *, int);
extern char *extract_function_subst (const char *, size_t *, int, int);
extern char *extract_arithmetic_subst (const char *, size_t *);
#if defined (PROCESS_SUBSTITUTION)
extern char *extract_process_subst (const char *, char *, size_t *, int);
#endif
extern char *extract_dollar_brace_string (const char *, size_t *, int, int);
extern char *assignment_name (const char *);
extern char *string_list_internal (WORD_LIST *, char *);
extern char *string_list (WORD_LIST *);
extern char *string_list_dollar_star (WORD_LIST *, int, int);
extern char *string_list_dollar_at (WORD_LIST *, int, int);
extern char *string_list_pos_params (int, WORD_LIST *, int, int);
extern void word_list_remove_quoted_nulls (WORD_LIST *);
extern WORD_LIST *list_string (char *, char *, int);
extern char *ifs_firstchar (int *);
extern char *get_word_from_string (char **, char *, char **);
extern char *strip_trailing_ifs_whitespace (char *, char *, int);
extern int do_assignment (char *);
extern int do_assignment_no_expand (char *);
extern int do_word_assignment (const WORD_DESC *, int);
extern char *sub_append_string (char *, char *, size_t *, size_t *);
extern char *sub_append_number (intmax_t, char *, int *, int *);
extern WORD_LIST *list_rest_of_args (void);
extern char *string_rest_of_args (int);
extern WORD_LIST *expand_string_unsplit (const char *, int);
extern WORD_LIST *expand_string_assignment (const char *, int);
extern WORD_LIST *expand_prompt_string (const char *, int, int);
extern WORD_LIST *expand_string (const char *, int);
extern char *expand_string_to_string (char *, int);
extern char *expand_string_unsplit_to_string (char *, int);
extern char *expand_assignment_string_to_string (char *, int);
extern char *expand_subscript_string (const char *, int);
extern char *expand_arith_string (char *, int);
extern char *expand_string_dollar_quote (const char *, int);
extern char *dequote_string (const char *);
extern char *dequote_escapes (const char *);
extern WORD_DESC *dequote_word (WORD_DESC *);
extern WORD_LIST *dequote_list (WORD_LIST *);
extern WORD_LIST *expand_word (WORD_DESC *, int);
extern WORD_LIST *expand_word_unsplit (WORD_DESC *, int);
extern WORD_LIST *expand_word_leave_quoted (WORD_DESC *, int);
extern char *get_dollar_var_value (intmax_t);
extern char *quote_string (const char *);
extern char *quote_escapes (const char *);
extern char *remove_quoted_escapes (char *);
extern char *quote_nosplit (const char *);
extern char *remove_quoted_nulls (char *);
extern char *string_quote_removal (const char *, int);
extern WORD_DESC *word_quote_removal (WORD_DESC *, int);
extern WORD_LIST *word_list_quote_removal (WORD_LIST *, int);
extern void setifs (SHELL_VAR *);
extern char *getifs (void);
extern WORD_LIST *word_split (WORD_DESC *, char *);
extern WORD_LIST *expand_words (WORD_LIST *);
extern WORD_LIST *expand_words_no_vars (WORD_LIST *);
extern WORD_LIST *expand_words_shellexp (WORD_LIST *);
extern WORD_DESC *command_substitute (char *, int, int);
extern WORD_DESC *function_substitute (char *, int, int);
extern char *pat_subst (char *, char *, char *, int);
#if defined (PROCESS_SUBSTITUTION)
extern int fifos_pending (void);
extern int num_fifos (void);
extern void unlink_fifo_list (void);
extern void unlink_all_fifos (void);
extern void unlink_fifo (int);
extern void *copy_fifo_list (int *);
extern void close_new_fifos (void *, int);
extern void clear_fifo_list (void);
extern int find_procsub_child (pid_t);
extern void set_procsub_status (int, pid_t, int);
extern void wait_procsubs (void);
extern void delete_procsubs (void);
#endif
extern WORD_LIST *list_string_with_quotes (char *);
#if defined (ARRAY_VARS)
extern char *extract_array_assignment_list (const char *, size_t *);
#endif
#if defined (COND_COMMAND)
extern char *remove_backslashes (const char *);
extern char *cond_expand_word (WORD_DESC *, int);
#endif
#define SD_NOJMP 0x001
#define SD_INVERT 0x002
#define SD_NOQUOTEDELIM 0x004
#define SD_NOSKIPCMD 0x008
#define SD_EXTGLOB 0x010
#define SD_IGNOREQUOTE 0x020
#define SD_GLOB 0x040
#define SD_NOPROCSUB 0x080
#define SD_COMPLETE 0x100
#define SD_HISTEXP 0x200
#define SD_ARITHEXP 0x400
#define SD_NOERROR 0x800
extern int skip_to_delim (const char *, int, const char *, int);
#if defined (BANG_HISTORY)
extern int skip_to_histexp (const char *, int, const char *, int);
#endif
#if defined (READLINE)
extern int char_is_quoted (char *, int);
extern int unclosed_pair (char *, int, char *);
extern WORD_LIST *split_at_delims (const char *, int, const char *, int, int, int *, int *);
#endif
extern SHELL_VAR *ifs_var;
extern char *ifs_value;
extern unsigned char ifs_cmap[];
extern int ifs_is_set, ifs_is_null;
#if defined (HANDLE_MULTIBYTE)
extern unsigned char ifs_firstc[];
extern size_t ifs_firstc_len;
#else
extern unsigned char ifs_firstc;
#endif
extern int assigning_in_environment;
extern int expanding_redir;
extern int inherit_errexit;
extern pid_t last_command_subst_pid;
extern int last_command_subst_status;
extern int executing_funsub;
#define isifs(c) (ifs_cmap[(unsigned char)(c)] != 0)
#define QUOTED_CHAR(c) ((c) == CTLESC)
#define QUOTED_NULL(string) ((string)[0] == CTLNUL && (string)[1] == '\0')
extern void invalidate_cached_quoted_dollar_at (void);
#endif