Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of libMiMic by
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 16:22:59 by
