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 (61cea9d35a058a8f9630883f022c5bee507fd2c4) (1,873B) (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"

#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();
}

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