⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 finsh_node.c

📁 中国人自己的c语言
💻 C
字号:
#include <finsh/finsh.h>

#include "finsh_node.h"
#include "finsh_error.h"
#include "finsh_var.h"
#include "finsh_heap.h"

struct finsh_node global_node_table[FINSH_NODE_MAX];

int finsh_node_init()
{
	memset(global_node_table, 0, sizeof(global_node_table));

	return 0;
}

struct finsh_node* finsh_node_allocate(u_char type)
{
	int i;

	/* find an empty entry */
	for (i = 0; i < FINSH_NODE_MAX; i ++)
	{
		if (global_node_table[i].type == FINSH_NODE_UNKNOWN) break;
	}

	if (i == FINSH_NODE_MAX) return NULL;

	/* fill type field */
	global_node_table[i].type = type;

	/* return this allocated node */
	return &global_node_table[i];
}

struct finsh_node* finsh_node_new_id(u_char* id)
{
	struct finsh_node* node;
	struct finsh_var*  var;
	struct finsh_syscall* func;

	node = NULL;

	var = finsh_var_lookup(id);
	if (var == NULL)
	{
		func = finsh_syscall_lookup(id);
	}

	if (var != NULL || func != NULL)
	{
		node = finsh_node_allocate(FINSH_NODE_ID);
		if (node == NULL)
		{
			finsh_error_set(FINSH_ERROR_MEMORY_FULL);
			return NULL;
		}

		node->var = var;
		if (node->var == NULL)
		{
			/* search in system call table */
			node->func = func;
			node->avf  = FINSH_NODE_FUNCTION;
		}
	}
	else
	{
		finsh_error_set(FINSH_ERROR_UNKNOWN_SYMBOL);
	}

	return node;
}

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->char_value = c;
	return node;
}

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->int_value = i;
	return node;
}

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->long_value = l;
	return node;
}

struct finsh_node* finsh_node_new_string(u_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->ptr = finsh_heap_allocate(strlen(s) + 1);
	strncpy(node->ptr, s, strlen(s));
	((u_char*)node->ptr)[strlen(s)] = '\0';

	return node;
}

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->ptr = ptr;
	return node;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -