亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usmart_str.c

?? ALIENTEK MINISTM32 擴展實驗9 USMART應用
?? C
字號:
#include "usmart_str.h"
#include "usmart.h"		   
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供學習使用,未經作者許可,不得用于其它任何用途
//ALIENTEK STM32開發板	   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2011/6/13
//版本:V2.0
//版權所有,盜版必究。
//Copyright(C) 正點原子 2011-2021
//All rights reserved
//********************************************************************************
//升級說明
//V1.4
//增加了對參數為string類型的函數的支持.適用范圍大大提高.
//優化了內存占用,靜態內存占用為79個字節@10個參數.動態適應數字及字符串長度
//V2.0,
//1,修改了list指令,打印函數的完整表達式.
//2,增加了id指令,打印每個函數的入口地址.
//3,修改了參數匹配,支持函數參數的調用(輸入入口地址).
//4,增加了函數名長度宏定義.			  
/////////////////////////////////////////////////////////////////////////////////////
  
//對比字符串str1和str2
//*str1:字符串1指針
//*str2:字符串2指針
//返回值:0,不相等;1,相等;
u8 usmart_strcmp(u8*str1,u8 *str2)
{
	while(1)
	{
		if(*str1!=*str2)return 0;//不相等
		if(*str1=='\0')break;//對比完成了.
		str1++;
		str2++;
	}
	return 1;//兩個字符串相等
}
//把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中得到函數名
//*str:源字符串指針
//*fname:獲取到的函數名字指針
//pnum:函數的參數個數
//返回值:0,成功;其他,錯誤代碼.
u8 usmart_get_fname(u8*str,u8*fname,u8 *pnum)
{
	u8 res;
	u8 fover=0;	  //括號深度
	u8 *strtemp;
	u8 offset=0;  
	u8 parmnum=0;
	u8 temp=1;
	strtemp=str;

	res=0;
	while(*strtemp!='(') //此代碼找到函數名的真正起始位置,函數名后緊跟(,如果增加空格,將導致失敗
	{
		strtemp++;
		res++;
		if(*strtemp==' ')offset=res;//跳過空格.	
	}
	strtemp=str;
	if(offset)strtemp+=offset+1;//跳到函數名開始的地方	   
	res=0;
	while(1)
	{
		if(*strtemp==0)
		{
			res=USMART_FUNCERR;//函數錯誤
			break;
		}else if(*strtemp=='(')fover++;//括號深度增加一級	 
		else if(*strtemp==')')//
		{
			if(fover)fover--;
			else res=USMART_FUNCERR;//錯誤結束,沒收到'('
			if(fover==0)break;//到末尾了,退出	    
		}
		if(fover==0)//函數名還沒接收完
		{
			*fname=*strtemp;//得到函數名
			fname++;
		}else //已經接受完了函數名了.
		{
			if(*strtemp==',')temp=1;		//使能增加一個參數
			else if(*strtemp!=' ')temp++;	//得到有效參數(非空格)
			if(fover==1&&temp==2)
			{
				temp++;		//防止重復增加
				parmnum++; 	//參數增加一個
			}
		}
		strtemp++; 			
	}   
	*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)					    //字符串正在讀
			{	 
				*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;i<num;i++)temp+=usmart_dev.plentbl[i];
	return temp;
}
//從str中得到函數參數
//str:源字符串;
//parn:參數的多少.0表示無參數 void類型
//返回值:0,成功;其他,錯誤代碼.
u8 usmart_get_fparam(u8*str,u8 *parn)
{	
	u8 i,type;  
	u32 res;
	u8 n=0;
	u8 len;
	u8 tstr[PARM_LEN+1];//字節長度的緩存,最多可以存放PARM_LEN個字符的字符串
	for(i=0;i<MAX_PARM;i++)usmart_dev.plentbl[i]=0;//清空參數長度表
	while(*str!='(')//偏移到參數開始的地方
	{
		str++;											    
		if(*str=='\0')return USMART_FUNCERR;//遇到結束符了
	}
	str++;//偏移到"("之后的第一個字節
	while(1)
	{
		i=usmart_get_aparm(str,tstr,&type);	//得到第一個參數  
		str+=i;								//偏移
		switch(type)
		{
			case 0:	//數字
				if(tstr[0]!='\0')				//接收到的參數有效
				{					    
					i=usmart_str2num(tstr,&res);	//記錄該參數	 
					if(i)return USMART_PARMERR;		//參數錯誤.
					*(u32*)(usmart_dev.parm+usmart_get_parmpos(n))=res; 	//記錄轉換成功的結果.
					usmart_dev.parmtype&=~(1<<n);	//標記數字
					usmart_dev.plentbl[n]=4;		//該參數的長度為4  
					n++;							//參數增加  
					if(n>MAX_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<<n;	//標記字符串 
				usmart_dev.plentbl[n]=len;	//該參數的長度為len  
				n++;
				if(n>MAX_PARM)return USMART_PARMOVER;//參數太多
				break;
			case 0XFF://錯誤
				return USMART_PARMERR;//參數錯誤	  
		}
		if(*str==')'||*str=='\0')break;//查到結束標志了.
	}
	*parn=n;	//記錄參數的個數
	return USMART_OK;//正確得到了參數
}














?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品久久不卡毛片| 日本一二三不卡| 成人精品免费网站| 国产精品自拍av| 国产精品一线二线三线| 国产一区在线看| 国产99久久久国产精品潘金| 国产乱对白刺激视频不卡| 韩日精品视频一区| 激情五月婷婷综合| 国产麻豆精品久久一二三| 国产一区二区福利| av一区二区三区四区| av在线不卡观看免费观看| 91日韩在线专区| 欧美人xxxx| 日韩欧美一区二区不卡| 久久久久久久久99精品| 国产精品网站一区| 伊人色综合久久天天| 爽好多水快深点欧美视频| 九九精品一区二区| 成人动漫av在线| 欧美精品色一区二区三区| 91麻豆精品91久久久久久清纯| 精品国产伦一区二区三区观看方式| 久久精品一区二区三区不卡| 亚洲v日本v欧美v久久精品| 亚洲1区2区3区视频| 久久精品国产77777蜜臀| 成人激情黄色小说| 欧美唯美清纯偷拍| 久久午夜羞羞影院免费观看| 亚洲免费在线视频| 久久福利资源站| 成人av在线观| 欧美一级理论性理论a| 国产精品天天摸av网| 五月婷婷久久丁香| 国产91精品一区二区麻豆网站| 欧美视频第二页| 国产日韩精品一区二区三区| 亚洲国产精品自拍| 国产成人精品免费在线| 欧美性猛交xxxx乱大交退制版| 精品国产一二三区| 亚洲色图视频网站| 国产一区二区在线观看视频| 91香蕉国产在线观看软件| 精品福利视频一区二区三区| 一区二区三区在线看| 国产精品一区二区在线播放| 91福利小视频| 中文字幕第一页久久| 美国av一区二区| 欧美日韩国产123区| 中文字幕一区二区三区在线播放 | 男女男精品视频| 成人美女视频在线看| 日韩精品自拍偷拍| 亚洲成人tv网| 在线观看免费亚洲| 最新国产の精品合集bt伙计| 国产一区二区福利| 久久一日本道色综合| 美女视频黄 久久| 欧美精品vⅰdeose4hd| 亚洲综合999| 色呦呦日韩精品| 亚洲人快播电影网| 91麻豆免费看片| 亚洲女厕所小便bbb| 91蜜桃在线免费视频| 综合亚洲深深色噜噜狠狠网站| 丰满亚洲少妇av| 欧美激情在线看| 国产91丝袜在线播放0| 亚洲国产精品成人综合色在线婷婷| 韩国精品免费视频| 久久久久久免费毛片精品| 狠狠色狠狠色合久久伊人| 久久影音资源网| 国产成人在线观看| 中文字幕一区在线| 色妹子一区二区| 亚洲国产精品精华液网站| 欧美色区777第一页| 日韩高清不卡在线| 精品久久一区二区| 国产mv日韩mv欧美| 一区二区三区四区在线播放| 在线观看日韩毛片| 免费成人小视频| 久久久久久黄色| 9l国产精品久久久久麻豆| 樱花影视一区二区| 日韩一区二区三区在线| 国产一区视频网站| 国产精品国产馆在线真实露脸| 93久久精品日日躁夜夜躁欧美| 亚洲在线一区二区三区| 91精品国产综合久久久久久| 精品午夜久久福利影院| 亚洲国产精品99久久久久久久久| 色哟哟国产精品免费观看| 日韩中文字幕av电影| 欧美激情一区三区| 欧美性猛交xxxx乱大交退制版| 日本不卡123| 中文字幕在线观看一区| 欧美日本一区二区在线观看| 国产在线精品一区二区| 1024成人网| 欧美成人官网二区| 91女人视频在线观看| 蜜臀av性久久久久蜜臀av麻豆| 国产精品美日韩| 欧美一区二区黄| 色婷婷综合久久久中文一区二区| 日本视频在线一区| 综合色天天鬼久久鬼色| 日韩午夜电影av| 91社区在线播放| 国产麻豆一精品一av一免费 | 正在播放一区二区| 粉嫩av一区二区三区在线播放| 亚洲在线一区二区三区| 亚洲国产精品99久久久久久久久 | 精品嫩草影院久久| 欧美主播一区二区三区| 国产精品99久| 免费观看成人av| 亚洲在线一区二区三区| 国产精品色一区二区三区| 欧美刺激午夜性久久久久久久| 91浏览器打开| 99热这里都是精品| 国产精品亚洲综合一区在线观看| 日本三级亚洲精品| 亚洲va在线va天堂| 一区二区三区美女视频| 国产精品久久久久久久久搜平片 | 精品视频在线免费观看| 99在线精品免费| 成人精品高清在线| 国产精品一区二区果冻传媒| 久久99在线观看| 看电影不卡的网站| 免费观看一级欧美片| 日韩成人一区二区| 丝袜国产日韩另类美女| 日韩理论片中文av| 国产精品国产三级国产普通话蜜臀| 久久久精品免费观看| 久久久久久久av麻豆果冻| 久久中文娱乐网| 久久精品视频在线免费观看| 亚洲精品在线一区二区| 久久美女高清视频| 国产精品免费看片| 一区在线播放视频| 亚洲综合男人的天堂| 五月激情六月综合| 蜜臀av性久久久久蜜臀aⅴ四虎| 日本美女一区二区| 精品中文av资源站在线观看| 国产老妇另类xxxxx| 成人性色生活片| 色狠狠av一区二区三区| 欧美午夜一区二区| 欧美成人性战久久| 欧美极品少妇xxxxⅹ高跟鞋| 成人欧美一区二区三区视频网页 | 日本伦理一区二区| 欧美日韩色综合| 精品欧美久久久| 中文字幕一区av| 亚洲国产精品综合小说图片区| 奇米精品一区二区三区在线观看| 激情六月婷婷综合| 成人精品一区二区三区中文字幕| voyeur盗摄精品| 欧美精品色综合| 中文字幕第一页久久| 亚洲成人在线免费| 国产一区二三区| 日本韩国欧美三级| 欧美成人艳星乳罩| 亚洲激情六月丁香| 白白色 亚洲乱淫| 欧美性猛交一区二区三区精品| 日韩欧美资源站| 亚洲欧洲精品一区二区三区| 婷婷中文字幕综合| 国产91综合一区在线观看| 欧美日韩一区小说| 欧美国产精品一区二区三区| 午夜精品免费在线| 成人av网站在线| 欧美成人vps|