diff --git a/shell/ash.c b/shell/ash.c index dac73182e..b1fc304fe 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -2621,50 +2621,54 @@ pwdcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) #endif #if ENABLE_SH_MATH_SUPPORT -static const uint8_t S_I_T[][4] = { -# if ENABLE_ASH_ALIAS - { CSPCL, CIGN, CIGN, CIGN }, /* 0, PEOA */ -# endif - { CSPCL, CWORD, CWORD, CWORD }, /* 1, ' ' */ - { CNL, CNL, CNL, CNL }, /* 2, \n */ - { CWORD, CCTL, CCTL, CWORD }, /* 3, !*-/:=?[]~ */ - { CDQUOTE, CENDQUOTE, CWORD, CWORD }, /* 4, '"' */ - { CVAR, CVAR, CWORD, CVAR }, /* 5, $ */ - { CSQUOTE, CWORD, CENDQUOTE, CWORD }, /* 6, "'" */ - { CSPCL, CWORD, CWORD, CLP }, /* 7, ( */ - { CSPCL, CWORD, CWORD, CRP }, /* 8, ) */ - { CBACK, CBACK, CCTL, CBACK }, /* 9, \ */ - { CBQUOTE, CBQUOTE, CWORD, CBQUOTE }, /* 10, ` */ - { CENDVAR, CENDVAR, CWORD, CENDVAR }, /* 11, } */ -# ifndef USE_SIT_FUNCTION - { CENDFILE, CENDFILE, CENDFILE, CENDFILE }, /* 12, PEOF */ - { CWORD, CWORD, CWORD, CWORD }, /* 13, 0-9A-Za-z */ - { CCTL, CCTL, CCTL, CCTL } /* 14, CTLESC ... */ -# endif -}; +# define SIT_ITEM(a,b,c,d) (a | (b << 4) | (c << 8) | (d << 12)) +static const uint16_t S_I_T[] = #else -static const uint8_t S_I_T[][3] = { -# if ENABLE_ASH_ALIAS - { CSPCL, CIGN, CIGN }, /* 0, PEOA */ -# endif - { CSPCL, CWORD, CWORD }, /* 1, ' ' */ - { CNL, CNL, CNL }, /* 2, \n */ - { CWORD, CCTL, CCTL }, /* 3, !*-/:=?[]~ */ - { CDQUOTE, CENDQUOTE, CWORD }, /* 4, '"' */ - { CVAR, CVAR, CWORD }, /* 5, $ */ - { CSQUOTE, CWORD, CENDQUOTE }, /* 6, "'" */ - { CSPCL, CWORD, CWORD }, /* 7, ( */ - { CSPCL, CWORD, CWORD }, /* 8, ) */ - { CBACK, CBACK, CCTL }, /* 9, \ */ - { CBQUOTE, CBQUOTE, CWORD }, /* 10, ` */ - { CENDVAR, CENDVAR, CWORD }, /* 11, } */ -# ifndef USE_SIT_FUNCTION - { CENDFILE, CENDFILE, CENDFILE }, /* 12, PEOF */ - { CWORD, CWORD, CWORD }, /* 13, 0-9A-Za-z */ - { CCTL, CCTL, CCTL } /* 14, CTLESC ... */ -# endif +# define SIT_ITEM(a,b,c,d) (a | (b << 4) | (c << 8)) +static const uint16_t S_I_T[] = +#endif +{ +#if ENABLE_ASH_ALIAS + SIT_ITEM(CSPCL , CIGN , CIGN , CIGN ), /* 0, PEOA */ +#endif + SIT_ITEM(CSPCL , CWORD , CWORD, CWORD ), /* 1, ' ' */ + SIT_ITEM(CNL , CNL , CNL , CNL ), /* 2, \n */ + SIT_ITEM(CWORD , CCTL , CCTL , CWORD ), /* 3, !*-/:=?[]~ */ + SIT_ITEM(CDQUOTE , CENDQUOTE, CWORD, CWORD ), /* 4, '"' */ + SIT_ITEM(CVAR , CVAR , CWORD, CVAR ), /* 5, $ */ + SIT_ITEM(CSQUOTE , CWORD , CENDQUOTE, CWORD), /* 6, "'" */ + SIT_ITEM(CSPCL , CWORD , CWORD, CLP ), /* 7, ( */ + SIT_ITEM(CSPCL , CWORD , CWORD, CRP ), /* 8, ) */ + SIT_ITEM(CBACK , CBACK , CCTL , CBACK ), /* 9, \ */ + SIT_ITEM(CBQUOTE , CBQUOTE , CWORD, CBQUOTE), /* 10, ` */ + SIT_ITEM(CENDVAR , CENDVAR , CWORD, CENDVAR), /* 11, } */ +#ifndef USE_SIT_FUNCTION + SIT_ITEM(CENDFILE, CENDFILE , CENDFILE, CENDFILE),/* 12, PEOF */ + SIT_ITEM(CWORD , CWORD , CWORD, CWORD ), /* 13, 0-9A-Za-z */ + SIT_ITEM(CCTL , CCTL , CCTL , CCTL ) /* 14, CTLESC ... */ +#endif +#undef SIT_ITEM +}; +/* Constants below must match table above */ +enum { +#if ENABLE_ASH_ALIAS + CSPCL_CIGN_CIGN_CIGN , /* 0 */ +#endif + CSPCL_CWORD_CWORD_CWORD , /* 1 */ + CNL_CNL_CNL_CNL , /* 2 */ + CWORD_CCTL_CCTL_CWORD , /* 3 */ + CDQUOTE_CENDQUOTE_CWORD_CWORD , /* 4 */ + CVAR_CVAR_CWORD_CVAR , /* 5 */ + CSQUOTE_CWORD_CENDQUOTE_CWORD , /* 6 */ + CSPCL_CWORD_CWORD_CLP , /* 7 */ + CSPCL_CWORD_CWORD_CRP , /* 8 */ + CBACK_CBACK_CCTL_CBACK , /* 9 */ + CBQUOTE_CBQUOTE_CWORD_CBQUOTE , /* 10 */ + CENDVAR_CENDVAR_CWORD_CENDVAR , /* 11 */ + CENDFILE_CENDFILE_CENDFILE_CENDFILE, /* 12 */ + CWORD_CWORD_CWORD_CWORD , /* 13 */ + CCTL_CCTL_CCTL_CCTL , /* 14 */ }; -#endif /* SH_MATH_SUPPORT */ /* c in SIT(c, syntax) must be an *unsigned char* or PEOA or PEOF, * caller must ensure proper cast on it if c is *char_ptr! @@ -2714,45 +2718,12 @@ SIT(int c, int syntax) } indx = syntax_index_table[s - spec_symbls]; } - return S_I_T[indx][syntax]; + return (S_I_T[indx] >> (syntax*4)) & 0xf; } #else /* !USE_SIT_FUNCTION */ -# if ENABLE_ASH_ALIAS -# define CSPCL_CIGN_CIGN_CIGN 0 -# define CSPCL_CWORD_CWORD_CWORD 1 -# define CNL_CNL_CNL_CNL 2 -# define CWORD_CCTL_CCTL_CWORD 3 -# define CDQUOTE_CENDQUOTE_CWORD_CWORD 4 -# define CVAR_CVAR_CWORD_CVAR 5 -# define CSQUOTE_CWORD_CENDQUOTE_CWORD 6 -# define CSPCL_CWORD_CWORD_CLP 7 -# define CSPCL_CWORD_CWORD_CRP 8 -# define CBACK_CBACK_CCTL_CBACK 9 -# define CBQUOTE_CBQUOTE_CWORD_CBQUOTE 10 -# define CENDVAR_CENDVAR_CWORD_CENDVAR 11 -# define CENDFILE_CENDFILE_CENDFILE_CENDFILE 12 -# define CWORD_CWORD_CWORD_CWORD 13 -# define CCTL_CCTL_CCTL_CCTL 14 -# else -# define CSPCL_CWORD_CWORD_CWORD 0 -# define CNL_CNL_CNL_CNL 1 -# define CWORD_CCTL_CCTL_CWORD 2 -# define CDQUOTE_CENDQUOTE_CWORD_CWORD 3 -# define CVAR_CVAR_CWORD_CVAR 4 -# define CSQUOTE_CWORD_CENDQUOTE_CWORD 5 -# define CSPCL_CWORD_CWORD_CLP 6 -# define CSPCL_CWORD_CWORD_CRP 7 -# define CBACK_CBACK_CCTL_CBACK 8 -# define CBQUOTE_CBQUOTE_CWORD_CBQUOTE 9 -# define CENDVAR_CENDVAR_CWORD_CENDVAR 10 -# define CENDFILE_CENDFILE_CENDFILE_CENDFILE 11 -# define CWORD_CWORD_CWORD_CWORD 12 -# define CCTL_CCTL_CCTL_CCTL 13 -# endif - -static const uint8_t syntax_index_table[258] = { +static const uint8_t syntax_index_table[] = { /* BASESYNTAX_DQSYNTAX_SQSYNTAX_ARISYNTAX */ /* 0 */ CWORD_CWORD_CWORD_CWORD, /* 1 */ CWORD_CWORD_CWORD_CWORD, @@ -3016,9 +2987,9 @@ static const uint8_t syntax_index_table[258] = { /* PEOF */ CENDFILE_CENDFILE_CENDFILE_CENDFILE, }; -# define SIT(c, syntax) (S_I_T[syntax_index_table[c]][syntax]) +# define SIT(c, syntax) ((S_I_T[syntax_index_table[c]] >> (syntax*4)) & 0xf) -#endif /* USE_SIT_FUNCTION */ +#endif /* !USE_SIT_FUNCTION */ /* ============ Alias handling */ @@ -10437,7 +10408,7 @@ noexpand(const char *text) continue; if (c == CTLESC) text++; - else if (SIT((signed char)c, BASESYNTAX) == CCTL) + else if (SIT(c, BASESYNTAX) == CCTL) return 0; } return 1; @@ -11398,8 +11369,10 @@ parsebackq: { continue; } if (pc != '\\' && pc != '`' && pc != '$' - && (!dblquote || pc != '"')) + && (!dblquote || pc != '"') + ) { STPUTC('\\', pout); + } if (pc <= 255 /* not PEOA or PEOF */) { break; }