Example #1
0
struct finsh_node* finsh_node_new_id(char* id)
{
	struct finsh_node* node;
	void*  symbol;
	unsigned char type;

	symbol	= NULL;
	type	= 0;
	node	= NULL;

	/* lookup variable firstly */
	symbol = (void*)finsh_var_lookup(id);
	if (symbol == NULL)
	{
		/* then lookup system variable */
		symbol = (void*)finsh_sysvar_lookup(id);
		if (symbol == NULL)
		{
			/* then lookup system call */
			symbol = (void*)finsh_syscall_lookup(id);
			if (symbol != NULL) type = FINSH_IDTYPE_SYSCALL;
		}
		else type = FINSH_IDTYPE_SYSVAR;
	}
	else type = FINSH_IDTYPE_VAR;

	if (symbol != NULL)
	{
		/* allocate a new node */
		node = finsh_node_allocate(FINSH_NODE_ID);

		/* allocate node error */
		if (node == NULL)
		{
			finsh_error_set(FINSH_ERROR_MEMORY_FULL);
			return NULL;
		}

		/* fill node value according type */
		switch (type)
		{
		case FINSH_IDTYPE_VAR:
			node->id.var = (struct finsh_var*)symbol;
			break;

		case FINSH_IDTYPE_SYSVAR:
			node->id.sysvar = (struct finsh_sysvar*)symbol;
			break;

		case FINSH_IDTYPE_SYSCALL:
			node->id.syscall = (struct finsh_syscall*)symbol;
			break;
		}
		/* fill identifier type */
		node->idtype = type;
	}
	else finsh_error_set(FINSH_ERROR_UNKNOWN_SYMBOL);

	return node;
}
Example #2
0
struct finsh_node* finsh_node_new_ptr(void* ptr)
{
	struct finsh_node* node;

	node = finsh_node_allocate(FINSH_NODE_VALUE_NULL);
	if (node == NULL) {
		finsh_error_set(FINSH_ERROR_MEMORY_FULL);
		return NULL;
	}

	node->value.ptr = ptr;
	return node;
}
Example #3
0
struct finsh_node* finsh_node_new_long(long l)
{
	struct finsh_node* node;

	node = finsh_node_allocate(FINSH_NODE_VALUE_LONG);
	if (node == NULL) {
		finsh_error_set(FINSH_ERROR_MEMORY_FULL);
		return NULL;
	}

	node->value.long_value = l;
	return node;
}
Example #4
0
struct finsh_node* finsh_node_new_int(int i)
{
	struct finsh_node* node;

	node = finsh_node_allocate(FINSH_NODE_VALUE_INT);
	if (node == NULL) {
		finsh_error_set(FINSH_ERROR_MEMORY_FULL);
		return NULL;
	}

	node->value.int_value = i;
	return node;
}
Example #5
0
struct finsh_node* finsh_node_new_char(char c)
{
	struct finsh_node* node;

	node = finsh_node_allocate(FINSH_NODE_VALUE_CHAR);
	if (node == NULL) {
		finsh_error_set(FINSH_ERROR_MEMORY_FULL);
		return NULL;
	}

	node->value.char_value = c;
	return node;
}
Example #6
0
/*
make a new node as following tree:
new_node
|
node1__
       \
       node2
*/
static struct finsh_node* make_sys_node(u_char type, struct finsh_node* node1, struct finsh_node* node2)
{
	struct finsh_node* node;

	node = finsh_node_allocate(type);

	if ((node1 != NULL) && (node != NULL))
	{
		finsh_node_child(node) = node1;
		finsh_node_sibling(node1) = node2;
	}
	else finsh_error_set(FINSH_ERROR_NULL_NODE);

	return node;
}
Example #7
0
struct finsh_node* finsh_node_new_string(char* s)
{
	struct finsh_node* node;

	node = finsh_node_allocate(FINSH_NODE_VALUE_STRING);
	if (node == NULL) {
		finsh_error_set(FINSH_ERROR_MEMORY_FULL);
		return NULL;
	}

	/* make string */
	node->value.ptr = finsh_heap_allocate(strlen(s) + 1);
	strncpy(node->value.ptr, s, strlen(s));
	((u_char*)node->value.ptr)[strlen(s)] = '\0';

	return node;
}