From fdc892944b6e52e4de44b0cb6f95f2b863724bab Mon Sep 17 00:00:00 2001 From: musil Date: Wed, 4 Jan 2006 01:05:17 +0000 Subject: new malloc svn path=/trunk/externals/iemlib/; revision=4356 --- src/iemlib2/splitfilename.c | 213 +++++++++++++++++++++----------------------- 1 file changed, 102 insertions(+), 111 deletions(-) (limited to 'src/iemlib2/splitfilename.c') diff --git a/src/iemlib2/splitfilename.c b/src/iemlib2/splitfilename.c index 5f009c8..5f8bf1a 100644 --- a/src/iemlib2/splitfilename.c +++ b/src/iemlib2/splitfilename.c @@ -24,131 +24,122 @@ static t_class *splitfilename_class; typedef struct _splitfilename { - t_object x_obj; - char x_sep[2]; - void *x_outpath; - void *x_outfile; + t_object x_obj; + char x_sep[2]; + char *x_mem; + t_int x_size; + t_outlet *x_outpath; + t_outlet *x_outfile; } t_splitfilename; static void splitfilename_separator(t_splitfilename *x, t_symbol *s, int ac, t_atom *av) { - if(ac > 0) - { - if(IS_A_SYMBOL(av, 0)) - { - if(strlen(av->a_w.w_symbol->s_name) == 1) - x->x_sep[0] = av->a_w.w_symbol->s_name[0]; - else if(!strcmp(av->a_w.w_symbol->s_name, "backslash")) - x->x_sep[0] = '\\'; - else if(!strcmp(av->a_w.w_symbol->s_name, "slash")) - x->x_sep[0] = '/'; - else if(!strcmp(av->a_w.w_symbol->s_name, "blank")) - x->x_sep[0] = ' '; - else if(!strcmp(av->a_w.w_symbol->s_name, "space")) - x->x_sep[0] = ' '; - else if(!strcmp(av->a_w.w_symbol->s_name, "dollar")) - x->x_sep[0] = '$'; - else if(!strcmp(av->a_w.w_symbol->s_name, "comma")) - x->x_sep[0] = ','; - else if(!strcmp(av->a_w.w_symbol->s_name, "semi")) - x->x_sep[0] = ';'; - else if(!strcmp(av->a_w.w_symbol->s_name, "leftbrace")) - x->x_sep[0] = '{'; - else if(!strcmp(av->a_w.w_symbol->s_name, "rightbrace")) - x->x_sep[0] = '}'; - else - x->x_sep[0] = '/'; - } - else if(IS_A_FLOAT(av, 0)) - { - int i; - float f=fabs(av->a_w.w_float); - - while(f >= 10.0) - f *= 0.1; - i = (int)f; - x->x_sep[0] = (char)i + '0'; - } - } - else - x->x_sep[0] = 0; + if(ac > 0) + { + if(IS_A_SYMBOL(av, 0)) + { + char *name=av->a_w.w_symbol->s_name; + + if(strlen(name) == 1) + x->x_sep[0] = name[0]; + else if(!strcmp(name, "backslash")) + x->x_sep[0] = '\\'; + else if(!strcmp(name, "slash")) + x->x_sep[0] = '/'; + else if(!strcmp(name, "blank")) + x->x_sep[0] = ' '; + else if(!strcmp(name, "space")) + x->x_sep[0] = ' '; + else if(!strcmp(name, "dollar")) + x->x_sep[0] = '$'; + else if(!strcmp(name, "comma")) + x->x_sep[0] = ','; + else if(!strcmp(name, "semi")) + x->x_sep[0] = ';'; + else if(!strcmp(name, "leftbrace")) + x->x_sep[0] = '{'; + else if(!strcmp(name, "rightbrace")) + x->x_sep[0] = '}'; + else + x->x_sep[0] = '/'; + } + else if(IS_A_FLOAT(av, 0)) + { + t_int i=atom_getintarg(0, ac, av); + + x->x_sep[0] = (char)i + '0';/* you can set any separator-char by setting a number between -32 ... 223 */ + } + } + else + x->x_sep[0] = 0; } static void splitfilename_symbol(t_splitfilename *x, t_symbol *s) { - int len = strlen(s->s_name); - - if(len) - { - if(x->x_sep[0] != 0) - { - char *str_path = (char *)getbytes(len*sizeof(char)); - char *str_file = (char *)getbytes(len*sizeof(char)); - char *cpp, *cpf; - - strcpy(str_path, s->s_name); - strcpy(str_file, s->s_name); - cpp = strrchr(str_path, x->x_sep[0]); - cpf = strrchr(str_file, x->x_sep[0]); - if(!cpp) /* JMZ: 20050701 */ - { - outlet_symbol(x->x_outfile, gensym(str_file)); - outlet_symbol(x->x_outpath, &s_); - } - else if (!cpf) /* JMZ: 20050701 */ - { - outlet_symbol(x->x_outfile, &s_); - outlet_symbol(x->x_outpath, gensym(str_path)); - } - else if((cpp - str_path) < 0) /* JMZ:removed typecast (char*) to (int); this is not portable */ - { - outlet_symbol(x->x_outfile, gensym(str_file)); - outlet_symbol(x->x_outpath, &s_); - } - else if((cpp - str_path) >= len) /* JMZ: removed typecast (char*) to (int) */ - { - outlet_symbol(x->x_outfile, &s_); - outlet_symbol(x->x_outpath, gensym(str_path)); - } - else - { - *cpp = 0; - cpf++; - outlet_symbol(x->x_outfile, gensym(cpf)); - outlet_symbol(x->x_outpath, gensym(str_path)); - } - freebytes(str_file, len*sizeof(char)); - freebytes(str_path, len*sizeof(char)); - } - else - { - outlet_symbol(x->x_outfile, &s_); - outlet_symbol(x->x_outpath, s); - } - } + t_int length = strlen(s->s_name); + + if(length) + { + if(x->x_sep[0]) + { + char *sep_ptr=x->x_mem; + + if(length > x->x_size) + { + x->x_mem = (char *)resizebytes(x->x_mem, x->x_size*sizeof(char), (length+100)*sizeof(char)); + x->x_size = length + 100; + } + strcpy(x->x_mem, s->s_name); + sep_ptr = strrchr(x->x_mem, x->x_sep[0]);/* points to the leftest separator-char-index of string */ + if((!sep_ptr) || ((sep_ptr - x->x_mem) < 0) || ((sep_ptr - x->x_mem) >= length)) + { /* JMZ: 20050701 : removed typecast (char*) to (int); this is not portable */ + outlet_symbol(x->x_outfile, &s_); + outlet_symbol(x->x_outpath, gensym(x->x_mem)); + } + else + { + *sep_ptr = 0; + sep_ptr++; + outlet_symbol(x->x_outfile, gensym(sep_ptr)); + outlet_symbol(x->x_outpath, gensym(x->x_mem)); + } + } + else + { + outlet_symbol(x->x_outfile, &s_); + outlet_symbol(x->x_outpath, s); + } + } +} + +static void splitfilename_free(t_splitfilename *x) +{ + freebytes(x->x_mem, x->x_size*sizeof(char)); } static void *splitfilename_new(t_symbol *s, int ac, t_atom *av) { - t_splitfilename *x = (t_splitfilename *)pd_new(splitfilename_class); - - x->x_sep[0] = 0; - x->x_sep[1] = 0; - if(ac == 0) - x->x_sep[0] = '/'; - else - splitfilename_separator(x, s, ac, av); - x->x_outpath = outlet_new(&x->x_obj, &s_symbol); - x->x_outfile = outlet_new(&x->x_obj, &s_symbol); - return (x); + t_splitfilename *x = (t_splitfilename *)pd_new(splitfilename_class); + + x->x_sep[0] = 0; + x->x_sep[1] = 0; + if(ac == 0) + x->x_sep[0] = '/'; + else + splitfilename_separator(x, s, ac, av); + x->x_size = 400; + x->x_mem = (char *)getbytes(x->x_size*sizeof(char)); + x->x_outpath = (t_outlet *)outlet_new(&x->x_obj, &s_symbol); + x->x_outfile = (t_outlet *)outlet_new(&x->x_obj, &s_symbol); + return (x); } void splitfilename_setup(void) { - splitfilename_class = class_new(gensym("splitfilename"), (t_newmethod)splitfilename_new, - 0, sizeof(t_splitfilename), 0, A_GIMME, 0); - class_addsymbol(splitfilename_class, splitfilename_symbol); - class_addmethod(splitfilename_class, (t_method)splitfilename_separator, gensym("separator"), A_GIMME, 0); - class_addmethod(splitfilename_class, (t_method)splitfilename_separator, gensym("sep"), A_GIMME, 0); - class_sethelpsymbol(splitfilename_class, gensym("iemhelp/help-splitfilename")); + splitfilename_class = class_new(gensym("splitfilename"), (t_newmethod)splitfilename_new, + 0, sizeof(t_splitfilename), 0, A_GIMME, 0); + class_addsymbol(splitfilename_class, splitfilename_symbol); + class_addmethod(splitfilename_class, (t_method)splitfilename_separator, gensym("separator"), A_GIMME, 0); + class_addmethod(splitfilename_class, (t_method)splitfilename_separator, gensym("sep"), A_GIMME, 0); + class_sethelpsymbol(splitfilename_class, gensym("iemhelp/help-splitfilename")); } -- cgit v1.2.1