finsh_node.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include <finsh.h>
  2. #include "finsh_node.h"
  3. #include "finsh_error.h"
  4. #include "finsh_var.h"
  5. #include "finsh_heap.h"
  6. struct finsh_node global_node_table[FINSH_NODE_MAX];
  7. int finsh_node_init()
  8. {
  9. memset(global_node_table, 0, sizeof(global_node_table));
  10. return 0;
  11. }
  12. struct finsh_node* finsh_node_allocate(u_char type)
  13. {
  14. int i;
  15. /* find an empty entry */
  16. for (i = 0; i < FINSH_NODE_MAX; i ++)
  17. {
  18. if (global_node_table[i].node_type == FINSH_NODE_UNKNOWN) break;
  19. }
  20. if (i == FINSH_NODE_MAX) return NULL;
  21. /* fill type field */
  22. global_node_table[i].node_type = type;
  23. /* return this allocated node */
  24. return &global_node_table[i];
  25. }
  26. struct finsh_node* finsh_node_new_id(char* id)
  27. {
  28. struct finsh_node* node;
  29. void* symbol;
  30. unsigned char type;
  31. symbol = NULL;
  32. type = 0;
  33. node = NULL;
  34. /* lookup variable firstly */
  35. symbol = (void*)finsh_var_lookup(id);
  36. if (symbol == NULL)
  37. {
  38. /* then lookup system variable */
  39. symbol = (void*)finsh_sysvar_lookup(id);
  40. if (symbol == NULL)
  41. {
  42. /* then lookup system call */
  43. symbol = (void*)finsh_syscall_lookup(id);
  44. if (symbol != NULL) type = FINSH_IDTYPE_SYSCALL;
  45. }
  46. else type = FINSH_IDTYPE_SYSVAR;
  47. }
  48. else type = FINSH_IDTYPE_VAR;
  49. if (symbol != NULL)
  50. {
  51. /* allocate a new node */
  52. node = finsh_node_allocate(FINSH_NODE_ID);
  53. /* allocate node error */
  54. if (node == NULL)
  55. {
  56. finsh_error_set(FINSH_ERROR_MEMORY_FULL);
  57. return NULL;
  58. }
  59. /* fill node value according type */
  60. switch (type)
  61. {
  62. case FINSH_IDTYPE_VAR:
  63. node->id.var = (struct finsh_var*)symbol;
  64. break;
  65. case FINSH_IDTYPE_SYSVAR:
  66. node->id.sysvar = (struct finsh_sysvar*)symbol;
  67. break;
  68. case FINSH_IDTYPE_SYSCALL:
  69. node->id.syscall = (struct finsh_syscall*)symbol;
  70. break;
  71. }
  72. /* fill identifier type */
  73. node->idtype = type;
  74. }
  75. else finsh_error_set(FINSH_ERROR_UNKNOWN_SYMBOL);
  76. return node;
  77. }
  78. struct finsh_node* finsh_node_new_char(char c)
  79. {
  80. struct finsh_node* node;
  81. node = finsh_node_allocate(FINSH_NODE_VALUE_CHAR);
  82. if (node == NULL)
  83. {
  84. finsh_error_set(FINSH_ERROR_MEMORY_FULL);
  85. return NULL;
  86. }
  87. node->value.char_value = c;
  88. return node;
  89. }
  90. struct finsh_node* finsh_node_new_int(int i)
  91. {
  92. struct finsh_node* node;
  93. node = finsh_node_allocate(FINSH_NODE_VALUE_INT);
  94. if (node == NULL)
  95. {
  96. finsh_error_set(FINSH_ERROR_MEMORY_FULL);
  97. return NULL;
  98. }
  99. node->value.int_value = i;
  100. return node;
  101. }
  102. struct finsh_node* finsh_node_new_long(long l)
  103. {
  104. struct finsh_node* node;
  105. node = finsh_node_allocate(FINSH_NODE_VALUE_LONG);
  106. if (node == NULL)
  107. {
  108. finsh_error_set(FINSH_ERROR_MEMORY_FULL);
  109. return NULL;
  110. }
  111. node->value.long_value = l;
  112. return node;
  113. }
  114. struct finsh_node* finsh_node_new_string(char* s)
  115. {
  116. struct finsh_node* node;
  117. node = finsh_node_allocate(FINSH_NODE_VALUE_STRING);
  118. if (node == NULL)
  119. {
  120. finsh_error_set(FINSH_ERROR_MEMORY_FULL);
  121. return NULL;
  122. }
  123. /* make string */
  124. node->value.ptr = finsh_heap_allocate(strlen(s) + 1);
  125. strncpy(node->value.ptr, s, strlen(s));
  126. ((u_char*)node->value.ptr)[strlen(s)] = '\0';
  127. return node;
  128. }
  129. struct finsh_node* finsh_node_new_ptr(void* ptr)
  130. {
  131. struct finsh_node* node;
  132. node = finsh_node_allocate(FINSH_NODE_VALUE_NULL);
  133. if (node == NULL)
  134. {
  135. finsh_error_set(FINSH_ERROR_MEMORY_FULL);
  136. return NULL;
  137. }
  138. node->value.ptr = ptr;
  139. return node;
  140. }