Update of /cvsroot/pure-data/externals/zexy/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12048
Modified Files: matchbox.c Log Message: added regex support
Index: matchbox.c =================================================================== RCS file: /cvsroot/pure-data/externals/zexy/src/matchbox.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** matchbox.c 7 Mar 2007 15:16:35 -0000 1.1 --- matchbox.c 8 Mar 2007 13:06:14 -0000 1.2 *************** *** 16,50 ****
! /* ! OSC pattern matching code was written by Matt Wright, ! The Center for New Music and Audio Technologies, ! University of California, Berkeley. Copyright (c) 1998,99,2000,01,02,03,04 ! The Regents of the University of California (Regents). ! ! Permission to use, copy, modify, distribute, and distribute modified versions ! of this software and its documentation without fee and without a signed ! licensing agreement, is hereby granted, provided that the above copyright ! notice, this paragraph and the following two paragraphs appear in all copies, ! modifications, and distributions. ! ! IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, ! SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING ! OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS ! BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ! ! REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ! PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED ! HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE ! MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. ! ! The OSC webpage is http://cnmat.cnmat.berkeley.edu/OpenSoundControl ! */
! #include "zexy.h"
#include <string.h>
/* * matchbox : see whether a regular expression matches the given symbol --- 16,35 ----
+ #include "zexy.h"
! #define MATCHBOX_EXACT 0 ! #define MATCHBOX_OSC 1
! #ifdef HAVE_REGEX_H ! # include <sys/types.h> ! # include <regex.h> ! #define MATCHBOX_REGEX 2 ! #endif
#include <string.h>
+ #define FALSE 0 + #define TRUE 1 + /* * matchbox : see whether a regular expression matches the given symbol *************** *** 57,63 **** static t_class *matchbox_class;
- #define MATCHBOX_EXACT 0 - #define MATCHBOX_OSC 1 -
typedef struct _listlist { --- 42,45 ---- *************** *** 132,147 **** } } else { ! post("types don't match!"); ! return 0; }
! return 0; }
#ifdef MATCHBOX_OSC /* OSC */
#define OSCWarning post - #define FALSE 0 - #define TRUE 1 static int OSC_MatchBrackets (const char *pattern, const char *test, const char*theWholePattern); static int OSC_MatchList (const char *pattern, const char *test, const char*theWholePattern); --- 114,153 ---- } } else { ! //post("types don't match!"); ! return FALSE; }
! return TRUE; }
#ifdef MATCHBOX_OSC /* OSC */
+ /* + OSC pattern matching code was written by Matt Wright, + The Center for New Music and Audio Technologies, + University of California, Berkeley. Copyright (c) 1998,99,2000,01,02,03,04 + The Regents of the University of California (Regents). + + Permission to use, copy, modify, distribute, and distribute modified versions + of this software and its documentation without fee and without a signed + licensing agreement, is hereby granted, provided that the above copyright + notice, this paragraph and the following two paragraphs appear in all copies, + modifications, and distributions. + + IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, + SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING + OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS + BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED + HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE + MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + + The OSC webpage is http://cnmat.cnmat.berkeley.edu/OpenSoundControl + */ + #define OSCWarning post static int OSC_MatchBrackets (const char *pattern, const char *test, const char*theWholePattern); static int OSC_MatchList (const char *pattern, const char *test, const char*theWholePattern); *************** *** 170,174 **** case ']' : case '}' : ! OSCWarning("Spurious %c in pattern ".../%s/..."",pattern[0], theWholePattern); return FALSE; case '[' : --- 176,180 ---- case ']' : case '}' : ! z_verbose(1, "Spurious %c in pattern ".../%s/..."",pattern[0], theWholePattern); return FALSE; case '[' : *************** *** 193,197 **** }
- /* we know that pattern[0] == '[' and test[0] != 0 */
--- 199,202 ---- *************** *** 202,206 ****
if (pattern[1] == 0) { ! OSCWarning("Unterminated [ in pattern ".../%s/..."", theWholePattern); return FALSE; } --- 207,211 ----
if (pattern[1] == 0) { ! z_verbose(1, "Unterminated [ in pattern ".../%s/..."", theWholePattern); return FALSE; } *************** *** 213,217 **** while (*p != ']') { if (*p == 0) { ! OSCWarning("Unterminated [ in pattern ".../%s/..."", theWholePattern); return FALSE; } --- 218,222 ---- while (*p != ']') { if (*p == 0) { ! z_verbose(1, "Unterminated [ in pattern ".../%s/..."", theWholePattern); return FALSE; } *************** *** 238,242 **** while (*p != ']') { if (*p == 0) { ! OSCWarning("Unterminated [ in pattern ".../%s/..."", theWholePattern); return FALSE; } --- 243,247 ---- while (*p != ']') { if (*p == 0) { ! z_verbose(1, "Unterminated [ in pattern ".../%s/..."", theWholePattern); return FALSE; } *************** *** 253,257 **** for(restOfPattern = pattern; *restOfPattern != '}'; restOfPattern++) { if (*restOfPattern == 0) { ! OSCWarning("Unterminated { in pattern ".../%s/..."", theWholePattern); return FALSE; } --- 258,262 ---- for(restOfPattern = pattern; *restOfPattern != '}'; restOfPattern++) { if (*restOfPattern == 0) { ! z_verbose(1, "Unterminated { in pattern ".../%s/..."", theWholePattern); return FALSE; } *************** *** 333,336 **** --- 338,442 ----
+ #ifdef MATCHBOX_REGEX + static int atommatch_regex(regex_t*pattern, t_atom*test) { + int result=FALSE; + char*s_test=0; + int test_size=0; + + if(0==pattern)return FALSE; + if(0==test) return FALSE; + + if(test->a_type==A_SYMBOL) { + s_test=test->a_w.w_symbol->s_name; + } else { + test_size=sizeof(char)*MAXPDSTRING; + s_test=(char*)getbytes(test_size); + atom_string(test, s_test, test_size); + } + + result=!(regexec(pattern, s_test, 0, 0, 0)); + + if(test_size>0) { + freebytes(s_test, test_size); + s_test=0; test_size=0; + } + + return result; + } + + static int listmatch_regex(int p_argc, regex_t**pattern, int t_argc, t_atom*test) { + /* match the patterns to the test */ + int argc=p_argc; + if(p_argc!=t_argc) + return FALSE; + + while(argc--) { + if(FALSE==atommatch_regex(*pattern++, test++)) { + return FALSE; + } + } + + return TRUE; + } + + static t_listlist*matchlistlist_regex(unsigned int*numresults, t_listlist*searchlist, int p_argc, t_atom*p_argv, int flags) { + regex_t**regexpressions=0; + t_listlist*matchinglist=0, *sl; + int i=0; + flags|=REG_EXTENDED; + + int num=0; + + /* 1st compile the patterns */ + regexpressions=(regex_t**)getbytes(sizeof(regex_t*)*p_argc); + for(i=0; i<p_argc; i++) { + char*s_pattern=0; + int pattern_size=0; + t_atom*pattern=p_argv+i; + if(pattern->a_type==A_SYMBOL) { + s_pattern=pattern->a_w.w_symbol->s_name; + } else { + pattern_size=sizeof(char)*MAXPDSTRING; + s_pattern=(char*)getbytes(pattern_size); + atom_string(pattern, s_pattern, pattern_size); + } + regexpressions[i]=(regex_t*)getbytes(sizeof(regex_t)); + if(regcomp(regexpressions[i], s_pattern, flags)) { + z_verbose(1, "[matchbox]: invalid regular expression: %s", s_pattern); + if(regexpressions[i])freebytes(regexpressions[i], sizeof(regex_t)); + regexpressions[i]=0; + } + if(pattern_size>0) { + freebytes(s_pattern, pattern_size); + s_pattern=0; pattern_size=0; + } + } + + /* match the patterns to the tests */ + for(sl=searchlist; 0!=sl; sl=sl->next) { + if(TRUE==listmatch_regex(p_argc, regexpressions, sl->argc, sl->argv)) { + matchinglist=addlistlist(matchinglist, sl->argc, sl->argv); + num++; + } + } + + /* clear the patterns */ + for(i=0; i<p_argc; i++) { + if(regexpressions[i]){ + regfree(regexpressions[i]); + freebytes(regexpressions[i], sizeof(regex_t)); + } + } + freebytes(regexpressions, sizeof(regex_t*)*p_argc); + + /* return the result */ + if(numresults!=0) + *numresults=num; + return matchinglist; + } + #endif /* MATCHBOX_REGEX */ + + +
*************** *** 351,362 ****
if(argc!=argc_pattern) ! return 0;
for(i=0; i<argc; i++) { if(0==matchbox_atommatch(argv_pattern+i, argv+i, mode)) ! return 0; } ! ! return 1; }
--- 457,468 ----
if(argc!=argc_pattern) ! return FALSE;
for(i=0; i<argc; i++) { if(0==matchbox_atommatch(argv_pattern+i, argv+i, mode)) ! return FALSE; } ! ! return TRUE; }
*************** *** 365,368 **** --- 471,481 ---- t_listlist*matchinglist=0, *sl;
+ /* extra handling of regex matching (because we want to compile only once */ + #ifdef MATCHBOX_REGEX + if(MATCHBOX_REGEX==mode) { + matchinglist=matchlistlist_regex(&num, searchlist, p_argc, p_argv, 0); + } else + #endif /* MATCHBOX_REGEX */ + /* normal matching */ for(sl=searchlist; 0!=sl; sl=sl->next) { if(matchlist(p_argc, p_argv, sl->argc, sl->argv, mode)) { *************** *** 433,441 ****
static void matchbox_mode(t_matchbox*x, t_symbol*s) { ! if (gensym("OSC")==s) ! x->x_mode=MATCHBOX_OSC; ! else if(gensym("==")==s) x->x_mode=MATCHBOX_EXACT; ! else { pd_error(x, "mode '%s' is unknown, switching to 'exact' mode", s->s_name); x->x_mode=MATCHBOX_EXACT; --- 546,564 ----
static void matchbox_mode(t_matchbox*x, t_symbol*s) { ! if(gensym("==")==s) x->x_mode=MATCHBOX_EXACT; ! else if (gensym("OSC")==s) { ! #ifdef MATCHBOX_OSC ! x->x_mode=MATCHBOX_OSC; ! #else ! pd_error(x, "[matchbox] has been compiled without 'OSC' support; ignoring your request"); ! #endif /* MATCHBOX_OSC */ ! } else if(gensym("regex")==s) { ! #ifdef MATCHBOX_REGEX ! x->x_mode=MATCHBOX_REGEX; ! #else ! pd_error(x, "[matchbox] has been compiled without 'regex' support; ignoring your request"); ! #endif /* MATCHBOX_REGEX */ ! } else { pd_error(x, "mode '%s' is unknown, switching to 'exact' mode", s->s_name); x->x_mode=MATCHBOX_EXACT; *************** *** 443,448 **** }
- - static void *matchbox_new(t_symbol *s, int argc, t_atom*argv) { --- 566,569 ---- *************** *** 485,489 ****
- matchbox_class = class_new(gensym("matchbox"), (t_newmethod)matchbox_new, (t_method)matchbox_free, sizeof(t_matchbox), 0, A_GIMME, 0); --- 606,609 ----