Update of /cvsroot/pure-data/externals/zexy/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23911
Modified Files: msgfile.c Log Message: fixed reentrant bug
Index: msgfile.c =================================================================== RCS file: /cvsroot/pure-data/externals/zexy/src/msgfile.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** msgfile.c 9 Jun 2005 12:17:03 -0000 1.4 --- msgfile.c 2 Oct 2005 16:07:44 -0000 1.5 *************** *** 26,34 **** #include <fcntl.h> #include <string.h> #ifdef linux ! #include <unistd.h> #endif #ifdef __WIN32__ ! #include <io.h> #endif
--- 26,35 ---- #include <fcntl.h> #include <string.h> + #ifdef linux ! # include <unistd.h> #endif #ifdef __WIN32__ ! # include <io.h> #endif
*************** *** 110,137 **** }
! static void clear_currentnode(t_msgfile *x) { ! t_msglist *dummy = x->current; ! t_msglist *nxt; ! t_msglist *prv; ! ! if (!dummy) return; ! ! freebytes(dummy->thislist, sizeof(dummy->thislist)); ! dummy->thislist = 0; ! dummy->n = 0; ! ! prv = dummy->previous; ! nxt = dummy->next; ! ! if (nxt) nxt->previous = prv; ! if (prv) prv->next = nxt;
! if (!prv && !nxt) return;
! x->current = (nxt)?nxt:prv; ! freebytes(dummy, sizeof(t_msglist)); } ! static void clear_emptynodes(t_msgfile *x) { t_msglist *dummy = x->current; --- 111,136 ---- }
! static void delete_currentnode(t_msgfile *x) { ! if (x&&x->current){ ! t_msglist *dummy = x->current; ! t_msglist *nxt=dummy->next; ! t_msglist *prv=dummy->previous; ! freebytes(dummy->thislist, sizeof(dummy->thislist)); ! dummy->thislist = 0; ! dummy->n = 0; ! dummy->next=0; ! dummy->previous=0;
! freebytes(dummy, sizeof(t_msglist)); ! dummy=0;
! if (nxt) nxt->previous = prv; ! if (prv) prv->next = nxt; ! ! x->current = (nxt)?nxt:prv; ! } } ! static void delete_emptynodes(t_msgfile *x) { t_msglist *dummy = x->current; *************** *** 143,147 **** while (x->current && x->current->previous) x->current = x->current->previous; while (x->current && x->current->next) { ! if (!x->current->thislist) clear_currentnode(x); else x->current = x->current->next; } --- 142,146 ---- while (x->current && x->current->previous) x->current = x->current->previous; while (x->current && x->current->next) { ! if (!x->current->thislist) delete_currentnode(x); else x->current = x->current->next; } *************** *** 168,172 ****
! if (x->current->thislist) x->current = newnode; } static void insert_currentnode(t_msgfile *x) --- 167,171 ----
! x->current = newnode; } static void insert_currentnode(t_msgfile *x) *************** *** 242,256 **** static void msgfile_clear(t_msgfile *x) { while (x->current && x->current->previous) x->current = x->current->previous;
! while (x->current && (x->current->previous || x->current->next)) { ! clear_currentnode(x); ! } ! if (x->current->thislist) { ! freebytes(x->current->thislist, sizeof(x->current->thislist)); ! x->current->n = 0; } }
static void delete_region(t_msgfile *x, int start, int stop) { --- 241,255 ---- static void msgfile_clear(t_msgfile *x) { + /* find the beginning */ while (x->current && x->current->previous) x->current = x->current->previous;
! while (x->current) { ! delete_currentnode(x); } }
+ /* delete from line "start" to line "stop" + * if "stop" is negative, delete from "start" to the end + */ static void delete_region(t_msgfile *x, int start, int stop) { *************** *** 262,266 **** --- 261,267 ---- int counter = 0;
+ /* go to the beginning of the buffer */ while (dummy && dummy->previous) dummy=dummy->previous; + /* go to the end of the buffer */ while (dummy && dummy->next) { counter++; *************** *** 277,281 **** msgfile_goto(x, start);
! while (n--) clear_currentnode(x);
if (newwhere+1) msgfile_goto(x, newwhere); --- 278,282 ---- msgfile_goto(x, start);
! while (n--) delete_currentnode(x);
if (newwhere+1) msgfile_goto(x, newwhere); *************** *** 291,297 **** if (pos<0) return; if (oldwhere > pos) oldwhere--; - msgfile_goto(x, pos); ! clear_currentnode(x); msgfile_goto(x, oldwhere); } else if (ac==2) { --- 292,297 ---- if (pos<0) return; if (oldwhere > pos) oldwhere--; msgfile_goto(x, pos); ! delete_currentnode(x); msgfile_goto(x, oldwhere); } else if (ac==2) { *************** *** 306,310 **** delete_region(x, 0, pos2); } ! } else clear_currentnode(x); }
--- 306,310 ---- delete_region(x, 0, pos2); } ! } else delete_currentnode(x); }
*************** *** 364,374 **** { t_msglist *cur = x->current; ! ! while (x->current && x->current->previous) x->current=x->current->previous; ! while (x->current && x->current->thislist) { ! outlet_list(x->x_obj.ob_outlet, gensym("list"), x->current->n, x->current->thislist); ! x->current = x->current->next; } - x->current = cur; } static void msgfile_this(t_msgfile *x) --- 364,372 ---- { t_msglist *cur = x->current; ! while (cur && cur->previous) cur=cur->previous; ! while (cur && cur->thislist) { ! outlet_list(x->x_obj.ob_outlet, gensym("list"), cur->n, cur->thislist); ! cur = cur->next; } } static void msgfile_this(t_msgfile *x) *************** *** 429,440 **** { int searching = 1; ! t_msglist *found = x->current; ! int actu = 0;
! while ((searching) && (x->current) && (x->current->thislist)) { ! int n = x->current->n; int equal = 1; t_atom *that = av; ! t_atom *this = x->current->thislist;
if (ac < n) n = ac; --- 427,440 ---- { int searching = 1; ! t_msglist *found = 0; ! t_msglist *cur=x->current;
! while (cur) { ! int n = cur->n; int equal = 1; t_atom *that = av; ! t_atom *this = cur->thislist; ! ! if(0==this)continue;
if (ac < n) n = ac; *************** *** 450,468 ****
if (equal) { ! found = x->current; ! outlet_float(x->x_secondout, node_wherearewe(x)); ! outlet_list(x->x_obj.ob_outlet, gensym("list"), x->current->n, x->current->thislist); }
! searching = !(equal); ! ! if (x->current && x->current->thislist) { ! if (x->current->next) x->current = x->current->next; ! actu++; ! } }
! if (searching) outlet_bang(x->x_secondout); ! x->current = found; }
--- 450,468 ----
if (equal) { ! found = cur; ! break; }
! cur=cur->next; }
! if(found){ ! x->current = found; ! outlet_float(x->x_secondout, node_wherearewe(x)); ! if(found->n && found->thislist) ! outlet_list(x->x_obj.ob_outlet, gensym("list"), found->n, found->thislist); ! } else { ! outlet_bang(x->x_secondout); ! } }
*************** *** 475,486 **** { t_msglist *cur = x->current; ! post("--------- msgfile contents: -----------");
! while (x->current && x->current->previous) x->current=x->current->previous; ! while (x->current) { ! t_msglist *dum=x->current; int i; ! startpost(""); for (i = 0; i < dum->n; i++) { t_atom *a = dum->thislist + i; --- 475,487 ---- { t_msglist *cur = x->current; ! int j=0; post("--------- msgfile contents: -----------");
! while (cur && cur->previous) cur=cur->previous; ! while (cur) { ! t_msglist *dum=cur; int i; ! j++; ! startpost("line %d:", j); for (i = 0; i < dum->n; i++) { t_atom *a = dum->thislist + i; *************** *** 488,494 **** } endpost(); ! x->current = x->current->next; } - x->current = cur; }
--- 489,494 ---- } endpost(); ! cur = cur->next; } }
*************** *** 507,511 **** }
! clear_emptynodes(x); }
--- 507,511 ---- }
! delete_emptynodes(x); }
*************** *** 742,749 ****
/* an empty node indicates the end of our listbuffer */ ! x->current = (t_msglist *)getbytes(sizeof(t_msglist)); ! x->current->n = 0; ! x->current->thislist = 0; ! x->current->previous = x->current->next = 0;
if ((argc==1) && (argv->a_type == A_SYMBOL)) { --- 742,752 ----
/* an empty node indicates the end of our listbuffer */ ! x->current = 0; ! /* ! x->curent = (t_msglist *)getbytes(sizeof(t_msglist)); ! x->current->n = 0; ! x->current->thislist = 0; ! x->current->previous = x->current->next = 0; ! */
if ((argc==1) && (argv->a_type == A_SYMBOL)) {