diff --git a/source/jeger.c b/source/jeger.c index 4ce6c7f..849f09b 100644 --- a/source/jeger.c +++ b/source/jeger.c @@ -535,12 +535,6 @@ regex_t * regex_compile(const char * const pattern) { } break; } - /* Ew */ - if (*s == '\\' - && is_hologram_escape(*(s+1))) { - ++s; - } - // Compile char switch (*s) { // holograms @@ -555,49 +549,58 @@ regex_t * regex_compile(const char * const pattern) { } s += 1; } break; - case '<': { - // XXX: make this legible - if (cs.flags & IS_AT_THE_BEGINNING - && !(cs.flags & DO_CATCH) - && !(cs.flags & IS_NEGATIVE) - && whitelist[0] == '\0') { - // --- - cs.flags |= INCREMENT_STATE; - cs.flags |= DO_FORBID_START_OF_STRING; - strcat(whitelist, JEGER_CHAR_symbol_chars); - // --- - ABSOLUTE_OFFSHOOT( JEGER_SOS_STATE, JEGER_INIT_STATE+1, 0, 0, regex); - ABSOLUTE_OFFSHOOT(JEGER_INIT_STATE, JEGER_INIT_STATE+2, 1, 0, regex); - HOOK_ALL(0, whitelist, HALT_AND_CATCH_FIRE, &cs, regex); - // --- - ++cs.state; - cs.width = 0; - cs.match_width = 0; - HOOK_ALL(0, whitelist, +1, &cs, regex); - cs.width = 1; - OFFSHOOT(0, +1, 1, 0, &cs, regex); - // --- + case '\\': { + if(is_hologram_escape(*(s+1))) { + ++s; } else { - HOOK_ALL(0, whitelist, +1, &cs, regex); - if ((cs.flags & DO_CATCH) - || (cs.flags & IS_NEGATIVE)) { - OFFSHOOT(+1, +2, 1, 1, &cs, regex); - } else { - cs.flags |= INCREMENT_STATE; - } - OFFSHOOT(0, +1, 1, 0, &cs, regex); + goto DEFAULT; + } + switch(*s){ + case '<': { + // XXX: make this legible + if (cs.flags & IS_AT_THE_BEGINNING + && !(cs.flags & DO_CATCH) + && !(cs.flags & IS_NEGATIVE) + && whitelist[0] == '\0') { + // --- + cs.flags |= INCREMENT_STATE; + cs.flags |= DO_FORBID_START_OF_STRING; + strcat(whitelist, JEGER_CHAR_symbol_chars); + // --- + ABSOLUTE_OFFSHOOT( JEGER_SOS_STATE, JEGER_INIT_STATE+1, 0, 0, regex); + ABSOLUTE_OFFSHOOT(JEGER_INIT_STATE, JEGER_INIT_STATE+2, 1, 0, regex); + HOOK_ALL(0, whitelist, HALT_AND_CATCH_FIRE, &cs, regex); + // --- + ++cs.state; + cs.width = 0; + cs.match_width = 0; + HOOK_ALL(0, whitelist, +1, &cs, regex); + cs.width = 1; + OFFSHOOT(0, +1, 1, 0, &cs, regex); + // --- + } else { + HOOK_ALL(0, whitelist, +1, &cs, regex); + if ((cs.flags & DO_CATCH) + || (cs.flags & IS_NEGATIVE)) { + OFFSHOOT(+1, +2, 1, 1, &cs, regex); + } else { + cs.flags |= INCREMENT_STATE; + } + OFFSHOOT(0, +1, 1, 0, &cs, regex); + } + cs.flags |= IS_NEGATIVE; + strcat(blacklist, JEGER_CHAR_symbol_chars); + s += 1; + } break; + case '>': { + HOOK_ALL(0, whitelist, +1, &cs, regex); + cs.flags |= IS_NEGATIVE | INCREMENT_STATE; + strcat(blacklist, JEGER_CHAR_symbol_chars); + OFFSHOOT(+1, +2, 0, 0, &cs, regex); + ++cs.state; + s += 1; + } break; } - cs.flags |= IS_NEGATIVE; - strcat(blacklist, JEGER_CHAR_symbol_chars); - s += 1; - } break; - case '>': { - HOOK_ALL(0, whitelist, +1, &cs, regex); - cs.flags |= IS_NEGATIVE | INCREMENT_STATE; - strcat(blacklist, JEGER_CHAR_symbol_chars); - OFFSHOOT(+1, +2, 0, 0, &cs, regex); - ++cs.state; - s += 1; } break; // quantifiers case '=': @@ -631,6 +634,7 @@ regex_t * regex_compile(const char * const pattern) { } s += 1; } break; + DEFAULT: default: { // Literal cs.flags |= INCREMENT_STATE; HOOK_ALL(0, whitelist, +1, &cs, regex);