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