OSDN Git Service

update libMiMic
[mimic/MiMicSDK.git] / lib / src / http / NyLPC_cUrlReader.c
1 #include "NyLPC_cUrlReader.h"\r
2 #include "NyLPC_utils.h"\r
3 #include <ctype.h>\r
4 NyLPC_TBool NyLPC_cUrlReader_getPath(const NyLPC_TChar* i_src,const NyLPC_TChar** path,NyLPC_TInt32* path_len)\r
5 {\r
6     const NyLPC_TChar* p=i_src;\r
7     for(;strchr("?#\0",*p)==NULL;p++);\r
8     *path=i_src;\r
9     *path_len=p-i_src;\r
10     return NyLPC_TBool_TRUE;\r
11 }\r
12 \r
13 /**\r
14  * 指定したURLクエリキーの値を探します。\r
15  * @return\r
16  * クエリ値の直前のポインタです。\r
17  * 例えばキーがabcの場合、[^\?]*\?abc=cdfの場合、=の位置を返します。[^\?]*\?abc&cdfの場合、&の位置を返します。\r
18  * cdfの場合、[^\?]*\?abc=cdfはNULL,[^\?]*\?abc&cdfは終端'\0'の位置を返します。\r
19  */\r
20 const NyLPC_TChar* NyLPC_cUrlReader_findKeyValue(const NyLPC_TChar* i_src,const NyLPC_TChar* i_key_name)\r
21 {\r
22     const NyLPC_TChar* p=i_src;\r
23     const NyLPC_TChar* k;\r
24     NyLPC_TInt32 kn,kl;\r
25     //?検索\r
26     for(;*p!='\0' && *p!='?';p++);\r
27     if(*p!='?'){\r
28         return NULL;\r
29     }\r
30     p++;\r
31     kl=strlen(i_key_name);\r
32     //search key value\r
33     for(;;){\r
34         //word検索(alnum_-のみ)\r
35         kn=NyLPC_cFormatTextReader_readWord(p,&k);\r
36         if(strncmp(i_key_name,k,kl)==0){\r
37             break;\r
38         }\r
39         p+=kn;\r
40         for(;*p!='\0' && *p!='&';p++);\r
41         if(*p!='&'){\r
42             return NULL;\r
43         }\r
44         p++;\r
45     }\r
46     return p+kn;\r
47 }\r
48 \r
49 /**\r
50  * URLから指定キー[:KEY:]のURLクエリ値[:VALUE:]を取得します。\r
51  * [:query:] := [^\?]*\?(&[:KEY:](=[:VALUE:])?&)*([:KEY:](=[:VALUE:])?)\r
52  * [:KEY:]   := [a-zA-Z0-9_-]\r
53  * [:VALUE:] := [^\#&]\r
54  */\r
55 NyLPC_TBool NyLPC_cUrlReader_getStr(const NyLPC_TChar* i_src,const NyLPC_TChar* i_key_name,const NyLPC_TChar** str,NyLPC_TInt32* str_len)\r
56 {\r
57     const NyLPC_TChar* p;\r
58     p=NyLPC_cUrlReader_findKeyValue(i_src,i_key_name);\r
59     if(p==NULL || *p!='='){\r
60         *str=p;\r
61         *str_len=0;\r
62         return NyLPC_TBool_FALSE;\r
63     }\r
64     p++;\r
65     *str=p;\r
66     for(;strchr("&#\0",*p)==NULL;p++);\r
67     *str_len=p-*str;\r
68     return NyLPC_TBool_TRUE;\r
69 }\r
70 \r
71 NyLPC_TBool NyLPC_cUrlReader_getUInt(const NyLPC_TChar* i_buf,const NyLPC_TChar* i_key_name,NyLPC_TUInt32* value)\r
72 {\r
73     NyLPC_TUInt32 l,r;\r
74     const NyLPC_TChar* p;\r
75     p=NyLPC_cUrlReader_findKeyValue(i_buf,i_key_name);\r
76     if(p==NULL || *p!='='){\r
77         return NyLPC_TBool_FALSE;\r
78     }\r
79     p++;\r
80     //prefixの確認\r
81     if((*p=='0') && (NyLPC_tolower(*(p+1))=='x'))\r
82     {\r
83         //16進数\r
84         p+=2;\r
85         r=l=0;\r
86         while(isxdigit((int)(*p))){\r
87             r=r*16+NyLPC_ctox(*p);\r
88             if(l!=(r>>4)){return NyLPC_TBool_FALSE;}\r
89             l=r;\r
90             p++;\r
91         }\r
92     }else{\r
93         r=l=0;\r
94         while(isdigit((int)(*p))){\r
95             r=r*10+NyLPC_ctoi(*p);\r
96             if(l!=(r/10)){return NyLPC_TBool_FALSE;}\r
97             l=r;\r
98             p++;\r
99         }\r
100     }\r
101     if(strchr("&#\0",*p)==NULL){\r
102         //An error if it is not terminator\r
103         return NyLPC_TBool_FALSE;\r
104     }\r
105     *value=r;\r
106     return NyLPC_TBool_TRUE;\r
107 }\r
108 NyLPC_TBool NyLPC_cUrlReader_getInt(const NyLPC_TChar* i_buf,const NyLPC_TChar* i_key_name,NyLPC_TInt32* value)\r
109 {\r
110     NyLPC_TInt32 l,r;\r
111     const NyLPC_TChar* p;\r
112     p=NyLPC_cUrlReader_findKeyValue(i_buf,i_key_name);\r
113     if(p==NULL || *p!='='){\r
114         return NyLPC_TBool_FALSE;\r
115     }\r
116     p++;\r
117     //prefixの確認\r
118     if((*p=='0') && (NyLPC_tolower(*(p+1))=='x'))\r
119     {\r
120         //16進数\r
121         p+=2;\r
122         r=l=0;\r
123         while(isxdigit((int)(*p))){\r
124             r=r*16+NyLPC_ctox(*p);\r
125             if(l!=(r>>4)){return NyLPC_TBool_FALSE;}\r
126             l=r;\r
127             p++;\r
128         }\r
129     }else{\r
130         r=l=0;\r
131         if(*p!='-'){\r
132             while(isdigit((int)(*p))){\r
133                 r=r*10+NyLPC_ctoi(*p);\r
134                 if(l!=(r/10)){return NyLPC_TBool_FALSE;}\r
135                 l=r;\r
136                 p++;\r
137             }\r
138         }else{\r
139             p++;\r
140             while(isdigit((int)(*p))){\r
141                 r=r*10+NyLPC_ctoi(*p);\r
142                 if(l!=(r/10)){return NyLPC_TBool_FALSE;}\r
143                 l=r;\r
144                 p++;\r
145             }\r
146             r*=-1;\r
147         }\r
148     }\r
149     if(strchr("&#\0",*p)==NULL){\r
150         //An error if it is not terminator\r
151         return NyLPC_TBool_FALSE;\r
152     }\r
153     *value=(int)r;\r
154     return NyLPC_TBool_TRUE;\r
155 }\r