180ee5cbfSDavid du Colombier #include <u.h> 280ee5cbfSDavid du Colombier #include <libc.h> 380ee5cbfSDavid du Colombier #include "String.h" 480ee5cbfSDavid du Colombier 580ee5cbfSDavid du Colombier #define STRLEN 128 680ee5cbfSDavid du Colombier 780ee5cbfSDavid du Colombier extern void s_free(String * sp)880ee5cbfSDavid du Colombiers_free(String *sp) 980ee5cbfSDavid du Colombier { 1080ee5cbfSDavid du Colombier if (sp == nil) 1180ee5cbfSDavid du Colombier return; 1280ee5cbfSDavid du Colombier lock(sp); 1380ee5cbfSDavid du Colombier if(--(sp->ref) != 0){ 1480ee5cbfSDavid du Colombier unlock(sp); 1580ee5cbfSDavid du Colombier return; 1680ee5cbfSDavid du Colombier } 1780ee5cbfSDavid du Colombier unlock(sp); 1880ee5cbfSDavid du Colombier 1980ee5cbfSDavid du Colombier if(sp->fixed == 0 && sp->base != nil) 2080ee5cbfSDavid du Colombier free(sp->base); 2180ee5cbfSDavid du Colombier free(sp); 2280ee5cbfSDavid du Colombier } 2380ee5cbfSDavid du Colombier 2480ee5cbfSDavid du Colombier /* get another reference to a string */ 2580ee5cbfSDavid du Colombier extern String * s_incref(String * sp)2680ee5cbfSDavid du Colombiers_incref(String *sp) 2780ee5cbfSDavid du Colombier { 2880ee5cbfSDavid du Colombier lock(sp); 2980ee5cbfSDavid du Colombier sp->ref++; 3080ee5cbfSDavid du Colombier unlock(sp); 3180ee5cbfSDavid du Colombier 3280ee5cbfSDavid du Colombier return sp; 3380ee5cbfSDavid du Colombier } 3480ee5cbfSDavid du Colombier 3580ee5cbfSDavid du Colombier /* allocate a String head */ 3680ee5cbfSDavid du Colombier extern String * _s_alloc(void)3780ee5cbfSDavid du Colombier_s_alloc(void) 3880ee5cbfSDavid du Colombier { 3980ee5cbfSDavid du Colombier String *s; 4080ee5cbfSDavid du Colombier 4180ee5cbfSDavid du Colombier s = mallocz(sizeof *s, 1); 4280ee5cbfSDavid du Colombier if(s == nil) 4380ee5cbfSDavid du Colombier return s; 4480ee5cbfSDavid du Colombier s->ref = 1; 4580ee5cbfSDavid du Colombier s->fixed = 0; 4680ee5cbfSDavid du Colombier return s; 4780ee5cbfSDavid du Colombier } 4880ee5cbfSDavid du Colombier 4980ee5cbfSDavid du Colombier /* create a new `short' String */ 5080ee5cbfSDavid du Colombier extern String * s_newalloc(int len)5180ee5cbfSDavid du Colombiers_newalloc(int len) 5280ee5cbfSDavid du Colombier { 5380ee5cbfSDavid du Colombier String *sp; 5480ee5cbfSDavid du Colombier 5580ee5cbfSDavid du Colombier sp = _s_alloc(); 5680ee5cbfSDavid du Colombier if(sp == nil) 5780ee5cbfSDavid du Colombier sysfatal("s_newalloc: %r"); 58*9a747e4fSDavid du Colombier setmalloctag(sp, getcallerpc(&len)); 5980ee5cbfSDavid du Colombier if(len < STRLEN) 6080ee5cbfSDavid du Colombier len = STRLEN; 6180ee5cbfSDavid du Colombier sp->base = sp->ptr = malloc(len); 6280ee5cbfSDavid du Colombier if (sp->base == nil) 6380ee5cbfSDavid du Colombier sysfatal("s_newalloc: %r"); 64*9a747e4fSDavid du Colombier setmalloctag(sp->base, getcallerpc(&len)); 6580ee5cbfSDavid du Colombier 6680ee5cbfSDavid du Colombier sp->end = sp->base + len; 6780ee5cbfSDavid du Colombier s_terminate(sp); 6880ee5cbfSDavid du Colombier return sp; 6980ee5cbfSDavid du Colombier } 7080ee5cbfSDavid du Colombier 7180ee5cbfSDavid du Colombier /* create a new `short' String */ 7280ee5cbfSDavid du Colombier extern String * s_new(void)7380ee5cbfSDavid du Colombiers_new(void) 7480ee5cbfSDavid du Colombier { 7580ee5cbfSDavid du Colombier String *sp; 7680ee5cbfSDavid du Colombier 7780ee5cbfSDavid du Colombier sp = _s_alloc(); 7880ee5cbfSDavid du Colombier if(sp == nil) 7980ee5cbfSDavid du Colombier sysfatal("s_new: %r"); 8080ee5cbfSDavid du Colombier sp->base = sp->ptr = malloc(STRLEN); 8180ee5cbfSDavid du Colombier if (sp->base == nil) 8280ee5cbfSDavid du Colombier sysfatal("s_new: %r"); 8380ee5cbfSDavid du Colombier sp->end = sp->base + STRLEN; 8480ee5cbfSDavid du Colombier s_terminate(sp); 8580ee5cbfSDavid du Colombier return sp; 8680ee5cbfSDavid du Colombier } 87