Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
	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 *
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
}