blob: 34f8916422c1419579c2721fdabf2618b90bde74 [file] [log] [blame]
rsc7f111042003-12-11 18:15:57 +00001#include <u.h>
2#include <libc.h>
3#include "libString.h"
4
5#define STRLEN 128
6
7extern void
8s_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);
18
19 if(sp->fixed == 0 && sp->base != nil)
20 free(sp->base);
21 free(sp);
22}
23
24/* get another reference to a string */
25extern String *
26s_incref(String *sp)
27{
28 lock(&sp->lk);
29 sp->ref++;
30 unlock(&sp->lk);
31
32 return sp;
33}
34
35/* allocate a String head */
36extern String *
37_s_alloc(void)
38{
39 String *s;
40
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}
48
49/* create a new `short' String */
50extern String *
51s_newalloc(int len)
52{
53 String *sp;
54
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));
65
66 sp->end = sp->base + len;
67 s_terminate(sp);
68 return sp;
69}
70
71/* create a new `short' String */
72extern String *
73s_new(void)
74{
75 String *sp;
76
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}