--- /dev/null
+#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
--- /dev/null
+/*\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
--- /dev/null
+#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
--- /dev/null
+#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