[9] | 1 |
|
---|
| 2 | #include "sb.h"
|
---|
| 3 |
|
---|
| 4 | /* BCOPY(from,to,cnt) - Copy string of bytes.
|
---|
| 5 | * Normally this routine is an assembly-language library routine,
|
---|
| 6 | * but not all systems have it. Hence this C-language version
|
---|
| 7 | * which tries to be fairly machine-independent.
|
---|
| 8 | * Attempts to be clever about using word moves instead of byte moves.
|
---|
| 9 | * Does not hack overlapping backward moves.
|
---|
| 10 | */
|
---|
| 11 | bcopy(from, to, cnt) /* Copy count bytes from -> to */
|
---|
| 12 | register SBMA from;
|
---|
| 13 | register SBMA to;
|
---|
| 14 | register unsigned cnt;
|
---|
| 15 | {
|
---|
| 16 | if(!cnt)
|
---|
| 17 | return;
|
---|
| 18 | while(rndrem((int)from)) /* Get source aligned */
|
---|
| 19 | { *to++ = *from++;
|
---|
| 20 | if(--cnt == 0) return;
|
---|
| 21 | }
|
---|
| 22 | if(rndrem((int)to) == 0) /* Do word move if dest now aligned */
|
---|
| 23 | { register unsigned tmp;
|
---|
| 24 | tmp = cnt;
|
---|
| 25 | if((cnt = rnddiv(cnt)) > 4)
|
---|
| 26 | { sbm_wcpy((int *)from, (int *)to, cnt);
|
---|
| 27 | if((cnt = rndrem(tmp)) == 0)
|
---|
| 28 | return; /* No leftover bytes, all done */
|
---|
| 29 | tmp -= cnt; /* Ugh, must update pointers */
|
---|
| 30 | from += tmp;
|
---|
| 31 | to += tmp;
|
---|
| 32 | }
|
---|
| 33 | else cnt = tmp; /* Not worth call overhead */
|
---|
| 34 | }
|
---|
| 35 | do { *to++ = *from++; } /* Finish up with byte loop */
|
---|
| 36 | while(--cnt);
|
---|
| 37 | }
|
---|
| 38 |
|
---|
| 39 | /* SBM_WCPY - word-move auxiliary routine.
|
---|
| 40 | * This is a separate routine so that machines with only a few
|
---|
| 41 | * registers have a chance to use them for the word copy loop.
|
---|
| 42 | * This cannot be made part of BCOPY without doing some
|
---|
| 43 | * unnecessary pointer conversions and using extra variables
|
---|
| 44 | * (since most compilers will not accept type casts on lvalues,
|
---|
| 45 | * which are needed to treat (char *) as (int *)).
|
---|
| 46 | */
|
---|
| 47 | sbm_wcpy(from, to, cnt)
|
---|
| 48 | register int *from, *to;
|
---|
| 49 | register unsigned cnt;
|
---|
| 50 | {
|
---|
| 51 | if(cnt)
|
---|
| 52 | do { *to++ = *from++; }
|
---|
| 53 | while(--cnt);
|
---|
| 54 | }
|
---|