|
|
researchv10 Norman
.file "strncpy.s"
# @(#)strncpy.s 1.6
# Fast assembler language version of the following C-program
# strncpy
# which represents the `standard' for the C-library.
# Copy s2 to s1, truncating or null-padding to always copy n bytes.
# Return s1
# char *
# strncpy(s1, s2, n)
# register char *s1, *s2;
# register int n;
# {
# register char *os1 = s1;
#
# while (--n >= 0)
# if ((*s1++ = *s2++) == '\0')
# while (--n >= 0)
# *s1++ = '\0';
# return (os1);
# }
.globl _strncpy
.text
.align 2
_strncpy:
.word 0x03c0 # uses regs. 0,1,2,3,4,5,6,7,8,9
movl 12(ap),r5 # source length (arg `n')
bleq L4 # n <= 0, so return now!
movq 4(ap),r3 # dest ptr
movl r4,r6 # working copy of src ptr
movl r5,r2 # copy of `n' for dest. length
movl $65535,r9 # max length for vax string instructions
L0:
subl3 r9,r5,r8 # is max src.len VERY large?
bleq L1 # hop if not
movl r9,r5 # wow, src.limit > 65535, (and r8 > 0)
L1:
locc $0,r5,(r6) # look for terminal null in src.
beql L2 # none? then r5 is right, so hop
subl3 r6,r1,r5 # else src.len < `n'. (put in r5).
clrl r8 # indicate no more (src) iterations
L2:
subl3 r9,r2,r7 # is dest.len VERY large?
bleq L3 # hop if not
movl r9,r2 # dest.limit was > 65535 (and r7 > 0)
L3:
movc5 r5,(r6),$0,r2,(r3) # Move n bytes, pad with nulls
movl r7,r2 # was dst.ln > 65535?
bleq L4 # NO, we're done
movl r8,r5 # YES, was src.ln also > 65535?
bgtr L0 # YES, then go move some more
clrl r5 # NO, set up to pad nulls
jbr L2 # to dst.ln `n'
L4:
movl 4(ap),r0 # we're done - return s1
ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.