var.c 1.3 KB

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