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

    {******************************************************************
     * Create a function for returning a fully qualified path/file    *
     * string, with the *'s replaced by the appropriate number of ?'s.*
     *                                                                *
     * (C) Daniel A. Bronstein, Michigan State University, 1991.      *
     *     May be used freely with acknowledgement.                   *
     *****************************************************************}

    unit qualify;

    Interface
    uses dos;                    {for pathstr definition}

    function fqualify(var ps:pathstr):pathstr;

    Implementation

    {$F+} {Far call so loading of the variable is simplified for asm.}
    function fqualify(var ps:pathstr):pathstr;
    begin
      asm
        push  ds                 {Save DS, else will crash after exit}
        push  si                 {and just to be safe, save SI too.}
        lds   si,ps              {Load address of pathstring,}
        xor   ax,ax              {clear AX,}
        cld                      {set direction flag and}
        lodsb                    {get length byte, incrementing SI.}
        mov   bx,ax              {Move length to BX and add}
        mov   byte ptr[si+bx],0  {a #0 to end to create ASCIIZ string.}
        les   di,@result         {Load address of the output string}
        mov   bx,di              {and save it in BX.}
        inc   di                 {Point past length byte of result}
        mov   ah,60h             {and call DOS function 60h.}
        int   21h
        jnc   @ok                {If no carry then ok, else return}
        mov   byte ptr[es:bx],0  {a 0 length string.}
        jmp   @xit
    @ok:
        xor   cx,cx              {Clear CX and}
    @0loop:
        inc   di                 {loop until find end of returned}
        inc   cx                 {ASCIIZ string.}
        cmp   byte ptr[es:di],0  {**Note that on 286 & 386 inc/cmp is faster}
        jne   @0loop             {**than CMPSB, so used here.}
        mov   byte ptr[es:bx],cl {Set the length byte of the result.}
    @xit:
        pop   si                 {Restore SI and}
        pop   ds                 {DS, then}
      end;                       {exit.}
    end;
    {$F-}

    begin
    end.

    { ==================================  DEMO    ============================}

    PROGRAM Qualtest;

    USES DOS, Qualify;

    VAR
      MyString, YourString : PathStr;

    BEGIN
      MyString := 'Foo*.*';
      YourString := FQualify(MyString);
      Writeln(YourString);
      Readln;

    END.

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