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)8s_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)26s_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)51s_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)73s_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