/*
============================================================================
Name : hstr_regexp.c
Author : martin.dvorak@mindforger.com
Copyright : Apache 2.0
Description : Simplified regexp that suits HSTR needs - matching and caching
============================================================================
*/
#include "include/hstr_regexp.h"
#define REGEXP_MATCH_BUFFER_SIZE 1
void hstr_regexp_init(HstrRegexp *hstrRegexp)
{
hashset_init(&hstrRegexp->cache);
}
bool hstr_regexp_match(HstrRegexp *hstrRegexp, char *regexp, char *text, regmatch_t *match)
{
regex_t* compiled=malloc(sizeof(regex_t));
if(hashset_contains(&hstrRegexp->cache,regexp)) {
compiled=hashset_get(&hstrRegexp->cache, regexp);
} else {
int compilationFlags=(hstrRegexp->caseSensitive?0:REG_ICASE);
//printf("Regular expressions matching:\n '%s'\n '%s'",text,regexp);
int compilationStatus=regcomp(compiled, regexp, compilationFlags);
//printf("\nCompilation: %d",compilationStatus);
if(!compilationStatus) {
hashset_put(&hstrRegexp->cache, strdup(regexp), compiled);
} else {
free(compiled);
// TODO error handling: regerror() to turn error codes to messages
return false;
}
}
int matches=REGEXP_MATCH_BUFFER_SIZE;
regmatch_t matchPtr[REGEXP_MATCH_BUFFER_SIZE];
int matchingFlags=0;
int matchingStatus=regexec(compiled, text, matches, matchPtr, matchingFlags);
//printf("\nMatching (status/matches): %s %d",(!matchingStatus?"match":"no-match"),matches);
if(!matchingStatus) {
//printf("\n %d %d",matchPtr[0].rm_so, matchPtr[0].rm_eo);
if(matchPtr[0].rm_so != -1) {
//printf("\n* %d %d",matchPtr[0].rm_so,matchPtr[0].rm_eo);
match->rm_so=matchPtr[0].rm_so;
match->rm_eo=matchPtr[0].rm_eo;
return true;
}
}
return false;
}
void hstr_regexp_destroy(HstrRegexp *hstrRegexp)
{
// TODO hashset_destroy();
}
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"
Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/hstr
Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/hstr
You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a
pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master