From 524416dc7971a1fe7ef1c7c1817022be6a7f274f Mon Sep 17 00:00:00 2001 From: glyn Date: Fri, 25 Sep 2015 16:53:06 +0100 Subject: [PATCH 1/1] Initial Commit --- .gitignore | 2 + README.md | 16 ++ bin/dfregex.dll | Bin 0 -> 31570 bytes bin/libgnurx-0.dll | Bin 0 -> 215230 bytes src/c/Makefile | 49 +++++ src/c/dfregex.c | 94 ++++++++ src/c/dfregex.h | 24 ++ src/c/dfregex_private.h | 29 +++ src/c/dfregex_private.rc | 37 ++++ src/c/gnuregex.c | 464 +++++++++++++++++++++++++++++++++++++++ src/c/gnuregex.h | 17 ++ src/c/libdfregex.a | Bin 0 -> 3614 bytes src/c/memman.c | 64 ++++++ src/c/memman.h | 18 ++ src/df32/dataflex.pkg | 95 ++++++++ 15 files changed, 909 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 bin/dfregex.dll create mode 100644 bin/libgnurx-0.dll create mode 100644 src/c/Makefile create mode 100644 src/c/dfregex.c create mode 100644 src/c/dfregex.h create mode 100644 src/c/dfregex_private.h create mode 100644 src/c/dfregex_private.rc create mode 100644 src/c/gnuregex.c create mode 100644 src/c/gnuregex.h create mode 100644 src/c/libdfregex.a create mode 100644 src/c/memman.c create mode 100644 src/c/memman.h create mode 100644 src/df32/dataflex.pkg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fafff2e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..25d0770 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +POSIX Regex functions for DataFlex 3.2 +-------------------------------------- + +Requires: + DataFlex 3.1c onwards + GCC or compatible compiler like MinGW + GNU regex libraries for windows + http://sourceforge.net/projects/mingw/files/Other/UserContributed/regex + +I created this because despite VDF (Visual Dataflex) users being able to leverage +vbscript.dll in Windows via COM to do regex operations, it seems that Console Mode +users are out of luck. + +Despite being GNU libraries, this is intended to be used on Microsoft Windows +using the DataFlex external_function import. No doubt if you're using DataFlex +on Unix you can get these to work with minimal modifications. diff --git a/bin/dfregex.dll b/bin/dfregex.dll new file mode 100644 index 0000000000000000000000000000000000000000..dd1766fccc974cc94476d6d9c5f2b63aa8ba5d24 GIT binary patch literal 31570 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 literal 0 HcmV?d00001 diff --git a/src/c/Makefile b/src/c/Makefile new file mode 100644 index 0000000..2f4b2ef --- /dev/null +++ b/src/c/Makefile @@ -0,0 +1,49 @@ +##------------------------------------------------------------------------- +## posix regex extensions +## +## Copyright (c) 2015, glyn@8kb.co.uk +## Author: Glyn Astill +## +##------------------------------------------------------------------------- +## + +CPP = g++.exe +CC = gcc.exe +WINDRES = windres.exe +RES = dfregex_private.res +OBJ = dfregex.o memman.o gnuregex.o $(RES) +LINKOBJ = dfregex.o memman.o gnuregex.o $(RES) +LIBS = --no-export-all-symbols --add-stdcall-alias -lgnurx +INCS = +CXXINCS = +BIN = dfregex.dll +CXXFLAGS = $(CXXINCS) -DBUILDING_DLL=1 +CFLAGS = $(INCS) -DBUILDING_DLL=1 +RM = del -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before dfregex.dll all-after + + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +DLLWRAP=dllwrap.exe +DEFFILE=libdfregex.def +STATICLIB=libdfregex.a + +$(BIN): $(LINKOBJ) + $(DLLWRAP) --output-def $(DEFFILE) --implib $(STATICLIB) $(LINKOBJ) $(LIBS) -o $(BIN) + +dfregex.o: dfregex.c + $(CC) -c dfregex.c -o dfregex.o $(CFLAGS) + +memman.o: memman.c + $(CC) -c memman.c -o memman.o $(CFLAGS) + +gnuregex.o: gnuregex.c + $(CC) -c gnuregex.c -o gnuregex.o $(CFLAGS) + +dfregex_private.res: dfregex_private.rc + $(WINDRES) -i dfregex_private.rc --input-format=rc -o dfregex_private.res -O coff diff --git a/src/c/dfregex.c b/src/c/dfregex.c new file mode 100644 index 0000000..a742f54 --- /dev/null +++ b/src/c/dfregex.c @@ -0,0 +1,94 @@ +/*------------------------------------------------------------------------- + * posix regex extensions + * + * Copyright (c) 2015, glyn@8kb.co.uk + * Author: Glyn Astill + * + *------------------------------------------------------------------------- + */ + +#include +#include +#include +#include "gnuregex.h" +#include "dfregex.h" + +DLLIMPORT int RegexpMatch (const char *str, const char *pattern, const char *flags, int errors) +{ + return regexp_match(str, pattern, flags, errors); +} + +DLLIMPORT int RegexpMatches(const char *str, const char *pattern, const char *flags, char *output, int output_len, int errors) +{ + char *matches = regexp_matches(str, pattern, flags, errors); + int matches_len; + int result = 0; + + if (matches != NULL) + { + matches_len = strlen(matches); + if (matches_len <= output_len) + { + strncpy(output, matches, matches_len); + result = 0; + } + else + result = -1; + + wfree(matches); + } + else + result = -2; + + return result; +} + +DLLIMPORT int RegexpReplace(const char *str, const char *pattern, const char *replacement, const char *flags, char *output, int output_len, int errors) +{ + char *replaced = regexp_replace(str, pattern, replacement, flags, errors); + int replaced_len; + int result = 0; + + if (replaced != NULL) + { + replaced_len = strlen(replaced); + + if (replaced_len <= output_len) + { + strncpy(output, replaced, replaced_len); + result = 0; + } + else + result = -1; + + wfree(replaced); + } + else + result = -2; + + + return result; +} + +BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , + DWORD reason /* Reason this function is being called. */ , + LPVOID reserved /* Not used. */ ) +{ + switch (reason) + { + case DLL_PROCESS_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + break; + } + + /* Returns TRUE on success, FALSE on failure */ + return TRUE; +} diff --git a/src/c/dfregex.h b/src/c/dfregex.h new file mode 100644 index 0000000..594d881 --- /dev/null +++ b/src/c/dfregex.h @@ -0,0 +1,24 @@ +/*------------------------------------------------------------------------- + * posix regex extensions + * + * Copyright (c) 2015, glyn@8kb.co.uk + * Author: Glyn Astill + * + *------------------------------------------------------------------------- + */ + +#ifndef _DFREGEX_H_ +#define _DFREGEX_H_ + +#if BUILDING_DLL +# define DLLIMPORT __declspec (dllexport) +#else /* Not BUILDING_DLL */ +# define DLLIMPORT __declspec (dllimport) +#endif /* Not BUILDING_DLL */ + + +DLLIMPORT int RegexpMatch(const char *str, const char *pattern, const char *flags, int errors); +DLLIMPORT int RegexpMatches(const char *str, const char *pattern, const char *flags, char *output, int output_len, int errors); +DLLIMPORT int RegexpReplace(const char *str, const char *pattern, const char *replacement, const char *flags, char *output, int output_len, int errors); + +#endif /* _DFREGEX_H_ */ diff --git a/src/c/dfregex_private.h b/src/c/dfregex_private.h new file mode 100644 index 0000000..d0006f2 --- /dev/null +++ b/src/c/dfregex_private.h @@ -0,0 +1,29 @@ +/*------------------------------------------------------------------------- + * posix regex extensions + * + * Copyright (c) 2015, glyn@8kb.co.uk + * Author: Glyn Astill + * + *------------------------------------------------------------------------- + */ + +#ifndef DFREGEX_PRIVATE_H +#define DFREGEX_PRIVATE_H + +/* VERSION DEFINITIONS */ +#define VER_STRING "0.1.1.1" +#define VER_MAJOR 0 +#define VER_MINOR 1 +#define VER_RELEASE 1 +#define VER_BUILD 1 +#define COMPANY_NAME "8kb.co.uk" +#define FILE_VERSION "0.1.1.1" +#define FILE_DESCRIPTION "Regex for DataFlex 3.2" +#define INTERNAL_NAME "" +#define LEGAL_COPYRIGHT "Glyn Astill" +#define LEGAL_TRADEMARKS "" +#define ORIGINAL_FILENAME "" +#define PRODUCT_NAME "" +#define PRODUCT_VERSION "" + +#endif /*DFREGEX_PRIVATE_H*/ diff --git a/src/c/dfregex_private.rc b/src/c/dfregex_private.rc new file mode 100644 index 0000000..cb42ebf --- /dev/null +++ b/src/c/dfregex_private.rc @@ -0,0 +1,37 @@ +/*------------------------------------------------------------------------- + * posix regex extensions + * + * Copyright (c) 2015, glyn@8kb.co.uk + * Author: Glyn Astill + * + *------------------------------------------------------------------------- + */ + +#include + +1 VERSIONINFO +FILEVERSION 0,1,1,1 +PRODUCTVERSION 0,1,1,1 +FILETYPE VFT_DLL +{ + BLOCK "StringFileInfo" + { + BLOCK "080904E4" + { + VALUE "CompanyName", "8kb.co.uk" + VALUE "FileVersion", "0.1.1.1" + VALUE "FileDescription", "Regex for DataFlex 3.2" + VALUE "InternalName", "" + VALUE "LegalCopyright", "Glyn Astill" + VALUE "LegalTrademarks", "" + VALUE "OriginalFilename", "" + VALUE "ProductName", "" + VALUE "ProductVersion", "" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0809, 1252 + } +} + diff --git a/src/c/gnuregex.c b/src/c/gnuregex.c new file mode 100644 index 0000000..611c990 --- /dev/null +++ b/src/c/gnuregex.c @@ -0,0 +1,464 @@ +/*------------------------------------------------------------------------- + * posix regex extensions + * + * Copyright (c) 2015, glyn@8kb.co.uk + * Author: Glyn Astill + * + *------------------------------------------------------------------------- + */ + +#include +#include +#include +#include +#include "memman.h" + +#define MAX_ERROR_MSG 0x1000 + +/* + * Return a properly escaped / quoted string + */ +static char * quote_output(char *str) { + char *result; + char *result_return; + int len; + int do_quote = 0; + char *ptr; + + len = strlen(str); + + /* Check for characters that need quoting */ + for (ptr = str; *ptr; ptr++) { + char ch = *ptr; + if (ch == '\"' || ch =='\\' || ch == '\{' || ch == ',') { + do_quote = 1; + break; + } + } + + /* If we find no characters that need quoting just return the input */ + if (do_quote != 1) + return str; + + /* Do the quoting, here the allocation is wasteful */ + result = (char *) wmalloc((len * 2 + 3) * sizeof(char)); + result_return = result; + + /* + * Starting address of result is incremented as we modify it's contents here + * with result_return keeping the starting address + */ + *result++ = '"'; + while (len-- > 0) { + /* Escape double quotes and backslash with backslash */ + if (*str == '"') { + *result++ = '\\'; + } + if (*str == '\\') { + *result++ = '\\'; + } + *result++ = *str++; + } + *result++ = '"'; + *result++ = '\0'; + + return result_return; +} + +/* + * Count open parenthesis to evaluate the number of subexpressions in the regex + */ +static int count_subexpressions(const char *str){ + int result = 0; + int last_was_backslash = 0; + const char *ptr; + + for(ptr = str; *ptr; ptr++){ + if (*ptr == '\\' && !last_was_backslash){ + last_was_backslash = 1; + continue; + } + if (*ptr == ')' && !last_was_backslash) + result++; + last_was_backslash = 0; + } + return result; +} + +/* + * Check to see if string contains any escape chars + * these could of course just be escaped backslashes + * themselvs. + */ +static int has_escapes(const char *str){ + const char *ptr; + + for(ptr=str; *ptr; ptr++){ + if (*ptr == '\\') + return 1; + } + return 0; +} + +/* + * Compile the regex pattern + */ +static int compile_regex(regex_t *re, const char *pattern, const char *flags, int errors) +{ + int status; + int cflags = REG_EXTENDED; + + if (strchr(flags, 'i')) { + cflags = cflags|REG_ICASE; + } + if (strchr(flags, 'n')) { + cflags = cflags|REG_NEWLINE; + } + + status = regcomp(re, pattern, cflags); + if (status != REG_NOERROR) { + if (errors == 1) { + char *error_message; + regerror (status, re, error_message, MAX_ERROR_MSG); + fprintf (stderr, "Regex error compiling '%s': %s\n", pattern, error_message); + } + return 1; + } + return status; +} + +/* + * Returns a pointer to a malloced array of regmatch_t containing match offsets + * in the input string. (As opposed to offests from each match) + * + * The regmatch struct info: + * regmatch_t.rm_so (regoff_t) = byte offset from start of string to start of substring + * regmatch_t.rm_eo (regoff_t) = byte offset from start of string to first character after the end of substring + */ +static int find_regex_matches(regex_t *re, const char *str, const int nsub, const char *flags, regmatch_t **result) +{ + /* Each individual match and it's subexpression matches stored in m */ + regmatch_t m[nsub+1]; + + /* A pointer into the string at the end of the previous match */ + const char *prev_match_eo = str; + + /* + * We return a count of matches and pass back an array of regmatch_t in + * matches containing match offsets in the original string + */ + int array_len = strchr(flags, 'g') ? 256 : 32; + int match_count = 0; + regmatch_t *matches; + + matches = (regmatch_t *) wmalloc(sizeof(regmatch_t) * array_len); + + while (!regexec(re, prev_match_eo, nsub+1, m, 0)) { + int i = 0; + + /* resize the matches array; when more space is required double current size */ + while (match_count + (nsub * 2) > array_len) { + array_len *= 2; + matches = (regmatch_t *) wrealloc(matches, sizeof(regmatch_t) * array_len); + } + + /* when we have subexpressions, we're only interested in their match offsets */ + if (nsub > 0) { + for (i = 1; i <= nsub; i++) { + if (m[i].rm_so < 0 || m[i].rm_eo < 0) { + matches[match_count].rm_so = -1; + matches[match_count++].rm_eo = -1; + } + else { + matches[match_count].rm_so = (prev_match_eo - str) + m[i].rm_so; + matches[match_count++].rm_eo = (prev_match_eo - str) + m[i].rm_eo; + } + } + } + /* else we want the original match offsets*/ + else { + matches[match_count].rm_so = (prev_match_eo - str) + m[0].rm_so; + matches[match_count++].rm_eo = (prev_match_eo - str) + m[0].rm_eo; + } + + /* + * If we have matched on a blank expression or we were + * not flagged to do greedy matching then break + */ + if (!m[0].rm_eo || !strchr(flags, 'g')) + break; + + /* + * Advance the search position to the end of the current match + * If the match happens to be zero length, advance search position + * by one? + */ + if (m[0].rm_eo == m[0].rm_so) + prev_match_eo++; + else + prev_match_eo += m[0].rm_eo; + } + *result = matches; + + return match_count; +} + +/* + * Takes regmatch_t array returned by find_regex_matches and returns a malloced + * string representing the captured substrings. + */ +static char * regex_matches_to_string(const char *str, int nsub, int match_count, regmatch_t *matches) { + int j; + int i; + char *unquoted = NULL; + char *quoted = NULL; + int quoted_len; + char *result; + + int str_len = strlen(str); + int allocated_sz = str_len+1; + result = wmalloc(allocated_sz * sizeof(char)); + int result_sz = 0; + + j = 0; + while (j < match_count) { + + if (j > 0) { + result_sz += 2; + result = reallocate_block(result, &allocated_sz, result_sz * sizeof(char), str_len); + result[result_sz-2] = ','; + result[result_sz-1] = '{'; + } + else { + result_sz++; + result = reallocate_block(result, &allocated_sz, result_sz * sizeof(char), str_len); + result[result_sz-1] = '{'; + } + + for (i = 0; i <= nsub; i++) { + if ((nsub > 0) && (i == 0)) + continue; + + if (i > 1) { + result_sz++; + result = reallocate_block(result, &allocated_sz, result_sz * sizeof(char), str_len); + result[result_sz-1] = ','; + } + + int so = matches[j].rm_so; + int eo = matches[j].rm_eo; + + if (so == -1 || eo == -1) { + result = reallocate_block(result, &allocated_sz, (result_sz+4) * sizeof(char), str_len); + strncpy(result+result_sz, "NULL", 4); + result_sz += 4; + } + else { + unquoted = wmalloc((eo-so)+1 * sizeof(char)); + strncpy(unquoted, str+so, eo-so); + unquoted[eo-so] = '\0'; + quoted = quote_output(unquoted); + quoted_len = strlen(quoted); + + result = reallocate_block(result, &allocated_sz, (result_sz+quoted_len) * sizeof(char), str_len); + strncpy(result+result_sz, quoted, quoted_len); + result_sz += quoted_len; + + if (quoted != unquoted) + wfree(unquoted); + wfree(quoted); + } + j++; + } + + result_sz++; + result = reallocate_block(result, &allocated_sz, result_sz * sizeof(char), str_len); + result[result_sz-1] = '}'; + } + + result_sz++; + result = reallocate_block(result, &allocated_sz, result_sz * sizeof(char), str_len); + result[result_sz-1] = '\0'; + + return result; +} + +/* + * Purely check for a match in the regex + */ +int regexp_match(const char *str, const char *pattern, const char *flags, int errors) +{ + regex_t re; + int result; + int status; + + status = compile_regex(&re, pattern, flags, errors); + if (status == REG_NOERROR) { + result = regexec(&re, str, (size_t) 0, NULL, 0); + regfree(&re); + + if (!result) /* match */ + return 1; + else + return 0; + } + else /* no match */ + return 0; +} + +/* + * Return all matches in the regex as a string by first calling find_regex_matches + * and then regex_matches_to_string. Arguably this could all be one function + * however separation will make future multiple output formats easier. + */ +char * regexp_matches(const char *str, const char *pattern, const char *flags, int errors) +{ + regex_t re; + regmatch_t *matches_p = NULL; + int nsub; + int match_count; + int status; + char *result = NULL; + + /* Compile the regex */ + status = compile_regex(&re, pattern, flags, errors); + if (status == REG_NOERROR) { + /* Count our subexpressions to size our regmatch_t array */ + nsub = count_subexpressions(pattern); + /* Find all the matches relative to the input string */ + match_count = find_regex_matches(&re, str, nsub, flags, &matches_p); + /* Turn the matches into an output string */ + result = regex_matches_to_string(str, nsub, match_count, matches_p); + /* Free up the regmatch_t malloced by find_regex_matches */ + wfree(matches_p); + regfree(&re); + } + + return result; +} + +/* + * Substitutes matches with the regex pattern in the string with the replacement + * pattern/string. + */ +char * regexp_replace(const char *str, const char *pattern, const char *replacement, const char *flags, int errors) +{ + regex_t re; + int nsub; + char *result = NULL; + char *match_str; + int status; + const char *prev_match_eo = str; + int str_len = strlen(str); + int replacement_len = strlen(replacement); + int allocated_sz = str_len+1; + int result_sz = 0; + + status = compile_regex(&re, pattern, flags, errors); + if (status == REG_NOERROR) { + + result = wmalloc(allocated_sz * sizeof(char)); + + /* Count our subexpressions to size our regmatch_t array */ + nsub = count_subexpressions(pattern); + regmatch_t m[nsub+1]; + + while (!regexec(&re, prev_match_eo, nsub+1, m, 0)) { + + /* Copy everything to the left of the first match */ + if (m[0].rm_so > 0) { + result = reallocate_block(result, &allocated_sz, (result_sz+m[0].rm_so) * sizeof(char), str_len); + strncpy(result+result_sz, prev_match_eo, m[0].rm_so); + result_sz += m[0].rm_so; + } + + /* If there are no backreferences in the replacement, copy in the replacement */ + if (!has_escapes(replacement)) { + result = reallocate_block(result, &allocated_sz, (result_sz+replacement_len) * sizeof(char), str_len); + strncpy(result+result_sz, replacement, replacement_len); + result_sz += replacement_len; + } + /* Otherwise process the backreferences and copy in subcaptures */ + else { + /* find the next escape char */ + const char *start = replacement; + const char *ptr; + + for(ptr = replacement; *ptr; ptr++) { + if (*ptr != '\\') + continue; + + /* append everything to the left of the current escape */ + result = reallocate_block(result, &allocated_sz, (result_sz+(ptr-start)) * sizeof(char), str_len); + strncpy(result+result_sz, start, (ptr-start)); + result_sz += (ptr-start); + + ptr++; + + if ((*ptr >= '1' && *ptr <= '9') || (*ptr == '&')) + { + /* Use the back reference of regexp. */ + int sub; + if (*ptr == '&') + sub = 0; + else + sub = *ptr - '0'; + + if (m[sub].rm_so != -1 && m[sub].rm_eo != -1 && sub <= nsub) { + result = reallocate_block(result, &allocated_sz, (result_sz+(m[sub].rm_eo-m[sub].rm_so)) * sizeof(char), str_len); + strncpy(result+result_sz, prev_match_eo+m[sub].rm_so, (m[sub].rm_eo-m[sub].rm_so)); + result_sz += (m[sub].rm_eo-m[sub].rm_so); + } + ptr++; + } + else if (*ptr == '\\') + { + /* append backsalsh */ + result_sz++; + result = reallocate_block(result, &allocated_sz, result_sz * sizeof(char), str_len); + result[result_sz-1] = '\\'; + ptr++; + } + else { + /* append backsalsh */ + result_sz++; + result = reallocate_block(result, &allocated_sz, result_sz * sizeof(char), str_len); + result[result_sz-1] = '\\'; + } + start = ptr; + } + /* + * Append right trailing replacement, except in the instance + * when it starts with character zero, which can happen when the + * last part of the replace string is escaped. + */ + if (*start) { + result = reallocate_block(result, &allocated_sz, (result_sz+(ptr-start)) * sizeof(char), str_len); + strncpy(result+result_sz, start, (ptr-start)); + result_sz += (ptr-start); + } + + } + prev_match_eo += m[0].rm_eo; + + /* + * If we have matched on a blank expression or we were + * not flagged to do greedy matching then break + */ + if (!m[0].rm_eo || !strchr(flags, 'g')) + break; + } + + /* Copy everything to the right of the last match */ + result = reallocate_block(result, &allocated_sz, (result_sz+(str_len-(prev_match_eo-str))) * sizeof(char), str_len); + strncpy(result+result_sz, prev_match_eo, str_len-(prev_match_eo-str)); + result_sz += str_len-(prev_match_eo-str); + + regfree(&re); + + result_sz++; + result = reallocate_block(result, &allocated_sz, result_sz * sizeof(char), str_len); + result[result_sz-1] = '\0'; + } + return result; +} diff --git a/src/c/gnuregex.h b/src/c/gnuregex.h new file mode 100644 index 0000000..8929e21 --- /dev/null +++ b/src/c/gnuregex.h @@ -0,0 +1,17 @@ +/*------------------------------------------------------------------------- + * posix regex extensions + * + * Copyright (c) 2015, glyn@8kb.co.uk + * Author: Glyn Astill + * + *------------------------------------------------------------------------- + */ + +#ifndef __GNUREGEX_H__ +#define __GNUREGEX_H__ + +extern int regexp_match(const char *str, const char *pattern, const char *flags, int errors); +extern char * regexp_matches(const char *str, const char *pattern, const char *flags, int errors); +extern char * regexp_replace(const char *str, const char *pattern, const char *replacement, const char *flags, int errors); + +#endif diff --git a/src/c/libdfregex.a b/src/c/libdfregex.a new file mode 100644 index 0000000000000000000000000000000000000000..575172c41d10c9b0c57fdb204b3356817d69b8e1 GIT binary patch literal 3614 zcmeHK&2G~`5FRIK6GHhD9N=c8B5?rYq=^%x2=xJqgnH!SxQSCoNki0xDksDv^pW}; zJPHTOe6wq3oor~4Koz1RdAy$eyzBk;+u8N=PITH!-c{eYd8;)Vd$qTXW~=48zEqjs zb!+XqexX|>q6%N%iHc`L+kv_&-#EZ~8 z9s)8wjHlzM2gvYb8mk=2G75T=KhKKbl9IAyTtX{)Klmn_U5;ufPq_;BF(umbg&j z?=nr=Q@Cat2d=Ui*Gh3aT-dST(t16qUVl6$Z!jFky5h$r(Xlg#MrlCDO`gzfaiwj* zOpXehFa|%xO&Eh4jJN2(=S}k`ylipRFEGLhX1?fvm32#72c|&J*jsg9h4zx)&|c8k zThm^^ygigpDBZO7>M0XXxB%^8UBECeHtk8}iZgJTmRBJ12%IgB7-pp`9;>n}{M?h$ zb(EP%Qerrp%rXt;$>+&PMMN8P1L_ram3qN1I9-~#`qekD=~=+3GI7U>;yDtpT!CJ5 z!J3Y9*;(gp(eKP>t1A&-l{HK^d!|dgE zNX#bs!R!;=;Y;z0XR~B-jIN67S(eN_M{+7@H3>uLh2Jvv5xpjiESuAyj1S+SG>i9P z=v`^>u{;x@9Tj=0Be)f)!+v$|w;l*A2MOd@(P-^fqhM3X%YI(?(;9WOM$^OCf1=TJ zxVb~?GPr)&%{1y?SEI{Q_iY}{w4CM9`>gZp=20>=%J2Ql8hwNX&bG{>yDA{QKyAM3 NJSuXu{Seu9|DRn0z}Wx* literal 0 HcmV?d00001 diff --git a/src/c/memman.c b/src/c/memman.c new file mode 100644 index 0000000..57e7465 --- /dev/null +++ b/src/c/memman.c @@ -0,0 +1,64 @@ +/*------------------------------------------------------------------------- + * posix regex extensions + * + * Copyright (c) 2015, glyn@8kb.co.uk + * Author: Glyn Astill + * + *------------------------------------------------------------------------- + */ + +#include +#include +#include + +/* + * Wrappers around malloc/realloc/free + */ +void * wmalloc(unsigned int size) { + char *result; + + if ((result = malloc(size)) == NULL) { + fprintf(stderr, "Failed to malloc %d bytes\n", size); + exit(1); + } + return result; +} + +void * wrealloc(void *iptr, unsigned int size) { + char *result; + + assert(iptr != NULL); + + if ((result = realloc(iptr, size)) == NULL) { + fprintf(stderr, "Failed to realloc %d bytes\n", size); + exit(1); + } + return result; +} + +void wfree(void *iptr){ + assert(iptr != NULL); + + if (iptr) { + free(iptr); + } + iptr = NULL; +} + +/* + * Reallocate memory block pointed to by iptr in chunks of chunk_size when + * required_size is greater than value pointed to be allocated_size. + * Sets value of allocated_size to current allocation. + */ +void * reallocate_block(void *iptr, int *allocated_size, int required_size, int chunk_size) { + void *result; + + if (*allocated_size >= required_size) + return iptr; + + *allocated_size += (((required_size-*allocated_size)/chunk_size)+1)*chunk_size; + + result = wrealloc(iptr, *allocated_size); + + return result; +} diff --git a/src/c/memman.h b/src/c/memman.h new file mode 100644 index 0000000..10ae667 --- /dev/null +++ b/src/c/memman.h @@ -0,0 +1,18 @@ +/*------------------------------------------------------------------------- + * posix regex extensions + * + * Copyright (c) 2015, glyn@8kb.co.uk + * Author: Glyn Astill + * + *------------------------------------------------------------------------- + */ + +#ifndef __MEMMAN_H__ +#define __MEMMAN_H__ + +extern void * wmalloc(unsigned int size); +extern void * wrealloc(void *iptr, unsigned int size); +extern void sfree(void *iptr); +extern void * reallocate_block(void *iptr, int *allocated_size, int required_size, int chunk_size); + +#endif diff --git a/src/df32/dataflex.pkg b/src/df32/dataflex.pkg new file mode 100644 index 0000000..6ef6a02 --- /dev/null +++ b/src/df32/dataflex.pkg @@ -0,0 +1,95 @@ +//------------------------------------------------------------------------- +// posix regex extensions +// +// Copyright (c) 2015, glyn@8kb.co.uk +// Author: Glyn Astill +// +//------------------------------------------------------------------------- +// + +use dll + +Define max_dfregex_buffer for 16384 +Define errors_to_stderr for 0 + +external_function RegexpMatch "RegexpMatch" dfregex.dll pointer str pointer pattern pointer flags integer errors returns integer +external_function RegexpMatches "RegexpMatches" dfregex.dll pointer str pointer pattern pointer flags pointer out pointer out_len integer errors returns integer +external_function RegexpReplace "RegexpReplace" dfregex.dll pointer str pointer pattern pointer replacement pointer flags pointer out pointer out_len integer errors returns integer + +//Purely check if a regex expression produces match in the input string +// Returns 1 on match, 0 on no match +// E.g +// move (regexp_match('the quick brown fox jumps over the lazy dog.', 'fox', 'g')) +function regexp_match global string str string pattern string flags returns integer + local integer l_iReturn + local pointer l_pStr l_pPattern l_pFlags + + getaddress of str to l_pStr + getaddress of pattern to l_pPattern + getaddress of flags to l_pFlags + + move (RegexpMatch(l_pStr, l_pPattern, l_pFlags, errors_to_stderr)) to l_iReturn + + function_return l_iReturn +end_function + +//Return a string containing all regex matches in the input string +// E.g +// move (regexp_matches('the quick brown fox jumps over the la\{zy d"og.', 'fox|(the)|brown|(la\\\{zy)|(d"og)', 'g')) to myString +function regexp_matches global string str string pattern string flags returns string + local integer l_iReturn + local pointer l_pStr l_pPattern l_pFlags l_pOut + local string l_sOut l_sReturn + + move "" to l_sReturn + getaddress of str to l_pStr + getaddress of pattern to l_pPattern + getaddress of flags to l_pFlags + zerostring max_dfregex_buffer to l_sOut + getaddress of l_sOut to l_pOut + + move (RegexpMatches(l_pStr, l_pPattern, l_pFlags, l_pOut, max_dfregex_buffer, errors_to_stderr)) to l_iReturn + + if (l_iReturn = 0); + move (cstring(l_sOut)) To l_sReturn + else begin + if (l_iReturn = -1); + error 999997 "Regex output buffer too small" + if (l_iReturn = -2); + error 999998 "Regex compilation failure" + move "" to l_sReturn + end + + function_return l_sReturn +end_function + +//Perform a replacement on the input string all matches with the given pattern +// E.g. +// move (regexp_replace('22 quick brown foxes jump over the 44 lazy dogs.', '([0-9]*).* (foxes) .* ([0-9]*) .* (dogs).*', 'SELECT build_data(\1,\2), build_data(\3,\4);', 'g')) to myString +function regexp_replace global string str string pattern string replacement string flags returns string + local integer l_iReturn + local pointer l_pStr l_pPattern l_pFlags l_pReplacement l_pOut + local string l_sOut l_sReturn + + move "" to l_sReturn + getaddress of str to l_pStr + getaddress of pattern to l_pPattern + getaddress of flags to l_pFlags + getaddress of replacement to l_pReplacement + zerostring max_dfregex_buffer to l_sOut + getaddress of l_sOut to l_pOut + + move (RegexpReplace(l_pStr, l_pPattern, l_pReplacement, l_pFlags, l_pOut, max_dfregex_buffer, errors_to_stderr)) to l_iReturn + + if (l_iReturn = 0); + move (cstring(l_sOut)) To l_sReturn + else begin + if (l_iReturn = -1); + error 999997 "Regex output buffer too small" + if (l_iReturn = -2); + error 999998 "Regex compilation failure" + move "" to l_sReturn + end + + function_return l_sReturn +end_function \ No newline at end of file -- 2.39.5