[PD-cvs] externals/zexy/src matchbox.c,1.5,1.6

IOhannes m zmölnig zmoelnig at users.sourceforge.net
Tue Jul 24 15:30:31 CEST 2007


Update of /cvsroot/pure-data/externals/zexy/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18430/src

Modified Files:
	matchbox.c 
Log Message:
added "delete" functionality


Index: matchbox.c
===================================================================
RCS file: /cvsroot/pure-data/externals/zexy/src/matchbox.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** matchbox.c	5 Jul 2007 14:50:37 -0000	1.5
--- matchbox.c	24 Jul 2007 13:30:29 -0000	1.6
***************
*** 93,111 ****
  }
  
! static void clearlistlist(t_listlist*list) {
!   while(list){
!     t_listlist*ll=list;
!     list=list->next;
  
!     if(ll->argv)freebytes(ll->argv, ll->argc*sizeof(t_atom));
!     ll->argv=0;
!     ll->argc=0;
!     ll->next=0;
!     freebytes(ll, sizeof(t_listlist));
    }
  }
  
- 
- 
  /* -------------- here comes the matching algorithms ----------- */
  
--- 93,117 ----
  }
  
! /* delete the _next_ element from the list */
! static t_listlist* deletelistnext(t_listlist*list) {
!   if(!list || !list->next)return list; /* nothing to delete */
!   t_listlist*ll=list->next;
!   list->next=ll->next;
!   if(ll->argv)freebytes(ll->argv, ll->argc*sizeof(t_atom));
!   ll->argv=0;
!   ll->argc=0;
!   ll->next=0;
!   freebytes(ll, sizeof(t_listlist));
!   return list;
! }
  
! /* delete the entire list of lists */
! static void clearlistlist(t_listlist*list) {
!   if(!list)return; /* nothing to delete */
!   while(list->next){
!     list=deletelistnext(list);
    }
  }
  
  /* -------------- here comes the matching algorithms ----------- */
  
***************
*** 388,392 ****
  }
  
! 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;
--- 394,398 ----
  }
  
! static t_listlist*matchlistlist_regex(unsigned int*numresults, t_listlist*searchlist, int p_argc, t_atom*p_argv, int flags, int delete_results) {
    regex_t**regexpressions=0;
    t_listlist*matchinglist=0, *sl;
***************
*** 422,429 ****
   
    /* 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++;
      }
    }
--- 428,450 ----
   
    /* match the patterns to the tests */
!   if(FALSE==delete_results) {
!     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++;
!       }
!     }
!   } else if (TRUE==delete_results) {
!     /* yummy: delete matching lists! */
!     t_listlist*lastgood=searchlist;
!     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++;
! 
!         sl=deletelistnext(lastgood); 
!       } else {
!         lastgood=sl;
!       }
      }
    }
***************
*** 475,479 ****
  }
  
! static t_listlist*matchlistlist(unsigned int*numresults, t_listlist*searchlist, int p_argc, t_atom*p_argv, int mode) {
    unsigned int num=0;
    t_listlist*matchinglist=0, *sl;
--- 496,500 ----
  }
  
! static t_listlist*matchlistlist(unsigned int*numresults, t_listlist*searchlist, int p_argc, t_atom*p_argv, int mode, int delete_results) {
    unsigned int num=0;
    t_listlist*matchinglist=0, *sl;
***************
*** 482,496 ****
  #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)) {
!       matchinglist=addlistlist(matchinglist, sl->argc, sl->argv);
!       num++;
      }
    }
!   
    if(numresults!=0)
      *numresults=num;
--- 503,532 ----
  #ifdef MATCHBOX_REGEX
    if(MATCHBOX_REGEX==mode) {
!     matchinglist=matchlistlist_regex(&num, searchlist, p_argc, p_argv, 0, delete_results);
    } else 
  #endif /* MATCHBOX_REGEX */
    /* normal matching */
!   if(FALSE==delete_results) {
!     for(sl=searchlist->next; 0!=sl; sl=sl->next) {
!       if(matchlist(p_argc, p_argv, sl->argc, sl->argv, mode)) {
!         matchinglist=addlistlist(matchinglist, sl->argc, sl->argv);
!         num++;
!       }
!     }
!   } else if (TRUE==delete_results) {
!     /* yummy: delete matching lists! */
!     t_listlist*lastgood=searchlist;
!     for(sl=searchlist->next; 0!=sl; sl=sl->next) {
!       if(matchlist(p_argc, p_argv, sl->argc, sl->argv, mode)) {
!         matchinglist=addlistlist(matchinglist, sl->argc, sl->argv);
!         num++;
! 
!         sl=deletelistnext(lastgood);
!       } else {
!         lastgood=sl;
!       }
      }
    }
! 
    if(numresults!=0)
      *numresults=num;
***************
*** 502,506 ****
    int results=0;
    int mode=x->x_mode;
!   t_listlist*resultlist=matchlistlist(&results, x->x_lists, argc, argv, mode);
    t_listlist*dummylist;
  
--- 538,542 ----
    int results=0;
    int mode=x->x_mode;
!   t_listlist*resultlist=matchlistlist(&results, x->x_lists, argc, argv, mode, FALSE);
    t_listlist*dummylist;
  
***************
*** 509,519 ****
    for(dummylist=resultlist; 0!=dummylist; dummylist=dummylist->next)
      outlet_list(x->x_outResult,  &s_list, dummylist->argc, dummylist->argv);
-   
- 
  }
  
  static void matchbox_add(t_matchbox*x, t_symbol*s, int argc, t_atom*argv) {
    // 1st match, whether we already have this entry
!   if(matchlistlist(0, x->x_lists, argc, argv, MATCHBOX_EXACT)) {
      // already there, skip the rest
      z_verbose(1, "this list is already in the buffer!, skipping...");
--- 545,553 ----
    for(dummylist=resultlist; 0!=dummylist; dummylist=dummylist->next)
      outlet_list(x->x_outResult,  &s_list, dummylist->argc, dummylist->argv);
  }
  
  static void matchbox_add(t_matchbox*x, t_symbol*s, int argc, t_atom*argv) {
    // 1st match, whether we already have this entry
!   if(matchlistlist(0, x->x_lists, argc, argv, MATCHBOX_EXACT, FALSE)) {
      // already there, skip the rest
      z_verbose(1, "this list is already in the buffer!, skipping...");
***************
*** 526,535 ****
  }
  
  
  
  static void matchbox_dump(t_matchbox*x) {
    t_listlist*lp=0;
  
!   if(0==x->x_lists){
      outlet_float(x->x_outNumResults, 0);
      return;
--- 560,582 ----
  }
  
+ static void matchbox_delete(t_matchbox*x, t_symbol*s, int argc, t_atom*argv) {
+   int results=0;
+   int mode=x->x_mode;
+   t_listlist*resultlist=matchlistlist(&results, x->x_lists, argc, argv, mode, TRUE);
+   t_listlist*dummylist;
+   t_symbol*delsym=gensym("deleted");
+ 
+   x->x_numlists-=results;
  
+   outlet_float(x->x_outNumResults, results);
+   
+   for(dummylist=resultlist; 0!=dummylist; dummylist=dummylist->next)
+     outlet_anything(x->x_outResult, delsym, dummylist->argc, dummylist->argv);
+ }
  
  static void matchbox_dump(t_matchbox*x) {
    t_listlist*lp=0;
  
!   if(0==x->x_lists || 0==x->x_lists->next){
      outlet_float(x->x_outNumResults, 0);
      return;
***************
*** 538,542 ****
    outlet_float(x->x_outNumResults, x->x_numlists);
  
!   for(lp=x->x_lists; 0!=lp; lp=lp->next)
    {
      outlet_list(x->x_outResult,  &s_list, lp->argc, lp->argv);
--- 585,589 ----
    outlet_float(x->x_outNumResults, x->x_numlists);
  
!   for(lp=x->x_lists->next; 0!=lp; lp=lp->next)
    {
      outlet_list(x->x_outResult,  &s_list, lp->argc, lp->argv);
***************
*** 547,552 ****
  static void matchbox_clear(t_matchbox*x) {
    clearlistlist(x->x_lists);
- 
-   x->x_lists=0;
    x->x_numlists=0;
  }
--- 594,597 ----
***************
*** 584,588 ****
  
  
!   x->x_lists=0;
    x->x_numlists=0;
  
--- 629,636 ----
  
  
!   x->x_lists=(t_listlist*)getbytes(sizeof(t_listlist));
!   x->x_lists->next=0;
!   x->x_lists->argc=0;
!   x->x_lists->argv=0;
    x->x_numlists=0;
  
***************
*** 600,603 ****
--- 648,653 ----
  {
    matchbox_clear(x);
+   freebytes(x->x_lists, sizeof(t_listlist));  
+   x->x_lists=0;
  }
  
***************
*** 620,623 ****
--- 670,674 ----
  
    class_addmethod(matchbox_class, (t_method)matchbox_add, gensym("add"), A_GIMME, 0);
+   class_addmethod(matchbox_class, (t_method)matchbox_delete, gensym("delete"), A_GIMME, 0);
    class_addmethod(matchbox_class, (t_method)matchbox_clear, gensym("clear"), A_NULL, 0);
    class_addmethod(matchbox_class, (t_method)matchbox_dump, gensym("dump"), A_NULL);





More information about the Pd-cvs mailing list