xref: /titanic_50/usr/src/lib/libbc/libc/stdio/common/gets.c (revision 015a6ef6781cc3ceba8ad3bfbae98449b6002a1f)
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"
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 #include <memory.h>
36 
37 extern int _filbuf();
38 
39 char *
40 gets(char *ptr)
41 {
42 	char *p, *ptr0 = ptr;
43 	int n;
44 
45 	for ( ; ; ) {
46 		if (stdin->_cnt <= 0) { /* empty buffer */
47 			if (_filbuf(stdin) == EOF) {
48 				if (ptr0 == ptr)
49 					return (NULL);
50 				break; /* no more data */
51 			}
52 			stdin->_ptr--;
53 			stdin->_cnt++;
54 		}
55 		n = stdin->_cnt;
56 		if ((p = memccpy(ptr, (char *) stdin->_ptr, '\n', n)) != NULL)
57 			n = p - ptr;
58 		ptr += n;
59 		stdin->_cnt -= n;
60 		stdin->_ptr += n;
61 		_BUFSYNC(stdin);
62 		if (p != NULL) { /* found '\n' in buffer */
63 			ptr--; /* step back over '\n' */
64 			break;
65 		}
66 	}
67 	*ptr = '\0';
68 	return (ptr0);
69 }
70