#include "usmart_str.h" #include "usmart.h" ////////////////////////////////////////////////////////////////////////////////// //±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ; //ALIENTEK STM32¿ª·¢°å //ÕýµãÔ­×Ó@ALIENTEK //¼¼ÊõÂÛ̳:www.openedv.com //°æ±¾£ºV3.1 //°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£ //Copyright(C) ÕýµãÔ­×Ó 2011-2021 //All rights reserved //******************************************************************************** //Éý¼¶ËµÃ÷ //V1.4 //Ôö¼ÓÁ˶ԲÎÊýΪstringÀàÐ͵ĺ¯ÊýµÄÖ§³Ö.ÊÊÓ÷¶Î§´ó´óÌá¸ß. //ÓÅ»¯ÁËÄÚ´æÕ¼ÓÃ,¾²Ì¬ÄÚ´æÕ¼ÓÃΪ79¸ö×Ö½Ú@10¸ö²ÎÊý.¶¯Ì¬ÊÊÓ¦Êý×Ö¼°×Ö·û´®³¤¶È //V2.0 //1,ÐÞ¸ÄÁËlistÖ¸Áî,´òÓ¡º¯ÊýµÄÍêÕû±í´ïʽ. //2,Ôö¼ÓÁËidÖ¸Áî,´òӡÿ¸öº¯ÊýµÄÈë¿ÚµØÖ·. //3,ÐÞ¸ÄÁ˲ÎÊýÆ¥Åä,Ö§³Öº¯Êý²ÎÊýµÄµ÷ÓÃ(ÊäÈëÈë¿ÚµØÖ·). //4,Ôö¼ÓÁ˺¯ÊýÃû³¤¶Èºê¶¨Òå. //V2.1 20110707 //1,Ôö¼Ódec,hexÁ½¸öÖ¸Áî,ÓÃÓÚÉèÖòÎÊýÏÔʾ½øÖÆ,¼°Ö´ÐнøÖÆ×ª»». //×¢:µ±dec,hex²»´ø²ÎÊýµÄʱºò,¼´É趨ÏÔʾ²ÎÊý½øÖÆ.µ±ºó¸ú²ÎÊýµÄʱºò,¼´Ö´ÐнøÖÆ×ª»». //Èç:"dec 0XFF" Ôò»á½«0XFFתΪ255,ÓÉ´®¿Ú·µ»Ø. //Èç:"hex 100" Ôò»á½«100תΪ0X64,ÓÉ´®¿Ú·µ»Ø //2,ÐÂÔöusmart_get_cmdnameº¯Êý,ÓÃÓÚ»ñȡָÁîÃû×Ö. //V2.2 20110726 //1,ÐÞÕýÁËvoidÀàÐͲÎÊýµÄ²ÎÊýͳ¼Æ´íÎó. //2,ÐÞ¸ÄÊý¾ÝÏÔʾ¸ñʽĬÈÏΪ16½øÖÆ. //V2.3 20110815 //1,È¥µôÁ˺¯ÊýÃûºó±ØÐë¸ú"("µÄÏÞÖÆ. //2,ÐÞÕýÁË×Ö·û´®²ÎÊýÖв»ÄÜÓÐ"("µÄbug. //3,ÐÞ¸ÄÁ˺¯ÊýĬÈÏÏÔʾ²ÎÊý¸ñʽµÄÐ޸ķ½Ê½. //V2.4 20110905 //1,ÐÞ¸ÄÁËusmart_get_cmdnameº¯Êý,Ôö¼Ó×î´ó²ÎÊý³¤¶ÈÏÞÖÆ.±ÜÃâÁËÊäÈë´íÎó²ÎÊýʱµÄËÀ»úÏÖÏó. //2,Ôö¼ÓUSMART_ENTIM2_SCANºê¶¨Òå,ÓÃÓÚÅäÖÃÊÇ·ñʹÓÃTIM2¶¨Ê±Ö´ÐÐscanº¯Êý. //V2.5 20110930 //1,ÐÞ¸Äusmart_initº¯ÊýΪvoid usmart_init(u8 sysclk),¿ÉÒÔ¸ù¾ÝϵͳƵÂÊ×Ô¶¯É趨ɨÃèʱ¼ä.(¹Ì¶¨100ms) //2,È¥µôÁËusmart_initº¯ÊýÖеÄuart_initº¯Êý,´®¿Ú³õʼ»¯±ØÐëÔÚÍⲿ³õʼ»¯,·½±ãÓû§×ÔÐйÜÀí. //V2.6 20111009 //1,Ôö¼ÓÁËread_addrºÍwrite_addrÁ½¸öº¯Êý.¿ÉÒÔÀûÓÃÕâÁ½¸öº¯Êý¶ÁдÄÚ²¿ÈÎÒâµØÖ·(±ØÐëÊÇÓÐЧµØÖ·).¸ü¼Ó·½±ãµ÷ÊÔ. //2,read_addrºÍwrite_addrÁ½¸öº¯Êý¿ÉÒÔͨ¹ýÉèÖÃUSMART_USE_WRFUNSΪÀ´Ê¹Äܺ͹رÕ. //3,ÐÞ¸ÄÁËusmart_strcmp,ʹÆä¹æ·¶»¯. //V2.7 20111024 //1,ÐÞÕýÁË·µ»ØÖµ16½øÖÆÏÔʾʱ²»»»ÐеÄbug. //2,Ôö¼ÓÁ˺¯ÊýÊÇ·ñÓзµ»ØÖµµÄÅжÏ,Èç¹ûûÓзµ»ØÖµ,Ôò²»»áÏÔʾ.Óзµ»ØÖµÊ±²ÅÏÔʾÆä·µ»ØÖµ. //V2.8 20111116 //1,ÐÞÕýÁËlistµÈ²»´ø²ÎÊýµÄÖ¸Áî·¢Ëͺó¿ÉÄܵ¼ÖÂËÀ»úµÄbug. //V2.9 20120917 //1,ÐÞ¸ÄÁËÐÎÈ磺void*xxx(void)ÀàÐͺ¯Êý²»ÄÜʶ±ðµÄbug¡£ //V3.0 20130425 //1,ÐÂÔöÁË×Ö·û´®²ÎÊý¶ÔתÒå·ûµÄÖ§³Ö¡£ //V3.1 20131120 //1,Ôö¼ÓruntimeϵͳָÁî,¿ÉÒÔÓÃÓÚͳ¼Æº¯ÊýÖ´ÐÐʱ¼ä. //Ó÷¨: //·¢ËÍ:runtime 1 ,Ôò¿ªÆôº¯ÊýÖ´ÐÐʱ¼äͳ¼Æ¹¦ÄÜ //·¢ËÍ:runtime 0 ,Ôò¹Ø±Õº¯ÊýÖ´ÐÐʱ¼äͳ¼Æ¹¦ÄÜ ///runtimeͳ¼Æ¹¦ÄÜ,±ØÐëÉèÖÃ:USMART_ENTIMX_SCAN Ϊ1,²Å¿ÉÒÔʹÓÃ!! ///////////////////////////////////////////////////////////////////////////////////// //¶Ô±È×Ö·û´®str1ºÍstr2 //*str1:×Ö·û´®1Ö¸Õë //*str2:×Ö·û´®2Ö¸Õë //·µ»ØÖµ:0£¬ÏàµÈ;1£¬²»ÏàµÈ; u8 usmart_strcmp(u8 *str1,u8 *str2) { while(1) { if(*str1!=*str2)return 1;//²»ÏàµÈ if(*str1=='\0')break;//¶Ô±ÈÍê³ÉÁË. str1++; str2++; } return 0;//Á½¸ö×Ö·û´®ÏàµÈ } //°Ñstr1µÄÄÚÈÝcopyµ½str2 //*str1:×Ö·û´®1Ö¸Õë //*str2:×Ö·û´®2Ö¸Õë void usmart_strcopy(u8*str1,u8 *str2) { while(1) { *str2=*str1; //¿½±´ if(*str1=='\0')break;//¿½±´Íê³ÉÁË. str1++; str2++; } } //µÃµ½×Ö·û´®µÄ³¤¶È(×Ö½Ú) //*str:×Ö·û´®Ö¸Õë //·µ»ØÖµ:×Ö·û´®µÄ³¤¶È u8 usmart_strlen(u8*str) { u8 len=0; while(1) { if(*str=='\0')break;//¿½±´Íê³ÉÁË. len++; str++; } return len; } //m^nº¯Êý //·µ»ØÖµ:m^n´Î·½ u32 usmart_pow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } //°Ñ×Ö·û´®×ªÎªÊý×Ö //Ö§³Ö16½øÖÆ×ª»»,µ«ÊÇ16½øÖÆ×Öĸ±ØÐëÊÇ´óдµÄ,ÇÒ¸ñʽΪÒÔ0X¿ªÍ·µÄ. //²»Ö§³Ö¸ºÊý //*str:Êý×Ö×Ö·û´®Ö¸Õë //*res:ת»»ÍêµÄ½á¹û´æ·ÅµØÖ·. //·µ»ØÖµ:0£¬³É¹¦×ª»»Íê³É.ÆäËû,´íÎó´úÂë. //1,Êý¾Ý¸ñʽ´íÎó.2,16½øÖÆÎ»ÊýΪ0.3,Æðʼ¸ñʽ´íÎó.4,Ê®½øÖÆÎ»ÊýΪ0. u8 usmart_str2num(u8*str,u32 *res) { u32 t; u8 bnum=0; //Êý×ÖµÄλÊý u8 *p; u8 hexdec=10;//ĬÈÏΪʮ½øÖÆÊý¾Ý p=str; *res=0;//ÇåÁã. while(1) { if((*p<='9'&&*p>='0')||(*p<='F'&&*p>='A')||(*p=='X'&&bnum==1))//²ÎÊýºÏ·¨ { if(*p>='A')hexdec=16; //×Ö·û´®ÖдæÔÚ×Öĸ,Ϊ16½øÖƸñʽ. bnum++; //λÊýÔö¼Ó. }else if(*p=='\0')break; //Åöµ½½áÊø·û,Í˳ö. else return 1; //²»È«ÊÇÊ®½øÖÆ»òÕß16½øÖÆÊý¾Ý. p++; } p=str; //ÖØÐ¶¨Î»µ½×Ö·û´®¿ªÊ¼µÄµØÖ·. if(hexdec==16) //16½øÖÆÊý¾Ý { if(bnum<3)return 2; //λÊýСÓÚ3£¬Ö±½ÓÍ˳ö.ÒòΪ0X¾ÍÕ¼ÁË2¸ö,Èç¹û0XºóÃæ²»¸úÊý¾Ý,Ôò¸ÃÊý¾Ý·Ç·¨. if(*p=='0' && (*(p+1)=='X'))//±ØÐëÒÔ'0X'¿ªÍ·. { p+=2; //Æ«ÒÆµ½Êý¾ÝÆðʼµØÖ·. bnum-=2;//¼õÈ¥Æ«ÒÆÁ¿ }else return 3;//ÆðʼͷµÄ¸ñʽ²»¶Ô }else if(bnum==0)return 4;//λÊýΪ0£¬Ö±½ÓÍ˳ö. while(1) { if(bnum)bnum--; if(*p<='9'&&*p>='0')t=*p-'0'; //µÃµ½Êý×ÖµÄÖµ else t=*p-'A'+10; //µÃµ½A~F¶ÔÓ¦µÄÖµ *res+=t*usmart_pow(hexdec,bnum); p++; if(*p=='\0')break;//Êý¾Ý¶¼²éÍêÁË. } return 0;//³É¹¦×ª»» } //µÃµ½Ö¸ÁîÃû //*str:Ô´×Ö·û´® //*cmdname:Ö¸ÁîÃû //*nlen:Ö¸ÁîÃû³¤¶È //maxlen:×î´ó³¤¶È(×öÏÞÖÆ,Ö¸Áî²»¿ÉÄÜÌ«³¤µÄ) //·µ»ØÖµ:0,³É¹¦;ÆäËû,ʧ°Ü. u8 usmart_get_cmdname(u8*str,u8*cmdname,u8 *nlen,u8 maxlen) { *nlen=0; while(*str!=' '&&*str!='\0') //ÕÒµ½¿Õ¸ñ»òÕß½áÊø·ûÔòÈÏΪ½áÊøÁË { *cmdname=*str; str++; cmdname++; (*nlen)++;//ͳ¼ÆÃüÁ¶È if(*nlen>=maxlen)return 1;//´íÎóµÄÖ¸Áî } *cmdname='\0';//¼ÓÈë½áÊø·û return 0;//Õý³£·µ»Ø } //»ñÈ¡ÏÂÒ»¸ö×Ö·û£¨µ±ÖмäÓкܶà¿Õ¸ñµÄʱºò£¬´Ëº¯ÊýÖ±½ÓºöÂÔ¿Õ¸ñ£¬ÕÒµ½¿Õ¸ñÖ®ºóµÄµÚÒ»¸ö×Ö·û£© //str:×Ö·û´®Ö¸Õë //·µ»ØÖµ:ÏÂÒ»¸ö×Ö·û u8 usmart_search_nextc(u8* str) { str++; while(*str==' '&&str!='\0')str++; return *str; } //´ÓstrÖеõ½º¯ÊýÃû //*str:Ô´×Ö·û´®Ö¸Õë //*fname:»ñÈ¡µ½µÄº¯ÊýÃû×ÖÖ¸Õë //*pnum:º¯ÊýµÄ²ÎÊý¸öÊý //*rval:ÊÇ·ñÐèÒªÏÔʾ·µ»ØÖµ(0,²»ÐèÒª;1,ÐèÒª) //·µ»ØÖµ:0,³É¹¦;ÆäËû,´íÎó´úÂë. u8 usmart_get_fname(u8*str,u8*fname,u8 *pnum,u8 *rval) { u8 res; u8 fover=0; //À¨ºÅÉî¶È u8 *strtemp; u8 offset=0; u8 parmnum=0; u8 temp=1; u8 fpname[6];//void+X+'/0' u8 fplcnt=0; //µÚÒ»¸ö²ÎÊýµÄ³¤¶È¼ÆÊýÆ÷ u8 pcnt=0; //²ÎÊý¼ÆÊýÆ÷ u8 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ÀàÐ͵IJÎÊý,±ØÐë×öÅжÏ. { 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; //·µ»ØÖ´Ðнá¹û } //´ÓstrÖеõ½Ò»¸öº¯ÊýµÄ²ÎÊý //*str:Ô´×Ö·û´®Ö¸Õë //*fparm:²ÎÊý×Ö·û´®Ö¸Õë //*ptype:²ÎÊýÀàÐÍ 0£¬Êý×Ö;1£¬×Ö·û´®;0XFF£¬²ÎÊý´íÎó //·µ»ØÖµ:0,ÒѾ­ÎÞ²ÎÊýÁË;ÆäËû,ÏÂÒ»¸ö²ÎÊýµÄÆ«ÒÆÁ¿. u8 usmart_get_aparm(u8 *str,u8 *fparm,u8 *ptype) { u8 i=0; u8 enout=0; u8 type=0;//ĬÈÏÊÇÊý×Ö u8 string=0; //±ê¼ÇstrÊÇ·ñÕýÔÚ¶Á while(1) { if(*str==','&& string==0)enout=1; //ÔÝ»ºÁ¢¼´Í˳ö,Ä¿µÄÊÇѰÕÒÏÂÒ»¸ö²ÎÊýµÄÆðʼµØÖ· if((*str==')'||*str=='\0')&&string==0)break;//Á¢¼´Í˳ö±êʶ·û if(type==0)//ĬÈÏÊÇÊý×ÖµÄ { if((*str>='0' && *str<='9')||(*str>='a' && *str<='f')||(*str>='A' && *str<='F')||*str=='X'||*str=='x')//Êý×Ö´®¼ì²â { if(enout)break; //ÕÒµ½ÁËÏÂÒ»¸ö²ÎÊý,Ö±½ÓÍ˳ö. if(*str>='a')*fparm=*str-0X20; //Сдת»»Îª´óд else *fparm=*str; //Сд»òÕßÊý×Ö±£³Ö²»±ä fparm++; }else if(*str=='"')//ÕÒµ½×Ö·û´®µÄ¿ªÊ¼±êÖ¾ { if(enout)break;//ÕÒµ½,ºó²ÅÕÒµ½",ÈÏΪ½áÊøÁË. type=1; string=1;//µÇ¼ÇSTRING ÕýÔÚ¶ÁÁË }else if(*str!=' '&&*str!=',')//·¢ÏÖ·Ç·¨×Ö·û,²ÎÊý´íÎó { type=0XFF; break; } }else//stringÀà { if(*str=='"')string=0; if(enout)break; //ÕÒµ½ÁËÏÂÒ»¸ö²ÎÊý,Ö±½ÓÍ˳ö. if(string) //×Ö·û´®ÕýÔÚ¶Á { if(*str=='\\') //Óöµ½×ªÒå·û(²»¸´ÖÆ×ªÒå·û) { str++; //Æ«ÒÆµ½×ªÒå·ûºóÃæµÄ×Ö·û,²»¹Üʲô×Ö·û,Ö±½ÓCOPY i++; } *fparm=*str; //Сд»òÕßÊý×Ö±£³Ö²»±ä fparm++; } } i++;//Æ«ÒÆÁ¿Ôö¼Ó str++; } *fparm='\0'; //¼ÓÈë½áÊø·û *ptype=type; //·µ»Ø²ÎÊýÀàÐÍ return i; //·µ»Ø²ÎÊý³¤¶È } //µÃµ½Ö¸¶¨²ÎÊýµÄÆðʼµØÖ· //num:µÚnum¸ö²ÎÊý,·¶Î§0~9. //·µ»ØÖµ:¸Ã²ÎÊýµÄÆðʼµØÖ· u8 usmart_get_parmpos(u8 num) { u8 temp=0; u8 i; for(i=0;iMAX_PARM)return USMART_PARMOVER;//²ÎÊýÌ«¶à } break; case 1://×Ö·û´® len=usmart_strlen(tstr)+1; //°üº¬Á˽áÊø·û'\0' usmart_strcopy(tstr,&usmart_dev.parm[usmart_get_parmpos(n)]);//¿½±´tstrÊý¾Ýµ½usmart_dev.parm[n] usmart_dev.parmtype|=1<MAX_PARM)return USMART_PARMOVER;//²ÎÊýÌ«¶à break; case 0XFF://´íÎó return USMART_PARMERR;//²ÎÊý´íÎó } if(*str==')'||*str=='\0')break;//²éµ½½áÊø±êÖ¾ÁË. } *parn=n; //¼Ç¼²ÎÊýµÄ¸öÊý return USMART_OK;//ÕýÈ·µÃµ½Á˲ÎÊý }