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

📄 compare.c~

📁 基于嵌入式linux的命令行接口
💻 C~
📖 第 1 页 / 共 4 页
字号:
    	UINT number,length, i;

    	number = 0;
		
    	i = (UINT)strlen(string);
    	if (i>4)
    	{
		return DATA_OVER_RANG;
    	}
		
    	for(length = 0; length<i; length++)
    	{
        	if ((string[length]<=0x39) && (string[length]>=0x30))
        	{
            		number = number*0x10+(string[length]-0x30);
        	}
        	else if((string[length]>=0x41) && (string[length]<=0x46))
        	{
            		number = number*0x10+(string[length]-0x41+0xa);
        	}
        	else if((string[length]>=0x61) && (string[length]<=0x66))
        	{
            		number = number*0x10+(string[length]-0x61+0xa);
        	}
        	else
        	{
            		return NOT_DATA;
        	}
    	}

    	return (UINT16)number;
}

/*******************************************************************************
函数:splitWord
功能:从字符串中分离一个关键字。
参数:
    输入--inputCommand:输入的命令字符串。
    	           ErrorPos:开始分离的地址。
    输出--retWord:输出的关键字。
返回:Ok:操作成功。
                ERROR:操作失败。
描述:1、从ErrorPos位置开始分离一个关键字。
                2、命令字符串中的关键字之间是用空格来分隔的。
                3、处理后,移动ErrorPos到下一个关键字的开始处。
                4、如果开始输入的ErrorPos处是空格或是'\0',则会出错。
*******************************************************************************/
UINT8 splitWord(INT8 *inputCommand, INT8 *retWord, UINT8 *ErrorPos)
{
    	BOOL finished = TRUE;
    	UINT Position;

    	Position = 0;

    	/*从inputCommand中的ErrorPos开始,分离出一个关键字*/
    	while(finished)
    	{
        	if ((inputCommand[*ErrorPos] != ' ') && (inputCommand[*ErrorPos] != '\0'))
        	{
            		retWord[Position++] = inputCommand[(*ErrorPos)++];
            		if (Position > (WORD_LENGTN-1))
            		{
				return ERROR;
            		}
        	}
        	else
        	{
            		finished = FALSE;
            		retWord[Position++] = '\0';
        	}
    	}

    	/*跳过空格*/
    	finished = TRUE;
    	while(finished)
    	{
        	if(inputCommand[*ErrorPos] == ' ')
        	{
            		(*ErrorPos)++;
        	}
        	else
        	{
            		finished = FALSE;
        	}
    	}

    	return OK;
}

/*******************************************************************************
函数:enableJudge
功能:判断单词是否为"enable"还是'disable'
参数:
    输入--
    输出--
返回:ENABLE:输入的字符串为"enable";
		  DISABLE:输入的字符串为"disable";
	         NONE_BOTH_ABLE:输入的字符串不为"enable"也不是"diable";
描述:
*******************************************************************************/
static UINT8 enableJudge(INT8 * judgeString)
{
    	if (stringCpm("enable", judgeString)==OK)
    	{
        	return ENABLE;
    	}
    	else if(stringCpm("disable", judgeString)==OK)
    	{
       	return DISABLE;
    	}
    	else
    	{
       	return NONE_BOTH_ABLE;
    	}
}

/*******************************************************************************
函数:install_command
功能:加载所有的命令到命令集中
参数:
    输入--
    输出--
返回:
描述:定义全局指针pHead,将所有的命令加载到命令集中
*******************************************************************************/
void cmdInstall(void)
{
    	INT32 i;

    	/*创建命令集的头指针*/
    	pHead = malloc(sizeof(COMMAND_NODE));
    	if (pHead == NULL)
    	{
        	printf("\nCan't malloc");
        	return;
    	}
    	pHead->brother = NULL;
    	pHead->son = NULL;
    	pHead->command_string = NULL;
    	pHead->command_number = 0xff;

    	/*加载所有的命令到命令集中*/
    	for(i=0; i<MAX_COMMAND; i++)
    	{
        	if (nodeInsert(i) == ERROR)
        	{
           	 	printf("Error:nodeInsert No=%d\n",i);
        	}
    	}
}

/*******************************************************************************
函数:nodeCreate
功能:生成一个新的结点
参数:
    输入--
    输出--
返回:
描述:节点中的元素都是默认值。
*******************************************************************************/
COMMAND_NODE * nodeCreate(void)
{
    	COMMAND_NODE * newNode;

    	newNode = malloc(sizeof(COMMAND_NODE));
    	if (newNode == NULL)
    	{
		return NULL;
    	}
    
    	newNode->brother = NULL;
    	newNode->son = NULL;
    	newNode->command_number = 0xff;
    	newNode->command_string = NULL;

    	return newNode;
}

/*******************************************************************************
函数:nodeInsert
功能:将一条命令加到命令集中
参数:
    输入--
    输出--
返回:
描述:同一条命令的所有关键字属于父子关系,不同命令
   的相同位置的关键字属于兄弟关系
*******************************************************************************/
STATE nodeInsert(UINT8 command_number)
{
    	COMMAND_NODE * newNode;
    	COMMAND_NODE * ppHead;
    	COMMAND_NODE * pTmpNode;
    	UINT8 finished;
    	INT8 *insertCommand;/*命令字符串*/
    	INT8 retWord[WORD_LENGTN];
    	UINT8 ErrorPos;
    	UINT8 cmdNum;/*命令编号*/
    	const struct  cmd_entry *command;

    	command = &commandList[command_number];
    	insertCommand = command->cmdString;
    	cmdNum = command->cmdNum;
    
    	ppHead = pHead;
    	ErrorPos = 0;

    	if(splitWord(insertCommand, retWord, &ErrorPos)==ERROR)
	{
		return ERROR;
    	}
    
    	finished = TRUE;
    	while(finished)
    	{
        	/*已经找到了命令树的叶节点,将关键字添加到新结点*/
        	if (ppHead->command_string == NULL)
        	{
            		ppHead->command_string = malloc(strlen(retWord)+1);
            		if (ppHead->command_string == NULL)
            		{
               			printf("\nCan't malloc");
               			return ERROR;
            		}
            		strcpy(ppHead->command_string, retWord);

            		/*字符串结束,退出循环,完成命令的添加*/
            		/*否则取新的单词,并创建新的子结点*/
            		if ((insertCommand[ErrorPos]) == '\0')
            		{
                		finished = FALSE;/*结束*/
                		ppHead->command_number = cmdNum;
            		}
            		else
            		{
                		if(splitWord(insertCommand, retWord, &ErrorPos)==ERROR)
                		{
					return ERROR;
                		}
                
                		newNode = nodeCreate();
                		if (newNode == NULL) 
					return ERROR;
                    
                		ppHead->son = newNode;
                		ppHead = ppHead->son;
            		}

            		continue;
        	}
        

        	/*查找命令树的叶节点,判断当前单词与结点单词是否相同*/
        	if (strcmp(retWord, ppHead->command_string) == WORD_EQUAL)
        	{
            		/*取新的单词*/
            		if(splitWord(insertCommand, retWord, &ErrorPos)==ERROR)
			{
				return ERROR;
            		}

            		/*单词相同1*/
            		/*当前结点指针指向新建的子结点或是原来的子结点*/
            		if (ppHead->son == NULL)
            		{
                		newNode = nodeCreate();
                		if (newNode == NULL)
                		{
					return ERROR;
                		}
                
                		ppHead->son = newNode;
                		ppHead = ppHead->son;
            		}
            		else
            		{	
               			pTmpNode = ppHead->son;
                		/*单词相同2*/
                		/*单词比下一son结点的单词小,说明为新的命令,插入一个空结点*/						
                		if ((strcmp(retWord, pTmpNode->command_string) == WORD_SMALLER)&&(retWord[0]!='['))
                		{
                    			newNode = nodeCreate();
                    			if (newNode == NULL)
                    			{
						return ERROR;
                    			}

                    			newNode->brother = pTmpNode;
                    			ppHead->son = newNode;
                    			ppHead = ppHead->son;
                		}
                		else
                		{
                			/*单词相同3*/
                			/*单词比下一son结点的单词大*/
					/*但是也有可能是新的节点,所以这个地方还是可能有问题的wys???*/		
                    			ppHead = ppHead->son;
                		}
            		}
            
            		continue;
        	}


        	/*单词不相同1*/
        	/*如果brother结点为空,说明为新的命令,建立新的结点*/
        	if (ppHead->brother == NULL)
        	{
            		newNode = nodeCreate();
            		if (newNode == NULL) 
            		{
				return ERROR;
            		}
            
            		ppHead->brother = newNode;
            		ppHead = ppHead->brother;
        	}
        	else
        	{
            		pTmpNode = ppHead->brother;
            		/*单词不相同2*/
            		/*单词比下一结点的单词小,说明为新的命令,插入一个空结点*/
            		if ((strcmp(retWord, pTmpNode->command_string) == WORD_SMALLER)&&(retWord[0]!='['))
            		{
                		newNode = nodeCreate();
                		if (newNode == NULL)
                		{
					return ERROR;
                		}

                		newNode->brother = pTmpNode;
                		ppHead->brother = newNode;
                		ppHead = ppHead->brother;
            		}
            		else
            		{
            			/*单词不相同3*/
            			/*单词比下一结点的单词大,继续判断平行brother结点*/
                		ppHead = ppHead->brother;
            		}
        	}        
    	}/*end of while()*/
    	return OK;
}

/*******************************************************************************
函数:nodeChk
功能:检查当前结点关键字
参数:
    输入--retWord:用户输入命令中的一个关键字。
                    ppHead:开始搜索比较关键字的命令树中的节点。
    输出--
返回:WORD_EXIST:找到相同的关键字。
                  VARIABLE_WORD:是一个可变参数的节点。
                  WORD_NOT_EXIST:没有找到这个关键字节点。
描述:输入当前结点的字母,判断是否在已存在的命令中。
                在brother中检查,
                    1 所有brother结点都与检查的字母不同,则表明不在
                     当前命令集中,返回命令数0xff,表明当前命令
                     集中无匹配的命令,用户输入命令有误
                    2 如果当前匹配,则检查command_number是否为0,
                     为0-----将指针指向son子集,返回命令数0
                         不为0--则找到匹配的命令,返回command_number
*******************************************************************************/
UINT8 nodeChk(INT8 *retWord, COMMAND_NODE * ppHead)
{
    	COMMAND_NODE * pNodeTmp;

    	pNodeTmp = ppHead;
    	/*判断关键字是否相同*/
    	while(1)
    	{
        	/*找到匹配的结点*/
		if(pNodeTmp == NULL)/*wys增加,主要是防止输入过多字符而导致的错误*/
		{
			return WORD_NOT_EXIST;
		}
	
        	if (stringCpm(pNodeTmp->command_string, retWord) == OK)
        	{
            		return WORD_EXIST;
        	}
			
        	/*结点不匹配,则到下一步判断*/
        	if (pNodeTmp->brother == NULL)
        	{
            		break;
        	}

        	pNodeTmp = pNodeTmp->brother;
    	}

    	/*判断是否存在参数结点*/
    	pNodeTmp = ppHead;
    	while(1)
    	{
        	/*参数*/
        	if (stringCpm(pNodeTmp->command_string, "[") == OK)
        	{
            		return VARIABLE_WORD;
        	}
        	/*结点不存在*/
        	if (pNodeTmp->brother == NULL)
        	{
            		return WORD_NOT_EXIST;
        	}
        	/*指向下一brother结点*/
        	pNodeTmp = pNodeTmp->brother;
    	}
}

/*******************************************************************************

⌨️ 快捷键说明

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