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