wstrings.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:26k
源码类别:

DVD

开发平台:

Others

  1. #include "Config.h" // ZKR GL051004
  2. //BillTang_0524_2004_A: Comment out since the next condition blocks release compilation
  3. //#if defined(_DEBUG) || defined(D_RELEASE_TRACE_ENABLED) // ZKR GL051004
  4. #pragma inline
  5. #include "ServicesIncludeasmrules.h"
  6. #include <string.h>
  7. #include <mem.h>
  8. #if defined(__FARFUNCS__)
  9. #include <_farfunc.h>
  10. #endif
  11. /*-----------------------------------------------------------------------*
  12. Name            wsetmem - sets memory to value
  13. Usage           void wsetmem(void *addr, unsigned len, wchar_t val);
  14. Prototype in    mem.h
  15. Description     sets the len words of the block pointed to by addr to
  16.                 val
  17. Return value    nothing
  18. *------------------------------------------------------------------------*/
  19. void _FARFUNC wsetmem(void _FAR *addr, size_t len, wchar_t val)
  20. {
  21. #if !(LDATA)
  22.     _ES = _DS;
  23. #endif
  24. asm LES_    di, addr
  25. asm mov cx, len
  26. asm mov ax, val
  27. asm cld
  28. asm rep stosw
  29. }
  30. /*-----------------------------------------------------------------------*
  31. Name            wcslen - calculates the length of a string
  32. Usage           size_t wcslen(const wchar_t *str);
  33. Prototype in    string.h
  34. Description     returns the length of a null terminated string
  35. *------------------------------------------------------------------------*/
  36. #undef wcslen                  /* not an intrinsic */
  37. size_t          _RTLENTRY  _EXPFUNC wcslen(const wchar_t *str)
  38. {
  39.   #if !(LDATA)
  40.   asm     mov     ax,ds
  41.   asm     mov     es,ax
  42.   asm     mov     di,str
  43.   asm     xor     ax,ax
  44.   #else
  45.   asm     les     di,str
  46.   asm     xor     ax,ax
  47.   asm     cmp     ax,W1(str)
  48.   asm     jne     start
  49.   asm     cmp     ax,di
  50.   asm     je      out
  51.   #endif
  52.   start:
  53.   asm     cld
  54.   asm     mov     cx, -1
  55.   asm     repne   scasw
  56.   asm     xchg    ax,cx
  57.   asm     not     ax
  58.   asm     dec     ax
  59.   out:
  60.   return(_AX);
  61. }
  62. /*-----------------------------------------------------------------------*
  63. Name            wcscpy - copy string src to string dest
  64. Usage           wchar_t *wcscpy (wchar_t *dest, const wchar_t *src);
  65. Prototype in    string.h
  66. Description     Copy the ASCIIZ string *src to  the buffer *dest. It is the
  67.                 callers responsibility  to ensure that  the dest buffer  is
  68.                 large enough  to contain the  string, and to  guard against
  69.                 supplying NULL arguments.
  70. Return value    wcscpy returns dest.
  71. *------------------------------------------------------------------------*/
  72. #undef wcscpy                  /* not an intrinsic */
  73. wchar_t *       _RTLENTRY  _EXPFUNC wcscpy(wchar_t *dest, const wchar_t *src)
  74. {
  75. #if !(LDATA)
  76.         _ES = _DS;
  77. #endif
  78. asm     cld
  79. asm     LES_    di, src
  80. asm     mov     si, di
  81. asm     xor     ax, ax
  82. asm     mov     cx, -1
  83. asm     repne   scasw
  84. asm     not     cx
  85. #if  (LDATA)
  86. #if  !defined(__HUGE__)
  87. asm     push    DS
  88. #endif
  89.         _DS = _ES;
  90. #endif
  91. asm     LES_    di, dest
  92. asm     rep     movsw
  93. #if  defined(__LARGE__) || defined(__COMPACT__)
  94. asm     pop     DS
  95. #endif
  96.         return(dest) ;
  97. }
  98. /*---------------------------------------------------------------------*
  99. Name            wcscat - appends one string to another
  100. Usage           wchar_t *wcscat(wchar_t *destin, const wchar_t *source);
  101. Prototype in    string.h
  102. Description     wcscat appends a copy of source to the end of destin. The
  103.                 length of the resulting string is strlen(destin) +
  104.                 strlen(source).
  105. Return value    returns a pointer dest
  106. *---------------------------------------------------------------------*/
  107. #undef wcscat                   /* not an intrinsic */
  108. wchar_t *       _RTLENTRY  _EXPFUNC wcscat(wchar_t *dest, const wchar_t *src)
  109. {
  110.         SaveSI
  111.         SaveDI
  112. asm     cld
  113. #if  defined(__LARGE__) || defined(__COMPACT__)
  114. asm     push    ds
  115. #endif
  116. #if LDATA
  117. asm     les     di, dest        /* es:di = dest */
  118. #else
  119. asm     mov     di, dest        /* es:di = dest */
  120. asm     push    ds
  121. asm     pop     es
  122. #endif
  123. asm     mov     dx, di          /* save dest offset in dx */
  124. asm     xor     ax, ax
  125. asm     mov     cx, -1          /* find end of dest */
  126. asm     repne  scasw
  127. #if LDATA
  128. asm     push    es
  129. #endif
  130. asm     lea     si,[di-2]       /* es:si points to terminating null in dest */
  131. asm     LES_    di, src
  132. asm     mov     cx,-1           /* figure out strlen(src) */
  133. asm     repne  scasw
  134. asm     not     cx              /* CX = strlen(src) + 1 */
  135. asm     shl     cx,1
  136. asm     sub     di,cx           /* point es:di back to start of src */
  137. asm     shr     cx,1
  138. #if LDATA
  139. asm     push    es
  140. asm     pop     ds              /* set DS: to seg of src */
  141. asm     pop     es              /* restore ES: as seg of dest */
  142. #endif
  143. asm     xchg    si, di          /* DS:SI = src, ES:DI = dest+strlen(dest) */
  144. asm     rep  movsw
  145. asm     xchg    ax, dx                  /* return addr of string */
  146. #if LDATA
  147. asm     mov     dx, es
  148. #endif
  149. #if  defined(__LARGE__) || defined(__COMPACT__)
  150. asm     pop     ds
  151. #endif
  152. #if LDATA
  153.         return( (wchar_t *)(MK_LONG) );
  154. #else
  155.         return( (wchar_t *)_AX );
  156. #endif
  157. }
  158. /*---------------------------------------------------------------------*
  159. Name            wcschr - scans a string for the first occurrence of a
  160.                          given character
  161. Usage           wchar_t *wcschr(const wchar_t *str, int c);
  162. Prototype in    string.h
  163. Description     wcschr scans a string in the forward direction, looking for a
  164.                 specific character. wcschr finds the first occurrence of the
  165.                 character ch in the string str.
  166.                 The null-terminator is considered
  167.                 to be part of the string, so that, for example
  168.                         wcschr(strs, 0)
  169.                 returns a pointer to the terminating null character of the
  170.                 string "strs".
  171. Return value    wcschr  returns a pointer to the first occurrence of the
  172.                 character ch in str; if ch does not occur in str, wcschr
  173.                 returns NULL.
  174. *---------------------------------------------------------------------*/
  175. #undef wcschr            /* not an intrinsic */
  176. /* alias records for C++ implementation of wcschr() */
  177. #if !defined(__FARFUNCS__)
  178. #if defined(__LARGE__) || defined(__COMPACT__) || defined(__HUGE__)
  179. #pragma alias (@wcschr$qnxci, _wcschr)
  180. #pragma alias (@wcschr$qnci, _wcschr)
  181. #else /* defined __TINY__ or __SMALL__ or __MEDIUM__ */
  182. #pragma alias (@wcschr$qpxci, _wcschr)
  183. #pragma alias (@wcschr$qpci, _wcschr)
  184. #endif
  185. #endif
  186. wchar_t *       _RTLENTRY  _EXPFUNC wcschr(const wchar_t *s, int c)
  187. {
  188. asm     cld
  189. #if  defined(__LARGE__) || defined(__COMPACT__)
  190. asm push    ds
  191. #endif
  192. asm LDS_    si, s
  193. asm mov bx,c
  194. cmp_loop:
  195. asm lodsw               /* get 1 wchar_t at a time */
  196. asm cmp ax, bx
  197. asm je  success         /* if first  wchar_t matches */
  198. asm and ax, ax
  199. asm jnz cmp_loop        /* continue if more characters */
  200. #if  defined(__LARGE__) || defined(__COMPACT__)
  201. asm pop ds
  202. #endif
  203.         return( NULL );
  204. success:
  205. asm lea ax, [si-2]      /* point AX at matching wchar_t */
  206. #if LDATA
  207. asm mov dx,ds
  208. #endif
  209. #if  defined(__LARGE__) || defined(__COMPACT__)
  210. asm pop ds
  211. #endif
  212. #if LDATA
  213.         return( (wchar_t *)(MK_LONG) );
  214. #else
  215.         return( (wchar_t *)_AX );
  216. #endif
  217. }
  218. /*-----------------------------------------------------------------------*
  219. Name            wcscmp - compare one string to another
  220. Usage           int wcscmp(const wchar_t *str1, const wchar_t str2);
  221. Prototype in    string.h
  222. Description     Compare *str1  with *str2, returning  a negative, zero,  or
  223.                 positive integer  according to whether *str1  is less than,
  224.                 equal, or greater than *str2, respectively.
  225. Return value    wcscmp return an integer value such as:
  226.                         < 0     if str1 is less than str2
  227.                         = 0     if str1 is the same as str2
  228.                         > 0     if str2 is greater than str2
  229. *------------------------------------------------------------------------*/
  230. #undef wcscmp                  /* not an intrinsic */
  231. int             _RTLENTRY  _EXPFUNC wcscmp(const wchar_t *str1, const wchar_t *str2)
  232. {
  233. #if  defined(__LARGE__) || defined(__COMPACT__)
  234. asm     mov     dx, ds
  235. #endif
  236. #if !(LDATA)
  237. asm     mov     ax, ds
  238. asm     mov     es, ax
  239. #endif
  240. asm     cld
  241. /*   Its handy to have AH & BH zero later for the final subtraction. */
  242. asm     xor     ax, ax
  243. asm     mov     bx, ax
  244. /*   Determine size of 2nd source string. */
  245. asm     LES_    di, str2
  246. asm     mov     si, di
  247. asm     xor     ax, ax
  248. asm     mov     cx, -1
  249. asm     repne   scasw
  250. asm     not     cx
  251. asm     mov     di, si
  252. asm     LDS_    si, str1
  253. /*
  254. Scan until either *s2 terminates or a difference is found.  Note that it is
  255. sufficient to check only for right termination, since if the left terminates
  256. before the right then that difference will also terminate the scan.
  257. */
  258. asm     repe    cmpsw
  259. /*
  260. The result is the signed difference of the final character pair, be they
  261. equal or different. A simple byte subtract and CBW doesn't work here because
  262. it does the wrong thing when the characters are 'ff' and '7f'.  In that case
  263. 255 would be reported as less than 127. ie '80' sign extends to 'ff80' which
  264. is a negative number.  Remember AH, BH are zero from above.
  265. */
  266. asm     mov     ax, [si-2]
  267. asm     mov     bx, ES_ [di-2]
  268. asm     sub     ax, bx
  269. #if  defined(__LARGE__) || defined(__COMPACT__)
  270. asm     mov     ds, dx
  271. #endif
  272.         return _AX;
  273. }
  274. //int             _RTLENTRY  _EXPFUNC wcscoll(const wchar_t * __s1, const wchar_t * __s2);
  275. //size_t          _RTLENTRY  _EXPFUNC wcscspn(const wchar_t *__s1, const wchar_t *__s2);
  276. //wchar_t *       _RTLENTRY  _EXPFUNC _wcsdup(const wchar_t *__s);
  277. /*-----------------------------------------------------------------------*
  278. Name            wcsncmp - compare one string to another
  279. Usage           int wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen);
  280. Prototype in    string.h
  281. Description     Compare *str1  with *str2, returning  a negative, zero,  or
  282.                 positive integer  according to whether *str1  is less than,
  283.                 equal, or greater than *str2, respectively.
  284.                 At most "maxlen" bytes will be compared. A "maxlen" of zero
  285.                 results in an equal compare, i.e. returns a zero.
  286. Return value    wcsncmp return an integer value such as:
  287.                     < 0 if str1 is less than str2
  288.                     = 0 if str1 is the same as str2
  289.                     > 0 if str2 is greater than str2
  290. *------------------------------------------------------------------------*/
  291. #undef wcsncmp                  /* not an intrinsic */
  292. int             _RTLENTRY  _EXPFUNC wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen)
  293. {
  294. #if defined(__LARGE__) || defined(__COMPACT__)
  295. asm     mov     dx, ds
  296. #endif
  297. #if !(LDATA)
  298. asm     mov     ax, ds      /* ES = DS */
  299. asm     mov     es, ax
  300. #endif
  301. asm     cld
  302. /*   Determine size of 2nd source string. */
  303. asm     LES_    di, str2
  304. asm     mov     si, di
  305. asm     mov     ax, maxlen
  306. asm     mov     cx, ax
  307. asm     jcxz    ncm_end
  308. asm     mov     bx, ax
  309. asm     xor     ax, ax
  310. asm     repne   scasw
  311. asm     sub     bx, cx
  312. asm     mov     cx, bx
  313. asm     mov     di, si
  314. asm     LDS_    si, str1
  315. /*
  316. Scan until either *s2 terminates, a difference is found, or "limit" is
  317. reached.  Note that it is sufficient to check only for right termination,
  318. since if the left terminates before the right then that difference will
  319. also terminate the scan.
  320. */
  321. asm     repe    cmpsw
  322. /*
  323.   The result is the signed difference of the final character pair, be they
  324.   equal or different.
  325.   We need to do the full word subtract here because ANSI requires unsigned
  326.   comparisons. A simple byte subtract with a CBW would produce the wrong
  327.   result in some cases.
  328. */
  329. asm     mov     ax, [si-2]
  330. asm     mov     bx, ES_ [di-2]
  331. asm     sub     ax, bx
  332. ncm_end:
  333. #if defined(__LARGE__) || defined(__COMPACT__)
  334. asm     mov     ds, dx
  335. #endif
  336.         return _AX;
  337. }
  338. /*-----------------------------------------------------------------------*
  339. Name            wcsncpy - copy string src to string dest
  340. Usage           wchar_t *wcsncpy (wchar_t *dest, const wchar_t *src, size_t maxlen);
  341. Prototype in    string.h
  342. Description     Copy the ASCIIZ string *src to  the buffer *dest. It is the
  343.                 callers responsibility  to ensure that  the dest buffer  is
  344.                 large enough  to contain the  string, and to  guard against
  345.                 supplying NULL arguments.
  346.                 The  length of  source copied   will be  trimmed to  maxlen
  347.                 bytes,  including  terminator.  If  *src  is  shorter  than
  348.                 maxlen, then  the target buffer   is zero filled  up to the
  349.                 maxlen.
  350.                 If the source needs to be  truncated then the target is NOT
  351.                 zero terminated.
  352. Return value    wcsncpy returns dest.
  353. *------------------------------------------------------------------------*/
  354. #undef wcsncpy                  /* not an intrinsic */
  355. wchar_t *       _RTLENTRY  _EXPFUNC wcsncpy(wchar_t *dest, const wchar_t *src, size_t maxlen)
  356. {
  357. #if !(LDATA)
  358. asm     mov     ax, ds
  359. asm     mov     es, ax
  360. #endif
  361. asm     cld
  362. asm     LES_    di, src
  363. asm     mov     si, di
  364. asm     xor     ax, ax
  365. asm     mov     bx, maxlen
  366. asm     mov     cx, bx
  367. asm     repne   scasw
  368. asm     sub     bx, cx
  369. #if (LDATA)
  370. #if  !defined ( __HUGE__ )
  371. asm     push    ds
  372. #endif
  373. asm     mov     di, es
  374. asm     mov     ds, di
  375. #endif
  376. asm     LES_    di, dest
  377. asm     xchg    cx, bx
  378. asm     rep     movsw
  379. asm     mov     cx, bx
  380. asm     rep     stosw
  381. #if  defined ( __LARGE__ ) || defined ( __COMPACT__ )
  382. asm     pop     ds
  383. #endif
  384.         return(dest) ;
  385. }
  386. /*---------------------------------------------------------------------*
  387. Name            _wcsnset - sets all characters in a string to a given
  388.                           character
  389. Usage           wchar_t *wcsnset(wchar_t *str, wchar_t ch, size_t n);
  390. Prototype in    string.h
  391. Description     strnset sets up to the first n bytes of the string str to the
  392.                 character ch. If n > strlen(str), then strlen(str) replaces n.
  393. Return value    pointer to str
  394. *---------------------------------------------------------------------*/
  395. #undef strnset                  /* not an intrinsic */
  396. wchar_t *       _RTLENTRY  _EXPFUNC _wcsnset(wchar_t *s, wchar_t ch, size_t n)
  397. {
  398.         unsigned len;
  399.         len = wcslen(s);
  400.         if (len < n)
  401.                 n = len;
  402.         wsetmem(s, n, ch);
  403.         return (s);
  404. }
  405. //wchar_t *       _RTLENTRY  _EXPFUNC wcspbrk(const wchar_t *__s1, const wchar_t *__s2);
  406. /*---------------------------------------------------------------------*
  407. Name            wcsrchr - scans a string for the last occurrence of a
  408.                 given character
  409. Usage           wchar_t *wcsrchr(const wchar_t *str, int c);
  410. Prototype in    string.h
  411. Description     wcsrchr scans a string in the reverse direction, looking for a
  412.                 specific character. wcsrchr finds the last occurrence of the
  413.                 character ch in the string str. The null-terminator is
  414.                 considered to be part of the string.
  415. Return value    wcsrchr returns a pointer to the last occurrence of the
  416.                 character ch. If ch does not occur in str, wcsrchr returns
  417.                 NULL.
  418. *---------------------------------------------------------------------*/
  419. #undef wcsrchr            /* not an intrinsic */
  420. /* alias records for C++ implementation of wcsrchr() */
  421. #if !defined(__FARFUNCS__)
  422. #if defined(__LARGE__) || defined(__COMPACT__) || defined(__HUGE__)
  423. #pragma alias (@wcsrchr$qnxci, _wcsrchr)
  424. #pragma alias (@wcsrchr$qnci, _wcsrchr)
  425. #else /* defined __TINY__ or __SMALL__ or __MEDIUM__ */
  426. #pragma alias (@wcsrchr$qpxci, _wcsrchr)
  427. #pragma alias (@wcsrchr$qpci, _wcsrchr)
  428. #endif
  429. #endif
  430. wchar_t *       _RTLENTRY  _EXPFUNC wcsrchr(const wchar_t *s, wchar_t c)
  431. {
  432.     register const wchar_t *ss;
  433.     register size_t i;
  434.     for(i = wcslen( s ) + 1, ss = s+i; i; i--)
  435.         {
  436.         if( *(--ss) == (wchar_t)c )  return( (wchar_t *)ss );
  437.         }
  438.     return( 0 );
  439. }
  440. //wchar_t *       _RTLENTRY  _EXPFUNC _wcsrev(wchar_t *__s);
  441. /*---------------------------------------------------------------------*
  442. Name            wcsset - sets all characters in a string to a given
  443.                          character
  444. Usage           wchar_t *wcsset(wchar_t *str, int ch);
  445. Prototype in    string.h
  446. Description     strset sets all characters in the string str to the
  447.                 character ch.
  448. Return value    pointer to str
  449. *---------------------------------------------------------------------*/
  450. #undef strset            /* not an intrinsic */
  451. wchar_t *       _RTLENTRY  _EXPFUNC _wcsset(wchar_t*s, wchar_t ch)
  452. {
  453.         wsetmem(s, wcslen(s), ch);
  454.         return (s);
  455. }
  456. //size_t          _RTLENTRY  _EXPFUNC wcsspn(const wchar_t *__s1, const wchar_t *__s2);
  457. /*-----------------------------------------------------------------------*
  458. Name            wcsstr - scans a string for the occurrence of a given string
  459. Usage           wchar_t *wcsstr(const wchar_t *str1, const wchar_t *str2);
  460. Prototype in    string.h
  461. Description     wcsstr scans str1 for the first occurrence of the substring
  462.                 str2.
  463. Return value    wcsstr returns a pointer to the element in str1 that contains
  464.                 str2 (points to str2 in str1). If str2 does not occur in str1,
  465.                 wcsstr returns NULL.
  466. *------------------------------------------------------------------------*/
  467. #if (LDATA)
  468. #define pushES_ asm     push    ES
  469. #define popES_  asm     pop     ES
  470. #else
  471. #define pushES_
  472. #define popES_
  473. #endif
  474. /* alias records for C++ implementation of wcsstr() */
  475. #if !defined(__FARFUNCS__)
  476. #if defined(__LARGE__) || defined(__COMPACT__) || defined(__HUGE__)
  477. #pragma alias (@wcsstr$qnxct1, _wcsstr)
  478. #pragma alias (@wcsstr$qncnxc, _wcsstr)
  479. #else /* defined __TINY__ or __SMALL__ or __MEDIUM__ */
  480. #pragma alias (@wcsstr$qpxct1, _wcsstr)
  481. #pragma alias (@wcsstr$qpcpxc, _wcsstr)
  482. #endif
  483. #endif
  484. wchar_t *       _RTLENTRY  _EXPFUNC wcsstr(const wchar_t *str1, const wchar_t *str2)
  485. {
  486.         if (!*str2)
  487.                 return((wchar_t *)str1);           /* return str1 if str2 empty */
  488.         pushDS_
  489. #if !(LDATA)
  490.     _ES = _DS;
  491. #endif
  492. asm     cld
  493. asm     LES_    di, str1
  494.         pushES_
  495. asm     mov     bx, di
  496. asm     xor     ax, ax
  497. asm     mov     cx, -1
  498. asm     repnz   scasw
  499. asm     not     cx
  500. asm     xchg    cx, dx
  501. asm     LES_    di, str2
  502.         pushES_
  503. asm     mov     bp, di
  504. asm     xor     ax, ax
  505. asm     mov     cx, -1
  506. asm     repnz   scasw
  507. asm     inc     cx
  508. asm     not     cx
  509.         popDS_
  510.         popES_
  511. strLoop:
  512. asm     mov     si, bp
  513. asm     lodsw
  514. asm     xchg    di, bx
  515. asm     xchg    cx, dx
  516. asm     repnz   scasw
  517. asm     mov     bx, di
  518. asm     jnz     NotFound
  519. asm     cmp     cx, dx
  520. asm     jnb     FirstMatch
  521. NotFound:
  522. #if (LDATA)
  523. asm     xor     bx, bx
  524. asm     mov     es, bx
  525. #endif
  526. asm     mov     bx, 2
  527. asm     jmp     short End
  528. FirstMatch:
  529. asm     xchg    cx, dx
  530. asm     jcxz    End
  531. asm     mov     ax, cx
  532. asm     dec     cx
  533. asm     repz    cmpsw
  534. asm     mov     cx, ax
  535. asm     jnz     strLoop
  536. End:
  537.         popDS_
  538. #if (LDATA)
  539.     return (wchar_t _es *)(_BX - 2);
  540. #else
  541.     return (wchar_t *)(_BX - 2);
  542. #endif
  543. }
  544. //wchar_t *       _RTLENTRY  _EXPFUNC wcstok(wchar_t *__s1, const wchar_t *__s2);
  545. /*---------------------------------------------------------------------*
  546. Name            strncat - appends strings
  547. Usage           wchar_t *strncat(wchar_t *destin, const wchar_t *source, size_t maxlen);
  548. Prototype in    string.h
  549. Description     strncat copies at most maxlen characters of source to the end
  550.                 of destin and then appends a null character. The maximum length
  551.                 of the resulting string is strlen(destin) + maxlen.
  552. Return value    pointer to destin
  553. *---------------------------------------------------------------------*/
  554. #undef strncat                  /* not an intrinsic */
  555. wchar_t *       _RTLENTRY  _EXPFUNC wcsncat(wchar_t *dest, const wchar_t *src, size_t maxlen)
  556. {
  557.     register unsigned len;
  558.     unsigned dlen;
  559.     dlen = wcslen(dest);
  560.     len = wcslen(src);
  561.     if (len > maxlen)
  562.         len = maxlen;
  563.     movmem((void *)src, dest + dlen, len << 1);
  564.     dest[dlen + len] = 0;
  565.     return (dest);
  566. }
  567. //wchar_t *       _RTLENTRY  _EXPFUNC wcspcpy(wchar_t *__dest, const wchar_t *__src);
  568. //wchar_t *       _RTLENTRY  _EXPFUNC _wcspcpy(wchar_t *__dest, const wchar_t *__src);
  569. /*-----------------------------------------------------------------------*
  570. Name            stricmp - compare  one  string  to  another  without case
  571.                           sensitivity
  572. Usage           int stricmp(const wchar_t *str1, const wchar_t *str2);
  573. Prototype in    string.h
  574. Description     Case-independent  comparison of  *str1 with  *str2. Compare
  575.                 the strings, but act as  if upper and lower case characters
  576.                 were  always  upper-case,  returning  a  negative, zero, or
  577.                 positive integer  according to whether *str1  is less than,
  578.                 equal, or greater than *str2, respectively.
  579.                 The strings *str1 and *str2 are not changed.
  580.                 When  comparing to  punctuation characters  alphabetics are
  581.                 always treated as upper-case.
  582. Return value    strcmp return an integer value such as:
  583.                         < 0     if str1 is less than str2
  584.                         = 0     if str1 is the same as str2
  585.                         > 0     if str2 is greater than str2
  586. *------------------------------------------------------------------------*/
  587. int             _RTLENTRY  _EXPFUNC _wcsicmp(const wchar_t *str1, const wchar_t *str2)
  588. {
  589. #if  defined(__LARGE__) || defined(__COMPACT__)
  590. asm     mov     dx, ds
  591. #endif
  592. #if !(LDATA)
  593. asm     mov     ax, ds
  594. asm     mov     es, ax
  595. #endif
  596. asm     cld
  597. asm     LDS_    si, str1
  598. asm     LES_    di, str2
  599. /*
  600.   We setup some constants in registers because there's a slight payoff
  601.   when the strings get longer than 3-4 characters (which should be most
  602.   of the time in a typical program).
  603. */
  604. asm     xor     ax, ax  /* AH and BH stay zero until the end            */
  605. asm     mov     bx, ax  /* when the final sub AX, BX is done            */
  606. //asm     mov     cx, 617aH       /* CH = 'a',  CL = 'z'                  */
  607. cmi_nextCh:
  608. asm     lodsw                   /* AL <- str1[i]        */
  609. asm     mov     bx, ES_ [di]    /* BL <- str2[i]        */
  610. asm     or      ax, ax          /* null terminator?     */
  611. asm     jz      cmi_end
  612. asm     scasw                   /* test & advance DI    */
  613. asm     je      cmi_nextCh
  614. cmi_alUpper:
  615. asm     cmp     ax, 'a'          /* str1[i] < 'a' */
  616. asm     jb      cmi_blUpper
  617. asm     cmp     ax, 'z'          /* str1[i] > 'z' */
  618. asm     ja      cmi_blUpper
  619. asm     sub     ax, 'a'-'A'     /* upper case str1[i] */
  620. cmi_blUpper:
  621. asm     cmp     bx, 'a'          /* str2[i] < 'a' */
  622. asm     jb      cmi_compareAgain
  623. asm     cmp     bx, 'z'          /* str2[i] > 'z' */
  624. asm     ja      cmi_compareAgain
  625. asm     sub     bx, 'a'-'A'     /* upper case str2[i] */
  626. cmi_compareAgain:
  627. asm     cmp     ax, bx          /* str1[i] == str2[i] */
  628. asm     je      cmi_nextCh
  629. cmi_end:
  630. /*
  631.   We need to do the full word subtract here because ANSI requires unsigned
  632.   comparisons. A simple byte subtract with a CBW would produce the wrong
  633.   result in some cases. Remember that AH, BH are still zero.
  634. */
  635. asm     sub     ax, bx
  636. #if  defined(__LARGE__) || defined(__COMPACT__)
  637. asm     mov     ds, dx
  638. #endif
  639.         return _AX;
  640. }
  641. //int             _RTLENTRY  _EXPFUNC _wcsnicmp(const wchar_t *__s1, const wchar_t *__s2, size_t __maxlen);
  642. /*-----------------------------------------------------------------------*
  643. Name            wmemset - sets memory to value
  644. Usage           void *wmemset(void *src, int c, size_t n);
  645. Prototype in    mem.h
  646. Description     sets the n word of the block pointed to by src to
  647.                 c.
  648. Return value    src
  649. *------------------------------------------------------------------------*/
  650. void *          _RTLENTRY  _EXPFUNC _wmemset(void *src, int c, size_t n)
  651. {
  652.   wsetmem( src, n, c );
  653.   return( src );
  654. }
  655. //wchar_t *       _RTLENTRYF _EXPFUNC _wcslwr(wchar_t *__s);
  656. //wchar_t *       _RTLENTRYF _EXPFUNC _wcsupr(wchar_t *__s);
  657. //wchar_t *       _RTLENTRYF _EXPFUNC _lwcslwr(wchar_t *__s);
  658. //wchar_t *       _RTLENTRYF _EXPFUNC _lwcsupr(wchar_t *__s);
  659. /*-----------------------------------------------------------------------*
  660. Name            _wmemcpy - copy a block of n bytes from src to dst
  661. Usage           void *_wmemcpy(void *dst, const void *src, size_t n);
  662. Prototype in    mem.h & string.h
  663. Description     _wmemcpy copies  a block of n  bytes from src to  dst.
  664.                 No overlap checking is performed.
  665. Return value    _wmemcpy returns dst
  666. *------------------------------------------------------------------------*/
  667. void *          _RTLENTRY  _EXPFUNC _wmemcpy(void *dst, const void *src, size_t n)
  668. {
  669. #if !(LDATA)
  670.         _ES = _DS;
  671. #endif
  672. #if     defined(__LARGE__) ||  defined(__COMPACT__)
  673. asm     mov     dx,ds           /* save ds */
  674. #endif
  675. asm     LES_     di, dst
  676. asm     LDS_     si, src
  677. asm     mov     cx,n
  678. asm     cld
  679. asm     rep     movsw
  680. #if     defined(__LARGE__) || defined(__COMPACT__)
  681.         asm     mov     ds,dx           /* restore */
  682. #endif
  683.         return(dst);
  684. }
  685. //BillTang_0524_2004_A: Comment out since the next condition blocks release compilation
  686. //#endif // #if defined(_DEBUG) || defined(D_RELEASE_TRACE_ENABLED) // ZKR GL051004