| #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; |
| } |