diff options
Diffstat (limited to 'src/freadln.c')
-rw-r--r-- | src/freadln.c | 373 |
1 files changed, 193 insertions, 180 deletions
diff --git a/src/freadln.c b/src/freadln.c index e8e09bb..42ca868 100644 --- a/src/freadln.c +++ b/src/freadln.c @@ -1,4 +1,4 @@ -/* +/* * freadln: reads messages continuously from the lines of a file * * (c) 1999-2011 IOhannes m zmölnig, forum::für::umläute, institute of electronic music and acoustics (iem) @@ -8,12 +8,12 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -37,125 +37,133 @@ #define MIN_FREADLN_LENGTH 10 -/* freadln: reads messages continuously from the lines of - * a file that doesn't necessarily need to fit +/* freadln: reads messages continuously from the lines of + * a file that doesn't necessarily need to fit * into the RAM of your system */ 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; +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; - char linebreak_chr[3]; + char linebreak_chr[3]; - t_canvas *x_canvas; + t_canvas *x_canvas; } 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; + 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; - char*dirname=canvas_getdir(x->x_canvas)->s_name; - int fd, len; - post("open: %s", s->s_name); + char filenamebuf[MAXPDSTRING], *filenamebufptr; + char*dirname=canvas_getdir(x->x_canvas)->s_name; + int fd, len; + post("open: %s", s->s_name); - freadln_close(x); + freadln_close(x); -/* - if(type!=gensym("cr")) { - pd_error(x, "currently only 'cr' type files are implemented!"); - return; - } -*/ - if (type==gensym("cr")) - strcpy(x->linebreak_chr,"\n"); - else - strcpy(x->linebreak_chr,";\n"); - + /* + if(type!=gensym("cr")) { + pd_error(x, "currently only 'cr' type files are implemented!"); + return; + } + */ + if (type==gensym("cr")) { + strcpy(x->linebreak_chr,"\n"); + } else { + strcpy(x->linebreak_chr,";\n"); + } - /* directory, filename, extension, dirresult, nameresult, unsigned int size, int bin */ - if ((fd=open_via_path( - dirname, - s->s_name, "", - filenamebuf, - &filenamebufptr, - MAXPDSTRING, - 0)) < 0 ) { - pd_error(x, "%s: failed to open %s", s->s_name, filenamebuf); - return; - } - z_close(fd); - len=strlen(filenamebuf); - if (!(x->x_filename=(char*)getbytes(sizeof(char)*(len+strlen(s->s_name)+2)))) { - pd_error(x, "out of memory"); - freadln_close(x); - return; - } - strcpy(x->x_filename,filenamebuf); - strcpy(x->x_filename+len,"/"); - strcpy(x->x_filename+len+1,filenamebufptr); - if (!(x->x_file=fopen(x->x_filename, "r"))) { - pd_error(x, "freadln: failed to fopen %s",x->x_filename); - return; - } - 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; + + /* directory, filename, extension, dirresult, nameresult, unsigned int size, int bin */ + if ((fd=open_via_path( + dirname, + s->s_name, "", + filenamebuf, + &filenamebufptr, + MAXPDSTRING, + 0)) < 0 ) { + pd_error(x, "%s: failed to open %s", s->s_name, filenamebuf); + return; + } + z_close(fd); + len=strlen(filenamebuf); + if (!(x->x_filename=(char*)getbytes(sizeof(char)*(len+strlen( + s->s_name)+2)))) { + pd_error(x, "out of memory"); + freadln_close(x); + return; + } + strcpy(x->x_filename,filenamebuf); + strcpy(x->x_filename+len,"/"); + strcpy(x->x_filename+len+1,filenamebufptr); + if (!(x->x_file=fopen(x->x_filename, "r"))) { + pd_error(x, "freadln: failed to fopen %s",x->x_filename); + return; + } + 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) +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]; + 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) +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; + int cnt=1; + if (c_str) { + do { + if (*c_str==c) { + return cnt; + } + cnt++; + } while (*c_str++!='\0'); + } + return -1; } static void freadln_done(t_freadln*x) @@ -165,101 +173,106 @@ static void freadln_done(t_freadln*x) static void freadln_readline (t_freadln *x) { - int min_length=(x->x_textbuf_length < 1)?1:x->x_textbuf_length; - int linebreak_pos=0; - int items_read; - t_binbuf *bbuf; - t_atom *abuf; - int abuf_length; - int rewind_after; + int min_length=(x->x_textbuf_length < 1)?1:x->x_textbuf_length; + int linebreak_pos=0; + int items_read; + t_binbuf *bbuf; + t_atom *abuf; + int abuf_length; + int rewind_after; - if (!x->x_file) { - pd_error(x, "no file opened for reading"); - freadln_done(x); - return; - } - - do { - if (linebreak_pos==-1) { - min_length<<=1; - fseek(x->x_file,-(long)(x->x_textbuf_length),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); - freadln_done(x); - return; - } - if (!(items_read=fread(x->x_textbuf,sizeof(char),x->x_textbuf_length,x->x_file))) { - freadln_close(x); - freadln_done(x); - return; - } - x->x_textbuf[x->x_textbuf_length-1]=0; - } while (((linebreak_pos=cstr_char_pos(x->x_textbuf,x->linebreak_chr[0]))==-1) && - !(items_read < x->x_textbuf_length)); - - if (linebreak_pos-1 < items_read - strlen(x->linebreak_chr)) { - rewind_after=items_read-linebreak_pos; - fseek(x->x_file,-(long)(rewind_after),SEEK_CUR); - } - if (linebreak_pos==-1) - linebreak_pos=items_read; - x->x_textbuf[linebreak_pos-1]='\0'; - if (!(bbuf=binbuf_new())) { - pd_error(x, "out of memory"); - freadln_close(x); - freadln_done(x); - return; - } - binbuf_text(bbuf, x->x_textbuf, linebreak_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); + if (!x->x_file) { + pd_error(x, "no file opened for reading"); + freadln_done(x); + return; + } + + do { + if (linebreak_pos==-1) { + min_length<<=1; + fseek(x->x_file,-(long)(x->x_textbuf_length),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); + freadln_done(x); + return; + } + if (!(items_read=fread(x->x_textbuf,sizeof(char),x->x_textbuf_length, + x->x_file))) { + freadln_close(x); + freadln_done(x); + return; + } + x->x_textbuf[x->x_textbuf_length-1]=0; + } while (((linebreak_pos=cstr_char_pos(x->x_textbuf, + x->linebreak_chr[0]))==-1) && + !(items_read < x->x_textbuf_length)); + + if (linebreak_pos-1 < items_read - strlen(x->linebreak_chr)) { + rewind_after=items_read-linebreak_pos; + fseek(x->x_file,-(long)(rewind_after),SEEK_CUR); + } + if (linebreak_pos==-1) { + linebreak_pos=items_read; + } + x->x_textbuf[linebreak_pos-1]='\0'; + if (!(bbuf=binbuf_new())) { + pd_error(x, "out of memory"); + freadln_close(x); + freadln_done(x); + return; + } + binbuf_text(bbuf, x->x_textbuf, linebreak_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); + 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, gensym("list")); - x->x_readybang_outlet = outlet_new(&x->x_ob, gensym("bang")); - x->x_filename=0; - x->x_file=0; - x->x_textbuf=0; - x->x_canvas = canvas_getcurrent(); - return (void *)x; + t_freadln *x = (t_freadln *)pd_new(freadln_class); + x->x_message_outlet = outlet_new(&x->x_ob, gensym("list")); + x->x_readybang_outlet = outlet_new(&x->x_ob, gensym("bang")); + x->x_filename=0; + x->x_file=0; + x->x_textbuf=0; + x->x_canvas = canvas_getcurrent(); + 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); + 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); - zexy_register("freadln"); + zexy_register("freadln"); } |