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

    Unit TextUtil;
    { Written by Wilbert Van.Leijen and posted in the Pascal Echo }

    Interface

    Function TextFilePos(Var f : Text) : LongInt;
    Function TextFileSize(Var f : Text) : LongInt;
    Procedure TextSeek(Var f : Text; n : LongInt);

    Implementation
    uses Dos;

    {$R-,S- }

    Procedure GetFileMode; Assembler;

    ASM
            CLC
            CMP    ES:[DI].TextRec.Mode, fmInput
            JE     @1
            MOV    [InOutRes], 104         { 'File not opened for reading' }
            XOR    AX, AX                  { Zero out function result }
            XOR    DX, DX
            STC
    @1:
    end;  { GetFileMode }

    Function TextFilePos(Var f : Text) : LongInt; Assembler;

    ASM
            LES    DI, f
            CALL   GetFileMode
            JC     @1

            XOR    CX, CX                  { Get position of file pointer }
            XOR    DX, DX
            MOV    BX, ES:[DI].TextRec.handle
            MOV    AX, 4201h
            INT    21h                     { offset := offset-BufEnd+BufPos }
            XOR    BX, BX
            SUB    AX, ES:[DI].TextRec.BufEnd
            SBB    DX, BX
            ADD    AX, ES:[DI].TextRec.BufPos
            ADC    DX, BX
    @1:
    end;  { TextFilePos }

    Function TextFileSize(Var f : Text) : LongInt; Assembler;

    ASM
            LES    DI, f
            CALL   GetFileMode
            JC     @1
            XOR    CX, CX                  { Get position of file pointer }
            XOR    DX, DX
            MOV    BX, ES:[DI].TextRec.handle
            MOV    AX, 4201h
            INT    21h
            PUSH   DX                      { Save current offset on the stack }
            PUSH   AX
            XOR    DX, DX                  { Move file pointer to EOF }
            MOV    AX, 4202h
            INT    21h
            POP    SI
            POP    CX
            PUSH   DX                      { Save EOF position }
            PUSH   AX
            MOV    DX, SI                  { Restore old offset }
            MOV    AX, 4200h
            INT    21h
            POP    AX                      { Return result}
            POP    DX
    @1:
    end;  { TextFileSize }

    Procedure TextSeek(Var f : Text; n : LongInt); Assembler;

    ASM
            LES    DI, f
            CALL   GetFileMode
            JC     @2

            MOV    CX, Word Ptr n+2        { Move file pointer }
            MOV    DX, Word Ptr n
            MOV    BX, ES:[DI].TextRec.Handle
            MOV    AX, 4200h
            INT    21h
            JNC    @1                      { Carry flag = reading past EOF }
            MOV    [InOutRes], AX
            JMP    @2

            { Force read next time }
    @1:     MOV    AX, ES:[DI].TextRec.BufEnd
            MOV    ES:[DI].TextRec.BufPos, AX
    @2:
    end;  { TextSeek }
    end.  { TextUtil }

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