summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/i386/stricmp.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/i386/stricmp.asm')
-rw-r--r--private/crt32/string/i386/stricmp.asm127
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