* Copyright (c) 1985 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
_sccsid:.asciz "@(#)fgets.s 5.3 (Berkeley) %G%"
* char *fgets(s, n, iptr);
* arguments: a target string, a length, and a file pointer.
* side effects: reads up to and including a newline, or up to n-1 bytes,
* whichever is less, from the file indicated by iptr into the target
* string and null terminates.
* result: the target string if successful, 0 otherwise.
* Sanity check -- is the buffer big enough?
subl3 $1,N,COUNT /* We scan at most COUNT chars */
* If no characters, call _filbuf() to get some.
movb r0,(S)+ /* Save the returned character */
cmpb r0,$NL /* If it was a newline, we're done */
tstl _BASE(IPTR) /* Is the input buffered? */
jeql Lloop /* If not, loop inefficiently */
* Look for a newline in the buffer.
cmpl _CNT(IPTR),COUNT /* Is buffer bigger than N-1? */
movl _CNT(IPTR),COUNT /* If not, don't read off the end */
locc $NL,COUNT,*_PTR(IPTR) /* Scan the buffer */
* Success -- copy the data and return.
decl r0 /* How many characters did we read? */
movc3 COUNT,*_PTR(IPTR),(S) /* Copy the data */
subl2 COUNT,_CNT(IPTR) /* Fix up the I/O buffer */
* If we run out of characters, copy the buffer and loop if needed.
movc3 COUNT,*_PTR(IPTR),(S) /* Copy the data */
subl2 COUNT,_CNT(IPTR) /* Adjust the buffers and counts */
* End of file? Check to see if we copied any data.
* Error return -- null pointer.