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* Common Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.opensource.org/licenses/cpl1.0.txt * 11* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 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 Sfio_t* ip; 49 Sfio_t* op; 50 51 static Sfio_t* rfp; 52 static Sfio_t* wfp; 53 54 va_start(ap, format); 55 if (!format) 56 return 0; 57 if (!rfp) 58 { 59 c = errno; 60 if (isatty(sffileno(sfstdin))) 61 rfp = sfstdin; 62 else if (!(rfp = sfopen(NiL, "/dev/tty", "r"))) 63 return -1; 64 if (isatty(sffileno(sfstderr))) 65 wfp = sfstderr; 66 else if (!(wfp = sfopen(NiL, "/dev/tty", "w"))) 67 return -1; 68 errno = c; 69 } 70 if (quit & ERROR_PROMPT) 71 { 72 quit &= ~ERROR_PROMPT; 73 ip = rfp; 74 op = wfp; 75 } 76 else 77 { 78 ip = sfstdin; 79 op = sfstderr; 80 } 81 sfsync(sfstdout); 82 sfvprintf(op, format, ap); 83 sfsync(op); 84 for (n = c = sfgetc(ip);; c = sfgetc(ip)) 85 switch (c) 86 { 87 case EOF: 88 n = c; 89 /*FALLTHROUGH*/ 90 case '\n': 91 switch (n) 92 { 93 case EOF: 94 case 'q': 95 case 'Q': 96 if (quit >= 0) 97 exit(quit); 98 return -1; 99 case '1': 100 case 'y': 101 case 'Y': 102 case '+': 103 return 0; 104 } 105 return 1; 106 } 107 va_end(ap); 108 /*NOTREACHED*/ 109} 110