Blob
1 #include <u.h>2 #include <libc.h>3 #include "libString.h"5 #define STRLEN 1287 extern void8 s_free(String *sp)9 {10 if (sp == nil)11 return;12 lock(&sp->lk);13 if(--(sp->ref) != 0){14 unlock(&sp->lk);15 return;16 }17 unlock(&sp->lk);19 if(sp->fixed == 0 && sp->base != nil)20 free(sp->base);21 free(sp);22 }24 /* get another reference to a string */25 extern String *26 s_incref(String *sp)27 {28 lock(&sp->lk);29 sp->ref++;30 unlock(&sp->lk);32 return sp;33 }35 /* allocate a String head */36 extern String *37 _s_alloc(void)38 {39 String *s;41 s = mallocz(sizeof *s, 1);42 if(s == nil)43 return s;44 s->ref = 1;45 s->fixed = 0;46 return s;47 }49 /* create a new `short' String */50 extern String *51 s_newalloc(int len)52 {53 String *sp;55 sp = _s_alloc();56 if(sp == nil)57 sysfatal("s_newalloc: %r");58 setmalloctag(sp, getcallerpc(&len));59 if(len < STRLEN)60 len = STRLEN;61 sp->base = sp->ptr = malloc(len);62 if (sp->base == nil)63 sysfatal("s_newalloc: %r");64 setmalloctag(sp->base, getcallerpc(&len));66 sp->end = sp->base + len;67 s_terminate(sp);68 return sp;69 }71 /* create a new `short' String */72 extern String *73 s_new(void)74 {75 String *sp;77 sp = _s_alloc();78 if(sp == nil)79 sysfatal("s_new: %r");80 sp->base = sp->ptr = malloc(STRLEN);81 if (sp->base == nil)82 sysfatal("s_new: %r");83 sp->end = sp->base + STRLEN;84 s_terminate(sp);85 return sp;86 }