单片机C语言(从str中得到函数名)组件

__虽然简单,但好记性不如烂笔头___
知识兔
//从str中得到函数名
//*str:源字符串指针
//*fname:获取到的函数名字指针
//*pnum:函数的参数个数
//*rval:是否需要显示返回值(0,不需要;1,需要)
//返回值:0,成功;其他,错误代码.
unsigned char get_fname(unsigned char*str,unsigned char*fname,unsigned char *pnum,unsigned char *rval)
{
    unsigned char res;
    unsigned char fover=0;      //括号深度
    unsigned char *strtemp;
    unsigned char offset=0;  
    unsigned char parmnum=0;
    unsigned char temp=1;
    unsigned char fpname[6];//void+X+'/0'
    unsigned char fplcnt=0; //第一个参数的长度计数器
    unsigned char pcnt=0;     //参数计数器
    unsigned char nchar;
    //判断函数是否有返回值
    strtemp=str;
    while(*strtemp!='\0')//没有结束
    {
        if(*strtemp!=' '&&(pcnt&0X7F)<5)//最多记录5个字符
        {    
            if(pcnt==0)pcnt|=0X80;//置位最高位,标记开始接收返回值类型
            if(((pcnt&0x7f)==4)&&(*strtemp!='*'))break;//最后一个字符,必须是*
            fpname[pcnt&0x7f]=*strtemp;//记录函数的返回值类型
            pcnt++;
        }else if(pcnt==0X85)break;
        strtemp++; 
    } 
    if(pcnt)//接收完了
    {
        fpname[pcnt&0x7f]='\0';//加入结束符
        if(usmart_strcmp(fpname,"void")==0)*rval=0;//不需要返回值
        else *rval=1;                               //需要返回值
        pcnt=0;
    } 
    res=0;
    strtemp=str;
    while(*strtemp!='('&&*strtemp!='\0') //此代码找到函数名的真正起始位置
    {  
        strtemp++;
        res++;
        if(*strtemp==' '||*strtemp=='*')
        {
            nchar=usmart_search_nextc(strtemp);        //获取下一个字符
            if(nchar!='('&&nchar!='*')offset=res;    //跳过空格和*号
        }
    }     
    strtemp=str;
    if(offset)strtemp+=offset+1;//跳到函数名开始的地方       
    res=0;
    nchar=0;//是否正在字符串里面的标志,0,不在字符串;1,在字符串;
    while(1)
    {
        if(*strtemp==0)
        {
            res=USMART_FUNCERR;//函数错误
            break;
        }else if(*strtemp=='('&&nchar==0)fover++;//括号深度增加一级     
        else if(*strtemp==')'&&nchar==0)
        {
            if(fover)fover--;
            else res=USMART_FUNCERR;//错误结束,没收到'('
            if(fover==0)break;//到末尾了,退出        
        }else if(*strtemp=='"')nchar=!nchar;

        if(fover==0)//函数名还没接收完
        {
            if(*strtemp!=' ')//空格不属于函数名
            {
                *fname=*strtemp;//得到函数名
                fname++;
            }
        }else //已经接受完了函数名了.
        {
            if(*strtemp==',')
            {
                temp=1;        //使能增加一个参数
                pcnt++;    
            }else if(*strtemp!=' '&&*strtemp!='(')
            {
                if(pcnt==0&&fplcnt<5)        //当第一个参数来时,为了避免统计void类型的参数,必须做判断.
                {
                    fpname[fplcnt]=*strtemp;//记录参数特征.
                    fplcnt++;
                }
                temp++;    //得到有效参数(非空格)
            }
            if(fover==1&&temp==2)
            {
                temp++;        //防止重复增加
                parmnum++;     //参数增加一个
            }
        }
        strtemp++;             
    }   
    if(parmnum==1)//只有1个参数.
    {
        fpname[fplcnt]='\0';//加入结束符
        if(usmart_strcmp(fpname,"void")==0)parmnum=0;//参数为void,表示没有参数.
    }
    *pnum=parmnum;    //记录参数个数
    *fname='\0';    //加入结束符
    return res;        //返回执行结果
}
知识兔
计算机