Annotation of sbbs/xpdev/conwrap.c, revision 1.1.1.1

1.1       root        1: /* conwrap.c */
                      2: 
                      3: /* DOS's kbhit and getch functions for Unix - Casey Martin 2000 */
                      4: 
                      5: /* $Id: conwrap.c,v 1.11 2004/11/02 22:48:50 deuce Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This library is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU Lesser General Public License          *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU Lesser General Public License for more details: lgpl.txt or     *
                     18:  * http://www.fsf.org/copyleft/lesser.html                                                                     *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #if defined(__unix__)
                     39: 
                     40: #include <stdlib.h>
                     41: #include <string.h>    /* memcpy */
                     42: #include <unistd.h>
                     43: #include <termios.h>
                     44: 
                     45: #if defined(__FreeBSD__)
                     46:        #include <sys/kbio.h>
                     47: #elif defined(__linux__)
                     48:        #include <sys/kd.h>
                     49: #endif
                     50: 
                     51: #include <sys/time.h>
                     52: #include <sys/types.h>
                     53: #include <signal.h>
                     54: 
                     55: #include "conwrap.h"                           /* Verify prototypes */
                     56: 
                     57: static struct termios current;         /* our current term settings                    */
                     58: static struct termios original;     /* old termios settings                                    */
                     59: static int beensetup = 0;           /* has _termios_setup() been called?       */
                     60: static int istty = 0;                          /* is stdin a tty?                                              */              
                     61: 
                     62: /* Resets the termios to its previous state */
                     63: void _termios_reset(void)
                     64: {
                     65:        tcsetattr(STDIN_FILENO, TCSANOW, &original);
                     66: }
                     67: 
                     68: /************************************************
                     69:   This pair of functions handles Ctrl-Z presses
                     70: ************************************************/
                     71: #if defined(__BORLANDC__)
                     72:         #pragma argsused
                     73: #endif
                     74: void _sighandler_stop(int sig)
                     75: {
                     76:     /* clean up the terminal */
                     77:     _termios_reset();
                     78: 
                     79:     /* ... and stop */
                     80:        kill(getpid(), SIGSTOP);
                     81: }
                     82: #if defined(__BORLANDC__)
                     83:         #pragma argsused
                     84: #endif
                     85: void _sighandler_cont(int sig)
                     86: {
                     87:     /* restore terminal */
                     88:        tcsetattr(STDIN_FILENO, TCSANOW, &current);
                     89: }
                     90: 
                     91: 
                     92: /* Prepares termios for non-blocking action */
                     93: void _termios_setup(void)
                     94: {
                     95:        beensetup = 1;
                     96:     
                     97:        tcgetattr(STDIN_FILENO, &original);
                     98:   
                     99:        memcpy(&current, &original, sizeof(struct termios));
                    100:        current.c_cc[VMIN] = 1;           /* read() will return with one char */
                    101:        current.c_cc[VTIME] = 0;          /* read() blocks forever */
                    102:        current.c_lflag &= ~ICANON;       /* character mode */
                    103:     current.c_lflag &= ~ECHO;         /* turn off echoing */
                    104:        tcsetattr(STDIN_FILENO, TCSANOW, &current);
                    105: 
                    106:     /* Let's install an exit function, also.  This way, we can reset
                    107:      * the termios silently
                    108:         */
                    109:     atexit(_termios_reset);
                    110: 
                    111:     /* install the Ctrl-Z handler */
                    112:     signal(SIGTSTP, _sighandler_stop);
                    113:     signal(SIGCONT, _sighandler_cont);
                    114: }
                    115: 
                    116: 
                    117: int kbhit(void)
                    118: {
                    119:        fd_set inp;
                    120:        struct timeval timeout = {0, 0};
                    121: 
                    122:        if(!istty) {
                    123:                istty = isatty(STDIN_FILENO);
                    124:                if(!istty)
                    125:                        return 0;
                    126:        }
                    127: 
                    128:     if(!beensetup)
                    129:        _termios_setup();
                    130: 
                    131:        /* set up select() args */
                    132:        FD_ZERO(&inp);
                    133:        FD_SET(STDIN_FILENO, &inp);
                    134: 
                    135:        if(select(STDIN_FILENO+1, &inp, NULL, NULL, &timeout)<1)
                    136:                return 0;
                    137:        return 1;
                    138: }
                    139: 
                    140: int getch(void)
                    141: {
                    142:        char c;
                    143: 
                    144:     if(!beensetup)
                    145:        _termios_setup();
                    146: 
                    147:     /* get a char out of stdin */
                    148:     read(STDIN_FILENO, &c, 1);
                    149: 
                    150:     return c;
                    151: }
                    152: 
                    153: #endif /* __unix__ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.