allocator.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "objects.h"
  5. #include "allocator.h"
  6. struct list *objects;
  7. void
  8. objects_push(scm *obj)
  9. {
  10. struct list *link = malloc(sizeof(struct list));
  11. link->object = obj;
  12. link->next = objects;
  13. if (objects) {
  14. objects->prev = link;
  15. }
  16. objects = link;
  17. }
  18. scm *
  19. allocate(scm len)
  20. {
  21. scm *p;
  22. // TODO:
  23. p = calloc(len, sizeof(scm));
  24. objects_push(p);
  25. return p;
  26. }
  27. scm
  28. allocate_strg(char *str, scm len)
  29. {
  30. scm padded_len;
  31. scm *p;
  32. char *dst;
  33. padded_len = (len + 1 + 8)/8;
  34. p = allocate(padded_len + 2);
  35. p[0] = make_hdr(HDR_WHITE, padded_len + 1, 0);
  36. p[1] = len;
  37. dst = (void*)(p+2);
  38. if (str)
  39. strncpy(dst, str, len);
  40. return scm_puttag(p, TAG_STRG);
  41. }
  42. scm
  43. allocate_cons(scm car, scm cdr)
  44. {
  45. scm *p;
  46. p = allocate(3);
  47. p[0] = make_hdr(HDR_WHITE, 0, 2);
  48. p[1] = car;
  49. p[2] = cdr;
  50. return scm_puttag(p, TAG_CONS);
  51. }
  52. scm
  53. allocate_vect(scm len, scm val)
  54. {
  55. scm *p;
  56. scm i;
  57. p = allocate(len + 1);
  58. p[0] = make_hdr(HDR_WHITE, 0, len);
  59. for (i = 0; i < len; i++) {
  60. p[1 + i] = val;
  61. }
  62. return scm_puttag(p, TAG_VECT);
  63. }
  64. scm
  65. allocate_clos(scm *lbl, scm len)
  66. {
  67. scm *p;
  68. p = allocate(len + 2);
  69. p[0] = make_hdr(HDR_WHITE, 1, len);
  70. p[1] = SCM_PTR(lbl);
  71. // the rest are #f because calloc sets them to 0
  72. return scm_puttag(p, TAG_CLOS);
  73. }