xref: /plan9/sys/src/libString/s_alloc.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
180ee5cbfSDavid du Colombier #include <u.h>
280ee5cbfSDavid du Colombier #include <libc.h>
380ee5cbfSDavid du Colombier #include "String.h"
480ee5cbfSDavid du Colombier 
580ee5cbfSDavid du Colombier #define STRLEN 128
680ee5cbfSDavid du Colombier 
780ee5cbfSDavid du Colombier extern void
s_free(String * sp)880ee5cbfSDavid du Colombier s_free(String *sp)
980ee5cbfSDavid du Colombier {
1080ee5cbfSDavid du Colombier 	if (sp == nil)
1180ee5cbfSDavid du Colombier 		return;
1280ee5cbfSDavid du Colombier 	lock(sp);
1380ee5cbfSDavid du Colombier 	if(--(sp->ref) != 0){
1480ee5cbfSDavid du Colombier 		unlock(sp);
1580ee5cbfSDavid du Colombier 		return;
1680ee5cbfSDavid du Colombier 	}
1780ee5cbfSDavid du Colombier 	unlock(sp);
1880ee5cbfSDavid du Colombier 
1980ee5cbfSDavid du Colombier 	if(sp->fixed == 0 && sp->base != nil)
2080ee5cbfSDavid du Colombier 		free(sp->base);
2180ee5cbfSDavid du Colombier 	free(sp);
2280ee5cbfSDavid du Colombier }
2380ee5cbfSDavid du Colombier 
2480ee5cbfSDavid du Colombier /* get another reference to a string */
2580ee5cbfSDavid du Colombier extern String *
s_incref(String * sp)2680ee5cbfSDavid du Colombier s_incref(String *sp)
2780ee5cbfSDavid du Colombier {
2880ee5cbfSDavid du Colombier 	lock(sp);
2980ee5cbfSDavid du Colombier 	sp->ref++;
3080ee5cbfSDavid du Colombier 	unlock(sp);
3180ee5cbfSDavid du Colombier 
3280ee5cbfSDavid du Colombier 	return sp;
3380ee5cbfSDavid du Colombier }
3480ee5cbfSDavid du Colombier 
3580ee5cbfSDavid du Colombier /* allocate a String head */
3680ee5cbfSDavid du Colombier extern String *
_s_alloc(void)3780ee5cbfSDavid du Colombier _s_alloc(void)
3880ee5cbfSDavid du Colombier {
3980ee5cbfSDavid du Colombier 	String *s;
4080ee5cbfSDavid du Colombier 
4180ee5cbfSDavid du Colombier 	s = mallocz(sizeof *s, 1);
4280ee5cbfSDavid du Colombier 	if(s == nil)
4380ee5cbfSDavid du Colombier 		return s;
4480ee5cbfSDavid du Colombier 	s->ref = 1;
4580ee5cbfSDavid du Colombier 	s->fixed = 0;
4680ee5cbfSDavid du Colombier 	return s;
4780ee5cbfSDavid du Colombier }
4880ee5cbfSDavid du Colombier 
4980ee5cbfSDavid du Colombier /* create a new `short' String */
5080ee5cbfSDavid du Colombier extern String *
s_newalloc(int len)5180ee5cbfSDavid du Colombier s_newalloc(int len)
5280ee5cbfSDavid du Colombier {
5380ee5cbfSDavid du Colombier 	String *sp;
5480ee5cbfSDavid du Colombier 
5580ee5cbfSDavid du Colombier 	sp = _s_alloc();
5680ee5cbfSDavid du Colombier 	if(sp == nil)
5780ee5cbfSDavid du Colombier 		sysfatal("s_newalloc: %r");
58*9a747e4fSDavid du Colombier 	setmalloctag(sp, getcallerpc(&len));
5980ee5cbfSDavid du Colombier 	if(len < STRLEN)
6080ee5cbfSDavid du Colombier 		len = STRLEN;
6180ee5cbfSDavid du Colombier 	sp->base = sp->ptr = malloc(len);
6280ee5cbfSDavid du Colombier 	if (sp->base == nil)
6380ee5cbfSDavid du Colombier 		sysfatal("s_newalloc: %r");
64*9a747e4fSDavid du Colombier 	setmalloctag(sp->base, getcallerpc(&len));
6580ee5cbfSDavid du Colombier 
6680ee5cbfSDavid du Colombier 	sp->end = sp->base + len;
6780ee5cbfSDavid du Colombier 	s_terminate(sp);
6880ee5cbfSDavid du Colombier 	return sp;
6980ee5cbfSDavid du Colombier }
7080ee5cbfSDavid du Colombier 
7180ee5cbfSDavid du Colombier /* create a new `short' String */
7280ee5cbfSDavid du Colombier extern String *
s_new(void)7380ee5cbfSDavid du Colombier s_new(void)
7480ee5cbfSDavid du Colombier {
7580ee5cbfSDavid du Colombier 	String *sp;
7680ee5cbfSDavid du Colombier 
7780ee5cbfSDavid du Colombier 	sp = _s_alloc();
7880ee5cbfSDavid du Colombier 	if(sp == nil)
7980ee5cbfSDavid du Colombier 		sysfatal("s_new: %r");
8080ee5cbfSDavid du Colombier 	sp->base = sp->ptr = malloc(STRLEN);
8180ee5cbfSDavid du Colombier 	if (sp->base == nil)
8280ee5cbfSDavid du Colombier 		sysfatal("s_new: %r");
8380ee5cbfSDavid du Colombier 	sp->end = sp->base + STRLEN;
8480ee5cbfSDavid du Colombier 	s_terminate(sp);
8580ee5cbfSDavid du Colombier 	return sp;
8680ee5cbfSDavid du Colombier }
87