|
|
1.1 ! root 1: ////////// ! 2: / i8086 C string library. ! 3: / strstr() ! 4: / ANSI 4.11.5.7. ! 5: ////////// ! 6: ! 7: ////////// ! 8: / char * ! 9: / strstr(s1, s2) ! 10: / char *s1, *s2; ! 11: / ! 12: / Return the first occurance in s1 of s2. ! 13: / If s2 is empty, return s1. ! 14: ////////// ! 15: ! 16: #include <larges.h> ! 17: ! 18: s1 = LEFTARG ! 19: s2 = s1+DPL ! 20: ! 21: Enter(strstr_) ! 22: Lds bx, s1(bp) / s1 address to DS:BX ! 23: Les di, s2(bp) / s2 address to ES:DI ! 24: mov dx, di / Save s2 start in DX ! 25: mov cx, $-1 / Max count to CX ! 26: sub ax, ax ! 27: cld ! 28: repne ! 29: scasb / Scan to NUL ! 30: dec di / Back up to match ! 31: mov ax, di ! 32: sub ax, dx / &NUL - &start = length of s2 to AX ! 33: je 3f / s2 is empty, just return s1 ! 34: ! 35: 1: mov cx, ax / Count to CX ! 36: mov di, dx / s2 address to ES:DI ! 37: mov si, bx / Current location within s1 to DS:SI ! 38: repe ! 39: cmpsb / Compare entire s2 to current s1 ! 40: je 3f / Success, return current location ! 41: inc bx / Mismatched, try next s1 location ! 42: cmpb -1(si), $0 / Check if end of s1 reached ! 43: jne 1b / No, keep trying ! 44: ! 45: 2: sub ax, ax / Failure, return NULL ! 46: #ifdef LARGEDATA ! 47: mov dx, ax ! 48: #endif ! 49: jmp 4f ! 50: ! 51: 3: mov ax, bx / Success, return pointer on s1 ! 52: #ifdef LARGEDATA ! 53: mov dx, ds ! 54: #endif ! 55: ! 56: 4: Leave
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.