54 lines
1.6 KiB
C
Executable file
54 lines
1.6 KiB
C
Executable file
|
|
#include "sb.h"
|
|
|
|
/* BCOPY(from,to,cnt) - Copy string of bytes.
|
|
* Normally this routine is an assembly-language library routine,
|
|
* but not all systems have it. Hence this C-language version
|
|
* which tries to be fairly machine-independent.
|
|
* Attempts to be clever about using word moves instead of byte moves.
|
|
* Does not hack overlapping backward moves.
|
|
*/
|
|
bcopy(from, to, cnt) /* Copy count bytes from -> to */
|
|
register SBMA from;
|
|
register SBMA to;
|
|
register unsigned cnt;
|
|
{
|
|
if(!cnt)
|
|
return;
|
|
while(rndrem((int)from)) /* Get source aligned */
|
|
{ *to++ = *from++;
|
|
if(--cnt == 0) return;
|
|
}
|
|
if(rndrem((int)to) == 0) /* Do word move if dest now aligned */
|
|
{ register unsigned tmp;
|
|
tmp = cnt;
|
|
if((cnt = rnddiv(cnt)) > 4)
|
|
{ sbm_wcpy((int *)from, (int *)to, cnt);
|
|
if((cnt = rndrem(tmp)) == 0)
|
|
return; /* No leftover bytes, all done */
|
|
tmp -= cnt; /* Ugh, must update pointers */
|
|
from += tmp;
|
|
to += tmp;
|
|
}
|
|
else cnt = tmp; /* Not worth call overhead */
|
|
}
|
|
do { *to++ = *from++; } /* Finish up with byte loop */
|
|
while(--cnt);
|
|
}
|
|
|
|
/* SBM_WCPY - word-move auxiliary routine.
|
|
* This is a separate routine so that machines with only a few
|
|
* registers have a chance to use them for the word copy loop.
|
|
* This cannot be made part of BCOPY without doing some
|
|
* unnecessary pointer conversions and using extra variables
|
|
* (since most compilers will not accept type casts on lvalues,
|
|
* which are needed to treat (char *) as (int *)).
|
|
*/
|
|
sbm_wcpy(from, to, cnt)
|
|
register int *from, *to;
|
|
register unsigned cnt;
|
|
{
|
|
if(cnt)
|
|
do { *to++ = *from++; }
|
|
while(--cnt);
|
|
}
|