Blame


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"
4 7f11104a 2003-12-11 devnull
5 7f11104a 2003-12-11 devnull #define STRLEN 128
6 7f11104a 2003-12-11 devnull
7 7f11104a 2003-12-11 devnull extern void
8 7f11104a 2003-12-11 devnull s_free(String *sp)
9 7f11104a 2003-12-11 devnull {
10 7f11104a 2003-12-11 devnull if (sp == nil)
11 7f11104a 2003-12-11 devnull return;
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);
15 7f11104a 2003-12-11 devnull return;
16 7f11104a 2003-12-11 devnull }
17 7f11104a 2003-12-11 devnull unlock(&sp->lk);
18 7f11104a 2003-12-11 devnull
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);
22 7f11104a 2003-12-11 devnull }
23 7f11104a 2003-12-11 devnull
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)
27 7f11104a 2003-12-11 devnull {
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);
31 7f11104a 2003-12-11 devnull
32 7f11104a 2003-12-11 devnull return sp;
33 7f11104a 2003-12-11 devnull }
34 7f11104a 2003-12-11 devnull
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)
38 7f11104a 2003-12-11 devnull {
39 7f11104a 2003-12-11 devnull String *s;
40 7f11104a 2003-12-11 devnull
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;
47 7f11104a 2003-12-11 devnull }
48 7f11104a 2003-12-11 devnull
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)
52 7f11104a 2003-12-11 devnull {
53 7f11104a 2003-12-11 devnull String *sp;
54 7f11104a 2003-12-11 devnull
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));
65 7f11104a 2003-12-11 devnull
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;
69 7f11104a 2003-12-11 devnull }
70 7f11104a 2003-12-11 devnull
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)
74 7f11104a 2003-12-11 devnull {
75 7f11104a 2003-12-11 devnull String *sp;
76 7f11104a 2003-12-11 devnull
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;
86 7f11104a 2003-12-11 devnull }