BSD 4_3_Tahoe release
[unix-history] / usr / src / lib / libc / stdio / stdio.vax / gets.s
/*
* Copyright (c) 1985 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
.asciz "@(#)gets.s 5.4 (Berkeley) 6/27/88"
#endif /* LIBC_SCCS and not lint */
/*
* char *gets(s);
* char *s;
*
* argument: a target string
* side effects: reads bytes up to and including a newline from the
* standard input into the target string and replaces the newline
* with a null to null-terminate the string.
* result: the target string if successful, 0 otherwise.
*/
#include "DEFS.h"
#define NL 0xa
ENTRY(gets, R11|R10)
#define S r11
movl 4(ap),S
#define IPTR r10
#define _CNT
#define _PTR 4
#define _BASE 8
#define _BUFSIZ 12
#define _FLAG 16
movab __iob,IPTR
#define OLD_S 4(ap)
/*
* If no characters, call _filbuf() to get some.
*/
tstl _CNT(IPTR)
jgtr Lscan
Lloop:
pushl IPTR
calls $1,__filbuf
tstl r0 /* What did _filbuf() return? */
jlss Leof
cmpb r0,$NL
jneq 1f
clrb (S)
jbr Lret
1:
movb r0,(S)+ /* Save the returned character */
tstl _BASE(IPTR) /* Is input buffered? */
jeql Lloop
/*
* Look for a newline in the buffer.
*/
Lscan:
locc $NL,_CNT(IPTR),*_PTR(IPTR)
jeql Lagain
/*
* Success -- copy the data and return.
*/
subl3 r0,_CNT(IPTR),r2
subl2 r2,_CNT(IPTR)
movc3 r2,*_PTR(IPTR),(S) /* Copy the data */
clrb (r3)
movl r1,_PTR(IPTR)
decl _CNT(IPTR) /* Skip the newline */
incl _PTR(IPTR)
/*
* Normal return.
*/
Lret:
movl OLD_S,r0
ret
/*
* If we run out of characters, copy the buffer and loop.
*/
Lagain:
movc3 _CNT(IPTR),*_PTR(IPTR),(S) /* Copy the data */
movl r3,S
movl _BASE(IPTR),_PTR(IPTR) /* Reset stdio */
clrl _CNT(IPTR)
jbr Lloop
/*
* End of file? Check to see if we copied any data.
*/
Leof:
cmpl S,OLD_S
jeql Lerror
clrb (S)
jbr Lret
/*
* Error/eof return -- null pointer.
*/
Lerror:
clrl r0
ret