stringex.cpp
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:5k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "stringex.h"
  3. #include "datatype.h"
  4. #include "error.h"
  5. #include <windows.h>
  6. #include <malloc.h>
  7. /*
  8. string support class
  9. */
  10. bstr::bstr()
  11. {
  12. ptr = NULL;
  13. size = 0;
  14. };
  15. bstr::bstr( bstr &str )
  16. {
  17. ptr = NULL;
  18. size = 0;
  19. if ( assign( str.ptr ) == false )
  20. throw CError( "bstr::bstr 皋葛府 且寸 角菩" );
  21. }
  22. bstr::bstr( char *str )
  23. {
  24. ptr = NULL;
  25. size = 0;
  26. if ( assign( str ) == false )
  27. throw CError( "bstr::bstr 皋葛府 且寸 角菩" );
  28. }
  29. bstr::~bstr()
  30. {
  31. cleanup();
  32. }
  33. bool bstr::alloc( int len )
  34. {
  35. // cleanup previous assigned data
  36. cleanup();
  37. size = len;
  38. ptr = new char[ size ];
  39. return ptr ? true : false;
  40. }
  41. bool bstr::expand( int len )
  42. {
  43. size += len;
  44. ptr = (char *) realloc( ptr, size );
  45. return ptr ? true : false;
  46. }
  47. bool bstr::assign( char *str, int len )
  48. {
  49. // cleanup previous assigned data
  50. cleanup();
  51. if ( alloc( len + 1 ) == false )
  52. return false;
  53. memcpy( ptr, str, len );
  54. ptr[len] = NULL;
  55. return true;
  56. }
  57. bool bstr::assign( char *str )
  58. {
  59. return assign( str, strlen( str ) );
  60. }
  61. void bstr::cleanup()
  62. {
  63. if ( ptr )
  64. {
  65. delete[] ptr;
  66. ptr = NULL;
  67. }
  68. size = 0;
  69. }
  70. bool bstr::isassign()
  71. {
  72. return ptr ? true : false;
  73. }
  74. int bstr::length()
  75. {
  76. // include NULL space
  77. return size;
  78. }
  79. char * bstr::operator = ( char *str )
  80. {
  81. return assign( str ) ? ptr : NULL;
  82. }
  83. char * bstr::operator = ( bstr &str )
  84. {
  85. return assign( str ) ? ptr : NULL;
  86. }
  87. char * bstr::operator = ( int num )
  88. {
  89. char temp[12];
  90. _itoa( num, temp, 10 );
  91. return assign( temp ) ? ptr : NULL;
  92. }
  93. bool bstr::operator == (char *str )
  94. {
  95. return strcmp( ptr, str ) ? false : true;
  96. }
  97. bool bstr::operator != ( char *str )
  98. {
  99. return strcmp( ptr, str ) ? true : false;
  100. }
  101. bstr & bstr::operator += ( char *str )
  102. {
  103. if ( !size )
  104. {
  105. assign( str );
  106. return *this;
  107. }
  108. expand( strlen( str ) );
  109. strcat( ptr, str );
  110. return *this;
  111. }
  112. bstr & bstr::operator += ( int num )
  113. {
  114. char temp[12]; // it's enough to store 32bit decimal either signed or unsigned
  115. _itoa( num, temp, 10 );
  116. return this->operator += ( temp );
  117. }
  118. bstr operator + ( bstr &str1, bstr &str2 )
  119. {
  120. bstr temp( str1 );
  121. temp += str2;
  122. return temp;
  123. }
  124. bstr operator + ( bstr &str1, char *str2 )
  125. {
  126. bstr temp( str1 );
  127. temp += str2;
  128. return temp;
  129. }
  130. bstr operator + ( char *str1, bstr &str2 )
  131. {
  132. bstr temp( str1 );
  133. temp += str2;
  134. return temp;
  135. }
  136. char * _memstr( char *buf, int buf_len, char *str )
  137. {
  138. int str_len = strlen( str );
  139. int str_idx = 0;
  140. for ( int i = 0; i < buf_len; i++ )
  141. {
  142. if ( str_idx == str_len )
  143. return (char *)(buf + i - str_len);
  144. if ( buf[i] == str[str_idx++] )
  145. continue;
  146. str_idx = 0;
  147. if ( buf[i] == str[str_idx] )
  148. ++str_idx;
  149. }
  150. if ( str_idx == str_len )
  151. return (char *)(buf + i - str_len);
  152. return NULL;
  153. }
  154. char * _memistr( char *buf, int buf_len, char *str )
  155. {
  156. int str_len = strlen( str );
  157. int str_idx = 0;
  158. for ( int i = 0; i < buf_len; i++ )
  159. {
  160. if ( str_idx == str_len )
  161. return (char *)(buf + i - str_len);
  162. if ( toupper( (byte) buf[i] ) == toupper( (byte) str[str_idx++] ) )
  163. continue;
  164. str_idx = 0;
  165. if ( toupper( (byte) buf[i] ) == toupper( (byte) str[str_idx] ) )
  166. ++str_idx;
  167. }
  168. if ( str_idx == str_len )
  169. return (char *)(buf + i - str_len);
  170. return NULL;
  171. }
  172. bool _isspace( char c )
  173. {
  174. return (c == ' ' || c == 't' || c == 'r' || c == 'n');
  175. }
  176. int _ltrim( char *str )
  177. {
  178. int str_len = strlen( str );
  179. int cur_len = 0;
  180. while ( cur_len < str_len )
  181. {
  182. if ( _isspace( str[cur_len] ) )
  183. {
  184. cur_len++;
  185. continue;
  186. }
  187. strcpy( str, &str[cur_len] );
  188. break;
  189. }
  190. return cur_len;
  191. }
  192. int _rtrim( char *str )
  193. {
  194. int str_len = 0;
  195. int cur_len = 0;
  196. while ( true )
  197. {
  198. str_len = strlen( str );
  199. if ( str_len && _isspace( str[str_len - 1] ) )
  200. {
  201. str[str_len - 1] = '';
  202. cur_len++;
  203. }
  204. else
  205. {
  206. break;
  207. }
  208. }
  209. return cur_len;
  210. }
  211. int _trim( char *str )
  212. {
  213. return _ltrim( str ) + _rtrim( str );
  214. }
  215. int _linecopy( char *str, char *buf )
  216. {
  217. char *next;
  218. int  line_len = 0;
  219. if ( (next = strstr( buf, "rn" )) || (next = strchr( buf, 'n' )) )
  220. line_len = next - buf;
  221. else
  222. line_len = strlen( buf );
  223. memcpy( str, buf, line_len );
  224. str[line_len] = '';
  225. return line_len;
  226. }
  227. int _linecopy( bstr *str, char *buf )
  228. {
  229. char *next;
  230. int  line_len = 0;
  231. if ( (next = strstr( buf, "rn" )) || (next = strchr( buf, 'n' )) )
  232. line_len = next - buf;
  233. else
  234. line_len = strlen( buf );
  235. str->assign( buf, line_len );
  236. return line_len;
  237. }
  238. bool _pickstring( char *str, char sep, int index, char *buf, int buf_len )
  239. {
  240. char *pos = str, *next;
  241. int  cur_index = 0;
  242. while ( cur_index <= index )
  243. {
  244. next = strchr( pos, sep );
  245. if ( cur_index == index )
  246. {
  247. if ( next )
  248. {
  249. if ( next - pos >= buf_len )
  250. return false;
  251. memcpy( buf, pos, next - pos );
  252. buf[next - pos] = 0;
  253. return true;
  254. }
  255. if ( strlen( pos ) >= (unsigned) buf_len )
  256. return false;
  257. strcpy( buf, pos );
  258. return true;
  259. }
  260. if ( !next )
  261. break;
  262. ++cur_index;
  263. pos = next + sizeof( sep );
  264. }
  265. return false;
  266. }