char *luaL_item_end (char *p) { switch (*p++) { case '\0': return p-1; case ESC: if (*p == 0) luaL_verror("incorrect pattern (ends with `%c')", ESC); return p+1; case '[': { char *end = bracket_end(p); if (end == NULL) lua_error("incorrect pattern (missing `]')"); return end+1; } default: return p; } }
int32 luaI_singlematch (int32 c, const char *p, const char **ep) { switch (*p) { case '.': /* matches any char */ *ep = p+1; return 1; case '\0': /* end of pattern; matches nothing */ *ep = p; return 0; case ESC: if (*(++p) == '\0') luaL_verror("incorrect pattern (ends with `%c')", ESC); *ep = p+1; return matchclass(c, (byte)*p); case '[': { const char *end = bracket_end(p+1); int32 sig = *(p+1) == '^' ? (p++, 0) : 1; if (end == NULL) lua_error("incorrect pattern (missing `]')"); *ep = end+1; while (++p < end) { if (*p == ESC) { if (((p+1) < end) && matchclass(c, (byte)*++p)) return sig; } else if ((*(p+1) == '-') && (p+2 < end)) { p+=2; if ((byte)*(p-2) <= c && c <= (byte)*p) return sig; } else if ((byte)*p == c) return sig; } return !sig; } default: *ep = p+1; return ((byte)*p == c); } }
int luaL_singlematch (int c, char *p) { if (c == 0) return 0; switch (*p) { case '.': return 1; case ESC: return matchclass(c, *(p+1)); case '[': { char *end = bracket_end(p+1); int sig = *(p+1) == '^' ? (p++, 0) : 1; while (++p < end) { if (*p == ESC) { if (((p+1) < end) && matchclass(c, *++p)) return sig; } else if ((*(p+1) == '-') && (p+2 < end)) { p+=2; if (*(p-2) <= c && c <= *p) return sig; } else if (*p == c) return sig; } return !sig; } default: return (*p == c); } }