void binbuf_addv(t_binbuf *x, char *fmt, ...) { va_list ap; t_atom arg[MAXADDMESSV], *at =arg; int nargs = 0; char *fp = fmt; va_start(ap, fmt); while (1) { if (nargs >= MAXADDMESSV) { error("binbuf_addmessv: only %d allowed", MAXADDMESSV); break; } switch(*fp++) { case 'i': SETFLOAT(at, va_arg(ap, t_int)); break; case 'f': SETFLOAT(at, va_arg(ap, double)); break; case 's': SETSYMBOL(at, va_arg(ap, t_symbol *)); break; case ';': SETSEMI(at); break; case ',': SETCOMMA(at); break; default: goto done; } at++; nargs++; } done: va_end(ap); binbuf_add(x, nargs, arg); }
static void xeq_addline(t_xeq *x, t_symbol *s, int ac, t_atom *av) { int i; for (i = 0; i < ac; i++) { if (av[i].a_type == A_SYMBOL) { if (!strcmp(av[i].a_w.w_symbol->s_name, "_semi_")) SETSEMI(&av[i]); else if (!strcmp(av[i].a_w.w_symbol->s_name, "_comma_")) SETCOMMA(&av[i]); } } binbuf_add(x->x_binbuf, ac, av); }
void binbuf_restore(t_binbuf *x, int argc, t_atom *argv) { int newsize = x->b_n + argc, i; t_atom *ap; if((ap = 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; if (!strcmp(str, ";")) SETSEMI(ap); else if (!strcmp(str, ",")) SETCOMMA(ap); else if (str[0] == '$' && str[1] >= '0' && str[1] <= '9') { int dollsym = 0; char *str2; for (str2 = str + 2; *str2; str2++) if (*str2 < '0' || *str2 > '9') dollsym = 1; if (dollsym) SETDOLLSYM(ap, gensym(str + 1)); else { int dollar = 0; #ifdef ROCKBOX dollar = atoi(argv->a_w.w_symbol->s_name + 1); #else sscanf(argv->a_w.w_symbol->s_name + 1, "%d", &dollar); #endif SETDOLLAR(ap, dollar); } } else *ap = *argv; argv++; } else *ap = *(argv++); } x->b_n = newsize; }
static void hammereditor_addline(t_hammerfile *f, t_symbol *s, int ac, t_atom *av) { if (f->f_editorfn) { int i; t_atom *ap; for (i = 0, ap = av; i < ac; i++, ap++) { if (ap->a_type == A_SYMBOL) { /* LATER rethink semi/comma mapping */ if (!strcmp(ap->a_w.w_symbol->s_name, "_semi_")) SETSEMI(ap); else if (!strcmp(ap->a_w.w_symbol->s_name, "_comma_")) SETCOMMA(ap); } } binbuf_add(f->f_binbuf, ac, av); } }
/* convert text to a binbuf */ void binbuf_text(t_binbuf *x, char *text, size_t size) { 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_getbytes(nalloc * sizeof(*x->b_vec)); ap = x->b_vec; x->b_n = 0; while (1) { #ifndef ROCKBOX int type; #endif /* 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 */ char c; int floatstate = 0, slash = 0, /* lastslash = 0, */ firstslash = (*textp == '\\'); bufp = buf; do { c = *bufp = *textp++; /* lastslash = slash; */ slash = (c == '\\'); if (floatstate >= 0) { int digit = (c >= '0' && c <= '9'), dot = (c == '.'), minus = (c == '-'), plusminus = (minus || (c == '+')), expon = (c == 'e' || c == 'E'); if (floatstate == 0) /* beginning */ { if (minus) floatstate = 1; else if (digit) floatstate = 2; else if (dot) floatstate = 3; else floatstate = -1; } else if (floatstate == 1) /* got minus */ { if (digit) floatstate = 2; else if (dot) floatstate = 3; else floatstate = -1; } else if (floatstate == 2) /* got digits */ { if (dot) floatstate = 4; else if (expon) floatstate = 6; else if (!digit) floatstate = -1; } else if (floatstate == 3) /* got '.' without digits */ { if (digit) floatstate = 5; else floatstate = -1; } else if (floatstate == 4) /* got '.' after digits */ { if (digit) floatstate = 5; else if (expon) floatstate = 6; else floatstate = -1; } else if (floatstate == 5) /* got digits after . */ { if (expon) floatstate = 6; else if (!digit) floatstate = -1; } else if (floatstate == 6) /* got 'e' */ { if (plusminus) floatstate = 7; else if (digit) floatstate = 8; else floatstate = -1; } else if (floatstate == 7) /* got plus or minus */ { if (digit) floatstate = 8; else floatstate = -1; } else if (floatstate == 8) /* got digits */ { if (!digit) floatstate = -1; } } if (!slash) bufp++; } while (textp != etext && bufp != ebuf && (slash || (*textp != ' ' && *textp != '\n' && *textp != '\r' && *textp != '\t' &&*textp != ',' && *textp != ';'))); *bufp = 0; #if 0 post("buf %s", buf); #endif if (*buf == '$' && buf[1] >= '0' && buf[1] <= '9' && !firstslash) { for (bufp = buf+2; *bufp; bufp++) if (*bufp < '0' || *bufp > '9') { SETDOLLSYM(ap, gensym(buf+1)); goto didit; } SETDOLLAR(ap, atoi(buf+1)); didit: ; } else { if (floatstate == 2 || floatstate == 4 || floatstate == 5 || floatstate == 8) SETFLOAT(ap, atof(buf)); else SETSYMBOL(ap, gensym(buf)); } } ap++; natom++; if (natom == nalloc) { x->b_vec = 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_resizebytes(x->b_vec, nalloc * sizeof(*x->b_vec), natom * sizeof(*x->b_vec)); x->b_n = natom; }