Coherent4.2.10/i386/lib/strncpy.s

/ $Header: $
		.unixorder

/ strncpy () routine, exactly as per the Standard C Library
/ $Log: $
/
		.text
		.globl	strncpy

/ String copy with length limit. An important part of the semantics of this
/ operation is the fact that the destination is null-padded out the maximum
/ length every time; the operating system depends on this for security at
/ some times.

dest		=	4
src		=	8
len		=	12

strncpy:
		movl	len(%esp), %ecx		/ Maximum length
		jecxz	?strncpy_done

		movl	%esi, %edx		/ Preserve %esi
		movl	src(%esp), %esi		/ Get src

		pushl	%edi			/ Preserve %edi
		movl	dest+4(%esp), %edi	/ Get dest, adjusting the
						/ stack offset for push

		cld				/ Scan upwards

?strncpy_loop:	lodsb				/ %al = * %ds:%esi ++
		stosb				/ * %es:%edi ++ = %al
		orb	%al, %al		/ %al == 0 ?
		loopne	?strncpy_loop

/ At some point it may be profitable to look at doing the zero-fill here in
/ 16-bit or 32-bit chunks.

		rep	stosb			/ Pad out destination, doing
						/ nothing if %ecx == 0

		popl	%edi			/ Restore %edi
		movl	%edx, %esi		/ Restore %esi

?strncpy_done:
		movl	dest(%esp), %eax	/ Return destination
		ret