[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]

    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 };

[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]