CSUBSTR.PAS in MISC.SWG 0123 01/01 37/47 79% Bug: if nrchars specifies more characters than remain starting at the start position, Str2 will contain nrchars characters. This is fixed. } procedure CopySubStr( Str1: string; start, nrchars: byte; var Str2: string ); assembler; { copy part of Str1 (beginning at start for nrchars) to Str2 if start > length of Str1, Str2 will contain a empty string. if nrchars specifies more characters than remain starting at the start position, Str2 will contain just that remainder of Str1. } asm { setup } push ds { save DS } cld { string operations forward } lds si, str1 { load in DS:SI pointer to str1 } les di, str2 { load in ES:DI pointer to str2 } mov ah, [si] { length str1 --> AH } and ah, ah { length str1 = 0? } je @null { yes, empty string in Str2 } mov bl, [start] { starting position --> BL } cmp ah, bl { start > length str1? } jb @null { yes, empty string in Str2 } { start + nrchars - 1 > length str1? } mov al, [nrchars]{ nrchars --> AL } mov dh, al { nrchars } add dh, bl { + start } jc @rest { if overflow copy rest of str1 } dec dh { - 1 } cmp ah, dh { nrchars > rest of str1? } jb @rest { yes, copy rest of str1 } jmp @copy @null: xor ax, ax { return a empty string } jmp @done @rest: sub ah, bl { length str1 - start } inc ah mov al, ah @copy: mov cl, al { how many chars to copy } xor ch, ch { clear CH } xor bh, bh { clear BH } add si, bx { starting position } mov dx, di { save pointer to str2 } inc di { don't overwrite length str2 } rep movsb { copy part str1 to str2 } mov di, dx { restore pointer to str2 } @done: mov [di], al { overwrite length byte of str2 } @exit: pop ds { restore DS } end { CopySubStr };