page ,132 ; ; Copyright 1987, 1989 Samuel H. Smith; All rights reserved ; ; This is a component of the ProDoor System. ; Do not distribute modified versions without my permission. ; Do not remove or alter this notice or any other copyright notice. ; If you use this in your own program you must distribute source code. ; Do not use any of this in a commercial product. ; ; ; Qread - quick version of ReadLn for text files ; Used by Qread unit. ; ; Written by Samuel Smith, 11-19-88 ; code segment byte public assume cs:code public qReadLn ; ------------------------------------------------------------- ; ; structure of text file record ; textfile struc handle dw ? ;dos handle mode dw ? ;open mode bufSize dw ? ;size of file buffer priv1 dw ? bufPos dw ? ;position of next read within file buffer bufEnd dw ? ;position past last byte of file buffer bufPtr dd ? ;pointer to file file buffer textfile ends ; ------------------------------------------------------------- ; ; procedure qReadLn( var fd: text; ; var dest: string; ; maxlen: word ); ; ; structure of stack frame -- fileptr equ dword ptr [bp+0ch] ;pointer to text file record destptr equ dword ptr [bp+08h] ;pointer to destination string maxlen equ word ptr [bp+06h] ;maximum length of destination string curpos equ dx curend equ bx qReadLn proc far push bp mov bp,sp ;create stack frame push ds lds si,fileptr ;ds:si -> textfile mov curpos,bufpos[si] ;current file buffer position mov curend,bufend[si] ;end of file buffer position lds si,bufptr[si] ;ds:si -> file buffer add si,curpos ; [bufpos] les di,destptr ;es:di -> dest inc di mov cx,maxlen ;initial destination space jmp short NextChar ;get first character ; ; main character loop ; StoreChar: stosb ;dest[len++] = c ; process next character in file buffer NextChar: cmp curpos,curend ;end of file buffer? jz NextBuffer ; have a character in the file buffer - get it HaveChar: lodsb ;c = buf[bufptr++] inc curpos cmp al,26 jle CheckControl ; it is a normal character - add it to the destination buffer NormChar: loop StoreChar ;dec cx, jnz jmp short qEndLine ; ; check control characters ; CheckControl: cmp al,26 ;^Z? end of file jz qEndFile cmp al,10 ;lf? end of line jz qEndLine cmp al,13 ;cr? skip it jz NextChar jmp short NormChar ; ; file buffer is empty - get another one ; NextBuffer: lds si,fileptr ;ds:si -> textfile call qFillBuf mov curend,bufend[si] xor curpos,curpos ;bufpos=0 lds si,bufptr[si] ;ds:si -> file buffer cmp curend,curpos jnz HaveChar ; ; end of file - return dest = ^Z unless dest has data in it ; qEndFile: cmp cx,maxlen jnz qEndLine mov al,26 stosb ;dest = ^Z dec cx ; ; end of line - set line length and return ; qEndLine: lds si,fileptr ;ds:si -> textfile mov bufpos[si],curpos ;update file buffer position mov ax,maxlen sub ax,cx ;calculate destination bytes used les di,destptr ;es:di -> dest mov es:[di],al ;update destination length pop ds pop bp ret 10 ;dispose of 10 parameter bytes qReadLn endp ; ------------------------------------------------------------- ; ; fill file buffer ; ; from handle[si] dos handle ; bufptr[si] data buffer ; bufsize[si] data buffer size ; ; sets bufpos[si] to 0 ; bufend[si] to bytes read ; ; preserves dx, cx, bx, ds, es, si, di ; qFillBuf proc near push dx push cx push bx mov ax,3f00h ;read mov bx,handle[si] ;dos handle mov cx,bufsize[si] ;file buffer size push ds lds dx,bufptr[si] ;file buffer pointer int 21h ;perform the read pop ds mov bufend[si],ax ;bytes read mov bufpos[si],0 ;bytes used pop bx pop cx pop dx ret qFillBuf endp code ends end