[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]