xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/stdio/fgets.c (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                  David Korn <dgk@research.att.com>                   *
19*b30d1939SAndy Fiddaman *                   Phong Vo <kpv@research.att.com>                    *
20*b30d1939SAndy Fiddaman *                                                                      *
21*b30d1939SAndy Fiddaman ***********************************************************************/
22*b30d1939SAndy Fiddaman #pragma prototyped
23*b30d1939SAndy Fiddaman 
24*b30d1939SAndy Fiddaman #include "stdhdr.h"
25*b30d1939SAndy Fiddaman 
26*b30d1939SAndy Fiddaman extern char*
_stdgets(Sfio_t * f,char * us,int n,int isgets)27*b30d1939SAndy Fiddaman _stdgets(Sfio_t* f, char* us, int n, int isgets)
28*b30d1939SAndy Fiddaman {
29*b30d1939SAndy Fiddaman 	int		p;
30*b30d1939SAndy Fiddaman 	unsigned char*	is;
31*b30d1939SAndy Fiddaman 	unsigned char*	ps;
32*b30d1939SAndy Fiddaman 
33*b30d1939SAndy Fiddaman 	if(n <= 0 || !us || (f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0))
34*b30d1939SAndy Fiddaman 		return NIL(char*);
35*b30d1939SAndy Fiddaman 
36*b30d1939SAndy Fiddaman 	SFLOCK(f,0);
37*b30d1939SAndy Fiddaman 
38*b30d1939SAndy Fiddaman 	n -= 1;
39*b30d1939SAndy Fiddaman 	is = (uchar*)us;
40*b30d1939SAndy Fiddaman 
41*b30d1939SAndy Fiddaman 	while(n)
42*b30d1939SAndy Fiddaman 	{	/* peek the read buffer for data */
43*b30d1939SAndy Fiddaman 		if((p = f->endb - (ps = f->next)) <= 0 )
44*b30d1939SAndy Fiddaman 		{	f->getr = '\n';
45*b30d1939SAndy Fiddaman 			f->mode |= SF_RC;
46*b30d1939SAndy Fiddaman 			if(SFRPEEK(f,ps,p) <= 0)
47*b30d1939SAndy Fiddaman 				break;
48*b30d1939SAndy Fiddaman 		}
49*b30d1939SAndy Fiddaman 
50*b30d1939SAndy Fiddaman 		if(p > n)
51*b30d1939SAndy Fiddaman 			p = n;
52*b30d1939SAndy Fiddaman 
53*b30d1939SAndy Fiddaman #if _lib_memccpy
54*b30d1939SAndy Fiddaman 		if((ps = (uchar*)memccpy((char*)is,(char*)ps,'\n',p)) != NIL(uchar*))
55*b30d1939SAndy Fiddaman 			p = ps-is;
56*b30d1939SAndy Fiddaman 		is += p;
57*b30d1939SAndy Fiddaman 		ps  = f->next+p;
58*b30d1939SAndy Fiddaman #else
59*b30d1939SAndy Fiddaman 		if(!(f->flags&(SF_BOTH|SF_MALLOC)))
60*b30d1939SAndy Fiddaman 		{	while(p-- && (*is++ = *ps++) != '\n')
61*b30d1939SAndy Fiddaman 				;
62*b30d1939SAndy Fiddaman 			p = ps-f->next;
63*b30d1939SAndy Fiddaman 		}
64*b30d1939SAndy Fiddaman 		else
65*b30d1939SAndy Fiddaman 		{	reg int	c = ps[p-1];
66*b30d1939SAndy Fiddaman 			if(c != '\n')
67*b30d1939SAndy Fiddaman 				ps[p-1] = '\n';
68*b30d1939SAndy Fiddaman 			while((*is++ = *ps++) != '\n')
69*b30d1939SAndy Fiddaman 				;
70*b30d1939SAndy Fiddaman 			if(c != '\n')
71*b30d1939SAndy Fiddaman 			{	f->next[p-1] = c;
72*b30d1939SAndy Fiddaman 				if((ps-f->next) >= p)
73*b30d1939SAndy Fiddaman 					is[-1] = c;
74*b30d1939SAndy Fiddaman 			}
75*b30d1939SAndy Fiddaman 		}
76*b30d1939SAndy Fiddaman #endif
77*b30d1939SAndy Fiddaman 
78*b30d1939SAndy Fiddaman 		/* gobble up read data and continue */
79*b30d1939SAndy Fiddaman 		f->next = ps;
80*b30d1939SAndy Fiddaman 		if(is[-1] == '\n')
81*b30d1939SAndy Fiddaman 			break;
82*b30d1939SAndy Fiddaman 		else if(n > 0)
83*b30d1939SAndy Fiddaman 			n -= p;
84*b30d1939SAndy Fiddaman 	}
85*b30d1939SAndy Fiddaman 
86*b30d1939SAndy Fiddaman 	if((_Sfi = is - ((uchar*)us)) <= 0)
87*b30d1939SAndy Fiddaman 		us = NIL(char*);
88*b30d1939SAndy Fiddaman 	else if(isgets && is[-1] == '\n')
89*b30d1939SAndy Fiddaman 	{	is[-1] = '\0';
90*b30d1939SAndy Fiddaman 		_Sfi -= 1;
91*b30d1939SAndy Fiddaman 	}
92*b30d1939SAndy Fiddaman 	else	*is = '\0';
93*b30d1939SAndy Fiddaman 
94*b30d1939SAndy Fiddaman 	SFOPEN(f,0);
95*b30d1939SAndy Fiddaman 	return us;
96*b30d1939SAndy Fiddaman }
97*b30d1939SAndy Fiddaman 
98*b30d1939SAndy Fiddaman char*
fgets(char * s,int n,Sfio_t * f)99*b30d1939SAndy Fiddaman fgets(char* s, int n, Sfio_t* f)
100*b30d1939SAndy Fiddaman {
101*b30d1939SAndy Fiddaman 	STDIO_PTR(f, "fgets", char*, (char*, int, Sfio_t*), (s, n, f))
102*b30d1939SAndy Fiddaman 
103*b30d1939SAndy Fiddaman 	return _stdgets(f, s, n, 0);
104*b30d1939SAndy Fiddaman }
105*b30d1939SAndy Fiddaman 
106*b30d1939SAndy Fiddaman char*
gets(char * s)107*b30d1939SAndy Fiddaman gets(char* s)
108*b30d1939SAndy Fiddaman {
109*b30d1939SAndy Fiddaman 	return _stdgets(sfstdin, s, BUFSIZ, 1);
110*b30d1939SAndy Fiddaman }
111