This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088
Dependents: MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more
NyLPC_cUrlReader.c
00001 #include "NyLPC_cUrlReader.h" 00002 #include "NyLPC_utils.h" 00003 #include <ctype.h> 00004 NyLPC_TBool NyLPC_cUrlReader_getPath(const NyLPC_TChar* i_src,const NyLPC_TChar** path,NyLPC_TInt32* path_len) 00005 { 00006 const NyLPC_TChar* p=i_src; 00007 for(;strchr("?#\0",*p)==NULL;p++); 00008 *path=i_src; 00009 *path_len=p-i_src; 00010 return NyLPC_TBool_TRUE; 00011 } 00012 00013 /** 00014 * 指定したURLクエリキーの値を探します。 00015 * @return 00016 * クエリ値の直前のポインタです。 00017 * 例えばキーがabcの場合、[^\?]*\?abc=cdfの場合、=の位置を返します。[^\?]*\?abc&cdfの場合、&の位置を返します。 00018 * cdfの場合、[^\?]*\?abc=cdfはNULL,[^\?]*\?abc&cdfは終端'\0'の位置を返します。 00019 */ 00020 const NyLPC_TChar* NyLPC_cUrlReader_findKeyValue(const NyLPC_TChar* i_src,const NyLPC_TChar* i_key_name) 00021 { 00022 const NyLPC_TChar* p=i_src; 00023 const NyLPC_TChar* k; 00024 NyLPC_TInt32 kn,kl; 00025 //?検索 00026 for(;*p!='\0' && *p!='?';p++); 00027 if(*p!='?'){ 00028 return NULL; 00029 } 00030 p++; 00031 kl=strlen(i_key_name); 00032 //search key value 00033 for(;;){ 00034 //word検索(alnum_-のみ) 00035 kn=NyLPC_cFormatTextReader_readWord(p,&k); 00036 if(strncmp(i_key_name,k,kl)==0){ 00037 break; 00038 } 00039 p+=kn; 00040 for(;*p!='\0' && *p!='&';p++); 00041 if(*p!='&'){ 00042 return NULL; 00043 } 00044 p++; 00045 } 00046 return p+kn; 00047 } 00048 00049 /** 00050 * URLから指定キー[:KEY:]のURLクエリ値[:VALUE:]を取得します。 00051 * [:query:] := [^\?]*\?(&[:KEY:](=[:VALUE:])?&)*([:KEY:](=[:VALUE:])?) 00052 * [:KEY:] := [a-zA-Z0-9_-] 00053 * [:VALUE:] := [^\#&] 00054 */ 00055 NyLPC_TBool NyLPC_cUrlReader_getStr(const NyLPC_TChar* i_src,const NyLPC_TChar* i_key_name,const NyLPC_TChar** str,NyLPC_TInt32* str_len) 00056 { 00057 const NyLPC_TChar* p; 00058 p=NyLPC_cUrlReader_findKeyValue(i_src,i_key_name); 00059 if(p==NULL || *p!='='){ 00060 *str=p; 00061 *str_len=0; 00062 return NyLPC_TBool_FALSE; 00063 } 00064 p++; 00065 *str=p; 00066 for(;strchr("&#\0",*p)==NULL;p++); 00067 *str_len=p-*str; 00068 return NyLPC_TBool_TRUE; 00069 } 00070 00071 NyLPC_TBool NyLPC_cUrlReader_getUInt(const NyLPC_TChar* i_buf,const NyLPC_TChar* i_key_name,NyLPC_TUInt32* value) 00072 { 00073 NyLPC_TUInt32 l,r; 00074 const NyLPC_TChar* p; 00075 p=NyLPC_cUrlReader_findKeyValue(i_buf,i_key_name); 00076 if(p==NULL || *p!='='){ 00077 return NyLPC_TBool_FALSE; 00078 } 00079 p++; 00080 //prefixの確認 00081 if((*p=='0') && (NyLPC_tolower(*(p+1))=='x')) 00082 { 00083 //16進数 00084 p+=2; 00085 r=l=0; 00086 while(isxdigit((int)(*p))){ 00087 r=r*16+NyLPC_ctox(*p); 00088 if(l!=(r>>4)){return NyLPC_TBool_FALSE;} 00089 l=r; 00090 p++; 00091 } 00092 }else{ 00093 r=l=0; 00094 while(isdigit((int)(*p))){ 00095 r=r*10+NyLPC_ctoi(*p); 00096 if(l!=(r/10)){return NyLPC_TBool_FALSE;} 00097 l=r; 00098 p++; 00099 } 00100 } 00101 if(strchr("&#\0",*p)==NULL){ 00102 //An error if it is not terminator 00103 return NyLPC_TBool_FALSE; 00104 } 00105 *value=r; 00106 return NyLPC_TBool_TRUE; 00107 } 00108 NyLPC_TBool NyLPC_cUrlReader_getInt(const NyLPC_TChar* i_buf,const NyLPC_TChar* i_key_name,NyLPC_TInt32* value) 00109 { 00110 NyLPC_TInt32 l,r; 00111 const NyLPC_TChar* p; 00112 p=NyLPC_cUrlReader_findKeyValue(i_buf,i_key_name); 00113 if(p==NULL || *p!='='){ 00114 return NyLPC_TBool_FALSE; 00115 } 00116 p++; 00117 //prefixの確認 00118 if((*p=='0') && (NyLPC_tolower(*(p+1))=='x')) 00119 { 00120 //16進数 00121 p+=2; 00122 r=l=0; 00123 while(isxdigit((int)(*p))){ 00124 r=r*16+NyLPC_ctox(*p); 00125 if(l!=(r>>4)){return NyLPC_TBool_FALSE;} 00126 l=r; 00127 p++; 00128 } 00129 }else{ 00130 r=l=0; 00131 if(*p!='-'){ 00132 while(isdigit((int)(*p))){ 00133 r=r*10+NyLPC_ctoi(*p); 00134 if(l!=(r/10)){return NyLPC_TBool_FALSE;} 00135 l=r; 00136 p++; 00137 } 00138 }else{ 00139 p++; 00140 while(isdigit((int)(*p))){ 00141 r=r*10+NyLPC_ctoi(*p); 00142 if(l!=(r/10)){return NyLPC_TBool_FALSE;} 00143 l=r; 00144 p++; 00145 } 00146 r*=-1; 00147 } 00148 } 00149 if(strchr("&#\0",*p)==NULL){ 00150 //An error if it is not terminator 00151 return NyLPC_TBool_FALSE; 00152 } 00153 *value=(int)r; 00154 return NyLPC_TBool_TRUE; 00155 }
Generated on Tue Jul 12 2022 15:46:16 by 1.7.2