xref: /original-bsd/lib/libc/vax/stdio.old/gets.s (revision cb8d5031)
1/*
2 * Copyright (c) 1985 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley.  The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16 */
17
18#if defined(LIBC_SCCS) && !defined(lint)
19	.asciz "@(#)gets.s	5.4 (Berkeley) 06/27/88"
20#endif /* LIBC_SCCS and not lint */
21
22/*
23 * char *gets(s);
24 * char *s;
25 *
26 * argument: a target string
27 * side effects: reads bytes up to and including a newline from the
28 *	standard input into the target string and replaces the newline
29 *	with a null to null-terminate the string.
30 * result: the target string if successful, 0 otherwise.
31 */
32
33#include "DEFS.h"
34
35#define		NL	0xa
36
37ENTRY(gets, R11|R10)
38
39#define		S	r11
40	movl	4(ap),S
41#define		IPTR	r10
42#define		_CNT
43#define		_PTR	4
44#define		_BASE	8
45#define		_BUFSIZ	12
46#define		_FLAG	16
47	movab	__iob,IPTR
48
49#define		OLD_S	4(ap)
50
51	/*
52	 * If no characters, call _filbuf() to get some.
53	 */
54	tstl	_CNT(IPTR)
55	jgtr	Lscan
56
57Lloop:
58	pushl	IPTR
59	calls	$1,__filbuf
60	tstl	r0			/* What did _filbuf() return? */
61	jlss	Leof
62	cmpb	r0,$NL
63	jneq	1f
64	clrb	(S)
65	jbr	Lret
661:
67	movb	r0,(S)+			/* Save the returned character */
68	tstl	_BASE(IPTR)		/* Is input buffered? */
69	jeql	Lloop
70
71	/*
72	 * Look for a newline in the buffer.
73	 */
74Lscan:
75	locc	$NL,_CNT(IPTR),*_PTR(IPTR)
76	jeql	Lagain
77
78	/*
79	 * Success -- copy the data and return.
80	 */
81	subl3	r0,_CNT(IPTR),r2
82	subl2	r2,_CNT(IPTR)
83	movc3	r2,*_PTR(IPTR),(S)	/* Copy the data */
84	clrb	(r3)
85	movl	r1,_PTR(IPTR)
86	decl	_CNT(IPTR)		/* Skip the newline */
87	incl	_PTR(IPTR)
88
89	/*
90	 * Normal return.
91	 */
92Lret:
93	movl	OLD_S,r0
94	ret
95
96	/*
97	 * If we run out of characters, copy the buffer and loop.
98	 */
99Lagain:
100	movc3	_CNT(IPTR),*_PTR(IPTR),(S)	/* Copy the data */
101	movl	r3,S
102	movl	_BASE(IPTR),_PTR(IPTR)		/* Reset stdio */
103	clrl	_CNT(IPTR)
104	jbr	Lloop
105
106	/*
107	 * End of file?  Check to see if we copied any data.
108	 */
109Leof:
110	cmpl	S,OLD_S
111	jeql	Lerror
112	clrb	(S)
113	jbr	Lret
114
115	/*
116	 * Error/eof return -- null pointer.
117	 */
118Lerror:
119	clrl	r0
120	ret
121