UtilityParser.h
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:6k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. #ifndef UTILITYPARSER_H__
  2. #define UTILITYPARSER_H__
  3. #include <string>
  4. #include <vector>
  5. class UtilityParser {
  6. void InitParser(void)
  7. {
  8. SetDelimiters(",t ");
  9. m_check_quotes = 0;
  10. m_strip = 0;
  11. m_max_args = 0;
  12. m_check_single_quotes = 0;
  13. m_include_quotes = 0;
  14. m_keep_args = 0;
  15. m_arg_index = 0;
  16. }
  17. protected:
  18. std::vector<char> m_delimiters;
  19. std::vector<std::string> m_data;
  20. int m_check_quotes;
  21. int m_check_single_quotes;
  22. int m_strip;
  23. int m_max_args;
  24. int m_include_quotes;
  25. int m_keep_args;
  26. int m_arg_index;
  27. public:
  28. UtilityParser(void){ InitParser();}
  29. UtilityParser(const char * delimiters)
  30. {
  31. InitParser();
  32. SetDelimiters(delimiters);
  33. }
  34. UtilityParser(const char * delimiters, const char * str)
  35. {
  36. InitParser();
  37. SetDelimiters(delimiters);
  38. ParseString(str);
  39. }
  40. ~UtilityParser(void){}
  41. std::vector<std::string> * GetData(void){ return &m_data;}
  42. int StripSpaces(int i = -1)
  43. {
  44. if (i == 0)
  45. m_strip = 0;
  46. else if (i == 1)
  47. m_strip = 1;
  48. return m_strip;
  49. }
  50. void CheckQuotes(void){ m_check_quotes = 1;}
  51. void CheckSingleQuotes(void){ m_check_single_quotes = 1;}
  52. void IncludeQuotes(void){ m_include_quotes = 1;}
  53. void ExcludeQuotes(void){ m_include_quotes = 0;}
  54. void KeepAllArguments(void){ m_keep_args = 1;}
  55. void KeepNonZeroArguments(void){ m_keep_args = 0;}
  56. void IncrementArgumentIndex(int incr=1){ m_arg_index += incr;}
  57. int GetArgument(int i, std::string& s)
  58. {
  59. int result = 0;
  60. if (i < m_data.size())
  61. {
  62. result++;
  63. s = m_data[i];
  64. }
  65. return result;
  66. }
  67. int GetSize(void){ return m_data.size();}
  68. void AppendDelimiter(const char c)
  69. {
  70. m_delimiters.push_back(c);
  71. }
  72. void SetDelimiters(const char * s)
  73. {
  74. if (s)
  75. {
  76. int size = strlen(s);
  77. if (size > 0)
  78. {
  79. m_delimiters.clear();
  80. for (int i=0;i<size;i++){
  81. m_delimiters.push_back(s[i]);
  82. }
  83. }
  84. }
  85. }
  86. int IsDelimiter(char c)
  87. {
  88. int result = 0;
  89. char tempc;
  90. int size = m_delimiters.size();
  91. for (int i=0;i<size;i++){
  92. tempc = m_delimiters[i];
  93. if (tempc == c)
  94. {
  95. result++;
  96. break;
  97. }
  98. }
  99. return result;
  100. }
  101. int IsQuote(char c)
  102. {
  103. int result = 0;
  104. if (c == (char)34)
  105. {
  106. result++;
  107. }
  108. return result;
  109. }
  110. int IsSingleQuote(char c)
  111. {
  112. int result = 0;
  113. if (c == (char)39)
  114. {
  115. result++;
  116. }
  117. return result;
  118. }
  119. void ParseString(const char * s)
  120. {
  121. if (s)
  122. {
  123. std::string temp = s;
  124. ParseString(temp);
  125. }
  126. }
  127. void SetMaxArgs(int args){ m_max_args = args;}
  128. void ParseString(const std::string& s)
  129. {
  130. m_data.clear();
  131. m_arg_index = 0;
  132. std::string token = "";
  133. char c;
  134. int i;
  135. int inside_quotes = 0;
  136. int length = s.length();
  137. for (i=0;i<length;i++){
  138. c = s.c_str()[i];
  139. if (m_check_quotes && IsQuote(c))
  140. {
  141. if (m_include_quotes)
  142. {
  143. if (inside_quotes)
  144. {
  145. token += c;
  146. m_data.push_back(token);
  147. token = "";
  148. }
  149. else
  150. {
  151. if (!m_keep_args)
  152. {
  153. if (token.length() > 0)
  154. {
  155. m_data.push_back(token);
  156. }
  157. }
  158. else
  159. {
  160. m_data.push_back(token);
  161. }
  162. token = c;
  163. }
  164. }
  165. else
  166. {
  167. if (!m_keep_args)
  168. {
  169. if (token.length() > 0)
  170. {
  171. m_data.push_back(token);
  172. }
  173. }
  174. else
  175. {
  176. m_data.push_back(token);
  177. }
  178. token = "";
  179. }
  180. inside_quotes = !inside_quotes;
  181. }
  182. else if (m_check_single_quotes && IsSingleQuote(c))
  183. {
  184. if (m_include_quotes)
  185. {
  186. if (inside_quotes)
  187. {
  188. token += c;
  189. m_data.push_back(token);
  190. token = "";
  191. }
  192. else
  193. {
  194. if (!m_keep_args)
  195. {
  196. if (token.length() > 0)
  197. {
  198. m_data.push_back(token);
  199. }
  200. }
  201. else
  202. {
  203. m_data.push_back(token);
  204. }
  205. token = "";
  206. token += c;
  207. }
  208. }
  209. else
  210. {
  211. if (!m_keep_args)
  212. {
  213. if (token.length() > 0)
  214. {
  215. m_data.push_back(token);
  216. }
  217. }
  218. else
  219. {
  220. m_data.push_back(token);
  221. }
  222. token = "";
  223. }
  224. inside_quotes = !inside_quotes;
  225. }
  226. else if ((m_check_quotes||m_check_single_quotes) && inside_quotes)
  227. {
  228. token += c;
  229. }
  230. else if (IsDelimiter(c) || (c<32))
  231. {
  232. if (!m_keep_args)
  233. {
  234. if (token.length() > 0)
  235. {
  236. m_data.push_back(token);
  237. }
  238. }
  239. else
  240. {
  241. m_data.push_back(token);
  242. }
  243. token = "";
  244.   // max arg check
  245. if (m_max_args && m_data.size() >= m_max_args)
  246. break;
  247. }
  248. else
  249. {
  250. token += c;
  251. }
  252. }
  253. if (!m_keep_args)
  254. {
  255. if (token.length() > 0)
  256. m_data.push_back(token);
  257. }
  258. else
  259. {
  260. m_data.push_back(token);
  261. }
  262. }
  263. bool IsNumber(std::string& s)
  264. {
  265. return IsNumber(s.c_str());
  266. }
  267. bool IsNumber(const char * s)
  268. {
  269. bool result = (IsIntNumber(s) || IsFloatNumber(s));
  270. return result;
  271. }
  272. bool IsFloatNumber(const char * s)
  273. {
  274. bool result = false;
  275. if (s)
  276. {
  277. std::string us = s;
  278. return IsFloatNumber(us);
  279. }
  280. return result;
  281. }
  282. bool IsFloatNumber(std::string& s)
  283. {
  284. bool result = false;
  285. char c;
  286. int size = s.length();
  287. bool got_decimal = false;
  288. for (int i=0;i<size;i++){
  289. c = s.c_str()[i];
  290. if (i == 0)
  291. {
  292. if (c == '.')
  293. {
  294. result = true;
  295. got_decimal = true;
  296. }
  297. else if (c == '-')
  298. {
  299. result = true;
  300. }
  301. else if ((c>=48) && (c<=57))
  302. {
  303. result = true;
  304. }
  305. else
  306. {
  307. break;
  308. }
  309. }
  310. else
  311. {
  312. if (c == '.' && !got_decimal)
  313. {
  314. got_decimal = true;
  315. }
  316. else if ((c>=48 && c<=57))
  317. {
  318. }
  319. else
  320. {
  321. result = false;
  322. break;
  323. }
  324. }
  325. }
  326. return result;
  327. }
  328. bool IsIntNumber(const char * s)
  329. {
  330. bool result = false;
  331. if (s)
  332. {
  333. std::string us = s;
  334. result = IsIntNumber(us);
  335. }
  336. return result;
  337. }
  338. bool IsIntNumber(std::string& s)
  339. {
  340. bool result = false;
  341. char c;
  342. int size = s.length();
  343. for (int i=0;i<size;i++){
  344. c = s.c_str()[i];
  345. if (i == 0)
  346. {
  347. if (c == '-')
  348. {
  349. result = true;
  350. }
  351. else if ((c>=48) && (c<=57))
  352. {
  353. result = true;
  354. }
  355. else
  356. {
  357. break;
  358. }
  359. }
  360. else
  361. {
  362. if ((c>=48 && c<=57))
  363. {
  364. }
  365. else
  366. {
  367. result = false;
  368. break;
  369. }
  370. }
  371. }
  372. return result;
  373. }
  374. };
  375. #endif