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