Update of /cvsroot/pure-data/externals/zexy/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25810
Modified Files: regex.c Log Message: made additional outlets: outlet1=1/0 (whether we have at least 1 match or not); outlet2=info about the matches; outlet3=number of matches
Index: regex.c =================================================================== RCS file: /cvsroot/pure-data/externals/zexy/src/regex.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** regex.c 19 May 2006 14:04:32 -0000 1.6 --- regex.c 20 Jun 2006 13:30:25 -0000 1.7 *************** *** 39,45 **** --- 39,55 ---- t_object x_obj; #ifdef HAVE_REGEX_H + char *x_regexstring; /* the uncompiled regular expression */ + int x_regexstringlength; + regex_t *x_regexp; int x_matchnum; + + int x_flags; /* flags for the regex-compiler; REG_EXTENDED is always enabled */ #endif + + t_outlet*x_outResult; + t_outlet*x_outDetails; + t_outlet*x_outNumDetails; + } t_regex;
*************** *** 110,127 **** return result; } - #endif
! static void regex_regex(t_regex *x, t_symbol*s, int argc, t_atom*argv) { ! ZEXY_USEVAR(s); ! #ifdef HAVE_REGEX_H ! char*result=0; ! int length=0; ! int flags = 0; flags |= REG_EXTENDED;
! result=regex_l2s(&length, 0, argc, argv); ! ! if(0==result || 0==length){ pd_error(x, "[regex]: no regular expression given"); return; --- 120,130 ---- return result; }
! static void regex_compile(t_regex *x) { ! int flags = x->x_flags; flags |= REG_EXTENDED;
! if(0==x->x_regexstring || 0==x->x_regexstringlength){ pd_error(x, "[regex]: no regular expression given"); return; *************** *** 136,151 **** x->x_regexp=(regex_t*)getbytes(sizeof(t_regex));
! if(regcomp(x->x_regexp, result, flags)) { ! pd_error(x, "[regex]: invalid regular expression: %s", result); if(x->x_regexp)freebytes(x->x_regexp, sizeof(t_regex)); x->x_regexp=0; }
! if(result)freebytes(result, length); #endif } static void regex_symbol(t_regex *x, t_symbol *s, int argc, t_atom*argv) { - ZEXY_USEVAR(s); #ifdef HAVE_REGEX_H char*teststring=0; --- 139,192 ---- x->x_regexp=(regex_t*)getbytes(sizeof(t_regex));
! if(regcomp(x->x_regexp, x->x_regexstring, flags)) { ! pd_error(x, "[regex]: invalid regular expression: %s", x->x_regexstring); if(x->x_regexp)freebytes(x->x_regexp, sizeof(t_regex)); x->x_regexp=0; } + } + #endif
! ! static void regex_case(t_regex *x, t_float f){ ! #if HAVE_REGEX_H ! if(f>0.f) ! x->x_flags |= REG_ICASE; ! else ! x->x_flags ^= REG_ICASE; ! ! regex_compile(x); ! #endif ! } ! ! ! static void regex_regex(t_regex *x, t_symbol*s, int argc, t_atom*argv) ! { ! #ifdef HAVE_REGEX_H ! char*result=0; ! int length=0; ! ! result=regex_l2s(&length, 0, argc, argv); ! ! if(0==result || 0==length){ ! pd_error(x, "[regex]: no regular expression given"); ! return; ! } ! ! if(x->x_regexstring) { ! freebytes(x->x_regexstring, x->x_regexstringlength); ! x->x_regexstring=0; ! x->x_regexstringlength=0; ! } ! ! x->x_regexstring=result; ! x->x_regexstringlength=length; ! ! regex_compile(x); #endif } + + /* compare the given list as string with the precompiled regex */ static void regex_symbol(t_regex *x, t_symbol *s, int argc, t_atom*argv) { #ifdef HAVE_REGEX_H char*teststring=0; *************** *** 154,158 **** int num_matches=x->x_matchnum; regmatch_t*match=(regmatch_t*)getbytes(sizeof(regmatch_t)*num_matches); ! t_atom*ap=(t_atom*)getbytes(sizeof(t_atom)*(1+2*num_matches)); int ap_length=0;
--- 195,199 ---- int num_matches=x->x_matchnum; regmatch_t*match=(regmatch_t*)getbytes(sizeof(regmatch_t)*num_matches); ! t_atom*ap=(t_atom*)getbytes(sizeof(t_atom)*(3*num_matches)); int ap_length=0;
*************** *** 169,196 **** }
err=regexec(x->x_regexp, teststring, num_matches, match, 0);
! if(err) { ! ap_length=1; ! SETFLOAT(ap, 0.f); ! } else { int num_results=0; int i=0; ! t_atom*ap2=ap+1; for(i=0; i<num_matches; i++){ if(match[i].rm_so!=-1){ if(i>0 && (match[i].rm_so==match[i-1].rm_so) && (match[i].rm_eo==match[i-1].rm_eo)){ } else { ! SETFLOAT(ap2+0, match[i].rm_so); ! SETFLOAT(ap2+1, match[i].rm_eo); ! ap2+=2; num_results++; } } } ! ap_length=1+2*num_results; ! SETFLOAT(ap, num_results); } - cleanup: if(teststring)freebytes(teststring, length); --- 210,256 ---- }
+ /* do the actual comparing against the regex */ err=regexec(x->x_regexp, teststring, num_matches, match, 0); + if(teststring){ + freebytes(teststring, length); + teststring=0; + }
! if(err) { /* NO match */ ! if(match){ ! freebytes(match, sizeof(regmatch_t)*num_matches); ! match=0; ! } ! ! outlet_float(x->x_outResult, 0.f); ! } else { /* match! */ int num_results=0; int i=0; ! t_atom*ap2=ap; ! for(i=0; i<num_matches; i++){ if(match[i].rm_so!=-1){ + /* output the matches */ if(i>0 && (match[i].rm_so==match[i-1].rm_so) && (match[i].rm_eo==match[i-1].rm_eo)){ + // duplicate matches } else { ! SETFLOAT(ap2+0, (t_float)i); ! SETFLOAT(ap2+1, (t_float)match[i].rm_so); ! SETFLOAT(ap2+2, (t_float)match[i].rm_eo); ! ap2+=3; num_results++; } } } ! if(match){ ! freebytes(match, sizeof(regmatch_t)*num_matches); ! match=0; ! } ! outlet_float(x->x_outNumDetails, (t_float)num_results); ! for(i=0; i<num_results; i++){ ! outlet_list(x->x_outDetails, gensym("list"), 3, ap+(i*3)); ! } ! outlet_float(x->x_outResult, 1.f); } cleanup: if(teststring)freebytes(teststring, length); *************** *** 198,202 ****
if(ap){ - outlet_list(x->x_obj.ob_outlet, gensym("list"), ap_length, ap); freebytes(ap, sizeof(t_atom)*(1+2*num_matches)); } --- 258,261 ---- *************** *** 207,216 **** { t_regex *x = (t_regex *)pd_new(regex_class); - ZEXY_USEVAR(s);
- outlet_new(&x->x_obj, 0); inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("symbol"), gensym("regex"));
#ifdef HAVE_REGEX_H x->x_regexp=0; x->x_matchnum=NUM_REGMATCHES; --- 266,283 ---- { t_regex *x = (t_regex *)pd_new(regex_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("symbol"), gensym("regex"));
+ x->x_outResult=outlet_new(&x->x_obj, 0); + x->x_outDetails=outlet_new(&x->x_obj, gensym("list")); + x->x_outNumDetails=outlet_new(&x->x_obj, gensym("float")); + + #ifdef HAVE_REGEX_H + x->x_flags=0; + + x->x_regexstring=0; + x->x_regexstringlength=0; + x->x_regexp=0; x->x_matchnum=NUM_REGMATCHES; *************** *** 226,229 **** --- 293,302 ---- { #ifdef HAVE_REGEX_H + if(x->x_regexstring){ + freebytes(x->x_regexstring, x->x_regexstringlength); + x->x_regexstring=0; + x->x_regexstringlength=0; + } + if(x->x_regexp) { regfree(x->x_regexp); *************** *** 245,249 ****
class_addlist (regex_class, regex_symbol); ! class_addmethod (regex_class, (t_method)regex_regex, gensym("regex"), A_GIMME, 0);
class_addmethod(regex_class, (t_method)regex_help, gensym("help"), A_NULL); --- 318,324 ----
class_addlist (regex_class, regex_symbol); ! class_addmethod(regex_class, (t_method)regex_regex, gensym("regex"), A_GIMME, 0); ! ! class_addmethod(regex_class, (t_method)regex_case, gensym("case"), A_FLOAT, 0);
class_addmethod(regex_class, (t_method)regex_help, gensym("help"), A_NULL);