#include "pattern.h" #include "cregex.h" #include "containers/stringarray.h" #include #include PATTERNPTR PatternNew(CONST_STRPTR pattern) { cregex_program_t* result = NULL; cregex_node_t* patternNode = cregex_parse(pattern); if( patternNode ) { result = cregex_compile_node( patternNode ); if( result != NULL ) { //Printf("successfully compiled %s\n", pattern); } else { // Printf("failed to compile %s\n", pattern); } cregex_parse_free( patternNode ); } else { // Printf("could not parse %s\n", pattern); } return result; } VOID PatternFree(cregex_program_t* pattern) { cregex_compile_free( pattern ); } StringArray PatternRun(CONST_STRPTR text, cregex_program_t* patternProgram) { StringArray result = NULL; char* localMatches[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; if (cregex_program_run(patternProgram, text, localMatches, 20) > 0) { int j = 0; int nmatches = 0; // count the matches for (j = 0; j < 20; ++j) if (localMatches[j]) nmatches = j; if( nmatches > 0 ) { result = StringArrayNew(); // loop the matches for (j = 0; j <= nmatches; j += 2) { if (localMatches[j] && localMatches[j + 1]) { int len = (int)(localMatches[j + 1] - localMatches[j]); STRPTR buffer = AllocVec(len+1, MEMF_CLEAR); // freed in the array sprintf(buffer, "%.*s", len, localMatches[j]); if( buffer[len-1] == '\n' ) { buffer[len-1] = '\0'; } StringArrayAppend(result, buffer); } else { //Printf("(NULL,NULL)\n"); } } } // end } else { //Printf("\"%s\": no match\n", text); } return result; }