Annotation of coherent/d/usr/lib/libcurses/getkey.c, revision 1.1

1.1     ! root        1: /* $Header: /newbits/usr/lib/libcurses/RCS/getkey.c,v 1.2 91/09/30 13:05:46 bin Exp Locker: bin $
        !             2:  *
        !             3:  *     The  information  contained herein  is a trade secret  of INETCO
        !             4:  *     Systems, and is confidential information.   It is provided under
        !             5:  *     a license agreement,  and may be copied or disclosed  only under
        !             6:  *     the terms of that agreement.   Any reproduction or disclosure of
        !             7:  *     this  material  without  the express  written  authorization  of
        !             8:  *     INETCO Systems or persuant to the license agreement is unlawful.
        !             9:  *
        !            10:  *     Copyright (c) 1989
        !            11:  *     An unpublished work by INETCO Systems, Ltd.
        !            12:  *     All rights reserved.
        !            13:  */
        !            14: 
        !            15: /*
        !            16:  * Keyboard Escape Sequence Mapping Routine.
        !            17:  *
        !            18:  *     int getkey();
        !            19:  *
        !            20:  *     FUTURE: Support escape sequences split across multiple reads.
        !            21:  */
        !            22: 
        !            23: #include <stdio.h>
        !            24: #include "curses.ext"
        !            25: 
        !            26: /*
        !            27:  * Get character from terminal, recognizing escape sequences.
        !            28:  */
        !            29: int
        !            30: getkey()
        !            31: {
        !            32:        register tkeyent_t * kp;
        !            33:        register int len;
        !            34:        tkeyent_t * sav_kp;
        !            35:        int sav_len;
        !            36:        uchar * str;
        !            37:        static unsigned char buf[64];
        !            38:        static int bufoff;
        !            39:        static int buflen;
        !            40: 
        !            41: #if DEBUG > 0
        !            42:        fprintf( outf, "getkey: bufoff=%d buflen=%d\n", bufoff, buflen );
        !            43: #endif
        !            44: 
        !            45:        while ( 1 ) {
        !            46: 
        !            47:                while ( bufoff >= buflen ) {
        !            48: 
        !            49:                        buflen = read( 0, buf, sizeof(buf) - 1 );
        !            50:                        bufoff = 0;
        !            51: 
        !            52: #if DEBUG > 0
        !            53:                        fprintf( outf, "getkey: %d bytes read\n", buflen );
        !            54:                        if ( buflen > 0 ) {
        !            55:                                fprintf( outf, "\t'" );
        !            56:                                for ( bufoff = 0; bufoff < buflen; bufoff++ )
        !            57:                                        fprintf(outf, "%s",
        !            58:                                                unctrl(buf[bufoff]) );
        !            59:                                fprintf( outf, "'\n" );
        !            60:                                bufoff = 0;
        !            61:                        }
        !            62: #endif
        !            63: 
        !            64:                        if ( buflen <= 0 )
        !            65:                                return (0);
        !            66: 
        !            67:                        buf[buflen] = '\0';
        !            68:                }
        !            69: 
        !            70:                /*
        !            71:                 * Search for matching escape sequences.
        !            72:                 * 'kp'         is a pointer into the keymap array.
        !            73:                 * 'kp->cpp'    is a pointer to the capability variable.
        !            74:                 * '*(kp->cpp)' is a pointer to the capability string.
        !            75:                 * '**(kp->cpp)'is the first character in the capability string.
        !            76:                 * Remember the longest capability string found.
        !            77:                 */
        !            78:                for ( sav_kp = NULL, kp = tkeymap; kp->id != 0; kp++ ) {
        !            79: 
        !            80:                        /*
        !            81:                         * Capability is not defined.
        !            82:                         */
        !            83:                        if ( kp->cpp == NULL )
        !            84:                                continue;
        !            85: 
        !            86:                        /*
        !            87:                         * Capability is not supported on current terminal.
        !            88:                         */
        !            89:                        if ( (str = *(kp->cpp)) == NULL )
        !            90:                                continue;
        !            91: 
        !            92:                        /*
        !            93:                         * Compute length of string.
        !            94:                         */
        !            95:                        len = strlen(str);
        !            96: 
        !            97:                        /*
        !            98:                         * Ignore zero-length strings.
        !            99:                         */
        !           100:                        if ( len == 0 )
        !           101:                                continue;
        !           102: 
        !           103: #if DEBUG > 0
        !           104:                        {
        !           105:                        uchar * cp;
        !           106:                        fprintf( outf, "getkey:0%03o = '", kp->id );
        !           107:                        for ( cp = str; *cp; cp++ )
        !           108:                                fprintf( outf, "%s", unctrl(*cp) );
        !           109:                        fprintf( outf, "'\n" );
        !           110:                        }
        !           111: #endif
        !           112:                        /*
        !           113:                         * Ignore strings which are longer than the input.
        !           114:                         */
        !           115:                        if ( bufoff + len > buflen )
        !           116:                                continue;
        !           117: 
        !           118:                        /*
        !           119:                         * Match not found.
        !           120:                         */
        !           121:                        if ( memcmp( str, &buf[bufoff], len ) != 0 )
        !           122:                                continue;
        !           123: 
        !           124: #if DEBUG > 0
        !           125:                        fprintf(outf, "getkey:0%03o match of len %d found!\n",
        !           126:                                kp->id, len );
        !           127: #endif
        !           128:                        /*
        !           129:                         * Match is longer than previous one - remember it.
        !           130:                         */
        !           131:                        if ( (sav_kp == NULL) || (sav_len < len) ) {
        !           132:                                sav_kp  = kp;
        !           133:                                sav_len = len;
        !           134:                        }
        !           135: #if DEBUG > 0
        !           136:                        else {
        !           137:                                fprintf(outf, "getkey:0%03o match discarded\n",
        !           138:                                        kp->id );
        !           139:                        }
        !           140: #endif
        !           141:                }
        !           142: 
        !           143:                /*
        !           144:                 * Match was found.
        !           145:                 */
        !           146:                if ( sav_kp != NULL ) {
        !           147: #if DEBUG > 0
        !           148:                        fprintf(outf,"getkey: match token = 0%o\n",sav_kp->id);
        !           149: #endif
        !           150:                        bufoff += sav_len;
        !           151: 
        !           152:                        return (sav_kp->id);
        !           153:                }
        !           154: 
        !           155: #if DEBUG > 0
        !           156:                fprintf( outf, "getkey: char = %s\n", unctrl(buf[bufoff]) );
        !           157: #endif
        !           158:                /*
        !           159:                 * Return next char.
        !           160:                 */
        !           161:                return (buf[ bufoff++ ]);
        !           162:        }
        !           163: }

unix.superglobalmegacorp.com

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