tags.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include <assert.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include "tags.h"
  5. #include "headers.h"
  6. scm scm_get_tag(scm s) {
  7. if(s & 0b111) return s & 0b111;
  8. return s & 0b111111;
  9. }
  10. scm mk_fals() { return atom_tag_fals; }
  11. scm mk_true() { return atom_tag_true; }
  12. scm mk_bool(scm b) {
  13. return b ? mk_true() : mk_fals();
  14. }
  15. scm mk_null() { return atom_tag_null; }
  16. scm mk_symb(scm id) {
  17. assert(id < ((scm)1 << (64-6)));
  18. return (id << 6) |
  19. atom_tag_symb;
  20. }
  21. scm mk_char(char ch) {
  22. //assert(ch < ((scm)1 << (64-6)));
  23. return (ch << 6) |
  24. atom_tag_char;
  25. }
  26. scm mk_numb(num nm) {
  27. //assert(nm < ((scm)1 << (64-6)));
  28. return (nm << 6) |
  29. tag_numb;
  30. }
  31. scm mk_cons(scm *p) {
  32. return ((scm)p) |
  33. tag_cons;
  34. }
  35. scm mk_clos(scm *p) {
  36. return ((scm)p) |
  37. tag_clos;
  38. }
  39. scm mk_vect(scm *p) {
  40. return ((scm)p) |
  41. tag_vect;
  42. }
  43. scm mk_strn(scm *p) {
  44. return ((scm)p) |
  45. tag_strn;
  46. }
  47. scm get_symb(scm s) {
  48. assert(scm_get_tag(s) == atom_tag_symb);
  49. return s >> 6;
  50. }
  51. char get_char(scm s) {
  52. assert(scm_get_tag(s) == atom_tag_char);
  53. return s >> 6;
  54. }
  55. num get_numb(scm s) {
  56. assert(scm_get_tag(s) == tag_numb);
  57. return ((num)s) >> 6;
  58. }
  59. scm *get_cons(scm s) {
  60. assert(scm_get_tag(s) == tag_cons);
  61. return (scm*)(s & ~0b111);
  62. }
  63. scm get_cons_car(scm s) {
  64. scm *p = get_cons(s);
  65. return p[1];
  66. }
  67. scm get_cons_cdr(scm s) {
  68. scm *p = get_cons(s);
  69. return p[2];
  70. }
  71. void set_cons_car(scm s, scm x) {
  72. scm *p = get_cons(s);
  73. p[1] = x;
  74. }
  75. void set_cons_cdr(scm s, scm x) {
  76. scm *p = get_cons(s);
  77. p[2] = x;
  78. }
  79. scm *get_clos(scm s) {
  80. assert(scm_get_tag(s) == tag_clos);
  81. return (scm*)(s & ~0b111);
  82. }
  83. scm *get_vect(scm s) {
  84. assert(scm_get_tag(s) == tag_vect);
  85. return (scm*)(s & ~0b111);
  86. }
  87. scm *get_strn(scm s) {
  88. assert(scm_get_tag(s) == tag_strn);
  89. return (scm*)(s & ~0b111);
  90. }
  91. scm get_strn_len(scm s) {
  92. scm *p;
  93. p = get_strn(s);
  94. return p[1];
  95. }
  96. unsigned char *get_strn_data(scm s) {
  97. scm *p;
  98. p = get_strn(s);
  99. return (void*)(p+2);
  100. }
  101. scm clos_lbl(scm clo) {
  102. scm *ptr;
  103. ptr = get_clos(clo);
  104. return ptr[1];
  105. }
  106. scm clos_env_ref(scm clo, scm idx) {
  107. scm *ptr;
  108. scm hdr;
  109. ptr = get_clos(clo);
  110. hdr = ptr[0];
  111. assert(header_raw_size(hdr) == 1);
  112. if(idx < header_scm_size(hdr)) {
  113. return ptr[2 + idx];
  114. }
  115. else {
  116. fprintf(stderr, "env register index out of range %ld\n", idx);
  117. exit(-1);
  118. }
  119. }
  120. void clos_set_env(scm clo, scm idx, scm obj) {
  121. scm *ptr;
  122. scm hdr;
  123. ptr = get_clos(clo);
  124. hdr = ptr[0];
  125. assert(header_raw_size(hdr) == 1);
  126. if(idx < header_scm_size(hdr)) {
  127. ptr[2 + idx] = obj;
  128. }
  129. else {
  130. fprintf(stderr, "env register index out of range %ld\n", idx);
  131. exit(-1);
  132. }
  133. }