plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

s_alloc.c (1305B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include "libString.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->lk);
     13 	if(--(sp->ref) != 0){
     14 		unlock(&sp->lk);
     15 		return;
     16 	}
     17 	unlock(&sp->lk);
     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->lk);
     29 	sp->ref++;
     30 	unlock(&sp->lk);
     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 }