symbol.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // The symbol table is a simple array of struct U.
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. // put symbol at index n
  5. void
  6. std_symbol(char *s, int n)
  7. {
  8. U *p;
  9. p = symtab + n;
  10. p->u.printname = s;
  11. }
  12. // symbol lookup, create symbol if need be
  13. U *
  14. usr_symbol(char *s)
  15. {
  16. int i;
  17. U *p;
  18. for (i = 0; i < NSYM; i++) {
  19. if (symtab[i].u.printname == 0)
  20. break;
  21. if (strcmp(s, symtab[i].u.printname) == 0)
  22. return symtab + i;
  23. }
  24. if (i == NSYM)
  25. stop("symbol table overflow");
  26. p = symtab + i;
  27. p->u.printname = (char *)malloc(strlen(s)+1);
  28. strcpy(p->u.printname,s);
  29. return p;
  30. }
  31. // get the symbol's printname
  32. char *
  33. get_printname(U *p)
  34. {
  35. if (p->k != SYM)
  36. stop("symbol error");
  37. return p->u.printname;
  38. }
  39. // clears the arglist too
  40. void
  41. set_binding(U *p, U *q)
  42. {
  43. if (p->k != SYM)
  44. stop("symbol error");
  45. binding[p - symtab] = q;
  46. arglist[p - symtab] = symbol(NIL);
  47. }
  48. U *
  49. get_binding(U *p)
  50. {
  51. if (p->k != SYM)
  52. stop("symbol error");
  53. return binding[p - symtab];
  54. }
  55. void
  56. set_binding_and_arglist(U *p, U *q, U *r)
  57. {
  58. if (p->k != SYM)
  59. stop("symbol error");
  60. binding[p - symtab] = q;
  61. arglist[p - symtab] = r;
  62. }
  63. U *
  64. get_arglist(U *p)
  65. {
  66. if (p->k != SYM)
  67. stop("symbol error");
  68. return arglist[p - symtab];
  69. }
  70. // get symbol's number from ptr
  71. int
  72. symnum(U *p)
  73. {
  74. if (p->k != SYM)
  75. stop("symbol error");
  76. return (int) (p - symtab);
  77. }
  78. // push indexed symbol
  79. void
  80. push_symbol(int k)
  81. {
  82. push(symtab + k);
  83. }
  84. void
  85. clear_symbols(void)
  86. {
  87. int i;
  88. for (i = 0; i < NSYM; i++) {
  89. binding[i] = symtab + i;
  90. arglist[i] = symbol(NIL);
  91. }
  92. }