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 if(len < STRLEN) 59 len = STRLEN; 60 sp->base = sp->ptr = malloc(len); 61 if (sp->base == nil) 62 sysfatal("s_newalloc: %r"); 63 64 sp->end = sp->base + len; 65 s_terminate(sp); 66 return sp; 67 } 68 69 /* create a new `short' String */ 70 extern String * 71 s_new(void) 72 { 73 String *sp; 74 75 sp = _s_alloc(); 76 if(sp == nil) 77 sysfatal("s_new: %r"); 78 sp->base = sp->ptr = malloc(STRLEN); 79 if (sp->base == nil) 80 sysfatal("s_new: %r"); 81 sp->end = sp->base + STRLEN; 82 s_terminate(sp); 83 return sp; 84 } 85