anon 7 ay önce
ebeveyn
işleme
283e1e48e7
4 değiştirilmiş dosya ile 56 ekleme ve 17 silme
  1. +9
    -1
      documentation/README.md
  2. +1
    -0
      documentation/TODO.md
  3. +38
    -16
      source/jeger.c
  4. +8
    -0
      source/main.cpp

+ 9
- 1
documentation/README.md Dosyayı Görüntüle

@@ -98,5 +98,13 @@ SOW must match:
Not only that, this combination is key,
either it has to be the start of the string
or there has to be at least something which is not a symbol char.
With out the last condition "eexample" would match "\\\<exaplme\\\>"
With out the last condition "eexample" would match "\\\<exaple\\\>"
as the iteration of `regex_match()` reaches "example".

From a more practical perspective:
``` C
\<myword\>
// Must match
"myword"
" myword"
```

+ 1
- 0
documentation/TODO.md Dosyayı Görüntüle

@@ -2,3 +2,4 @@
[ ] UTF-8 support
[ ] arbitrary memory support (this probably covers UTF-8 support)
[ ] documentation thats not shit
[ ] HOOK\_ALL / OFFSHOOT width parameter inconsistency

+ 38
- 16
source/jeger.c Dosyayı Görüntüle

@@ -9,7 +9,9 @@
#include <limits.h>
#include <stdlib.h>

#define JEGER_INIT_STATE 2
#define JEGER_SOS_STATE 0
#define JEGER_NSOS_STATE 1
#define JEGER_INIT_STATE 2

// ------------------
// ### Char tests ###
@@ -346,7 +348,7 @@ int escape_1_to_N(const char c,

static inline
int escape_to_negative(const char c,
compiler_state * const cs) {
compiler_state * const cs) {
switch (c) {
case 'D': {
const char digit_chars[] = JEGER_CHAR_SET_digits;
@@ -481,6 +483,8 @@ regex_t * regex_compile(const char * const pattern) {
.blacklist = blacklist,
};

bool fucku = true;

for (const char * s = pattern; *s != '\00';) {
assert(!is_quantifier(*s) && "Pattern starts with quantifier.");
// Reset the compiler
@@ -539,21 +543,37 @@ regex_t * regex_compile(const char * const pattern) {
s += 1;
} break;
case '<': {
unsigned true_inc = 1;
if ((cs.flags & DO_CATCH)
|| (cs.flags & IS_NEGATIVE)) {
OFFSHOOT(0, +1, 1, 1, &cs, regex);
OFFSHOOT(+1, +2, 1, 1, &cs, regex);
++true_inc;
} else {
if (cs.flags & IS_AT_THE_BEGINNING
&& !(cs.flags & DO_CATCH)
&& !(cs.flags & IS_NEGATIVE)
&& whitelist[0] == '\0') {
// ---
cs.flags |= INCREMENT_STATE;
fucku = false;
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;
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;
if (cs.flags & IS_AT_THE_BEGINNING) {
ABSOLUTE_OFFSHOOT(0, JEGER_INIT_STATE + true_inc, 0, 0, regex);
}
strcat(blacklist, JEGER_CHAR_symbol_chars);
//OFFSHOOT(0 + (true_inc-1), +true_inc, 1, 0, &cs, regex);
s += 1;
} break;
case '>': {
@@ -622,11 +642,13 @@ regex_t * regex_compile(const char * const pattern) {
}

// Init state hookups
ABSOLUTE_OFFSHOOT(0, JEGER_INIT_STATE, 0, 0, regex);
if (fucku) {
ABSOLUTE_OFFSHOOT(JEGER_SOS_STATE, JEGER_INIT_STATE, 0, 0, regex);
}
if (cs.flags & FORCE_START_OF_STRING) {
ABSOLUTE_OFFSHOOT(1, HALT_AND_CATCH_FIRE, 0, 0, regex);
ABSOLUTE_OFFSHOOT(JEGER_NSOS_STATE, HALT_AND_CATCH_FIRE, 0, 0, regex);
} else {
ABSOLUTE_OFFSHOOT(1, JEGER_INIT_STATE, 0, 0, regex);
ABSOLUTE_OFFSHOOT(JEGER_NSOS_STATE, JEGER_INIT_STATE, 0, 0, regex);
}

regex->accepting_state = cs.state;


+ 8
- 0
source/main.cpp Dosyayı Görüntüle

@@ -107,6 +107,14 @@ signed main() {
TEST(R"del(.\<print\>.)del", "printf", false);
TEST(R"del(.\<print\>.)del", "fprintf", false);

puts("");

TEST(R"del(\<while\>)del", "while", true);
TEST(R"del(\<while\>)del", " while ", true);
TEST(R"del(\<while\>)del", "9while ", true);
TEST(R"del(\<while\>)del", "for while {", true);
TEST(R"del(\<while\>)del", "for while{", true);

if (test_counter == passed_tests) {
fputs("\033[32m", stdout);
} else {


Yükleniyor…
İptal
Kaydet