Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19653
Modified Files: Tag: desiredata kernel.c Log Message: cleanup and introducing binbuf_capa()
Index: kernel.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/Attic/kernel.c,v retrieving revision 1.1.2.11 retrieving revision 1.1.2.12 diff -C2 -d -r1.1.2.11 -r1.1.2.12 *** kernel.c 28 Dec 2006 00:46:45 -0000 1.1.2.11 --- kernel.c 28 Dec 2006 06:49:20 -0000 1.1.2.12 *************** *** 1,13 **** ! /* Copyright (c) 2006 Mathieu Bouchard */ ! /* Copyright (c) 1997-1999 Miller Puckette except the hashtable. ! * For information on usage and redistribution, and for a DISCLAIMER OF ALL ! * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#include "desire.h" #include <stdlib.h> #include <string.h> ! /* T.Grill - include SIMD functionality */ ! #include "m_simd.h" #include <stdio.h>
/* T.Grill - bit alignment for signal vectors (must be a multiple of 8!) */ --- 1,30 ---- ! /* Copyright 2006-2007 Mathieu Bouchard. ! * Copyright (c) 1997-2006 Miller Puckette. ! * For information on usage and redistribution, and for a DISCLAIMER OF ALL ! * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ ! ! /* IOhannes : ! * changed the canvas_restore in "g_canvas.c", so that it might accept $args as well (like "pd $0_test") ! * so you can make multiple & distinguishable templates ! * 1511:forum::für::umläute:2001 ! * change marked with IOhannes ! */
#include "desire.h" + #include "m_simd.h" #include <stdlib.h> + #include <stdarg.h> #include <string.h> ! #include <fcntl.h> #include <stdio.h> + #include <ctype.h> + #include <errno.h> + #include <pthread.h> + #ifdef UNISTD + #include <unistd.h> + #endif + #ifdef MSW + #include <io.h> + #endif
/* T.Grill - bit alignment for signal vectors (must be a multiple of 8!) */ *************** *** 246,260 ****
void atom_string(t_atom *a, char *buf, unsigned int bufsize) { - char tbuf[30]; switch(a->a_type) { case A_SEMI: strcpy(buf, ";"); break; case A_COMMA: strcpy(buf, ","); break; case A_POINTER: strcpy(buf, "(pointer)"); break; ! case A_FLOAT: sprintf(tbuf, "%g", a->a_w.w_float); if (strlen(tbuf) < bufsize-1) strcpy(buf, tbuf); else if (a->a_w.w_float < 0) strcpy(buf, "-"); else strcat(buf, "+"); ! break; case A_SYMBOL: { char *sp; --- 263,277 ----
void atom_string(t_atom *a, char *buf, unsigned int bufsize) { switch(a->a_type) { case A_SEMI: strcpy(buf, ";"); break; case A_COMMA: strcpy(buf, ","); break; case A_POINTER: strcpy(buf, "(pointer)"); break; ! case A_FLOAT: { ! char tbuf[30]; sprintf(tbuf, "%g", a->a_w.w_float); if (strlen(tbuf) < bufsize-1) strcpy(buf, tbuf); else if (a->a_w.w_float < 0) strcpy(buf, "-"); else strcat(buf, "+"); ! } break; case A_SYMBOL: { char *sp; *************** *** 1001,1024 **** }
- /* Copyright (c) 1997-1999 Miller Puckette. - * For information on usage and redistribution, and for a DISCLAIMER OF ALL - * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ - - #define PD_CLASS_DEF - #include "desire.h" - #include "s_stuff.h" - #include <stdlib.h> - #ifdef UNISTD - #include <unistd.h> - #endif - #ifdef MSW - #include <io.h> - #endif - - #include <stdio.h> /* grrrr: for sprintf */ - #include <stdarg.h> - #include <string.h> - #include <pthread.h> /* tb: for hashtable locking */ - #ifdef QUALIFIED_NAME static char *pd_library_name = 0; --- 1018,1021 ---- *************** *** 1061,1065 **** }
- void obj_list(t_object *x, t_symbol *s, int argc, t_atom *argv); static void class_nosavefn(t_gobj *z, t_binbuf *b); --- 1058,1061 ---- *************** *** 1394,1398 **** { pthread_mutex_unlock(&hash_lock); ! return(sym2); } sym1 = &sym2->s_next; --- 1390,1394 ---- { pthread_mutex_unlock(&hash_lock); ! return sym2; } sym1 = &sym2->s_next; *************** *** 1686,1690 **** for (i = c->nmethod, m = c->methods; i--; m++) if (m->me_name == s) return m->me_fun; pd_error(x, "%s: no method for message '%s'", c->name->s_name, s->s_name); ! return((t_gotfn)nullfn); }
--- 1682,1686 ---- for (i = c->nmethod, m = c->methods; i--; m++) if (m->me_name == s) return m->me_fun; pd_error(x, "%s: no method for message '%s'", c->name->s_name, s->s_name); ! return (t_gotfn)nullfn; }
*************** *** 1749,1807 **** }
- /* Copyright 2006-2007 Mathieu Bouchard. - * Copyright 1997-2006 Miller Puckette. - * For information on usage and redistribution, and for a DISCLAIMER OF ALL - * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ - - /* IOhannes : - * changed the canvas_restore in "g_canvas.c", so that it might accept $args as well (like "pd $0_test") - * so you can make multiple & distinguishable templates - * 1511:forum::für::umläute:2001 - * change marked with IOhannes - */ - - #include <stdlib.h> - #include "m_pd.h" - #include "s_stuff.h" - #include <stdio.h> - #ifdef UNISTD - #include <unistd.h> - #endif - #ifdef MSW - #include <io.h> - #endif - #include <fcntl.h> - #include <string.h> - #include <stdarg.h> - #include <errno.h> - struct _binbuf { ! int b_n; ! t_atom *b_vec; };
t_binbuf *binbuf_new(void) { t_binbuf *x = (t_binbuf *)t_getbytes(sizeof(*x)); ! x->b_n = 0; ! x->b_vec = (t_atom *)t_getbytes(0); return x; }
void binbuf_free(t_binbuf *x) { ! t_freebytes(x->b_vec, x->b_n * sizeof(*x->b_vec)); ! t_freebytes(x, sizeof(*x)); }
t_binbuf *binbuf_duplicate(t_binbuf *y) { t_binbuf *x = (t_binbuf *)t_getbytes(sizeof(*x)); ! x->b_n = y->b_n; ! x->b_vec = (t_atom *)t_getbytes(x->b_n * sizeof(*x->b_vec)); ! memcpy(x->b_vec, y->b_vec, x->b_n * sizeof(*x->b_vec)); return x; }
void binbuf_clear(t_binbuf *x) { ! x->b_vec = (t_atom *)t_resizebytes(x->b_vec, x->b_n * sizeof(*x->b_vec), 0); ! x->b_n = 0; }
--- 1745,1785 ---- }
struct _binbuf { ! int n; ! int capa; /* capacity: how much n may grow without reallocating */ ! t_atom *vec; };
t_binbuf *binbuf_new(void) { t_binbuf *x = (t_binbuf *)t_getbytes(sizeof(*x)); ! x->n = 0; ! x->capa = 0; ! x->vec = (t_atom *)t_getbytes(0); return x; }
+ /* caution: capa >= x->n */ + static void binbuf_capa(t_binbuf *x, int capa) { + x->vec = (t_atom *)t_resizebytes(x->vec, x->capa*sizeof(*x->vec), capa*sizeof(*x->vec)); + x->capa = capa; + } + void binbuf_free(t_binbuf *x) { ! t_freebytes(x->vec, x->n * sizeof(*x->vec)); ! t_freebytes(x, sizeof(*x)); }
t_binbuf *binbuf_duplicate(t_binbuf *y) { t_binbuf *x = (t_binbuf *)t_getbytes(sizeof(*x)); ! x->capa = x->n = y->n; ! x->vec = (t_atom *)t_getbytes(x->n * sizeof(*x->vec)); ! memcpy(x->vec, y->vec, x->n * sizeof(*x->vec)); return x; }
void binbuf_clear(t_binbuf *x) { ! x->n = 0; ! x->vec = (t_atom *)t_resizebytes(x->vec, x->n * sizeof(*x->vec), 0); ! x->capa = 0; }
*************** *** 1810,1825 **** char buf[MAXPDSTRING+1], *bufp, *ebuf = buf+MAXPDSTRING; const char *textp = text, *etext = text+size; ! t_atom *ap; ! int nalloc = 16, natom = 0; ! t_freebytes(x->b_vec, x->b_n * sizeof(*x->b_vec)); ! x->b_vec = (t_atom *)t_getbytes(nalloc * sizeof(*x->b_vec)); ! ap = x->b_vec; ! x->b_n = 0; while (1) { /* skip leading space */ while ((textp != etext) && (*textp == ' ' || *textp == '\n' || *textp == '\r' || *textp == '\t')) textp++; if (textp == etext) break; ! if (*textp == ';') SETSEMI(ap), textp++; ! else if (*textp == ',') SETCOMMA(ap), textp++; else { /* it's an atom other than a comma or semi */ --- 1788,1800 ---- char buf[MAXPDSTRING+1], *bufp, *ebuf = buf+MAXPDSTRING; const char *textp = text, *etext = text+size; ! binbuf_clear(x); ! binbuf_capa(x,16); ! x->n = 0; while (1) { /* skip leading space */ while ((textp != etext) && (*textp == ' ' || *textp == '\n' || *textp == '\r' || *textp == '\t')) textp++; if (textp == etext) break; ! if (*textp == ';') {binbuf_addv(x,";"); textp++;} ! else if (*textp == ',') {binbuf_addv(x,","); textp++;} else { /* it's an atom other than a comma or semi */ *************** *** 1832,1896 **** slash = (c == '\'); if (q >= 0) { ! int digit = (c >= '0' && c <= '9'), dot = (c == '.'), minus = (c == '-'), ! plusminus = (minus || (c == '+')), expon = (c == 'e' || c == 'E'); ! if (q == 0) { /* beginning */ if (minus) q = 1; else if (digit) q = 2; else if (dot) q = 3; else q = -1; ! } else if (q == 1) { /* got minus */ if (digit) q = 2; else if (dot) q = 3; else q = -1; ! } else if (q == 2) { /* got digits */ if (dot) q = 4; else if (expon) q = 6; else if (!digit) q = -1; ! } else if (q == 3) { /* got '.' without digits */ if (digit) q = 5; else q = -1; ! } else if (q == 4) { /* got '.' after digits */ if (digit) q = 5; else if (expon) q = 6; else q = -1; ! } else if (q == 5) { /* got digits after . */ if (expon) q = 6; else if (!digit) q = -1; ! } else if (q == 6) { /* got 'e' */ if (plusminus) q = 7; else if (digit) q = 8; else q = -1; ! } else if (q == 7) { /* got plus or minus */ if (digit) q = 8; else q = -1; ! } else if (q == 8) { /* got digits */ if (!digit) q = -1; } } ! if (!lastslash && c == '$' && (textp != etext && ! textp[0] >= '0' && textp[0] <= '9')) ! dollar = 1; if (!slash) bufp++; ! } ! while (textp != etext && bufp != ebuf && ! (slash || (*textp != ' ' && *textp != '\n' && *textp != '\r' ! && *textp != '\t' &&*textp != ',' && *textp != ';'))); *bufp = 0; ! if (q == 2 || q == 4 || q == 5 || q == 8) SETFLOAT(ap, atof(buf)); ! /* LATER try to figure out how to mix "$" and "$" correctly; ! here, the backslashes were already stripped so we assume all ! "$" chars are real dollars. In fact, we only know at least one ! was. */ else if (dollar) { ! if (buf[0] != '$') ! dollar = 0; ! for (bufp = buf+1; *bufp; bufp++) ! if (*bufp < '0' || *bufp > '9') ! dollar = 0; ! if (dollar) SETDOLLAR(ap, atoi(buf+1)); ! else SETDOLLSYM(ap, gensym(buf)); ! } ! else SETSYMBOL(ap, gensym(buf)); ! } ! ap++; ! natom++; ! if (natom == nalloc) { ! x->b_vec = (t_atom *)t_resizebytes(x->b_vec, nalloc * sizeof(*x->b_vec), ! nalloc * (2*sizeof(*x->b_vec))); ! nalloc = nalloc * 2; ! ap = x->b_vec + natom; } if (textp == etext) break; } ! /* reallocate the vector to exactly the right size */ ! x->b_vec = (t_atom *)t_resizebytes(x->b_vec, nalloc * sizeof(*x->b_vec), ! natom * sizeof(*x->b_vec)); ! x->b_n = natom; }
--- 1807,1848 ---- slash = (c == '\'); if (q >= 0) { ! int digit = isdigit(c), dot=c=='.', minus=c=='-', plusminus=minus||c=='+', expon=c=='e'||c=='E'; ! if (q==0) { /* beginning */ if (minus) q = 1; else if (digit) q = 2; else if (dot) q = 3; else q = -1; ! } else if (q==1) { /* got minus */ if (digit) q = 2; else if (dot) q = 3; else q = -1; ! } else if (q==2) { /* got digits */ if (dot) q = 4; else if (expon) q = 6; else if (!digit) q = -1; ! } else if (q==3) { /* got '.' without digits */ if (digit) q = 5; else q = -1; ! } else if (q==4) { /* got '.' after digits */ if (digit) q = 5; else if (expon) q = 6; else q = -1; ! } else if (q==5) { /* got digits after . */ if (expon) q = 6; else if (!digit) q = -1; ! } else if (q==6) { /* got 'e' */ if (plusminus) q = 7; else if (digit) q = 8; else q = -1; ! } else if (q==7) { /* got plus or minus */ if (digit) q = 8; else q = -1; ! } else if (q==8) { /* got digits */ if (!digit) q = -1; } } ! if (!lastslash && c == '$' && textp!=etext && isdigit(textp[0])) dollar = 1; if (!slash) bufp++; ! } while (textp != etext && bufp != ebuf && (slash || !strchr(" \n\r\t,;",*textp))); *bufp = 0; ! if (q == 2 || q == 4 || q == 5 || q == 8) binbuf_addv(x,"f",atof(buf)); ! /* LATER try to figure out how to mix "$" and "$" correctly; here, the backslashes were already ! stripped so we assume all "$" chars are real dollars. In fact, we only know at least one was. */ else if (dollar) { ! if (buf[0] != '$') dollar = 0; ! for (bufp = buf+1; *bufp; bufp++) if (*bufp < '0' || *bufp > '9') dollar = 0; ! if (dollar) binbuf_addv(x,"$",atoi(buf+1)); ! else binbuf_addv(x,"&",gensym(buf)); ! } else binbuf_addv(x,"s",gensym(buf)); } if (textp == etext) break; } ! binbuf_capa(x,x->n); }
*************** *** 1902,1906 **** t_atom *ap; int indx; ! for (ap = x->b_vec, indx = x->b_n; indx--; ap++) { int newlength; if ((ap->a_type == A_SEMI || ap->a_type == A_COMMA) && length && buf[length-1] == ' ') length--; --- 1854,1858 ---- t_atom *ap; int indx; ! for (ap = x->vec, indx = x->n; indx--; ap++) { int newlength; if ((ap->a_type == A_SEMI || ap->a_type == A_COMMA) && length && buf[length-1] == ' ') length--; *************** *** 1924,1946 **** }
! /* LATER improve the out-of-space behavior below. Also fix this so that ! writing to file doesn't buffer everything together. */ ! void binbuf_add(t_binbuf *x, int argc, t_atom *argv) { ! int newsize = x->b_n + argc, i; ! t_atom *ap; ! if (ap = (t_atom *)t_resizebytes(x->b_vec, x->b_n * sizeof(*x->b_vec), newsize * sizeof(*x->b_vec))) { ! x->b_vec = ap; ! } else { ! error("binbuf_addmessage: out of space"); ! return; ! } ! #if 0 ! startpost("binbuf_add: "); ! postatom(argc, argv); ! endpost(); ! #endif ! for (ap = x->b_vec + x->b_n, i = argc; i--; ap++) *ap = *(argv++); ! x->b_n = newsize; }
--- 1876,1887 ---- }
! /* Miller said: fix this so that writing to file doesn't buffer everything together. */ ! /* matju said: make this use vector size doubling as it used to be in binbuf_text */ void binbuf_add(t_binbuf *x, int argc, t_atom *argv) { ! int newsize = x->n + argc, i; ! t_atom *ap = (t_atom *)t_resizebytes(x->vec, x->n * sizeof(*x->vec), newsize * sizeof(*x->vec)); ! x->vec = ap; ! for (ap = x->vec + x->n, i = argc; i--; ap++) *ap = *(argv++); ! x->capa = x->n = newsize; }
*************** *** 1963,1966 **** --- 1904,1909 ---- case ';': SETSEMI(at); break; case ',': SETCOMMA(at); break; + case '$': SETDOLLAR(at, va_arg(ap, int)); break; + case '&': SETDOLLSYM(at, va_arg(ap, t_symbol *)); break; default: goto done; } *************** *** 1980,1985 **** int i; t_atom *ap; ! binbuf_add(z, y->b_n, y->b_vec); ! for (i = 0, ap = z->b_vec; i < z->b_n; i++, ap++) { char tbuf[MAXPDSTRING]; switch (ap->a_type) { --- 1923,1928 ---- int i; t_atom *ap; ! binbuf_add(z, y->n, y->vec); ! for (i = 0, ap = z->vec; i < z->n; i++, ap++) { char tbuf[MAXPDSTRING]; switch (ap->a_type) { *************** *** 1998,2002 **** } } ! binbuf_add(x, z->b_n, z->b_vec); }
--- 1941,1945 ---- } } ! binbuf_add(x, z->n, z->vec); }
*************** *** 2011,2023 ****
void binbuf_restore(t_binbuf *x, int argc, t_atom *argv) { ! int newsize = x->b_n + argc, i; t_atom *ap; ! if (ap = (t_atom *)t_resizebytes(x->b_vec, x->b_n * sizeof(*x->b_vec), newsize * sizeof(*x->b_vec))) { ! x->b_vec = ap; } else { error("binbuf_addmessage: out of space"); return; } ! for (ap = x->b_vec + x->b_n, i = argc; i--; ap++) { if (argv->a_type == A_SYMBOL) { char *str = argv->a_w.w_symbol->s_name, *str2; --- 1954,1966 ----
void binbuf_restore(t_binbuf *x, int argc, t_atom *argv) { ! int newsize = x->n + argc, i; t_atom *ap; ! if (ap = (t_atom *)t_resizebytes(x->vec, x->n * sizeof(*x->vec), newsize * sizeof(*x->vec))) { ! x->vec = ap; } else { error("binbuf_addmessage: out of space"); return; } ! for (ap = x->vec + x->n, i = argc; i--; ap++) { if (argv->a_type == A_SYMBOL) { char *str = argv->a_w.w_symbol->s_name, *str2; *************** *** 2041,2045 **** } else *ap = *(argv++); } ! x->b_n = newsize; }
--- 1984,1988 ---- } else *ap = *(argv++); } ! x->n = newsize; }
*************** *** 2049,2053 **** void binbuf_print(t_binbuf *x) { int i, startedpost = 0, newline = 1; ! for (i = 0; i < x->b_n; i++) { if (newline) { if (startedpost) endpost(); --- 1992,1996 ---- void binbuf_print(t_binbuf *x) { int i, startedpost = 0, newline = 1; ! for (i = 0; i < x->n; i++) { if (newline) { if (startedpost) endpost(); *************** *** 2055,2066 **** startedpost = 1; } ! postatom(1, x->b_vec + i); ! newline = !! x->b_vec[i].a_type == A_SEMI; } if (startedpost) endpost(); }
! int binbuf_getnatom(t_binbuf *x) {return x->b_n;} ! t_atom *binbuf_getvec(t_binbuf *x) {return x->b_vec;}
int canvas_getdollarzero(void); --- 1998,2009 ---- startedpost = 1; } ! postatom(1, x->vec + i); ! newline = !! x->vec[i].a_type == A_SEMI; } if (startedpost) endpost(); }
! int binbuf_getnatom(t_binbuf *x) {return x->n;} ! t_atom *binbuf_getvec(t_binbuf *x) {return x->vec;}
int canvas_getdollarzero(void); *************** *** 2156,2161 **** static t_atom mstack[MSTACKSIZE], *msp = mstack, *ems = mstack+MSTACKSIZE; t_atom *stackwas = msp; ! t_atom *at = x->b_vec; ! int ac = x->b_n; int nargs; while (1) { --- 2099,2104 ---- static t_atom mstack[MSTACKSIZE], *msp = mstack, *ems = mstack+MSTACKSIZE; t_atom *stackwas = msp; ! t_atom *at = x->vec; ! int ac = x->n; int nargs; while (1) { *************** *** 2374,2378 **** goto fail; } ! for (ap = x->b_vec, indx = x->b_n; indx--; ap++) { int length; /* estimate how many characters will be needed. Printing out --- 2317,2321 ---- goto fail; } ! for (ap = x->vec, indx = x->n; indx--; ap++) { int length; /* estimate how many characters will be needed. Printing out *************** *** 2428,2433 **** static t_binbuf *binbuf_convert(t_binbuf *oldb, int maxtopd) { t_binbuf *newb = binbuf_new(); ! t_atom *vec = oldb->b_vec; ! t_int n = oldb->b_n, nextindex, stackdepth = 0, stack[MAXSTACK], nobj = 0, i; t_atom outmess[MAXSTACK], *nextmess; if (!maxtopd) binbuf_addv(newb, "ss;", gensym("max"), gensym("v2")); --- 2371,2376 ---- static t_binbuf *binbuf_convert(t_binbuf *oldb, int maxtopd) { t_binbuf *newb = binbuf_new(); ! t_atom *vec = oldb->vec; ! t_int n = oldb->n, nextindex, stackdepth = 0, stack[MAXSTACK], nobj = 0, i; t_atom outmess[MAXSTACK], *nextmess; if (!maxtopd) binbuf_addv(newb, "ss;", gensym("max"), gensym("v2")); *************** *** 2692,2698 **** int binbuf_match(t_binbuf *inbuf, t_binbuf *searchbuf) { int indexin, nmatched; ! for (indexin = 0; indexin <= inbuf->b_n - searchbuf->b_n; indexin++) { ! for (nmatched = 0; nmatched < searchbuf->b_n; nmatched++) { ! t_atom *a1 = &inbuf->b_vec[indexin + nmatched], *a2 = &searchbuf->b_vec[nmatched]; if (a1->a_type != a2->a_type || a1->a_type == A_SYMBOL && a1->a_w.w_symbol != a2->a_w.w_symbol || --- 2635,2641 ---- int binbuf_match(t_binbuf *inbuf, t_binbuf *searchbuf) { int indexin, nmatched; ! for (indexin = 0; indexin <= inbuf->n - searchbuf->n; indexin++) { ! for (nmatched = 0; nmatched < searchbuf->n; nmatched++) { ! t_atom *a1 = &inbuf->vec[indexin + nmatched], *a2 = &searchbuf->vec[nmatched]; if (a1->a_type != a2->a_type || a1->a_type == A_SYMBOL && a1->a_w.w_symbol != a2->a_w.w_symbol ||