关键词搜索

源码搜索 ×
×

tars源码分析之24

发布2022-07-17浏览625次

详情内容

参数解析,其实就是字符串的转化,简单:

  1. #include "util/tc_parsepara.h"
  2. namespace tars
  3. {
  4. #define ENCODE_TABLE "=&%\r\n"
  5. TC_Parsepara::TC_Parsepara(const string &sParam)
  6. {
  7. load(sParam);
  8. }
  9. TC_Parsepara::TC_Parsepara(const map<string, string> &mpParam)
  10. {
  11. load(mpParam);
  12. }
  13. TC_Parsepara::TC_Parsepara(const TC_Parsepara &para)
  14. {
  15. _param = para._param;
  16. }
  17. TC_Parsepara &TC_Parsepara::operator=(const TC_Parsepara &para)
  18. {
  19. if(this != &para)
  20. {
  21. clear();
  22. _param = para._param;
  23. }
  24. return *this;
  25. }
  26. bool TC_Parsepara::operator==(const TC_Parsepara &para)
  27. {
  28. return _param == para._param;
  29. }
  30. const TC_Parsepara TC_Parsepara::operator+(const TC_Parsepara &para)
  31. {
  32. map<string, string> mpParam;
  33. mpParam = _param;
  34. mpParam.insert(para._param.begin(), para._param.end());
  35. return TC_Parsepara(mpParam);
  36. }
  37. TC_Parsepara& TC_Parsepara::operator+=(const TC_Parsepara &para)
  38. {
  39. _param.insert(para._param.begin(), para._param.end());
  40. return *this;
  41. }
  42. TC_Parsepara::~TC_Parsepara()
  43. {
  44. clear();
  45. }
  46. void TC_Parsepara::clear()
  47. {
  48. _param.clear();
  49. }
  50. string TC_Parsepara::encodeMap(const map<string, string> &mpParam) const
  51. {
  52. string sParsepara("");
  53. map<string, string>::const_iterator it = mpParam.begin();
  54. while(it != mpParam.end())
  55. {
  56. sParsepara += encodestr((*it).first) + "=" + encodestr((*it).second);
  57. it++;
  58. if(it != mpParam.end())
  59. {
  60. sParsepara += "&";
  61. }
  62. }
  63. return sParsepara;
  64. }
  65. void TC_Parsepara::decodeMap(const string &sParam, map<string, string> &mpParam) const
  66. {
  67. int iFlag = 0;
  68. char ch1 = '=';
  69. char ch2 = '&';
  70. string sName;
  71. string sValue;
  72. string sBuffer;
  73. if (sParam.length() == 0)
  74. {
  75. mpParam.clear();
  76. return ;
  77. }
  78. string::size_type pos = 0;
  79. while( pos <= sParam.length())
  80. {
  81. if(sParam[pos] == ch1) //中间分隔符,前面读入是name
  82. {
  83. sName = decodestr(sBuffer);
  84. sBuffer = "";
  85. iFlag = 1;
  86. }
  87. else if(sParam[pos] == ch2 || pos == sParam.length()) //结束符,读入的是值
  88. {
  89. sValue = decodestr(sBuffer);
  90. sBuffer = "";
  91. if(sName.length() > 0 && iFlag)
  92. {
  93. mpParam[sName] = decodestr(sValue);
  94. iFlag = 0;
  95. }
  96. }
  97. else
  98. {
  99. sBuffer += sParam[pos];
  100. }
  101. pos++;
  102. }
  103. }
  104. void TC_Parsepara::load(const string &sParam)
  105. {
  106. clear();
  107. decodeMap(sParam, _param);
  108. }
  109. void TC_Parsepara::load(const map<string, string> &mpParam)
  110. {
  111. _param = mpParam;
  112. }
  113. string TC_Parsepara::tostr() const
  114. {
  115. return encodeMap(_param);
  116. }
  117. string &TC_Parsepara::operator[](const string &sName)
  118. {
  119. return _param[sName];
  120. }
  121. string TC_Parsepara::getValue(const string &sName) const
  122. {
  123. string sValue;
  124. map<string, string>::const_iterator it;
  125. if((it = _param.find(sName)) != _param.end())
  126. {
  127. sValue = it->second;
  128. }
  129. return sValue;
  130. }
  131. void TC_Parsepara::setValue(const string &sName, const string &sValue)
  132. {
  133. _param[sName] = sValue;
  134. }
  135. map<string,string> &TC_Parsepara::toMap()
  136. {
  137. return _param;
  138. }
  139. const map<string,string> &TC_Parsepara::toMap() const
  140. {
  141. return _param;
  142. }
  143. void TC_Parsepara::traverse(TC_ParseparaTraverseFunc func,void *pParam)
  144. {
  145. map<string, string>::iterator it = _param.begin();
  146. map<string, string>::iterator itEnd = _param.end();
  147. while(it != itEnd)
  148. {
  149. func(it->first, it->second, pParam);
  150. ++it;
  151. }
  152. }
  153. char TC_Parsepara::x2c(const string &sWhat)
  154. {
  155. register char digit;
  156. if(sWhat.length() < 2)
  157. {
  158. return '\0';
  159. }
  160. digit = (sWhat[0] >= 'A' ? ((sWhat[0] & 0xdf) - 'A')+10 : (sWhat[0] - '0'));
  161. digit *= 16;
  162. digit += (sWhat[1] >= 'A' ? ((sWhat[1] & 0xdf) - 'A')+10 : (sWhat[1] - '0'));
  163. return(digit);
  164. }
  165. string TC_Parsepara::decodestr(const string &sParam)
  166. {
  167. string sBuffer("");
  168. string::size_type pos = 0;
  169. while( pos < sParam.length())
  170. {
  171. if(sParam[pos] == '%')
  172. {
  173. if (pos >= sParam.length() - 2)
  174. {
  175. break;
  176. }
  177. sBuffer += x2c(sParam.substr(pos + 1));
  178. pos += 3;
  179. }
  180. else
  181. {
  182. sBuffer += sParam[pos];
  183. pos++;
  184. }
  185. }
  186. return sBuffer;
  187. }
  188. string TC_Parsepara::encodestr(const string &sParam)
  189. {
  190. string sBuffer("");
  191. static char sHexTable[17] = "0123456789ABCDEF";
  192. string::size_type pos = 0;
  193. while( pos < sParam.length())
  194. {
  195. if(string(ENCODE_TABLE).find_first_of(sParam[pos]) != string::npos)
  196. {
  197. sBuffer += '%';
  198. sBuffer += sHexTable[(sParam[pos]>>4)&0x0f];
  199. sBuffer += sHexTable[sParam[pos]&0x0f];
  200. }
  201. else
  202. {
  203. sBuffer += sParam[pos];
  204. }
  205. pos++;
  206. }
  207. return sBuffer;
  208. }
  209. }

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载