2025-04-27 07:49:33 -04:00

109 lines
2.6 KiB
NASM

page ,132
title strncpy - copy at most n characters of string
;***
;strncpy.asm - copy at most n characters of string
;
; Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
;
;Purpose:
; defines strncpy() - copy at most n characters of string
;
;Revision History:
; 10-25-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
; 10-26-88 JCR Re-arrange regs to avoid push/pop ebx
; 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 *strncpy(dest, source, count) - copy at most n characters
;
;Purpose:
; Copies count characters from the source string to the
; destination. If count is less than the length of source,
; NO NULL CHARACTER is put onto the end of the copied string.
; If count is greater than the length of sources, dest is padded
; with null characters to length count.
;
; Algorithm:
; char *
; strncpy (dest, source, count)
; char *dest, *source;
; unsigned count;
; {
; char *start = dest;
;
; while (count && (*dest++ = *source++))
; count--;
; if (count)
; while (--count)
; *dest++ = '\0';
; return(start);
; }
;
;Entry:
; char *dest - pointer to spot to copy source, enough space
; is assumed.
; char *source - source string for copy
; unsigned count - characters to copy
;
;Exit:
; returns dest, with the character copied there.
;
;Uses:
;
;Exceptions:
;
;*******************************************************************************
CODESEG
public strncpy
strncpy proc \
uses edi esi, \
dest:ptr byte, \
sorc:ptr byte, \
count:IWORD
mov edi,[dest] ; di=pointer to dest
mov esi,[sorc] ; si=pointer to source
mov edx,edi ; dx saves dest pointer
mov ecx,[count] ; get the max char count
jecxz short toend ; don't do loop if nothing to move
lupe:
lodsb ; get byte into al and kick si
or al,al ; see if we just moved a null
jz short outlupe ; end of string
stosb ; store byte from al and kick di
loop lupe ; dec cx & jmp to lupe if nonzero
; else drop out
outlupe:
xor al,al ; null byte to store
rep stosb ; store null for all cx>0
toend:
mov eax,edx ; return value: dest addr
ifdef _STDCALL_
ret 2*DPSIZE + ISIZE ; _stdcall return
else
ret ; _cdecl return
endif
strncpy endp
end