This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers NyLPC_cUrlReader.c Source File

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 }