runtime_print.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include "sans.h"
  6. #include "garbagecollector.h"
  7. #include "runtime.h"
  8. #include "symboltable.h"
  9. sdata bltn_newline() {
  10. printf("\n");
  11. return SDBOOL(0);
  12. }
  13. void display_string(sdata ob) {
  14. u len = heap_ref(ob.data.value).data.ivalue;
  15. u i;
  16. sdata c;
  17. for(i=0; i<len; i++){
  18. c = heap_ref(ob.data.value + 1 + i);
  19. printf("%c", (char)c.data.ivalue);
  20. }
  21. }
  22. sdata bltn_display(sdata ob) {
  23. switch (ob.tag) {
  24. case tbool:
  25. if(ob.data.ivalue) {
  26. printf("#t");
  27. } else {
  28. printf("#f");
  29. }
  30. break;
  31. case tchar:
  32. printf("%c", (char)ob.data.ivalue);
  33. break;
  34. case tstrn:
  35. display_string(ob);
  36. break;
  37. case tsymb:
  38. printf("%s", lookup(ob.data.value));
  39. break;
  40. case tnumb:
  41. printf("%lu",ob.data.ivalue);
  42. break;
  43. case tcons:
  44. printf("(");
  45. bltn_display(heap_ref(ob.data.value));
  46. printf(" . ");
  47. bltn_display(heap_ref(ob.data.value+1));
  48. printf(")");
  49. break;
  50. case tnull:
  51. printf("()");
  52. break;
  53. default:
  54. log_err("runtime/bltn_display: cannot print type [%d]\n", ob.tag);
  55. }
  56. return SDBOOL(0);
  57. }
  58. sdata bltn_print(sdata ob) {
  59. bltn_display(ob);
  60. return bltn_newline();
  61. }