Update of /cvsroot/pure-data/externals/zexy/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20851
Modified Files: z_zexy.c z_zexy.h Added Files: freadln.c fwriteln.c Log Message: added fz's [freadln] and [fwriteln]
Index: z_zexy.h =================================================================== RCS file: /cvsroot/pure-data/externals/zexy/src/z_zexy.h,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** z_zexy.h 10 May 2007 13:21:21 -0000 1.14 --- z_zexy.h 21 May 2007 11:59:11 -0000 1.15 *************** *** 28,31 **** --- 28,33 ---- void envrms_tilde_setup(void); /* envrms~ */ void fifop_setup(void); /* fifop */ + void freadln_setup(void); /* freadln */ + void fwriteln_setup(void); /* fwriteln */ void glue_setup(void); /* glue */ void index_setup(void); /* index */
Index: z_zexy.c =================================================================== RCS file: /cvsroot/pure-data/externals/zexy/src/z_zexy.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** z_zexy.c 10 May 2007 13:21:21 -0000 1.14 --- z_zexy.c 21 May 2007 11:59:11 -0000 1.15 *************** *** 30,33 **** --- 30,35 ---- envrms_tilde_setup(); /* envrms~ */ fifop_setup(); /* fifop */ + freadln_setup(); /* freadln */ + fwriteln_setup(); /* fwriteln */ glue_setup(); /* glue */ index_setup(); /* index */
--- NEW FILE: freadln.c ---
/****************************************************** * * zexy - implementation file * * copyleft (c) Franz Zotter * * 2105:forum::für::umläute:2007 * * institute of electronic music and acoustics (iem) * ****************************************************** * * license: GNU General Public License v.2 * ******************************************************/
#include "zexy.h"
#include <stdio.h> #include <string.h> #include <stdarg.h> #include <fcntl.h>
#ifdef __WIN32__ # include <io.h> #else # include <sys/types.h> # include <unistd.h> #endif
#define MIN_FREADLN_LENGTH 10
/* freadln: reads messages continuously from the lines of * a file that doesn't necessarily need to fit * into the RAM of your system * * Franz Zotter zotter@iem.at, 2007 * Institute of Electronic Music and Acoustics * */
static t_class *freadln_class;
typedef struct freadln { t_object x_ob; FILE *x_file; char *x_filename; char *x_textbuf; int x_textbuf_length; t_outlet *x_message_outlet; t_outlet *x_readybang_outlet; } t_freadln;
static void freadln_close (t_freadln *x) { if(x->x_file) fclose(x->x_file); x->x_file=0; if(x->x_filename) freebytes(x->x_filename, sizeof(char)*MAXPDSTRING); x->x_filename=0; if(x->x_textbuf) freebytes(x->x_textbuf, sizeof(char)*x->x_textbuf_length); x->x_textbuf=0; x->x_textbuf_length=0; }
static void freadln_open (t_freadln *x, t_symbol *s, t_symbol*type) { char filenamebuf[MAXPDSTRING], *filenamebufptr; int fd; freadln_close(x);
if(type!=gensym("cr")) { pd_error(x, "currently only 'cr' type files are implemented!"); return; }
// directory, filename, extension, dirresult, nameresult, unsigned int size, int bin if ((fd=open_via_path("",s->s_name,"", filenamebuf, &filenamebufptr, MAXPDSTRING,0))==-1) { pd_error(x, "failed to open %128s", filenamebuf); close(fd); return; } close(fd); if (!(x->x_file=fopen(filenamebuf, "r"))) { pd_error(x, "failed to open %128s",filenamebuf); return; } if (!(x->x_filename=(char*)getbytes(sizeof(char)*strlen(filenamebuf)))) { pd_error(x, "out of memory"); freadln_close(x); return; } strcpy(x->x_filename,filenamebuf); if (!(x->x_textbuf = (char *) getbytes (MIN_FREADLN_LENGTH * sizeof(char)))) { pd_error(x, "out of memory"); freadln_close(x); return; } x->x_textbuf_length=MIN_FREADLN_LENGTH; }
static int enlarge_cstr_if_required(const char **c_str, int *len, const int desired_min_length) { if ((!(*c_str))||*len==0) { *c_str = (char*) calloc (1,sizeof(char)); return 1; } if (len[0]<desired_min_length) { do { len[0]<<=1; } while ((len[0]<desired_min_length)&&(len[0]!=0)); freebytes((char*)*c_str, sizeof(char)*len[0]); if (!(*c_str=(char*)calloc(len[0],sizeof(char)))) len[0]=0; } return len[0]; }
static int cstr_char_pos(const char *c_str, const char c) { int cnt=1; if (c_str) { do { if (*c_str==c) return cnt; cnt++; } while (*c_str++!='\0'); } return -1; }
static void freadln_readline (t_freadln *x) { int min_length=(x->x_textbuf_length < 1)?1:x->x_textbuf_length; int ret_pos=0; t_binbuf *bbuf; t_atom *abuf; int abuf_length; t_symbol *s;
if (!x->x_file) { pd_error(x, "no file opened for reading"); return; }
do { if (ret_pos==-1) { min_length++; fseek(x->x_file,-(long)(x->x_textbuf_length-1),SEEK_CUR); } if (!enlarge_cstr_if_required((const char**) &x->x_textbuf, &x->x_textbuf_length, min_length)) { pd_error(x, "out of memory"); x->x_textbuf_length=0; freadln_close(x); return; } if (!(fgets(x->x_textbuf, x->x_textbuf_length, x->x_file))) { freadln_close(x); outlet_bang(x->x_readybang_outlet); return; } } while ((ret_pos=cstr_char_pos(x->x_textbuf,'\n'))==-1); x->x_textbuf[ret_pos-1]='\0'; //post("analyzing "%s"",x->x_textbuf); if (!(bbuf=binbuf_new())) { pd_error(x, "out of memory"); freadln_close(x); return; } binbuf_text(bbuf, x->x_textbuf, ret_pos-1); abuf = binbuf_getvec(bbuf); abuf_length = binbuf_getnatom(bbuf); if (abuf_length>0) { if (abuf->a_type==A_SYMBOL) { outlet_anything(x->x_message_outlet, atom_getsymbol(abuf), abuf_length-1, abuf+1); } else { outlet_list(x->x_message_outlet, gensym("list"), abuf_length, abuf); } } else { outlet_list(x->x_message_outlet, atom_getsymbol(abuf), 0, abuf); } // NOTE: the following line might be a problem in recursions // and could be performed before to outlet_* as well, // but(!) atom buffer abuf must be copied if doing so. binbuf_free(bbuf);
} static void freadln_free (t_freadln *x) { freadln_close(x); outlet_free (x->x_message_outlet); outlet_free (x->x_readybang_outlet); }
static void *freadln_new(void) { t_freadln *x = (t_freadln *)pd_new(freadln_class); x->x_message_outlet = outlet_new(&x->x_ob, &s_list); x->x_readybang_outlet = outlet_new(&x->x_ob, &s_bang); x->x_filename=0; x->x_file=0; x->x_textbuf=0; return (void *)x; }
void freadln_setup(void) { freadln_class = class_new(gensym("freadln"), (t_newmethod)freadln_new, (t_method) freadln_free, sizeof(t_freadln), 0, 0); class_addmethod(freadln_class, (t_method)freadln_open, gensym("open"), A_SYMBOL, A_DEFSYM, 0); class_addmethod(freadln_class, (t_method)freadln_close, gensym("close"), A_NULL, 0); class_addbang(freadln_class, (t_method)freadln_readline); }
--- NEW FILE: fwriteln.c --- #include "m_pd.h" #include <stdio.h> #include <string.h>
/* fwriteln: writes messages continuously into a file that * doesn't necessarily need to fit into the RAM of your system * * Franz Zotter zotter@iem.at, 2007 * Institute of Electronic Music and Acoustics * * parts of this externals were copied from Iohannes zmoelnig's * iemmatrix */
static t_class *fwriteln_class;
typedef struct fwriteln { t_object x_ob; FILE *x_file; char *x_filename; char *x_textbuf; } t_fwriteln;
static void fwriteln_close (t_fwriteln *x) { if(x->x_file) fclose(x->x_file); x->x_file=0; if(x->x_filename) freebytes(x->x_filename, sizeof(char)*MAXPDSTRING); x->x_filename=0; if(x->x_textbuf) freebytes(x->x_textbuf, sizeof(char)*MAXPDSTRING); x->x_textbuf=0; }
static void fwriteln_open (t_fwriteln *x, t_symbol *s, t_symbol*type) { char filename[MAXPDSTRING]; sys_bashfilename (s->s_name, filename); filename[MAXPDSTRING-1]=0; fwriteln_close (x);
if(0==type || type!=gensym("cr")) { pd_error(x, "unknown type '%s'", (type)?type->s_name:""); return; }
if (!(x->x_file=fopen(filename, "w"))) { pd_error(x, "failed to open %128s",filename); return; } x->x_filename=(char*)getbytes(sizeof(char)*strlen(filename)); strcpy(x->x_filename,filename); x->x_textbuf = (char *) getbytes (MAXPDSTRING * sizeof(char)); }
static void fwriteln_write (t_fwriteln *x, t_symbol *s, int argc, t_atom *argv) { int length=0; char *text=x->x_textbuf; if (x->x_file) { if ((s!=gensym("list"))||(argv->a_type==A_SYMBOL)) { snprintf(text,MAXPDSTRING,"%s ", s->s_name); text[MAXPDSTRING-1]=0; length=strlen(text); if (fwrite(text, length*sizeof(char),1,x->x_file) < 1) { pd_error(x, "failed to write %128s",x->x_filename); freebytes (text, MAXPDSTRING * sizeof(char)); fwriteln_close(x); return; } } while (argc--) { switch (argv->a_type) { case A_FLOAT: snprintf(text,MAXPDSTRING,"%.16g ", atom_getfloat(argv)); text[MAXPDSTRING-1]=0; length=strlen(text); if (fwrite(text, length*sizeof(char),1,x->x_file) < 1) { pd_error(x, "failed to write %128s",x->x_filename); freebytes (text, MAXPDSTRING * sizeof(char)); fwriteln_close(x); return; } break; case A_SYMBOL: snprintf(text,MAXPDSTRING,"%s ", atom_getsymbol(argv)->s_name); text[MAXPDSTRING-1]=0; length=strlen(text); if (fwrite(text, length*sizeof(char),1,x->x_file) < 1) { pd_error(x, "failed to write %128s",x->x_filename); freebytes (text, MAXPDSTRING * sizeof(char)); fwriteln_close(x); return; } break; case A_COMMA: snprintf(text,MAXPDSTRING,", "); length=strlen(text); if (fwrite(text, length*sizeof(char),1,x->x_file) < 1) { pd_error(x, "failed to write %128s",x->x_filename); freebytes (text, MAXPDSTRING * sizeof(char)); fwriteln_close(x); return; } break; case A_SEMI: snprintf(text,MAXPDSTRING,"; "); length=strlen(text); if (fwrite(text, length*sizeof(char),1,x->x_file) < 1) { pd_error(x, "failed to write %128s",x->x_filename); freebytes (text, MAXPDSTRING * sizeof(char)); fwriteln_close(x); return; } break; } argv++; }
snprintf(text,MAXPDSTRING,"\n"); length=strlen(text); if (fwrite(text, length*sizeof(char),1,x->x_file) < 1) { pd_error(x, "failed to write %128s",x->x_filename); freebytes (text, MAXPDSTRING * sizeof(char)); fwriteln_close(x); return; } } else { pd_error(x, "no file opened for writing"); } } static void fwriteln_free (t_fwriteln *x) { fwriteln_close(x); }
static void *fwriteln_new(void) { t_fwriteln *x = (t_fwriteln *)pd_new(fwriteln_class); x->x_filename=0; x->x_file=0; x->x_textbuf=0; return (void *)x; }
void fwriteln_setup(void) { fwriteln_class = class_new(gensym("fwriteln"), (t_newmethod)fwriteln_new, (t_method) fwriteln_free, sizeof(t_fwriteln), 0, 0); class_addmethod(fwriteln_class, (t_method)fwriteln_open, gensym("open"), A_SYMBOL, A_DEFSYM, 0); class_addmethod(fwriteln_class, (t_method)fwriteln_close, gensym("close"), A_NULL, 0); class_addanything(fwriteln_class, (t_method)fwriteln_write); }