diff options
Diffstat (limited to 'private/crt32/string/i386/stricmp.asm')
-rw-r--r-- | private/crt32/string/i386/stricmp.asm | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/private/crt32/string/i386/stricmp.asm b/private/crt32/string/i386/stricmp.asm new file mode 100644 index 000000000..80f384701 --- /dev/null +++ b/private/crt32/string/i386/stricmp.asm @@ -0,0 +1,127 @@ + page ,132 + title stricmp +;*** +;strcmp.asm - contains case-insensitive string comparision routine +; _stricmp/_strcmpi +; +; Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved. +; +;Purpose: +; contains _stricmpi(), also known as _strcmpi() +; +;Revision History: +; 05-18-88 SJM Add model-independent (large model) ifdef +; 08-04-88 SJM convert to cruntime/ add 32-bit support +; 08-23-88 JCR Minor 386 cleanup +; 10-10-88 JCR Added strcmpi() entry for compatiblity with early revs +; 10-25-88 JCR General cleanup for 386-only code +; 10-27-88 JCR Shuffled regs so no need to save/restore ebx +; 03-23-90 GJF Changed to _stdcall. Also, fixed the copyright. +; 01-18-91 GJF ANSI naming. +; 05-10-91 GJF Back to _cdecl, sigh... +; +;******************************************************************************* + + .xlist + include cruntime.inc + .list + +page +;*** +;int _stricmp(dst, src), _strcmpi(dst, src) - compare strings, ignore case +; +;Purpose: +; _stricmp/_strcmpi perform a case-insensitive string comparision. +; For differences, upper case letters are mapped to lower case. +; Thus, "abc_" < "ABCD" since "_" < "d". +; +; Algorithm: +; +; int _strcmpi (char * dst, char * src) +; { +; int f,l; +; +; do { +; f = tolower(*dst); +; l = tolower(*src); +; dst++; +; src++; +; } while (f && f == l); +; +; return(f - l); +; } +; +;Entry: +; char *dst, *src - strings to compare +; +;Exit: +; AX = -1 if dst < src +; AX = 0 if dst = src +; AX = +1 if dst > src +; +;Uses: +; CX, DX +; +;Exceptions: +; +;******************************************************************************* + + CODESEG + + public _strcmpi ; alternate entry point for compatibility +_strcmpi label proc + + public _stricmp +_stricmp proc \ + uses esi, \ + dst:ptr, \ + src:ptr + + + mov esi,[src] ; SI = src + mov edx,[dst] ; DX = dst + mov al,-1 ; fall into loop + +chk_null: + or al,al + jz short done +again: + lodsb ; al = next source byte + mov ah,[edx] ; ah = next dest byte + inc edx + + cmp ah,al ; first try case-sensitive comparision + je short chk_null ; match + + sub al,'A' + cmp al,'Z'-'A'+1 + sbb cl,cl + and cl,'a'-'A' + add al,cl + add al,'A' ; tolower(*dst) + + xchg ah,al ; operations on AL are shorter than AH + + sub al,'A' + cmp al,'Z'-'A'+1 + sbb cl,cl + and cl,'a'-'A' + add al,cl + add al,'A' ; tolower(*src) + + cmp al,ah ; inverse of above comparison -- AL & AH are swapped + je short chk_null + ; dst < src dst > src + sbb al,al ; AL=-1, CY=1 AL=0, CY=0 + sbb al,-1 ; AL=-1 AL=1 +done: + movsx eax,al ; extend al to eax + +ifdef _STDCALL_ + ret 2*DPSIZE ; _stdcall return +else + ret ; _cdecl return +endif + +_stricmp endp + end |