Str.cpp
上传用户:oy0519
上传日期:2008-01-20
资源大小:124k
文件大小:7k
源码类别:

绘图程序

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include "Str.h"
  6. CStr::CStr(const char* str)
  7. {
  8. if(str == 0)
  9. {
  10. m_nLength = 0;
  11. m_pString = 0;
  12. }
  13. else
  14. {
  15. m_nLength = strlen(str);
  16. m_pString = new char[m_nLength + 1];
  17. assert(m_pString != 0);
  18. strcpy(m_pString, str);
  19. }
  20. }
  21. CStr::CStr(const CStr& str)
  22. if(str == 0)
  23. {
  24. m_nLength = 0;
  25. m_pString = 0;
  26. }
  27. else
  28. {
  29. m_nLength = str.m_nLength; 
  30. m_pString = new char[m_nLength + 1];
  31. assert(m_pString != 0);
  32. strcpy(m_pString, str.m_pString); 
  33. }
  34. }
  35. CStr& CStr::operator +=(const CStr& str)
  36. {
  37. m_nLength += str.m_nLength;
  38. char* pNew = new char[m_nLength + 1];
  39. assert(pNew != 0);
  40. strcpy(pNew, m_pString);
  41. strcat(pNew, str.m_pString);
  42. delete m_pString;
  43. m_pString = pNew;
  44. return *this;
  45. }
  46. CStr& CStr::operator =(const char* str)
  47. {
  48. if (m_pString) delete m_pString;
  49. m_nLength = strlen(str);
  50. m_pString = new char[m_nLength + 1]; 
  51. assert(m_pString != 0);
  52. strcpy(m_pString, str);
  53. return *this;
  54. }
  55. CStr& CStr::operator =(const CStr& str)
  56. {
  57. assert(str != 0);
  58. if (m_pString) delete m_pString;
  59. m_nLength = strlen(str.m_pString);
  60. m_pString = new char[m_nLength + 1]; 
  61. assert(m_pString != 0);
  62. strcpy(m_pString, str.m_pString);
  63. return *this;
  64. }
  65. void CStr::VarToString(const double var)
  66. {
  67. char str[32];
  68. gcvt(var, 16, str);
  69. m_nLength = strlen(str);
  70. if (str[m_nLength - 1] == '.')
  71. {
  72. str[m_nLength - 1] = '';
  73. m_nLength --;
  74. }
  75. m_nLength = strlen(str);
  76. m_pString = new char[m_nLength + 1];
  77. assert(m_pString != 0);
  78. strcpy(m_pString, str);
  79. }
  80. int CStr::Format(const char* format, ...)
  81. {
  82. assert(format != 0);
  83. int len;
  84. char* MaxBuf;
  85. for(int i = 5; ; i ++)
  86. {
  87. len = (int)pow(2, i);
  88. MaxBuf = new char[len];
  89. if (!MaxBuf) return 0;
  90. // some UNIX's do not support vsnprintf and snprintf
  91. len = _vsnprintf(MaxBuf, len, format, (char*)(&format + 1));
  92. if (len > 0) break;
  93. delete []MaxBuf;
  94. if (len == 0) return 0;
  95. }
  96. if (!m_pString)
  97. {
  98. m_nLength = len;
  99. m_pString = new char[m_nLength + 1];
  100. }
  101. else if (m_nLength < len)
  102. {
  103. delete m_pString;
  104. m_nLength = len;
  105. m_pString = new char[m_nLength + 1];
  106. }
  107. if (m_pString) 
  108. strcpy(m_pString, MaxBuf);
  109. else
  110. len = 0;
  111. delete []MaxBuf;
  112. return len;
  113. }
  114. bool CStr::Match(char* Wildcards, char* str)
  115. {
  116. bool Yes = 1;
  117. //iterate and delete '?' and '*' one by one
  118. while(*Wildcards != '' && Yes && *str != '')
  119. {
  120. if (*Wildcards == '?') str ++;
  121. else if (*Wildcards == '*')
  122. {
  123. Yes = Scan(Wildcards, str);
  124. Wildcards --;
  125. }
  126. else
  127. {
  128. Yes = (*Wildcards == *str);
  129. str ++;
  130. }
  131. Wildcards ++;
  132. }
  133. while (*Wildcards == '*' && Yes)  Wildcards ++;
  134. return Yes && *str == '' && *Wildcards == '';
  135. }
  136. // scan '?' and '*'
  137. bool CStr::Scan(char*& Wildcards, char*& str)
  138. {
  139. // remove the '?' and '*'
  140. for(Wildcards ++; *str != '' && (*Wildcards == '?' || *Wildcards == '*'); Wildcards ++)
  141. if (*Wildcards == '?') str ++;
  142. while ( *Wildcards == '*') Wildcards ++;
  143. // if str is empty and Wildcards has more characters or,
  144. // Wildcards is empty, return 
  145. if (*str == '' && *Wildcards != '') return false;
  146. if (*str == '' && *Wildcards == '') return true; 
  147. // else search substring
  148. else
  149. {
  150. char* wdsCopy = Wildcards;
  151. char* strCopy = str;
  152. bool  Yes     = 1;
  153. do 
  154. {
  155. if (!Match(Wildcards, str)) strCopy ++;
  156. Wildcards = wdsCopy;
  157. str   = strCopy;
  158. while ((*Wildcards != *str) && (*str != '')) str ++;
  159. wdsCopy = Wildcards;
  160. strCopy = str;
  161. }while ((*str != '') ? !Match(Wildcards, str) : (Yes = false) != false);
  162. if (*str == '' && *Wildcards == '') return true;
  163. return Yes;
  164. }
  165. }
  166. bool CStr::NumericParse(void* pvar, char flag)
  167. {
  168. assert(m_pString != 0);
  169. char* pTmpStr = m_pString;
  170. // remove the leading ' ' and 't' at the beginning
  171. while (*pTmpStr == ' ' || *pTmpStr == 't')
  172. pTmpStr++;
  173. // no desired character found
  174. if (strlen(pTmpStr) == 0)
  175. return false;
  176. char a = pTmpStr[0];
  177. if ((flag == 'b' || flag == 'C' || flag == 'S' || 
  178. flag == 'I' || flag == 'L') && a == '-')
  179. return false;
  180. if (flag == 'b')
  181. {
  182. bool var;
  183. if (strcmp(pTmpStr, "true") == 0 || strcmp(pTmpStr, "1") == 0 ||
  184. strcmp(pTmpStr, "TRUE") == 0) var = true;
  185. else if (strcmp(pTmpStr, "false") == 0 || strcmp(pTmpStr, "0") == 0 ||
  186. strcmp(pTmpStr, "FALSE") == 0) var = false;
  187. else // failed
  188. return false;
  189. memcpy(pvar, &var, sizeof(bool));
  190. return true;
  191. }
  192. else
  193. {
  194. double tmpvar = strtod(pTmpStr, (char**)&pTmpStr);
  195. if (tmpvar == 0.0 && a != '0')
  196. return false;   // convertion wrong
  197. if (flag == 'f' || flag == 'd')
  198. {
  199. // allow any float value with one 'f' or 'F' terminated
  200. if (*pTmpStr == 'f' || *pTmpStr == 'F') 
  201. pTmpStr++;
  202. }
  203. else if (flag == 'l' || flag == 'L')
  204. {
  205. // allow any float value with one 'l' or 'L terminated
  206. if (*pTmpStr == 'l' || *pTmpStr == 'L') 
  207. pTmpStr++;
  208. }
  209. switch(flag)
  210. {
  211. case 'c':
  212. {
  213. //if (tmpvar < -(0xff / 2 + 1) || tmpvar > 0xff / 2)
  214. if (tmpvar < -128 || tmpvar > 127)
  215. return false;   // onerflow
  216. char var = (char)tmpvar;
  217. memcpy(pvar, &var, sizeof(char));
  218. }
  219. break;
  220. case 's':
  221. {
  222. //if (tmpvar < -(0xffff / 2 + 1) || tmpvar > 0xffff / 2)
  223. if (tmpvar < -32768.0 || tmpvar > 32768.0)
  224. return false;   // onerflow
  225. short var = (short)tmpvar;
  226. memcpy(pvar, &var, sizeof(short));
  227. }
  228. break;
  229. case 'i':
  230. {
  231. //if (tmpvar < -(0xffffffff / 2 + 1) || tmpvar > 0xffffffff / 2)
  232. if (tmpvar < -2147483648.0 || tmpvar > 2147483647.0)
  233. return false;   // onerflow
  234. int var = (int)tmpvar;
  235. memcpy(pvar, &var, sizeof(int));
  236. }
  237. break;
  238. case 'l':
  239. {
  240. //if (tmpvar < -(0xffffffff / 2 + 1) || tmpvar > 0xffffffff / 2)
  241. if (tmpvar < -2147483648.0 || tmpvar > 2147483647.0)
  242. return false;   // onerflow
  243. long var = (long)tmpvar;
  244. memcpy(pvar, &var, sizeof(long));
  245. }
  246. break;
  247. case 'C':
  248. {
  249. //if (tmpvar < 0 || tmpvar > 0xff)
  250. if (tmpvar < 0.0 || tmpvar > 255)
  251. return false;   // onerflow
  252. unsigned char var = (unsigned char)tmpvar;
  253. memcpy(pvar, &var, sizeof(unsigned char));
  254. }
  255. break;
  256. case 'S':
  257. {
  258. //if (tmpvar < 0 || tmpvar > 0xffff)
  259. if (tmpvar < 0.0 || tmpvar > 65535.0)
  260. return false;   // onerflow
  261. unsigned short var = (unsigned short)tmpvar;
  262. memcpy(pvar, &var, sizeof(unsigned short));
  263. }
  264. break;
  265. case 'I':
  266. {
  267. //if (tmpvar < 0 || tmpvar > 0xffffffff)
  268. if (tmpvar < 0.0 || tmpvar > 4294967295.0)
  269. return false;   // onerflow
  270. unsigned int var = (unsigned int)tmpvar;
  271. memcpy(pvar, &var, sizeof(unsigned int));
  272. }
  273. break;
  274. case 'L':
  275. {
  276. //if (tmpvar < 0 || tmpvar > 0xffffffff)
  277. if (tmpvar < 0.0 || tmpvar > 4294967295.0)
  278. return false;   // onerflow
  279. unsigned long var = (unsigned long)tmpvar;
  280. memcpy(pvar, &var, sizeof(unsigned long));
  281. }
  282. break;
  283. case 'f':
  284. {
  285. if (tmpvar < -3.402823466e+38 || tmpvar > 3.402823466e+38)
  286. return false;   // onerflow
  287. float var = (float)tmpvar;
  288. memcpy(pvar, &var, sizeof(float));
  289. }
  290. break;
  291. case 'd':
  292. memcpy(pvar, &tmpvar, sizeof(double));
  293. break;
  294. }
  295. // remove the leading ' ' and 't' at the end
  296. while (*pTmpStr == ' ' || *pTmpStr == 't')
  297. pTmpStr++;
  298. if (*pTmpStr != '')
  299. return false;   // non digital character detected
  300. return true;
  301. }
  302. }