KStrBase.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KStrBase.cpp
  5. // Date: 2000.08.08
  6. // Code: WangWei(Daphnis)
  7. // Desc: String Utility Functions
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KDebug.h"
  11. #include "KMemBase.h"
  12. #include "KStrBase.h"
  13. #include <string.h>
  14. ENGINE_API int g_StrLen(LPCSTR lpStr)
  15. {
  16. #ifdef WIN32
  17. register int nLen;
  18. __asm
  19. {
  20. mov edi, lpStr
  21. mov ecx, 0xffffffff
  22. xor al, al
  23. repne scasb
  24. not ecx
  25. dec ecx
  26. mov nLen, ecx
  27. }
  28. return nLen;
  29. #else
  30.      return strlen(lpStr);
  31. #endif
  32. }
  33. //---------------------------------------------------------------------------
  34. // 函数: StrEnd
  35. // 功能: 返回字符串结尾指针
  36. // 参数: lpStr : 字符串开头的指针
  37. // 返回: lpEnd : 字符串末尾的指针
  38. //---------------------------------------------------------------------------
  39. ENGINE_API LPSTR g_StrEnd(LPCSTR lpStr)
  40. {
  41. #ifdef WIN32
  42. register LPSTR lpEnd;
  43. __asm
  44. {
  45. mov edi, lpStr
  46. mov ecx, 0xffffffff
  47. xor al, al
  48. repne scasb
  49. lea eax, [edi - 1]
  50. mov lpEnd, eax
  51. }
  52. return lpEnd;
  53. #else
  54.      return (char *)lpStr + strlen(lpStr);
  55. #endif
  56. }
  57. //---------------------------------------------------------------------------
  58. // 函数: StrCpy
  59. // 功能: 字符串拷贝
  60. // 参数: lpDest : 目标字符串
  61. // lpSrc : 源字符串
  62. // 返回: void
  63. //---------------------------------------------------------------------------
  64. ENGINE_API void g_StrCpy(LPSTR lpDest, LPCSTR lpSrc)
  65. {
  66. #ifdef WIN32
  67. __asm
  68. {
  69. mov edi, lpSrc
  70. mov ecx, 0xffffffff
  71. xor al, al
  72. repne scasb
  73. not ecx
  74. mov edi, lpDest
  75. mov esi, lpSrc
  76. mov edx, ecx
  77. shr ecx, 2
  78. rep movsd
  79. mov ecx, edx
  80. and ecx, 3
  81. rep movsb
  82. };
  83. #else
  84.     strcpy(lpDest, lpSrc);
  85. #endif
  86. }
  87. //---------------------------------------------------------------------------
  88. // 函数: StrCpyLen
  89. // 功能: 字符串拷贝,有最大长度限制
  90. // 参数: lpDest : 目标字符串
  91. // lpSrc : 源字符串
  92. // nMaxLen : 最大长度
  93. // 返回: void
  94. //---------------------------------------------------------------------------
  95. ENGINE_API void g_StrCpyLen(LPSTR lpDest, LPCSTR lpSrc, int nMaxLen)
  96. {
  97. #ifdef WIN32
  98. __asm
  99. {
  100. xor al, al
  101. mov edx, nMaxLen
  102. dec edx
  103. jg copy_section
  104. jl finished
  105. mov edi, lpDest
  106. stosb
  107. jmp finished
  108. copy_section:
  109. mov edi, lpSrc
  110. mov ecx, 0xffffffff
  111. repne scasb
  112. not ecx
  113. dec ecx
  114. cmp ecx, edx
  115. jle loc_little_equal
  116. mov ecx, edx
  117. loc_little_equal:
  118. mov edi, lpDest
  119. mov esi, lpSrc
  120. mov edx, ecx
  121. shr ecx, 2
  122. rep movsd
  123. mov ecx, edx
  124. and ecx, 3
  125. rep movsb
  126. stosb
  127. finished:
  128. };
  129. #else
  130.     strncpy(lpDest, lpSrc, nMaxLen);
  131. #endif
  132. }
  133. //---------------------------------------------------------------------------
  134. // 函数: StrCat
  135. // 功能: 字符串末尾追加另一个字符串
  136. // 参数: lpDest : 目标字符串
  137. // lpSrc : 源字符串
  138. // 返回: void
  139. //---------------------------------------------------------------------------
  140. ENGINE_API void g_StrCat(LPSTR lpDest, LPCSTR lpSrc)
  141. {
  142. register LPSTR lpEnd;
  143. lpEnd = g_StrEnd(lpDest);
  144. g_StrCpy(lpEnd, lpSrc);
  145. }
  146. //---------------------------------------------------------------------------
  147. // 函数: StrCatLen
  148. // 功能: 字符串末尾追加另一个字符串,有最大长度限制
  149. // 参数: lpDest : 目标字符串
  150. // lpSrc : 源字符串
  151. // nMaxLen : 最大长度
  152. // 返回: void
  153. //---------------------------------------------------------------------------
  154. ENGINE_API void g_StrCatLen(LPSTR lpDest, LPCSTR lpSrc, int nMaxLen)
  155. {
  156. register LPSTR lpEnd;
  157. lpEnd = g_StrEnd(lpDest);
  158. g_StrCpyLen(lpEnd, lpSrc, nMaxLen);
  159. }
  160. //---------------------------------------------------------------------------
  161. // 函数: StrCmp
  162. // 功能: 字符串比较
  163. // 参数: lpDest : 字符串1
  164. // lpSrc : 字符串2
  165. // 返回: TRUE : 相同
  166. // FALSE : 不同
  167. //---------------------------------------------------------------------------
  168. ENGINE_API BOOL g_StrCmp(LPCSTR lpDest, LPCSTR lpSrc)
  169. {
  170. register int nLen1, nLen2;
  171. nLen1 = g_StrLen(lpDest);
  172. nLen2 = g_StrLen(lpSrc);
  173. if (nLen1 != nLen2)
  174. return FALSE;
  175. return g_MemComp((void*)lpDest, (void*)lpSrc, nLen1);
  176. }
  177. //---------------------------------------------------------------------------
  178. // 函数: StrCmpLen
  179. // 功能: 字符串比较,限定长度
  180. // 参数: lpDest : 字符串1
  181. // lpSrc : 字符串2
  182. // nLen : 长度
  183. // 返回: TRUE : 相同
  184. // FALSE : 不同
  185. //---------------------------------------------------------------------------
  186. ENGINE_API BOOL g_StrCmpLen(LPCSTR lpDest, LPCSTR lpSrc, int nMaxLen)
  187. {
  188. register int nLen1, nLen2;
  189. nLen1 = g_StrLen(lpDest);
  190. nLen2 = g_StrLen(lpSrc);
  191. if (nMaxLen > nLen1)
  192. nMaxLen = nLen1;
  193. if (nMaxLen > nLen2)
  194. nMaxLen = nLen2;
  195. return g_MemComp((void*)lpDest, (void*)lpSrc, nMaxLen);
  196. }
  197. //---------------------------------------------------------------------------
  198. // 函数: StrUpper
  199. // 功能: 小写字母转大写字母
  200. // 参数: lpDest : 字符串
  201. // 返回: void
  202. //---------------------------------------------------------------------------
  203. ENGINE_API void g_StrUpper(LPSTR lpDest)
  204. {
  205. #ifdef WIN32
  206. __asm
  207. {
  208. mov esi, lpDest
  209. loc_lodsb:
  210. lodsb
  211. or al, al
  212. je loc_exit
  213. cmp al, 'a'
  214. jb loc_lodsb
  215. cmp al, 'z'
  216. ja loc_lodsb
  217. sub al, 0x20
  218. mov [esi - 1], al
  219. jmp loc_lodsb
  220. loc_exit:
  221. }
  222. #else
  223.      char *ptr = lpDest;
  224.      while(*ptr) {
  225.          if(*ptr >= 'a' && *ptr <= 'z') *ptr += 'A' - 'a';
  226. //          *ptr = toupper(*ptr);
  227.           ptr++;
  228.      }
  229. #endif
  230. }
  231. //---------------------------------------------------------------------------
  232. // 函数: StrLower
  233. // 功能: 大写字母转小写字母
  234. // 参数: lpDest : 字符串
  235. // 返回: void
  236. //---------------------------------------------------------------------------
  237. ENGINE_API void g_StrLower(LPSTR lpDest)
  238. {
  239. #ifdef WIN32
  240. __asm
  241. {
  242. mov esi, lpDest
  243. loc_lodsb:
  244. lodsb
  245. or al, al
  246. je loc_exit
  247. cmp al, 'A'
  248. jb loc_lodsb
  249. cmp al, 'Z'
  250. ja loc_lodsb
  251. add al, 0x20
  252. mov [esi - 1], al
  253. jmp loc_lodsb
  254. loc_exit:
  255. }
  256. #else
  257.      char *ptr = lpDest;
  258.      while(*ptr) {
  259.          if(*ptr >= 'A' && *ptr <= 'Z') *ptr += 'a' - 'A';
  260. //          *ptr = tolower(*ptr);
  261.           ptr++;
  262.      }
  263. #endif
  264. }
  265. //---------------------------------------------------------------------------
  266. ENGINE_API void g_StrRep(LPSTR lpDest, LPSTR lpSrc, LPSTR lpRep)
  267. {
  268. int nSrcLen = g_StrLen(lpSrc);
  269. int nDestLen = g_StrLen(lpDest);
  270. int nMaxLen = nDestLen - nSrcLen + g_StrLen(lpRep) + 1;
  271. char *pStart = NULL;
  272.         int i;
  273. for (i = 0; i < nDestLen - nSrcLen; i++)
  274. {
  275. if (g_StrCmpLen(&lpDest[i], lpSrc, nSrcLen))
  276. break;
  277. }
  278. if (i == nDestLen - nSrcLen)
  279. return;
  280. pStart = new char[nMaxLen];
  281. if (i != 0)
  282. {
  283. g_StrCpyLen(pStart, lpDest, i);
  284. g_StrCat(pStart, lpRep);
  285. g_StrCat(pStart, &lpDest[i + nSrcLen]);
  286. }
  287. else
  288. {
  289. g_StrCpy(pStart, lpRep);
  290. g_StrCat(pStart, &lpDest[nSrcLen]);
  291. }
  292. g_StrCpy(lpDest, pStart);
  293. if (pStart)
  294. {
  295. delete [] pStart;
  296. pStart = NULL;
  297. }
  298. }