xref: /plan9/sys/src/libString/s_alloc.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 #include <u.h>
2 #include <libc.h>
3 #include "String.h"
4 
5 #define STRLEN 128
6 
7 extern void
s_free(String * sp)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 *
s_incref(String * sp)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 *
_s_alloc(void)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 *
s_newalloc(int len)51 s_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 */
72 extern String *
s_new(void)73 s_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 }
87