X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=shell%2Fmatch.h;h=aa393ed1ab8247b803cbbb35ff11e4f167d9e472;hb=2bba591991f5ac9b97582e37375dd49492c63df0;hp=863f525397694ceac1611b3bf916010084972bb4;hpb=a4f331d3c3ea5b358613992a48556cc9cbfdf139;p=oweals%2Fbusybox.git diff --git a/shell/match.h b/shell/match.h index 863f52539..aa393ed1a 100644 --- a/shell/match.h +++ b/shell/match.h @@ -1,22 +1,34 @@ /* match.h - interface to shell ##/%% matching code */ -typedef char *(*scan_t)(char *string, char *match, bool zero); +#ifndef SHELL_MATCH_H +#define SHELL_MATCH_H 1 -char *scanleft(char *string, char *match, bool zero); -char *scanright(char *string, char *match, bool zero); +PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN -static inline scan_t pick_scan(char op1, char op2, bool *zero) +//TODO! Why ash.c still uses internal version?! + +enum { + SCAN_MOVE_FROM_LEFT = (1 << 0), + SCAN_MOVE_FROM_RIGHT = (1 << 1), + SCAN_MATCH_LEFT_HALF = (1 << 2), + SCAN_MATCH_RIGHT_HALF = (1 << 3), +}; + +char* FAST_FUNC scan_and_match(char *string, const char *pattern, unsigned flags); + +static inline unsigned pick_scan(char op1, char op2) { - /* # - scanleft - * ## - scanright - * % - scanright - * %% - scanleft - */ + unsigned scan_flags; if (op1 == '#') { - *zero = true; - return op1 == op2 ? scanright : scanleft; - } else { - *zero = false; - return op1 == op2 ? scanleft : scanright; + scan_flags = SCAN_MATCH_LEFT_HALF + + (op1 == op2 ? SCAN_MOVE_FROM_RIGHT : SCAN_MOVE_FROM_LEFT); + } else { /* % */ + scan_flags = SCAN_MATCH_RIGHT_HALF + + (op1 == op2 ? SCAN_MOVE_FROM_LEFT : SCAN_MOVE_FROM_RIGHT); } + return scan_flags; } + +POP_SAVED_FUNCTION_VISIBILITY + +#endif