static BOOL need_escape( WCHAR c ) { if (isalnumW( c )) return FALSE; if (c <= 31 || c >= 127) return TRUE; else { switch (c) { case ' ': case '"': case '#': case '%': case '<': case '>': case ']': case '\\': case '[': case '^': case '`': case '{': case '|': case '}': case '~': return TRUE; default: return FALSE; } } }
literal_t *parse_regexp(parser_ctx_t *ctx) { const WCHAR *re, *flags_ptr; BOOL in_class = FALSE; DWORD re_len, flags; literal_t *ret; HRESULT hres; TRACE("\n"); while(*--ctx->ptr != '/'); /* Simple regexp pre-parser; '/' if used in char class does not terminate regexp literal */ re = ++ctx->ptr; while(ctx->ptr < ctx->end) { if(*ctx->ptr == '\\') { if(++ctx->ptr == ctx->end) break; }else if(in_class) { if(*ctx->ptr == '\n') break; if(*ctx->ptr == ']') in_class = FALSE; }else { if(*ctx->ptr == '/') break; if(*ctx->ptr == '[') in_class = TRUE; } ctx->ptr++; } if(ctx->ptr == ctx->end || *ctx->ptr != '/') { WARN("pre-parsing failed\n"); return NULL; } re_len = ctx->ptr-re; flags_ptr = ++ctx->ptr; while(ctx->ptr < ctx->end && isalnumW(*ctx->ptr)) ctx->ptr++; hres = parse_regexp_flags(flags_ptr, ctx->ptr-flags_ptr, &flags); if(FAILED(hres)) return NULL; ret = parser_alloc(ctx, sizeof(literal_t)); ret->type = LT_REGEXP; ret->u.regexp.str = re; ret->u.regexp.str_len = re_len; ret->u.regexp.flags = flags; return ret; }
/****************************************************************************** * netbios_char (INTERNAL) */ static WCHAR netbios_char ( WCHAR wc ) { static const WCHAR special[] = {'!','@','#','$','%','^','&','\'',')','(','-','_','{','}','~'}; static const WCHAR deflt = '_'; unsigned int i; if ( isalnumW ( wc ) ) return wc; for ( i = 0; i < sizeof (special) / sizeof (WCHAR); i++ ) if ( wc == special[i] ) return wc; return deflt; }
literal_t *parse_regexp(parser_ctx_t *ctx) { const WCHAR *re, *flags_ptr; DWORD re_len, flags; literal_t *ret; HRESULT hres; TRACE("\n"); while(*ctx->ptr != '/') ctx->ptr--; re = ++ctx->ptr; while(ctx->ptr < ctx->end && *ctx->ptr != '/') { if(*ctx->ptr++ == '\\' && ctx->ptr < ctx->end) ctx->ptr++; } if(ctx->ptr == ctx->end) { WARN("unexpected end of file\n"); return NULL; } re_len = ctx->ptr-re; flags_ptr = ++ctx->ptr; while(ctx->ptr < ctx->end && isalnumW(*ctx->ptr)) ctx->ptr++; hres = parse_regexp_flags(flags_ptr, ctx->ptr-flags_ptr, &flags); if(FAILED(hres)) return NULL; ret = parser_alloc(ctx, sizeof(literal_t)); ret->type = LT_REGEXP; ret->u.regexp.str = re; ret->u.regexp.str_len = re_len; ret->u.regexp.flags = flags; return ret; }
/* ECMA-262 3rd Edition 7.6 */ static BOOL is_identifier_char(WCHAR c) { return isalnumW(c) || c == '$' || c == '_' || c == '\\'; }
static inline BOOL is_identifier_char(WCHAR c) { return isalnumW(c) || c == '_'; }