xaizek / hstr (License: Apachev2) (since 2018-12-07)
Bash and Zsh shell history suggest box - easily view, navigate, search and manage your command history.
<root> / src / hstr_regexp.c (6b848d36889f6ea6ee26930d9d8181dc7008916c) (2,272B) (mode 100644) [raw]
/*
 ============================================================================
 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"

#include "include/hstr_utils.h"

#define REGEXP_MATCH_BUFFER_SIZE 1

void hstr_regexp_init(HstrRegexp *hstrRegexp)
{
    hashset_init(&hstrRegexp->cache);
}

bool hstr_regexp_match(
        HstrRegexp *hstrRegexp,
        const char *regexp,
        const char *text,
        regmatch_t *match,
        char *errorMessage,
        const size_t errorMessageSize)
{
    regex_t* compiled;
    if(hashset_contains(&hstrRegexp->cache,regexp)) {
        compiled=hashset_get(&hstrRegexp->cache, regexp);
    } else {
        compiled=malloc(sizeof(regex_t));
        int compilationFlags=(hstrRegexp->caseSensitive?0:REG_ICASE);
        int compilationStatus=regcomp(compiled, regexp, compilationFlags);
        if(!compilationStatus) {
            hashset_put(&hstrRegexp->cache, hstr_strdup(regexp), compiled);
        } else {
            regerror(compilationStatus, compiled, errorMessage, errorMessageSize);
            free(compiled);
            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);
    if(!matchingStatus) {
        if(matchPtr[0].rm_so != -1) {
            match->rm_so=matchPtr[0].rm_so;
            match->rm_eo=matchPtr[0].rm_eo;
            return true;
        }
    }
    return false;
}

void hstr_regexp_destroy(HstrRegexp *hstrRegexp)
{
    hashset_destroy(&hstrRegexp->cache, true);
}

int regexp_compile(regex_t *regexp, const char *regexpText)
{
    return regcomp(regexp, regexpText, 0);
    //return regcomp(regexp, regexpText, REG_NEWLINE);
}

int regexp_match(regex_t *regexp, const char *text)
{
    const char *p = text;
    // TODO study multi matches and make this safe
    const int n_matches = 100;
    regmatch_t m[n_matches];
    return regexec(regexp, p, n_matches, m, 0);
}
Hints

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