|
|
1.1 ! root 1: //////// ! 2: / ! 3: / #include <string.h> ! 4: / ! 5: / char * ! 6: / memccpy(dest, src, c, n) ! 7: / char *dest, *src; ! 8: / ! 9: / Action: Copy characters from memory area src into dest, stopping ! 10: / after the first occurrence of character C has been ! 11: / been copied, or after N characters have been copied. ! 12: / ! 13: / Return: A pointer to the character after the copy of C in dest, ! 14: / or a NULL pointer if C was not found in the first N ! 15: / characters of src. ! 16: //////// ! 17: .globl memccpy_ ! 18: ! 19: memccpy_: / char * ! 20: push si / memccpy ( dest, src, c, n ) ! 21: push di / ! 22: mov bx, sp / char *dest, *src; ! 23: movb al, 10(bx) / register int c; /* AX */ ! 24: mov dx, 12(bx) / register unsigned n; /* DX */ ! 25: / ! 26: mov di, 8(bx) / { register char *cp = src; /* DI */ ! 27: mov cx, dx / register cnt = n; /* CX */ ! 28: / ! 29: jcxz 0f / for (; cnt != 0; --cnt) ! 30: cld / if (*cp++ == c) ! 31: repne / break; ! 32: scasb / ! 33: jne 0f / if (cp[-1] == c) ! 34: sub dx, cx / { n -= cnt; ! 35: mov cx, di / ! 36: sub cx, 8(bx) / cnt = cp - src + dest; ! 37: add cx, 6(bx) / } ! 38: 0: mov ax, cx / c = cnt; ! 39: mov si, 8(bx) / ! 40: mov di, 6(bx) / ! 41: mov cx, dx / for ( cnt = n; cnt != 0; --cnt) ! 42: rep / *dest++ = *src++; ! 43: movsb / ! 44: pop di / return c; ! 45: pop si / } ! 46: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.