mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:33:16 +00:00

Imported from https://www.nuget.org/packages/Microsoft.Windows.SDK.CRTSource/10.0.22621.3 License: MIT
169 lines
3.4 KiB
NASM
169 lines
3.4 KiB
NASM
page ,132
|
|
title strncpy - copy at most n characters of string
|
|
;***
|
|
;strncpy.asm - copy at most n characters of string
|
|
;
|
|
; Copyright (c) Microsoft Corporation. All rights reserved.
|
|
;
|
|
;Purpose:
|
|
; defines strncpy() - copy at most n characters of string
|
|
;
|
|
;*******************************************************************************
|
|
; Look at strncat.asm for this file
|
|
include ksamd64.inc
|
|
subttl "strncpy"
|
|
|
|
LEAF_ENTRY_ARG3 strncpy, _TEXT, dst:ptr byte, src:ptr byte, count:dword
|
|
OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
|
|
|
; align the SOURCE so we never page fault
|
|
; dest pointer alignment not important
|
|
|
|
mov r11, rcx
|
|
or r8, r8
|
|
jz strncpy_exit
|
|
sub rcx, rdx ; combine pointers
|
|
test dl, 7
|
|
jz qword_loop_entrance
|
|
|
|
copy_head_loop_begin:
|
|
mov al, [rdx]
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit
|
|
test dl, 7
|
|
jnz copy_head_loop_begin
|
|
jmp qword_loop_entrance
|
|
|
|
strncpy_exit:
|
|
mov rax, r11
|
|
ret
|
|
|
|
qword_loop_begin:
|
|
mov [rdx+rcx], rax
|
|
add rdx, 8
|
|
qword_loop_entrance:
|
|
mov rax, [rdx]
|
|
sub r8, 8
|
|
jbe qword_loop_end
|
|
mov r9, 7efefefefefefeffh
|
|
add r9, rax
|
|
mov r10, rax
|
|
xor r10, -1
|
|
xor r10, r9
|
|
mov r9, 8101010101010100h
|
|
test r10, r9
|
|
jz qword_loop_begin
|
|
|
|
qword_loop_end:
|
|
add r8, 8
|
|
jz strncpy_exit_2
|
|
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
test ah, ah
|
|
mov [rdx+rcx], ah
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
shr rax, 16
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
test ah, ah
|
|
mov [rdx+rcx], ah
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
shr rax, 16
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
test ah, ah
|
|
mov [rdx+rcx], ah
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
shr eax, 16
|
|
test al, al
|
|
mov [rdx+rcx], al
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jz strncpy_exit_2
|
|
test ah, ah
|
|
mov [rdx+rcx], ah
|
|
jz filler
|
|
inc rdx
|
|
dec r8
|
|
jnz qword_loop_entrance
|
|
|
|
strncpy_exit_2:
|
|
mov rax, r11
|
|
ret
|
|
|
|
;this is really just memset
|
|
filler:
|
|
add rcx, rdx
|
|
xor rdx, rdx
|
|
cmp r8, 16
|
|
jb tail ; a quickie
|
|
aligner1:
|
|
test cl, 7
|
|
jz aligned
|
|
inc rcx
|
|
mov [rcx], dl
|
|
dec r8
|
|
jmp aligner1
|
|
aligned:
|
|
sub r8, 32
|
|
jb tail_8_enter
|
|
loop32:
|
|
mov [rcx], rdx
|
|
mov [rcx+8], rdx
|
|
mov [rcx+16], rdx
|
|
mov [rcx+24], rdx
|
|
add rcx, 32
|
|
sub r8, 32
|
|
jae loop32
|
|
|
|
tail_8_enter:
|
|
add r8, 32 ; get back the value
|
|
tail_8_begin:
|
|
sub r8, 8
|
|
jb tail_enter
|
|
mov [rcx], rdx
|
|
add rcx, 8
|
|
jmp tail_8_begin
|
|
|
|
tail_enter:
|
|
add r8, 8 ; get back the value
|
|
tail:
|
|
sub r8, 1
|
|
jb tail_finish
|
|
mov [rcx], dl
|
|
inc rcx
|
|
jmp tail
|
|
tail_finish:
|
|
mov rax, r11
|
|
ret
|
|
|
|
LEAF_END strncpy, _TEXT
|
|
|
|
end
|