xref: /titanic_51/usr/src/lib/libbc/libc/stdio/common/gets.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*      Copyright (c) 1984 AT&T */
23 /*        All Rights Reserved   */
24 
25 #pragma ident	"%Z%%M%	%I%	%E% SMI"  /* from S5R2 3.3 */
26 
27 /*LINTLIBRARY*/
28 /*
29  * This version reads directly from the buffer rather than looping on getc.
30  * Ptr args aren't checked for NULL because the program would be a
31  * catastrophic mess anyway.  Better to abort than just to return NULL.
32  */
33 #include <stdio.h>
34 #include "stdiom.h"
35 
36 extern int _filbuf();
37 extern _bufsync();
38 extern char *memccpy();
39 
40 char *
41 gets(ptr)
42 char *ptr;
43 {
44 	char *p, *ptr0 = ptr;
45 	register int n;
46 
47 	for ( ; ; ) {
48 		if (stdin->_cnt <= 0) { /* empty buffer */
49 			if (_filbuf(stdin) == EOF) {
50 				if (ptr0 == ptr)
51 					return (NULL);
52 				break; /* no more data */
53 			}
54 			stdin->_ptr--;
55 			stdin->_cnt++;
56 		}
57 		n = stdin->_cnt;
58 		if ((p = memccpy(ptr, (char *) stdin->_ptr, '\n', n)) != NULL)
59 			n = p - ptr;
60 		ptr += n;
61 		stdin->_cnt -= n;
62 		stdin->_ptr += n;
63 		_BUFSYNC(stdin);
64 		if (p != NULL) { /* found '\n' in buffer */
65 			ptr--; /* step back over '\n' */
66 			break;
67 		}
68 	}
69 	*ptr = '\0';
70 	return (ptr0);
71 }
72