1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                 Eclipse Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*          http://www.eclipse.org/org/documents/epl-v10.html           *
11*         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#pragma prototyped
23/*
24 * AT&T Research
25 *
26 * output printf prompt and read response
27 * if format==0 then verify that interaction is possible
28 *
29 * return:
30 *
31 *	0	[1yY+]
32 *	-1	[qQ] or EOF
33 *	1	otherwise
34 *
35 * if (quit&ERROR_PROMPT) then tty forced for IO
36 * if quit>=0 then [qQ] or EOF calls exit(quit)
37 */
38
39#include <ast.h>
40#include <error.h>
41
42int
43astquery(int quit, const char* format, ...)
44{
45	va_list		ap;
46	register int	n;
47	register int	c;
48	int		r;
49	Sfio_t*		ip;
50	Sfio_t*		op;
51
52	static Sfio_t*	rfp;
53	static Sfio_t*	wfp;
54
55	r = 0;
56	va_start(ap, format);
57	if (!format)
58		goto done;
59	r = -1;
60	if (!rfp)
61	{
62		c = errno;
63		if (isatty(sffileno(sfstdin)))
64			rfp = sfstdin;
65		else if (!(rfp = sfopen(NiL, "/dev/tty", "r")))
66			goto done;
67		if (isatty(sffileno(sfstderr)))
68			wfp = sfstderr;
69		else if (!(wfp = sfopen(NiL, "/dev/tty", "w")))
70			goto done;
71		errno = c;
72	}
73	if (quit & ERROR_PROMPT)
74	{
75		quit &= ~ERROR_PROMPT;
76		ip = rfp;
77		op = wfp;
78	}
79	else
80	{
81		ip = sfstdin;
82		op = sfstderr;
83	}
84	sfsync(sfstdout);
85	sfvprintf(op, format, ap);
86	sfsync(op);
87	for (n = c = sfgetc(ip);; c = sfgetc(ip))
88		switch (c)
89		{
90		case EOF:
91			n = c;
92			/*FALLTHROUGH*/
93		case '\n':
94			switch (n)
95			{
96			case EOF:
97			case 'q':
98			case 'Q':
99				if (quit >= 0)
100					exit(quit);
101				goto done;
102			case '1':
103			case 'y':
104			case 'Y':
105			case '+':
106				r = 0;
107				goto done;
108			}
109			return 1;
110		}
111 done:
112	va_end(ap);
113	return r;
114}
115