How would i ..

Discussion in 'C' started by bconnor, Apr 20, 2006.

  1. bconnor

    bconnor New Member

    Joined:
    Apr 4, 2006
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    Modify play_again3.c so; upon receiving a keyboard signal, it resets the terminal attributes and exits with a value of 2.

    Code:
    /* play_again3.c
     *	purpose: ask if user wants another transaction
     *	 method: set tty into chr-by-chr, no-echo mode
     *		 set tty into no-delay mode
     *		 read char, return result
     *	returns: 0=>yes, 1=>no, 2=>timeout
     *	 better: reset terminal mode on Interrupt
     */
    #include	<stdio.h>
    #include	<termios.h>
    #include	<fcntl.h>
    #include	<string.h>
    
    #define	ASK		"Do you want another transaction"
    #define	TRIES	   3	                                   /* max tries */
    #define SLEEPTIME  2                                       /* time per try */
    #define	BEEP       putchar('\a')                           /* alert user */
    
    main()
    {
    	int	response;
    
    	tty_mode(0);				/* save current mode	*/
    	set_cr_noecho_mode();			/* set -icanon, -echo	*/
    	set_nodelay_mode();			/* noinput => EOF	*/
    	response = get_response(ASK, TRIES);	/* get some answer	*/
    	tty_mode(1);				/* restore orig mode	*/
    	return response;
    }
    get_response( char *question , int maxtries)
    /*
     * purpose: ask a question and wait for a y/n answer or maxtries
     *  method: use getchar and complain about non-y/n input
     * returns: 0=>yes, 1=>no, 2=>timeout
     */
    {
    	int	input;
    
    	printf("%s (y/n)?", question);			/* ask		*/
    	fflush(stdout);					/* force output	*/
    	while ( 1 ){
    		sleep(SLEEPTIME);			/* wait a bit	*/
    		input = tolower(get_ok_char());        	/* get next chr */
    		if ( input == 'y' )
    			return 0;
    		if ( input == 'n' )
    			return 1;
    		if ( maxtries-- == 0 )			/* outatime?	*/
    			return 2;			/* sayso	*/
    		BEEP;
    	}
    }
    /*
     *  skip over non-legal chars and return y,Y,n,N or EOF
     */
    get_ok_char()
    {
    	int c;
    	while( ( c = getchar() ) != EOF && strchr("yYnN",c) == NULL )
    		;
    	return c;
    }
    
    set_cr_noecho_mode()
    /* 
     * purpose: put file descriptor 0 into chr-by-chr mode and noecho mode
     *  method: use bits in termios
     */
    {
    	struct	termios	ttystate;
    
    	tcgetattr( 0, &ttystate);		/* read curr. setting	*/
    	ttystate.c_lflag    	&= ~ICANON;	/* no buffering		*/
    	ttystate.c_lflag    	&= ~ECHO;	/* no echo either	*/
    	ttystate.c_cc[VMIN]  	=  1;		/* get 1 char at a time	*/
    	tcsetattr( 0 , TCSANOW, &ttystate);	/* install settings	*/
    }
    
    set_nodelay_mode()
    /*
     * purpose: put file descriptor 0 into no-delay mode
     *  method: use fcntl to set bits
     *   notes: tcsetattr() will do something similar, but it is complicated
     */
    {
    	int	termflags;
    
    	termflags = fcntl(0, F_GETFL);		/* read curr. settings	*/
    	termflags |= O_NDELAY;			/* flip on nodelay bit	*/
    	fcntl(0, F_SETFL, termflags);		/* and install 'em	*/
    }
    
    /* how == 0 => save current mode,  how == 1 => restore mode */
    /* this version handles termios and fcntl flags             */
    
    tty_mode(int how)
    {
    	static struct termios original_mode;
    	static int            original_flags;
    	if ( how == 0 ){
    		tcgetattr(0, &original_mode);
    		original_flags = fcntl(0, F_GETFL);
    	}
    	else {
    		tcsetattr(0, TCSANOW, &original_mode); 
    		fcntl( 0, F_SETFL, original_flags);	
    	}
    }
     
  2. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,336
    Likes Received:
    377
    Trophy Points:
    83
    Probably because of
    Code:
    if ( maxtries-- == 0 )			/* outatime?	*/
    	return 2;			/* sayso	*/
    
    it returns when MAXTRIES reaches 0.
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice