109 lines
2.6 KiB
NASM
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
|