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 42 int 43 astquery(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