summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/i386/strncat.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/i386/strncat.asm')
-rw-r--r--private/crt32/string/i386/strncat.asm117
1 files changed, 117 insertions, 0 deletions
diff --git a/private/crt32/string/i386/strncat.asm b/private/crt32/string/i386/strncat.asm
new file mode 100644
index 000000000..b6060bb12
--- /dev/null
+++ b/private/crt32/string/i386/strncat.asm
@@ -0,0 +1,117 @@
+ page ,132
+ title strncat - append n chars of string1 to string2
+;***
+;strncat.asm - append n chars of string to new string
+;
+; Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
+;
+;Purpose:
+; defines strncat() - appends n characters of string onto
+; end of other string
+;
+;Revision History:
+; 10-25-83 RN initial version
+; 08-05-87 SKS Fixed bug: extra null was stored if n > strlen(back)
+; 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-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
+;***
+;char *strncat(front, back, count) - append count chars of back onto front
+;
+;Purpose:
+; Appends at most count characters of the string back onto the
+; end of front, and ALWAYS terminates with a null character.
+; If count is greater than the length of back, the length of back
+; is used instead. (Unlike strncpy, this routine does not pad out
+; to count characters).
+;
+; Algorithm:
+; char *
+; strncat (front, back, count)
+; char *front, *back;
+; unsigned count;
+; {
+; char *start = front;
+;
+; while (*front++)
+; ;
+; front--;
+; while (count--)
+; if (!(*front++ = *back++))
+; return(start);
+; *front = '\0';
+; return(start);
+; }
+;
+;Entry:
+; char *front - string to append onto
+; char *back - string to append
+; unsigned count - count of max characters to append
+;
+;Exit:
+; returns a pointer to string appended onto (front).
+;
+;Uses:
+;
+;Exceptions:
+;
+;*******************************************************************************
+
+ CODESEG
+
+ public strncat
+strncat proc \
+ uses edi esi, \
+ front:ptr byte, \
+ back:ptr byte, \
+ count:IWORD
+
+
+ mov edi,[front] ; di=pointer to dest
+
+ mov edx,edi ; save return value in dx
+ xor eax,eax ; search value: null byte (assumed zero below!)
+ or ecx,-1 ; cx = -1, so won't stop scan
+repne scasb ; find null byte
+ dec edi ; di points to dest null terminator
+ mov esi,edi ; si " " " " "
+
+ mov edi,[back] ; di points to source
+
+ push edi ; save back pointer
+ mov ecx,[count] ; cx = count bytes negatively
+repne scasb ; find null byte & get source length
+ jne short nonull
+ inc ecx ; do NOT count null byte in length
+nonull:
+ ; cx=count of difference in bytes in source
+ ; with reference (without null)
+ sub ecx,[count] ; take the difference of bytes counted to expected
+ neg ecx ; away from expected
+ mov edi,esi ; di=pointer to dest null terminator
+ pop esi ; restore pointer to source
+rep movsb ; concatenate the strings
+ ; WARNING: AL must be zero at this point!
+ stosb ; attach null byte
+
+ mov eax,edx ; return value: dest addr
+
+ifdef _STDCALL_
+ ret 2*DPSIZE + ISIZE ; _stdcall return
+else
+ ret ; _cdecl return
+endif
+
+strncat endp
+ end