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 #include "sfdchdr.h"
23*b30d1939SAndy Fiddaman 
24*b30d1939SAndy Fiddaman #if _PACKAGE_ast
25*b30d1939SAndy Fiddaman #include <ast_tty.h>
26*b30d1939SAndy Fiddaman #include <signal.h>
27*b30d1939SAndy Fiddaman #endif
28*b30d1939SAndy Fiddaman 
29*b30d1939SAndy Fiddaman /*
30*b30d1939SAndy Fiddaman  * a simple but fast more style pager discipline
31*b30d1939SAndy Fiddaman  * if on sfstdout then sfstdin ops reset the page state
32*b30d1939SAndy Fiddaman  *
33*b30d1939SAndy Fiddaman  * Glenn Fowler
34*b30d1939SAndy Fiddaman  * AT&T Research
35*b30d1939SAndy Fiddaman  *
36*b30d1939SAndy Fiddaman  * @(#)$Id: sfdcmore (AT&T Research) 1998-06-25 $
37*b30d1939SAndy Fiddaman  */
38*b30d1939SAndy Fiddaman 
39*b30d1939SAndy Fiddaman typedef struct
40*b30d1939SAndy Fiddaman {
41*b30d1939SAndy Fiddaman 	Sfdisc_t	disc;		/* sfio discipline		*/
42*b30d1939SAndy Fiddaman 	Sfio_t*		input;		/* tied with this input stream	*/
43*b30d1939SAndy Fiddaman 	Sfio_t*		error;		/* tied with this error stream	*/
44*b30d1939SAndy Fiddaman 	int		rows;		/* max rows			*/
45*b30d1939SAndy Fiddaman 	int		cols;		/* max cols			*/
46*b30d1939SAndy Fiddaman 	int		row;		/* current row			*/
47*b30d1939SAndy Fiddaman 	int		col;		/* current col			*/
48*b30d1939SAndy Fiddaman 	int		match;		/* match length, 0 if none	*/
49*b30d1939SAndy Fiddaman 	char		pattern[128];	/* match pattern		*/
50*b30d1939SAndy Fiddaman 	char		prompt[1];	/* prompt string		*/
51*b30d1939SAndy Fiddaman } More_t;
52*b30d1939SAndy Fiddaman 
53*b30d1939SAndy Fiddaman /*
54*b30d1939SAndy Fiddaman  * more read
55*b30d1939SAndy Fiddaman  * we assume line-at-a-time input
56*b30d1939SAndy Fiddaman  */
57*b30d1939SAndy Fiddaman 
58*b30d1939SAndy Fiddaman #if __STD_C
moreread(Sfio_t * f,void * buf,size_t n,Sfdisc_t * dp)59*b30d1939SAndy Fiddaman static ssize_t moreread(Sfio_t* f, void* buf, size_t n, Sfdisc_t* dp)
60*b30d1939SAndy Fiddaman #else
61*b30d1939SAndy Fiddaman static ssize_t moreread(f, buf, n, dp)
62*b30d1939SAndy Fiddaman Sfio_t*		f;
63*b30d1939SAndy Fiddaman void*		buf;
64*b30d1939SAndy Fiddaman size_t		n;
65*b30d1939SAndy Fiddaman Sfdisc_t*	dp;
66*b30d1939SAndy Fiddaman #endif
67*b30d1939SAndy Fiddaman {
68*b30d1939SAndy Fiddaman 	register More_t*	more = (More_t*)dp;
69*b30d1939SAndy Fiddaman 
70*b30d1939SAndy Fiddaman 	more->match = 0;
71*b30d1939SAndy Fiddaman 	more->row = 2;
72*b30d1939SAndy Fiddaman 	more->col = 1;
73*b30d1939SAndy Fiddaman 	return sfrd(f, buf, n, dp);
74*b30d1939SAndy Fiddaman }
75*b30d1939SAndy Fiddaman 
76*b30d1939SAndy Fiddaman /*
77*b30d1939SAndy Fiddaman  * output label on wfd and return next char on rfd with no echo
78*b30d1939SAndy Fiddaman  * return < -1 is -(signal + 1)
79*b30d1939SAndy Fiddaman  */
80*b30d1939SAndy Fiddaman 
81*b30d1939SAndy Fiddaman #if __STD_C
ttyquery(Sfio_t * rp,Sfio_t * wp,const char * label,Sfdisc_t * dp)82*b30d1939SAndy Fiddaman static int ttyquery(Sfio_t* rp, Sfio_t* wp, const char* label, Sfdisc_t* dp)
83*b30d1939SAndy Fiddaman #else
84*b30d1939SAndy Fiddaman static int ttyquery(rp, wp, label, dp)
85*b30d1939SAndy Fiddaman Sfio_t*		rp;
86*b30d1939SAndy Fiddaman Sfio_t*		wp;
87*b30d1939SAndy Fiddaman char*		label;
88*b30d1939SAndy Fiddaman Sfdisc_t*	dp;
89*b30d1939SAndy Fiddaman #endif
90*b30d1939SAndy Fiddaman {
91*b30d1939SAndy Fiddaman 	register int	r;
92*b30d1939SAndy Fiddaman 	int		n;
93*b30d1939SAndy Fiddaman 
94*b30d1939SAndy Fiddaman #ifdef TCSADRAIN
95*b30d1939SAndy Fiddaman 	unsigned char	c;
96*b30d1939SAndy Fiddaman 	struct termios	old;
97*b30d1939SAndy Fiddaman 	struct termios	tty;
98*b30d1939SAndy Fiddaman 	int		rfd = sffileno(rp);
99*b30d1939SAndy Fiddaman 	int		wfd = sffileno(rp);
100*b30d1939SAndy Fiddaman 
101*b30d1939SAndy Fiddaman 	if (!label)
102*b30d1939SAndy Fiddaman 		n = 0;
103*b30d1939SAndy Fiddaman 	else if (n = strlen(label))
104*b30d1939SAndy Fiddaman 		write(wfd, label, n);
105*b30d1939SAndy Fiddaman 	tcgetattr(rfd, &old);
106*b30d1939SAndy Fiddaman 	tty = old;
107*b30d1939SAndy Fiddaman 	tty.c_cc[VTIME] = 0;
108*b30d1939SAndy Fiddaman 	tty.c_cc[VMIN] = 1;
109*b30d1939SAndy Fiddaman 	tty.c_lflag &= ~(ICANON|ECHO|ECHOK|ISIG);
110*b30d1939SAndy Fiddaman 	tcsetattr(rfd, TCSADRAIN, &tty);
111*b30d1939SAndy Fiddaman 	if ((r = read(rfd, &c, 1)) == 1)
112*b30d1939SAndy Fiddaman 	{
113*b30d1939SAndy Fiddaman 		if (c == old.c_cc[VEOF])
114*b30d1939SAndy Fiddaman 			r = -1;
115*b30d1939SAndy Fiddaman 		else if (c == old.c_cc[VINTR])
116*b30d1939SAndy Fiddaman 			r = -(SIGINT + 1);
117*b30d1939SAndy Fiddaman 		else if (c == old.c_cc[VQUIT])
118*b30d1939SAndy Fiddaman 			r = -(SIGQUIT + 1);
119*b30d1939SAndy Fiddaman 		else if (c == '\r')
120*b30d1939SAndy Fiddaman 			r = '\n';
121*b30d1939SAndy Fiddaman 		else
122*b30d1939SAndy Fiddaman 			r = c;
123*b30d1939SAndy Fiddaman 	}
124*b30d1939SAndy Fiddaman 	tcsetattr(rfd, TCSADRAIN, &old);
125*b30d1939SAndy Fiddaman 	if (n)
126*b30d1939SAndy Fiddaman 	{
127*b30d1939SAndy Fiddaman 		write(wfd, "\r", 1);
128*b30d1939SAndy Fiddaman 		while (n-- > 0)
129*b30d1939SAndy Fiddaman 			write(wfd, " ", 1);
130*b30d1939SAndy Fiddaman 		write(wfd, "\r", 1);
131*b30d1939SAndy Fiddaman 	}
132*b30d1939SAndy Fiddaman #else
133*b30d1939SAndy Fiddaman 	register char*	s;
134*b30d1939SAndy Fiddaman 
135*b30d1939SAndy Fiddaman 	if (label && (n = strlen(label)))
136*b30d1939SAndy Fiddaman 		sfwr(wp, label, n, dp);
137*b30d1939SAndy Fiddaman 	r = (s = sfgetr(rp, '\n', 0)) ? *s : -1;
138*b30d1939SAndy Fiddaman #endif
139*b30d1939SAndy Fiddaman 	return r;
140*b30d1939SAndy Fiddaman }
141*b30d1939SAndy Fiddaman 
142*b30d1939SAndy Fiddaman /*
143*b30d1939SAndy Fiddaman  * more write
144*b30d1939SAndy Fiddaman  */
145*b30d1939SAndy Fiddaman 
146*b30d1939SAndy Fiddaman #if __STD_C
morewrite(Sfio_t * f,const Void_t * buf,register size_t n,Sfdisc_t * dp)147*b30d1939SAndy Fiddaman static ssize_t morewrite(Sfio_t* f, const Void_t* buf, register size_t n, Sfdisc_t* dp)
148*b30d1939SAndy Fiddaman #else
149*b30d1939SAndy Fiddaman static ssize_t morewrite(f, buf, n, dp)
150*b30d1939SAndy Fiddaman Sfio_t* 	f;
151*b30d1939SAndy Fiddaman Void_t*		buf;
152*b30d1939SAndy Fiddaman register size_t	n;
153*b30d1939SAndy Fiddaman Sfdisc_t*	dp;
154*b30d1939SAndy Fiddaman #endif
155*b30d1939SAndy Fiddaman {
156*b30d1939SAndy Fiddaman 	register More_t*	more = (More_t*)dp;
157*b30d1939SAndy Fiddaman 	register char*		b;
158*b30d1939SAndy Fiddaman 	register char*		s;
159*b30d1939SAndy Fiddaman 	register char*		e;
160*b30d1939SAndy Fiddaman 	register ssize_t	w;
161*b30d1939SAndy Fiddaman 	register int		r;
162*b30d1939SAndy Fiddaman 
163*b30d1939SAndy Fiddaman 	if (!more->row)
164*b30d1939SAndy Fiddaman 		return n;
165*b30d1939SAndy Fiddaman 	if (!more->col)
166*b30d1939SAndy Fiddaman 		return sfwr(f, buf, n, dp);
167*b30d1939SAndy Fiddaman 	w = 0;
168*b30d1939SAndy Fiddaman 	b = (char*)buf;
169*b30d1939SAndy Fiddaman 	s = b;
170*b30d1939SAndy Fiddaman 	e = s + n;
171*b30d1939SAndy Fiddaman 	if (more->match)
172*b30d1939SAndy Fiddaman 	{
173*b30d1939SAndy Fiddaman  match:
174*b30d1939SAndy Fiddaman 		for (r = more->pattern[0];; s++)
175*b30d1939SAndy Fiddaman 		{
176*b30d1939SAndy Fiddaman 			if (s >= e)
177*b30d1939SAndy Fiddaman 				return n;
178*b30d1939SAndy Fiddaman 			if (*s == '\n')
179*b30d1939SAndy Fiddaman 				b = s + 1;
180*b30d1939SAndy Fiddaman 			else if (*s == r && (e - s) >= more->match && !strncmp(s, more->pattern, more->match))
181*b30d1939SAndy Fiddaman 				break;
182*b30d1939SAndy Fiddaman 		}
183*b30d1939SAndy Fiddaman 		s = b;
184*b30d1939SAndy Fiddaman 		w += b - (char*)buf;
185*b30d1939SAndy Fiddaman 		more->match = 0;
186*b30d1939SAndy Fiddaman 	}
187*b30d1939SAndy Fiddaman 	while (s < e)
188*b30d1939SAndy Fiddaman 	{
189*b30d1939SAndy Fiddaman 		switch (*s++)
190*b30d1939SAndy Fiddaman 		{
191*b30d1939SAndy Fiddaman 		case '\t':
192*b30d1939SAndy Fiddaman 			more->col = ((more->col + 8) & ~7) - 1;
193*b30d1939SAndy Fiddaman 			/*FALLTHROUGH*/
194*b30d1939SAndy Fiddaman 		default:
195*b30d1939SAndy Fiddaman 			if (++more->col <= more->cols || s < e && *s == '\n')
196*b30d1939SAndy Fiddaman 				continue;
197*b30d1939SAndy Fiddaman 			/*FALLTHROUGH*/
198*b30d1939SAndy Fiddaman 		case '\n':
199*b30d1939SAndy Fiddaman 			more->col = 1;
200*b30d1939SAndy Fiddaman 			if (++more->row < more->rows)
201*b30d1939SAndy Fiddaman 				continue;
202*b30d1939SAndy Fiddaman 			break;
203*b30d1939SAndy Fiddaman 		case '\b':
204*b30d1939SAndy Fiddaman 			if (more->col > 1)
205*b30d1939SAndy Fiddaman 				more->col--;
206*b30d1939SAndy Fiddaman 			continue;
207*b30d1939SAndy Fiddaman 		case '\r':
208*b30d1939SAndy Fiddaman 			more->col = 1;
209*b30d1939SAndy Fiddaman 			continue;
210*b30d1939SAndy Fiddaman 		}
211*b30d1939SAndy Fiddaman 		w += sfwr(f, b, s - b, dp);
212*b30d1939SAndy Fiddaman 		b = s;
213*b30d1939SAndy Fiddaman 		r = ttyquery(sfstdin, f, more->prompt, dp);
214*b30d1939SAndy Fiddaman 		if (r == '/' || r == 'n')
215*b30d1939SAndy Fiddaman 		{
216*b30d1939SAndy Fiddaman 			if (r == '/')
217*b30d1939SAndy Fiddaman 			{
218*b30d1939SAndy Fiddaman 				sfwr(f, "/", 1, dp);
219*b30d1939SAndy Fiddaman 				if ((s = sfgetr(sfstdin, '\n', 1)) && (n = sfvalue(sfstdin) - 1) > 0)
220*b30d1939SAndy Fiddaman 				{
221*b30d1939SAndy Fiddaman 					if (n >= sizeof(more->pattern))
222*b30d1939SAndy Fiddaman 						n = sizeof(more->pattern) - 1;
223*b30d1939SAndy Fiddaman 					memcpy(more->pattern, s, n);
224*b30d1939SAndy Fiddaman 					more->pattern[n] = 0;
225*b30d1939SAndy Fiddaman 				}
226*b30d1939SAndy Fiddaman 			}
227*b30d1939SAndy Fiddaman 			if (more->match = strlen(more->pattern))
228*b30d1939SAndy Fiddaman 			{
229*b30d1939SAndy Fiddaman 				more->row = 1;
230*b30d1939SAndy Fiddaman 				more->col = 1;
231*b30d1939SAndy Fiddaman 				goto match;
232*b30d1939SAndy Fiddaman 			}
233*b30d1939SAndy Fiddaman 		}
234*b30d1939SAndy Fiddaman 		switch (r)
235*b30d1939SAndy Fiddaman 		{
236*b30d1939SAndy Fiddaman 		case '\n':
237*b30d1939SAndy Fiddaman 		case '\r':
238*b30d1939SAndy Fiddaman 			more->row--;
239*b30d1939SAndy Fiddaman 			more->col = 1;
240*b30d1939SAndy Fiddaman 			break;
241*b30d1939SAndy Fiddaman 		case ' ':
242*b30d1939SAndy Fiddaman 			more->row = 2;
243*b30d1939SAndy Fiddaman 			more->col = 1;
244*b30d1939SAndy Fiddaman 			break;
245*b30d1939SAndy Fiddaman 		default:
246*b30d1939SAndy Fiddaman 			more->row = 0;
247*b30d1939SAndy Fiddaman 			return n;
248*b30d1939SAndy Fiddaman 		}
249*b30d1939SAndy Fiddaman 	}
250*b30d1939SAndy Fiddaman 	if (s > b)
251*b30d1939SAndy Fiddaman 		w += sfwr(f, b, s - b, dp);
252*b30d1939SAndy Fiddaman 	return w;
253*b30d1939SAndy Fiddaman }
254*b30d1939SAndy Fiddaman 
255*b30d1939SAndy Fiddaman /*
256*b30d1939SAndy Fiddaman  * remove the discipline on close
257*b30d1939SAndy Fiddaman  */
258*b30d1939SAndy Fiddaman 
259*b30d1939SAndy Fiddaman #if __STD_C
moreexcept(Sfio_t * f,int type,Void_t * data,Sfdisc_t * dp)260*b30d1939SAndy Fiddaman static int moreexcept(Sfio_t* f, int type, Void_t* data, Sfdisc_t* dp)
261*b30d1939SAndy Fiddaman #else
262*b30d1939SAndy Fiddaman static int moreexcept(f, type, data, dp)
263*b30d1939SAndy Fiddaman Sfio_t*		f;
264*b30d1939SAndy Fiddaman int		type;
265*b30d1939SAndy Fiddaman Void_t*		data;
266*b30d1939SAndy Fiddaman Sfdisc_t*	dp;
267*b30d1939SAndy Fiddaman #endif
268*b30d1939SAndy Fiddaman {
269*b30d1939SAndy Fiddaman 	register More_t*	more = (More_t*)dp;
270*b30d1939SAndy Fiddaman 
271*b30d1939SAndy Fiddaman 	if (type == SF_FINAL || type == SF_DPOP)
272*b30d1939SAndy Fiddaman 	{
273*b30d1939SAndy Fiddaman 		if (f = more->input)
274*b30d1939SAndy Fiddaman 		{
275*b30d1939SAndy Fiddaman 			more->input = 0;
276*b30d1939SAndy Fiddaman 			sfdisc(f, SF_POPDISC);
277*b30d1939SAndy Fiddaman 		}
278*b30d1939SAndy Fiddaman 		else if (f = more->error)
279*b30d1939SAndy Fiddaman 		{
280*b30d1939SAndy Fiddaman 			more->error = 0;
281*b30d1939SAndy Fiddaman 			sfdisc(f, SF_POPDISC);
282*b30d1939SAndy Fiddaman 		}
283*b30d1939SAndy Fiddaman 		else
284*b30d1939SAndy Fiddaman 			free(dp);
285*b30d1939SAndy Fiddaman 	}
286*b30d1939SAndy Fiddaman 	else if (type == SF_SYNC)
287*b30d1939SAndy Fiddaman 	{
288*b30d1939SAndy Fiddaman 		more->match = 0;
289*b30d1939SAndy Fiddaman 		more->row = 1;
290*b30d1939SAndy Fiddaman 		more->col = 1;
291*b30d1939SAndy Fiddaman 	}
292*b30d1939SAndy Fiddaman 	return 0;
293*b30d1939SAndy Fiddaman }
294*b30d1939SAndy Fiddaman 
295*b30d1939SAndy Fiddaman /*
296*b30d1939SAndy Fiddaman  * push the more discipline on f
297*b30d1939SAndy Fiddaman  * if prompt==0 then a default ansi prompt is used
298*b30d1939SAndy Fiddaman  * if rows==0 or cols==0 then they are deterimined from the tty
299*b30d1939SAndy Fiddaman  * if f==sfstdout then input on sfstdin also resets the state
300*b30d1939SAndy Fiddaman  */
301*b30d1939SAndy Fiddaman 
302*b30d1939SAndy Fiddaman #if __STD_C
sfdcmore(Sfio_t * f,const char * prompt,int rows,int cols)303*b30d1939SAndy Fiddaman int sfdcmore(Sfio_t* f, const char* prompt, int rows, int cols)
304*b30d1939SAndy Fiddaman #else
305*b30d1939SAndy Fiddaman int sfdcmore(f, prompt, rows, cols)
306*b30d1939SAndy Fiddaman Sfio_t*		f;
307*b30d1939SAndy Fiddaman char*		prompt;
308*b30d1939SAndy Fiddaman int		rows;
309*b30d1939SAndy Fiddaman int		cols;
310*b30d1939SAndy Fiddaman #endif
311*b30d1939SAndy Fiddaman {
312*b30d1939SAndy Fiddaman 	register More_t*	more;
313*b30d1939SAndy Fiddaman 	size_t			n;
314*b30d1939SAndy Fiddaman 
315*b30d1939SAndy Fiddaman 	/*
316*b30d1939SAndy Fiddaman 	 * this is a writeonly discipline for interactive io
317*b30d1939SAndy Fiddaman 	 */
318*b30d1939SAndy Fiddaman 
319*b30d1939SAndy Fiddaman 	if (!(sfset(f, 0, 0) & SF_WRITE) || !isatty(sffileno(sfstdin)) || !isatty(sffileno(sfstdout)))
320*b30d1939SAndy Fiddaman 		return -1;
321*b30d1939SAndy Fiddaman 	if (!prompt)
322*b30d1939SAndy Fiddaman 		prompt = "\033[7m More\033[m";
323*b30d1939SAndy Fiddaman 	n = strlen(prompt) + 1;
324*b30d1939SAndy Fiddaman 	if (!(more = (More_t*)malloc(sizeof(More_t) + n)))
325*b30d1939SAndy Fiddaman 		return -1;
326*b30d1939SAndy Fiddaman 	memset(more, 0, sizeof(*more));
327*b30d1939SAndy Fiddaman 
328*b30d1939SAndy Fiddaman 	more->disc.readf = moreread;
329*b30d1939SAndy Fiddaman 	more->disc.writef = morewrite;
330*b30d1939SAndy Fiddaman 	more->disc.exceptf = moreexcept;
331*b30d1939SAndy Fiddaman 	memcpy(more->prompt, prompt, n);
332*b30d1939SAndy Fiddaman 	if (!rows || !cols)
333*b30d1939SAndy Fiddaman 	{
334*b30d1939SAndy Fiddaman #if _PACKAGE_ast
335*b30d1939SAndy Fiddaman 		astwinsize(sffileno(sfstdin), &rows, &cols);
336*b30d1939SAndy Fiddaman #endif
337*b30d1939SAndy Fiddaman 		if (!rows)
338*b30d1939SAndy Fiddaman 			rows = 24;
339*b30d1939SAndy Fiddaman 		if (!cols)
340*b30d1939SAndy Fiddaman 			cols = 80;
341*b30d1939SAndy Fiddaman 	}
342*b30d1939SAndy Fiddaman 	more->rows = rows;
343*b30d1939SAndy Fiddaman 	more->cols = cols;
344*b30d1939SAndy Fiddaman 	more->row = 1;
345*b30d1939SAndy Fiddaman 	more->col = 1;
346*b30d1939SAndy Fiddaman 
347*b30d1939SAndy Fiddaman 	if (sfdisc(f, &more->disc) != &more->disc)
348*b30d1939SAndy Fiddaman 	{
349*b30d1939SAndy Fiddaman 		free(more);
350*b30d1939SAndy Fiddaman 		return -1;
351*b30d1939SAndy Fiddaman 	}
352*b30d1939SAndy Fiddaman 	if (f == sfstdout)
353*b30d1939SAndy Fiddaman 	{
354*b30d1939SAndy Fiddaman 		if (sfdisc(sfstdin, &more->disc) != &more->disc)
355*b30d1939SAndy Fiddaman 		{
356*b30d1939SAndy Fiddaman 			sfdisc(f, SF_POPDISC);
357*b30d1939SAndy Fiddaman 			return -1;
358*b30d1939SAndy Fiddaman 		}
359*b30d1939SAndy Fiddaman 		more->input = sfstdin;
360*b30d1939SAndy Fiddaman 		if (sfdisc(sfstderr, &more->disc) != &more->disc)
361*b30d1939SAndy Fiddaman 		{
362*b30d1939SAndy Fiddaman 			sfdisc(f, SF_POPDISC);
363*b30d1939SAndy Fiddaman 			return -1;
364*b30d1939SAndy Fiddaman 		}
365*b30d1939SAndy Fiddaman 		more->error = sfstdin;
366*b30d1939SAndy Fiddaman 	}
367*b30d1939SAndy Fiddaman 
368*b30d1939SAndy Fiddaman 	return 0;
369*b30d1939SAndy Fiddaman }
370