xref: /plan9-contrib/sys/src/libString/s_alloc.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
1 #include <u.h>
2 #include <libc.h>
3 #include "String.h"
4 
5 #define STRLEN 128
6 
7 extern void
8 s_free(String *sp)
9 {
10 	if (sp == nil)
11 		return;
12 	lock(sp);
13 	if(--(sp->ref) != 0){
14 		unlock(sp);
15 		return;
16 	}
17 	unlock(sp);
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 */
25 extern String *
26 s_incref(String *sp)
27 {
28 	lock(sp);
29 	sp->ref++;
30 	unlock(sp);
31 
32 	return sp;
33 }
34 
35 /* allocate a String head */
36 extern 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 */
50 extern String *
51 s_newalloc(int len)
52 {
53 	String *sp;
54 
55 	sp = _s_alloc();
56 	if(sp == nil)
57 		sysfatal("s_newalloc: %r");
58 	if(len < STRLEN)
59 		len = STRLEN;
60 	sp->base = sp->ptr = malloc(len);
61 	if (sp->base == nil)
62 		sysfatal("s_newalloc: %r");
63 
64 	sp->end = sp->base + len;
65 	s_terminate(sp);
66 	return sp;
67 }
68 
69 /* create a new `short' String */
70 extern String *
71 s_new(void)
72 {
73 	String *sp;
74 
75 	sp = _s_alloc();
76 	if(sp == nil)
77 		sysfatal("s_new: %r");
78 	sp->base = sp->ptr = malloc(STRLEN);
79 	if (sp->base == nil)
80 		sysfatal("s_new: %r");
81 	sp->end = sp->base + STRLEN;
82 	s_terminate(sp);
83 	return sp;
84 }
85