var.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "rc.h"
  2. #include "exec.h"
  3. #include "fns.h"
  4. int
  5. hash(char *s, int n)
  6. {
  7. int h = 0, i = 1;
  8. while(*s) h+=*s++*i++;
  9. h%=n;
  10. return h<0?h+n:h;
  11. }
  12. #define NKW 30
  13. struct kw{
  14. char *name;
  15. int type;
  16. struct kw *next;
  17. }*kw[NKW];
  18. void
  19. kenter(int type, char *name)
  20. {
  21. int h = hash(name, NKW);
  22. struct kw *p = new(struct kw);
  23. p->type = type;
  24. p->name = name;
  25. p->next = kw[h];
  26. kw[h] = p;
  27. }
  28. void
  29. kinit(void)
  30. {
  31. kenter(FOR, "for");
  32. kenter(IN, "in");
  33. kenter(WHILE, "while");
  34. kenter(IF, "if");
  35. kenter(NOT, "not");
  36. kenter(TWIDDLE, "~");
  37. kenter(BANG, "!");
  38. kenter(SUBSHELL, "@");
  39. kenter(SWITCH, "switch");
  40. kenter(FN, "fn");
  41. }
  42. tree*
  43. klook(char *name)
  44. {
  45. struct kw *p;
  46. tree *t = token(name, WORD);
  47. for(p = kw[hash(name, NKW)];p;p = p->next)
  48. if(strcmp(p->name, name)==0){
  49. t->type = p->type;
  50. t->iskw = 1;
  51. break;
  52. }
  53. return t;
  54. }
  55. var*
  56. gvlook(char *name)
  57. {
  58. int h = hash(name, NVAR);
  59. var *v;
  60. for(v = gvar[h];v;v = v->next) if(strcmp(v->name, name)==0) return v;
  61. return gvar[h] = newvar(strdup(name), gvar[h]);
  62. }
  63. var*
  64. vlook(char *name)
  65. {
  66. var *v;
  67. if(runq)
  68. for(v = runq->local;v;v = v->next)
  69. if(strcmp(v->name, name)==0) return v;
  70. return gvlook(name);
  71. }
  72. void
  73. setvar(char *name, word *val)
  74. {
  75. struct var *v = vlook(name);
  76. freewords(v->val);
  77. v->val = val;
  78. v->changed = 1;
  79. }