首页 > 编程语言 > 详细

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

时间:2019-10-11 12:56:56      阅读:145      评论:0      收藏:0      [点我收藏+]
___虽然简单,但好记性不如烂笔头___
//从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;        //返回执行结果
}

 

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

原文:https://www.cnblogs.com/benhhs/p/11652978.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!