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