|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include "libString.h" | 
|  |  | 
|  | #define STRLEN 128 | 
|  |  | 
|  | extern void | 
|  | s_free(String *sp) | 
|  | { | 
|  | if (sp == nil) | 
|  | return; | 
|  | lock(&sp->lk); | 
|  | if(--(sp->ref) != 0){ | 
|  | unlock(&sp->lk); | 
|  | return; | 
|  | } | 
|  | unlock(&sp->lk); | 
|  |  | 
|  | if(sp->fixed == 0 && sp->base != nil) | 
|  | free(sp->base); | 
|  | free(sp); | 
|  | } | 
|  |  | 
|  | /* get another reference to a string */ | 
|  | extern String * | 
|  | s_incref(String *sp) | 
|  | { | 
|  | lock(&sp->lk); | 
|  | sp->ref++; | 
|  | unlock(&sp->lk); | 
|  |  | 
|  | return sp; | 
|  | } | 
|  |  | 
|  | /* allocate a String head */ | 
|  | extern String * | 
|  | _s_alloc(void) | 
|  | { | 
|  | String *s; | 
|  |  | 
|  | s = mallocz(sizeof *s, 1); | 
|  | if(s == nil) | 
|  | return s; | 
|  | s->ref = 1; | 
|  | s->fixed = 0; | 
|  | return s; | 
|  | } | 
|  |  | 
|  | /* create a new `short' String */ | 
|  | extern String * | 
|  | s_newalloc(int len) | 
|  | { | 
|  | String *sp; | 
|  |  | 
|  | sp = _s_alloc(); | 
|  | if(sp == nil) | 
|  | sysfatal("s_newalloc: %r"); | 
|  | setmalloctag(sp, getcallerpc(&len)); | 
|  | if(len < STRLEN) | 
|  | len = STRLEN; | 
|  | sp->base = sp->ptr = malloc(len); | 
|  | if (sp->base == nil) | 
|  | sysfatal("s_newalloc: %r"); | 
|  | setmalloctag(sp->base, getcallerpc(&len)); | 
|  |  | 
|  | sp->end = sp->base + len; | 
|  | s_terminate(sp); | 
|  | return sp; | 
|  | } | 
|  |  | 
|  | /* create a new `short' String */ | 
|  | extern String * | 
|  | s_new(void) | 
|  | { | 
|  | String *sp; | 
|  |  | 
|  | sp = _s_alloc(); | 
|  | if(sp == nil) | 
|  | sysfatal("s_new: %r"); | 
|  | sp->base = sp->ptr = malloc(STRLEN); | 
|  | if (sp->base == nil) | 
|  | sysfatal("s_new: %r"); | 
|  | sp->end = sp->base + STRLEN; | 
|  | s_terminate(sp); | 
|  | return sp; | 
|  | } |