OSDN Git Service

UrlEncode,FormatWriterの追加
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Tue, 11 Jun 2013 01:50:13 +0000 (01:50 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Tue, 11 Jun 2013 01:50:13 +0000 (01:50 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@260 47198e57-cb75-475f-84c4-a814cd6f29e0

lib/src/http/NyLPC_cUrlEncode.c [new file with mode: 0644]
lib/src/http/NyLPC_cUrlEncode.h [new file with mode: 0644]
lib/src/utils/NyLPC_cFormatWriter.c [new file with mode: 0644]
lib/src/utils/NyLPC_cFormatWriter.h [new file with mode: 0644]

diff --git a/lib/src/http/NyLPC_cUrlEncode.c b/lib/src/http/NyLPC_cUrlEncode.c
new file mode 100644 (file)
index 0000000..9fa7ecf
--- /dev/null
@@ -0,0 +1,51 @@
+#include "NyLPC_cUrlEncode.h"\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+\r
+\r
+NyLPC_TBool NyLPC_cUrlEncode_initialize(NyLPC_TcUrlEncode_t* i_inst)\r
+{\r
+       i_inst->_len=0;\r
+       return NyLPC_TBool_TRUE;\r
+}\r
+\r
+NyLPC_TcUrlEncode_ST NyLPC_cUrlEncode_decode(NyLPC_TcUrlEncode_t* i_inst,NyLPC_TChar c,NyLPC_TChar* out)\r
+{\r
+       int t;\r
+       if(c=='%'){\r
+               if(i_inst->_len!=0){\r
+                       NyLPC_OnErrorGoto(Error);\r
+               }\r
+               i_inst->_len=1;\r
+               return NyLPC_TcUrlEncode_ST_NEXT;\r
+       }else{\r
+               switch(i_inst->_len){\r
+               case 0:\r
+                       *out=c;\r
+                       return NyLPC_TcUrlEncode_ST_DONE;\r
+               case 1:\r
+                       if(!isxdigit(c)){\r
+                               NyLPC_OnErrorGoto(Error);\r
+                       }\r
+                       t=NyLPC_ctox(c);\r
+                       i_inst->v=(NyLPC_TChar)t;//16進文字→HEX\r
+                       i_inst->_len++;\r
+                       return NyLPC_TcUrlEncode_ST_NEXT;\r
+               case 2:\r
+                       if(!isxdigit(c)){\r
+                               NyLPC_OnErrorGoto(Error);\r
+                       }\r
+                       t=NyLPC_ctox(c);\r
+                       *out=(NyLPC_TChar)((i_inst->v<<4) | t);\r
+                       i_inst->v=0;\r
+                       i_inst->_len=0;\r
+                       return NyLPC_TcUrlEncode_ST_DONE;\r
+               default:\r
+                       NyLPC_OnErrorGoto(Error);\r
+               }\r
+       }\r
+Error:\r
+       i_inst->v=0;\r
+       i_inst->_len=0;\r
+       return NyLPC_TcUrlEncode_ST_ERROR;\r
+}\r
diff --git a/lib/src/http/NyLPC_cUrlEncode.h b/lib/src/http/NyLPC_cUrlEncode.h
new file mode 100644 (file)
index 0000000..64208a7
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * NyLPC_cUrlEncode.h\r
+ *\r
+ *  Created on: 2013/06/11\r
+ *      Author: nyatla\r
+ */\r
+\r
+#ifndef NYLPC_CURLENCODE_H_\r
+#define NYLPC_CURLENCODE_H_\r
+\r
+#include "NyLPC_stdlib.h"\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+\r
+typedef struct NyLPC_TcUrlEncode NyLPC_TcUrlEncode_t;\r
+\r
+typedef NyLPC_TUInt32 NyLPC_TcUrlEncode_ST;\r
+#define NyLPC_TcUrlEncode_ST_NEXT      2\r
+#define NyLPC_TcUrlEncode_ST_DONE      1\r
+#define NyLPC_TcUrlEncode_ST_ERROR     0\r
+\r
+struct NyLPC_TcUrlEncode\r
+{\r
+       /**一時バッファ */\r
+       NyLPC_TChar v;\r
+       /** バッファに蓄積してる長さ*/\r
+       NyLPC_TInt8 _len;\r
+};\r
+\r
+NyLPC_TBool NyLPC_cUrlEncode_initialize(NyLPC_TcUrlEncode_t* i_inst);\r
+\r
+#define NyLPC_cUrlEncode_finalize(i_inst)\r
+\r
+\r
+\r
+NyLPC_TcUrlEncode_ST NyLPC_cUrlEncode_decode(NyLPC_TcUrlEncode_t* i_inst,NyLPC_TChar c,NyLPC_TChar* out);\r
+\r
+\r
+#endif /* NYLPC_CURLENCODE_H_ */\r
diff --git a/lib/src/utils/NyLPC_cFormatWriter.c b/lib/src/utils/NyLPC_cFormatWriter.c
new file mode 100644 (file)
index 0000000..3db8f36
--- /dev/null
@@ -0,0 +1,134 @@
+#include "NyLPC_cFormatWriter.h"\r
+\r
+\r
+#define FTYPE_LENGTH 0x00000001\r
+#define FTYPE_NOTHING 0x00000000\r
+\r
+#define NUM_OF_WORK 16\r
+NyLPC_TBool NyLPC_cFormatWriter_print(NyLPC_cFormatWriter_printHandler i_handler,void* i_inst,const NyLPC_TChar* i_fmt,va_list args)\r
+{\r
+       const char* rp=i_fmt;\r
+       const char* sp;\r
+       char wk[NUM_OF_WORK];\r
+       NyLPC_TUInt32 ftype;\r
+       NyLPC_TUInt32 ut;\r
+       int ol=0;\r
+       while(*rp!='\0'){\r
+               if(*rp=='%'){\r
+                       ftype=FTYPE_NOTHING;\r
+                       rp++;\r
+               FMT_NEXT:\r
+                       switch (*rp){\r
+                       case '.':\r
+                               //%.*(s)\r
+                               if(*(rp+1)=='*'){\r
+                                       //%.*\r
+                                       ftype=FTYPE_LENGTH;\r
+                                       rp+=2;\r
+                                       goto FMT_NEXT;\r
+                               }\r
+                               //その他\r
+                               wk[ol]=*rp;\r
+                               ol++;\r
+                               rp++;\r
+                               break;\r
+                       case 's':\r
+                               switch(ftype){\r
+                               case FTYPE_LENGTH:\r
+                                       //%.*sの場合\r
+                                       ut=va_arg(args,NyLPC_TUInt32);\r
+                                       break;\r
+                               default:\r
+                                       ut=0x7FFFFFFF;\r
+                               }\r
+                               sp=va_arg(args,const char*);\r
+                               while(*sp!=0 && ut>0){\r
+                                       wk[ol]=*sp;\r
+                                       ol++;\r
+                                       sp++;\r
+                                       //バッファフルなら書込み。\r
+                                       if(ol>=NUM_OF_WORK){\r
+                                               i_handler(i_inst,wk,NUM_OF_WORK);\r
+                                               ol=0;\r
+                                       }\r
+                                       ut--;\r
+                               }\r
+                               rp++;\r
+                               continue;\r
+                       case 'c':\r
+                               wk[ol]=(char)va_arg(args,int);\r
+                               rp++;\r
+                               ol++;\r
+                               break;\r
+                       case 'd':\r
+                               //ワークを空にする。\r
+                               if(ol>0){\r
+                                       i_handler(i_inst,wk,ol);\r
+                                       ol=0;\r
+                               }\r
+                               NyLPC_itoa((va_arg(args,int)),wk,10);\r
+                               //強制コミット\r
+                               i_handler(i_inst,wk,strlen(wk));\r
+                               rp++;\r
+                               continue;\r
+                       case 'u':\r
+                               //ワークを空にする。\r
+                               if(ol>0){\r
+                                       i_handler(i_inst,wk,ol);\r
+                               }\r
+                               ut=va_arg(args,NyLPC_TUInt32);\r
+                               ol=15;\r
+                               wk[ol--]='\0';\r
+                               do{\r
+                                       wk[ol--]='0'+(ut%10);\r
+                                       ut/=10;\r
+                               }while(ut>0);\r
+                               i_handler(i_inst,(wk+ol+1),14-ol);\r
+                               ol=0;\r
+                               rp++;\r
+                               continue;\r
+                       case 'x':\r
+                               //ワークを空にする。\r
+                               if(ol>0){\r
+                                       i_handler(i_inst,wk,ol);\r
+                                       ol=0;\r
+                               }\r
+                               NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
+                               //強制コミット\r
+                               i_handler(i_inst,wk,strlen(wk));\r
+                               rp++;\r
+                               continue;\r
+//                     case 'X':\r
+                       case '%':\r
+                               wk[ol]='%';\r
+                               ol++;\r
+                               rp++;\r
+                               break;\r
+                       case '\0':\r
+                               //オワタ(ループ抜けるためにrpはそのまま。)\r
+                               break;\r
+                       default:\r
+                               wk[ol]=*rp;\r
+                               ol++;\r
+                       }\r
+                       //バッファフルなら書込み。\r
+                       if(ol>=NUM_OF_WORK){\r
+                               i_handler(i_inst,wk,NUM_OF_WORK);\r
+                               ol=0;\r
+                       }\r
+               }else if(*rp==0){\r
+                       //オワタ\r
+                       break;\r
+               }else{\r
+                       wk[ol]=*rp;\r
+                       ol++;\r
+                       rp++;\r
+                       if(ol>=NUM_OF_WORK){\r
+                               i_handler(i_inst,wk,NUM_OF_WORK);\r
+                               ol=0;\r
+                       }\r
+               }\r
+       }\r
+       //どこかでエラーが起こってればFALSE返す。\r
+       return i_handler(i_inst,wk,ol);\r
+}\r
diff --git a/lib/src/utils/NyLPC_cFormatWriter.h b/lib/src/utils/NyLPC_cFormatWriter.h
new file mode 100644 (file)
index 0000000..5bc9cde
--- /dev/null
@@ -0,0 +1,28 @@
+#include "NyLPC_stdlib.h"\r
+#include <stdarg.h>\r
+#ifndef NYLPC_CFORMATTEXTWRITER_H_\r
+#define NYLPC_CFORMATTEXTWRITER_H_\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif /* __cplusplus */\r
+\r
+\r
+typedef NyLPC_TBool(*NyLPC_cFormatWriter_printHandler)(void* i_inst,const void* i_buf,NyLPC_TUInt32 i_len);\r
+/**\r
+ * printfライクな書式出力関数です。i_handlerへi_fmtに示される書式文字列を出力します。\r
+ * @param i_fmt\r
+ * フォーマット文字列。以下の形式をサポートします。\r
+ * %d\r
+ * %u\r
+ * %c\r
+ * %%\r
+ * %s,%.*s\r
+ *\r
+ */\r
+NyLPC_TBool NyLPC_cFormatWriter_print(NyLPC_cFormatWriter_printHandler i_handler,void* i_inst,const NyLPC_TChar* i_fmt,va_list args);\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif /* __cplusplus */\r
+#endif /* NYLPC_CFORMATTEXTREADER_H_ */\r