summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/i386/strncmp.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/i386/strncmp.asm')
-rw-r--r--private/crt32/string/i386/strncmp.asm120
1 files changed, 120 insertions, 0 deletions
diff --git a/private/crt32/string/i386/strncmp.asm b/private/crt32/string/i386/strncmp.asm
new file mode 100644
index 000000000..15b187651
--- /dev/null
+++ b/private/crt32/string/i386/strncmp.asm
@@ -0,0 +1,120 @@
+ page ,132
+ title strncmp - compare first n chars of two strings
+;***
+;strncmp.asm - compare first n characters of two strings
+;
+; Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
+;
+;Purpose:
+; defines strncmp() - compare first n characters of two strings
+; for lexical order.
+;
+;Revision History:
+; 10-26-83 RN initial version
+; 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 386 cleanup
+; 10-26-88 JCR General cleanup for 386-only code
+; 03-23-90 GJF Changed to _stdcall. Also, fixed the copyright.
+; 05-10-91 GJF Back to _cdecl, sigh...
+;
+;*******************************************************************************
+
+ .xlist
+ include cruntime.inc
+ .list
+
+page
+;***
+;int strncmp(first, last, count) - compare first count chars of strings
+;
+;Purpose:
+; Compares two strings for lexical order. The comparison stops
+; after: (1) a difference between the strings is found, (2) the end
+; of the strings is reached, or (3) count characters have been
+; compared.
+;
+; Algorithm:
+; int
+; strncmp (first, last, count)
+; char *first, *last;
+; unsigned count;
+; {
+; if (!count)
+; return(0);
+; while (--count && *first && *first == *last)
+; {
+; first++;
+; last++;
+; }
+; return(*first - *last);
+; }
+;
+;Entry:
+; char *first, *last - strings to compare
+; unsigned count - maximum number of characters to compare
+;
+;Exit:
+; returns <0 if first < last
+; returns 0 if first == last
+; returns >0 if first > last
+;
+;Uses:
+;
+;Exceptions:
+;
+;*******************************************************************************
+
+ CODESEG
+
+ public strncmp
+strncmp proc \
+ uses edi esi ebx, \
+ first:ptr byte, \
+ last:ptr byte, \
+ count:IWORD
+
+
+ mov ecx,[count] ; cx=max number of bytes to compare
+ jecxz short toend ; it's as if strings are equal
+
+ mov ebx,ecx ; bx saves count
+
+ mov edi,[first] ; di=first pointer (es=segment part)
+
+ mov esi,edi ; si saves first pointer
+ xor eax,eax ; ax=0
+repne scasb ; count bytes
+ neg ecx ; cx=count - strlen
+ add ecx,ebx ; strlen + count - strlen
+
+okay:
+ mov edi,esi ; restore first pointer
+ mov esi,[last] ; si = last pointer
+repe cmpsb ; compare strings
+ mov al,[esi-1]
+ xor ecx,ecx ; set return value = 0
+
+ cmp al,[edi-1] ; last-first
+ ja short lastbig ; <last is bigger>
+ je short toend ; <equal>
+ ;jb short firstbig ; <first is bigger>
+
+firstbig:
+ dec ecx ; first string is bigger
+ dec ecx ; make FFFE so 'not' will give 0001
+
+lastbig: ; last string is bigger
+ not ecx ; return -1
+
+toend:
+ mov eax,ecx ; return value
+
+ifdef _STDCALL_
+ ret 2*DPSIZE + ISIZE ; _stdcall return
+else
+ ret ; _cdecl return
+endif
+
+strncmp endp
+ end