BJH@V3.INFERENCE.COM.UUCP (07/01/88)
HELP! -
Here is a simple little C program that is supposed to have a top level
command loop and a debug command loop. Each loop is supposed to scanf
for commands and exit when you type 'X'. To get to the debug command
loop from the top level you type ^C. Sure enough, that works. But once
in debugger() it seems that stdin gets wedged, ie. scanf from stdin
returns 0 tokens. In fact, debugger() never stops at scanf and asks for
input; it just loops endlessly. I have tried all sorts of clearerr(),
rewind(), open(), close(), freopen(), setbuf() operations on stdin to no
avail. What am I missing? Is VAX C broken? Am I broken?
PS. I'm using VMS 4.7, VAX C 2.3. And please don't respond with 'Try
this' 'Try that' unless you've tried it and it works, because I've
already tried a hundred billion things.
=> Brian Hagerty [sic] BJH @ V3.INFERENCE.COM
=> Network Manager "If I had a penny for every solution I've tried!"
=> Inference Corporation
=> Lost Angeles, UT
8< ...snip... 8< ...snip... 8< ...snip... 8< ...snip... 8< ...snip...
#include stdio
#include signal
#include setjmp
jmp_buf env; /* set/longjmp environment buffer */
main()
{
char buf[80];
int debugger(), n;
signal( SIGINT, debugger); /* Set the trap for ^C */
while( setjmp(env) != 0 ) { /* False first time thru */
printf( "Long jump!\n"); /* True when returning from debugger */
}
while( *buf != 'X' ) { /* TOPLEVEL command loop */
printf( "toplevel> "); /* Loop works fine. */
n = fscanf( stdin, "%s", &buf); /* Try ^C when you're bored */
printf( "%d toplevel tokens\n", n);
}
}
debugger( sigint, code, scp)
int sigint, code;
struct sigcontext *scp;
{
char buf[80];
int n;
printf( "Signal trapped!\n"); /* ^C from TOPLEVEL takes you here */
signal( SIGINT, debugger); /* Reset the trap for ^C */
while( *buf != 'X' ) {
printf( "debug> "); /* This loop printf's ... */
n = fscanf( stdin, "%s", &buf); /* but won't accept input */
printf( "%d debug tokens\n", n); /* and loops forever */
}
longjmp( env, sigint); /* Jump to main (if u ever get here!) */
}