Blob


1 #include <u.h>
2 #include <libc.h>
3 #include "libString.h"
5 #define STRLEN 128
7 extern void
8 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 }