📄 compare.c~
字号:
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 + -