s_alloc.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "String.h"
  4. #define STRLEN 128
  5. extern void
  6. s_free(String *sp)
  7. {
  8. if (sp == nil)
  9. return;
  10. lock(sp);
  11. if(--(sp->ref) != 0){
  12. unlock(sp);
  13. return;
  14. }
  15. unlock(sp);
  16. if(sp->fixed == 0 && sp->base != nil)
  17. free(sp->base);
  18. free(sp);
  19. }
  20. /* get another reference to a string */
  21. extern String *
  22. s_incref(String *sp)
  23. {
  24. lock(sp);
  25. sp->ref++;
  26. unlock(sp);
  27. return sp;
  28. }
  29. /* allocate a String head */
  30. extern String *
  31. _s_alloc(void)
  32. {
  33. String *s;
  34. s = mallocz(sizeof *s, 1);
  35. if(s == nil)
  36. return s;
  37. s->ref = 1;
  38. s->fixed = 0;
  39. return s;
  40. }
  41. /* create a new `short' String */
  42. extern String *
  43. s_newalloc(int len)
  44. {
  45. String *sp;
  46. sp = _s_alloc();
  47. if(sp == nil)
  48. sysfatal("s_newalloc: %r");
  49. setmalloctag(sp, getcallerpc(&len));
  50. if(len < STRLEN)
  51. len = STRLEN;
  52. sp->base = sp->ptr = malloc(len);
  53. if (sp->base == nil)
  54. sysfatal("s_newalloc: %r");
  55. setmalloctag(sp->base, getcallerpc(&len));
  56. sp->end = sp->base + len;
  57. s_terminate(sp);
  58. return sp;
  59. }
  60. /* create a new `short' String */
  61. extern String *
  62. s_new(void)
  63. {
  64. String *sp;
  65. sp = _s_alloc();
  66. if(sp == nil)
  67. sysfatal("s_new: %r");
  68. sp->base = sp->ptr = malloc(STRLEN);
  69. if (sp->base == nil)
  70. sysfatal("s_new: %r");
  71. sp->end = sp->base + STRLEN;
  72. s_terminate(sp);
  73. return sp;
  74. }