1 /* 2 * Copyright (c) 2006-2018, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2010-03-22 Bernard first version 9 */ 10 #include <finsh.h> 11 12 #include "finsh_node.h" 13 #include "finsh_error.h" 14 #include "finsh_var.h" 15 #include "finsh_heap.h" 16 17 struct finsh_node global_node_table[FINSH_NODE_MAX]; 18 finsh_node_init()19int finsh_node_init() 20 { 21 memset(global_node_table, 0, sizeof(global_node_table)); 22 23 return 0; 24 } 25 finsh_node_allocate(uint8_t type)26struct finsh_node* finsh_node_allocate(uint8_t type) 27 { 28 int i; 29 30 /* find an empty entry */ 31 for (i = 0; i < FINSH_NODE_MAX; i ++) 32 { 33 if (global_node_table[i].node_type == FINSH_NODE_UNKNOWN) break; 34 } 35 36 if (i == FINSH_NODE_MAX) return NULL; 37 38 /* fill type field */ 39 global_node_table[i].node_type = type; 40 41 /* return this allocated node */ 42 return &global_node_table[i]; 43 } 44 finsh_node_new_id(char * id)45struct finsh_node* finsh_node_new_id(char* id) 46 { 47 struct finsh_node* node; 48 void* symbol; 49 unsigned char type; 50 51 symbol = NULL; 52 type = 0; 53 node = NULL; 54 55 /* lookup variable firstly */ 56 symbol = (void*)finsh_var_lookup(id); 57 if (symbol == NULL) 58 { 59 /* then lookup system variable */ 60 symbol = (void*)finsh_sysvar_lookup(id); 61 if (symbol == NULL) 62 { 63 /* then lookup system call */ 64 symbol = (void*)finsh_syscall_lookup(id); 65 if (symbol != NULL) type = FINSH_IDTYPE_SYSCALL; 66 } 67 else type = FINSH_IDTYPE_SYSVAR; 68 } 69 else type = FINSH_IDTYPE_VAR; 70 71 if (symbol != NULL) 72 { 73 /* allocate a new node */ 74 node = finsh_node_allocate(FINSH_NODE_ID); 75 76 /* allocate node error */ 77 if (node == NULL) 78 { 79 finsh_error_set(FINSH_ERROR_MEMORY_FULL); 80 return NULL; 81 } 82 83 /* fill node value according type */ 84 switch (type) 85 { 86 case FINSH_IDTYPE_VAR: 87 node->id.var = (struct finsh_var*)symbol; 88 break; 89 90 case FINSH_IDTYPE_SYSVAR: 91 node->id.sysvar = (struct finsh_sysvar*)symbol; 92 break; 93 94 case FINSH_IDTYPE_SYSCALL: 95 node->id.syscall = (struct finsh_syscall*)symbol; 96 break; 97 } 98 /* fill identifier type */ 99 node->idtype = type; 100 } 101 else finsh_error_set(FINSH_ERROR_UNKNOWN_SYMBOL); 102 103 return node; 104 } 105 finsh_node_new_char(char c)106struct finsh_node* finsh_node_new_char(char c) 107 { 108 struct finsh_node* node; 109 110 node = finsh_node_allocate(FINSH_NODE_VALUE_CHAR); 111 if (node == NULL) 112 { 113 finsh_error_set(FINSH_ERROR_MEMORY_FULL); 114 return NULL; 115 } 116 117 node->value.char_value = c; 118 return node; 119 } 120 finsh_node_new_int(int i)121struct finsh_node* finsh_node_new_int(int i) 122 { 123 struct finsh_node* node; 124 125 node = finsh_node_allocate(FINSH_NODE_VALUE_INT); 126 if (node == NULL) 127 { 128 finsh_error_set(FINSH_ERROR_MEMORY_FULL); 129 return NULL; 130 } 131 132 node->value.int_value = i; 133 return node; 134 } 135 finsh_node_new_long(long l)136struct finsh_node* finsh_node_new_long(long l) 137 { 138 struct finsh_node* node; 139 140 node = finsh_node_allocate(FINSH_NODE_VALUE_LONG); 141 if (node == NULL) 142 { 143 finsh_error_set(FINSH_ERROR_MEMORY_FULL); 144 return NULL; 145 } 146 147 node->value.long_value = l; 148 return node; 149 } 150 finsh_node_new_string(char * s)151struct finsh_node* finsh_node_new_string(char* s) 152 { 153 struct finsh_node* node; 154 155 node = finsh_node_allocate(FINSH_NODE_VALUE_STRING); 156 if (node == NULL) 157 { 158 finsh_error_set(FINSH_ERROR_MEMORY_FULL); 159 return NULL; 160 } 161 162 /* make string */ 163 node->value.ptr = finsh_heap_allocate(strlen(s) + 1); 164 strncpy(node->value.ptr, s, strlen(s)); 165 ((uint8_t*)node->value.ptr)[strlen(s)] = '\0'; 166 167 return node; 168 } 169 finsh_node_new_ptr(void * ptr)170struct finsh_node* finsh_node_new_ptr(void* ptr) 171 { 172 struct finsh_node* node; 173 174 node = finsh_node_allocate(FINSH_NODE_VALUE_NULL); 175 if (node == NULL) 176 { 177 finsh_error_set(FINSH_ERROR_MEMORY_FULL); 178 return NULL; 179 } 180 181 node->value.ptr = ptr; 182 return node; 183 } 184