mirror of
https://git.lain.church/emil/libhl.git
synced 2025-05-13 23:36:44 +00:00
auto esc magic char tokens
This commit is contained in:
parent
ed22849143
commit
94b151462a
31
source/hl.h
31
source/hl.h
@ -34,7 +34,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
hl_group_t * hl;
|
hl_group_t * hl;
|
||||||
token_type_t t;
|
token_type_t t;
|
||||||
char * syntax;
|
regex_t * syntax;
|
||||||
} token_t;
|
} token_t;
|
||||||
|
|
||||||
// GLOBALS
|
// GLOBALS
|
||||||
@ -56,7 +56,7 @@ void new_display_mode(display_t * mode) {
|
|||||||
|
|
||||||
int free_token(token_t * token) {
|
int free_token(token_t * token) {
|
||||||
free(token->hl);
|
free(token->hl);
|
||||||
free(token->syntax);
|
regex_free(token->syntax);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -67,15 +67,23 @@ int append_token(token_t * token) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
token_t * new_symbol_token(const char * const word,
|
token_t * new_symbol_token(const char * const c,
|
||||||
hl_group_t * const g) {
|
hl_group_t * const g) {
|
||||||
char * new_word = strdup(word);
|
char * new_word;
|
||||||
|
if (is_magic(*c)) {
|
||||||
|
new_word = (char *)malloc(sizeof(char)*3);
|
||||||
|
new_word[0] = '\\';
|
||||||
|
new_word[1] = *c;
|
||||||
|
new_word[2] = '\00';
|
||||||
|
} else {
|
||||||
|
new_word = strdup(c);
|
||||||
|
}
|
||||||
|
|
||||||
token_t * mt = (token_t*)malloc(sizeof(token_t));
|
token_t * mt = (token_t*)malloc(sizeof(token_t));
|
||||||
|
|
||||||
mt->hl = g;
|
mt->hl = g;
|
||||||
mt->t = KEYSYMBOL;
|
mt->t = KEYSYMBOL;
|
||||||
mt->syntax = new_word;
|
mt->syntax = regex_compile(new_word);
|
||||||
|
|
||||||
append_token(mt);
|
append_token(mt);
|
||||||
|
|
||||||
@ -126,7 +134,7 @@ token_t * new_keyword_token(const char * const word,
|
|||||||
|
|
||||||
mt->hl = g;
|
mt->hl = g;
|
||||||
mt->t = KEYWORD;
|
mt->t = KEYWORD;
|
||||||
mt->syntax = new_word;
|
mt->syntax = regex_compile(new_word);
|
||||||
|
|
||||||
append_token(mt);
|
append_token(mt);
|
||||||
|
|
||||||
@ -173,15 +181,10 @@ token_t * new_token(const char * const word,
|
|||||||
int token_fits(const token_t * const token,
|
int token_fits(const token_t * const token,
|
||||||
const char * const to,
|
const char * const to,
|
||||||
const int string_offset,
|
const int string_offset,
|
||||||
int * match_offset) {
|
int * match_offset) {
|
||||||
const char * const pattern = token->syntax;
|
|
||||||
|
|
||||||
if (! pattern) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//return regex_match(pattern, to, string_offset, match_offset);
|
//return regex_match(pattern, to, string_offset, match_offset);
|
||||||
return regex_search(NULL, pattern + string_offset);
|
return regex_search(token->syntax, to + string_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void render_string(const char * const string,
|
void render_string(const char * const string,
|
||||||
|
@ -33,7 +33,7 @@ typedef struct {
|
|||||||
s += n; \
|
s += n; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
bool is_quantifier(const char c){
|
static bool is_quantifier(const char c) {
|
||||||
for (const char * s = "+*?"; *s != '\00'; s++) {
|
for (const char * s = "+*?"; *s != '\00'; s++) {
|
||||||
if (*s == c) {
|
if (*s == c) {
|
||||||
return true;
|
return true;
|
||||||
@ -42,8 +42,20 @@ bool is_quantifier(const char c){
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_magic(const char c) {
|
||||||
|
if (is_quantifier(c)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (const char * s = "\\[]"; *s != '\00'; s++) {
|
||||||
|
if (*s == c) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int escape_1_to_1(const char c, char * whitelist) {
|
|
||||||
|
static int escape_1_to_1(const char c, char * whitelist) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 't': {
|
case 't': {
|
||||||
strcat(whitelist, "\t");
|
strcat(whitelist, "\t");
|
||||||
@ -83,7 +95,7 @@ int escape_1_to_1(const char c, char * whitelist) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int escape_1_to_N(const char c, char * whitelist) {
|
static int escape_1_to_N(const char c, char * whitelist) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 'i': {
|
case 'i': {
|
||||||
const char identifier_chars[] = "@0123456789_\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337";
|
const char identifier_chars[] = "@0123456789_\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337";
|
||||||
@ -175,7 +187,7 @@ int escape_1_to_N(const char c, char * whitelist) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compile_range(const char * const range,
|
static int compile_range(const char * const range,
|
||||||
char * whitelist) {
|
char * whitelist) {
|
||||||
assert(range[0] == '[' && "Not a range.");
|
assert(range[0] == '[' && "Not a range.");
|
||||||
|
|
||||||
|
@ -17,4 +17,6 @@ extern regex_t * regex_compile(const char * const pattern);
|
|||||||
extern bool regex_search(regex_t * regex, const char * const string);
|
extern bool regex_search(regex_t * regex, const char * const string);
|
||||||
extern int regex_free(regex_t * const regex);
|
extern int regex_free(regex_t * const regex);
|
||||||
|
|
||||||
|
extern bool is_magic(const char c);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user