[BACK]Return to ttyin.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / less

Annotation of src/usr.bin/less/ttyin.c, Revision 1.1

1.1     ! etheisen    1: /*
        !             2:  * Copyright (c) 1984,1985,1989,1994,1995  Mark Nudelman
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms, with or without
        !             6:  * modification, are permitted provided that the following conditions
        !             7:  * are met:
        !             8:  * 1. Redistributions of source code must retain the above copyright
        !             9:  *    notice, this list of conditions and the following disclaimer.
        !            10:  * 2. Redistributions in binary form must reproduce the above copyright
        !            11:  *    notice in the documentation and/or other materials provided with
        !            12:  *    the distribution.
        !            13:  *
        !            14:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
        !            15:  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            16:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            17:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
        !            18:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            19:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
        !            20:  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
        !            21:  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
        !            22:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
        !            23:  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
        !            24:  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            25:  */
        !            26:
        !            27:
        !            28: /*
        !            29:  * Routines dealing with getting input from the keyboard (i.e. from the user).
        !            30:  */
        !            31:
        !            32: #include "less.h"
        !            33:
        !            34: static int tty;
        !            35:
        !            36: /*
        !            37:  * Open keyboard for input.
        !            38:  */
        !            39:        public void
        !            40: open_getchr()
        !            41: {
        !            42: #if MSOFTC || OS2
        !            43:        extern int fd0;
        !            44:        /*
        !            45:         * Open a new handle to CON: in binary mode
        !            46:         * for unbuffered keyboard read.
        !            47:         */
        !            48:         fd0 = dup(0);
        !            49:         close(0);
        !            50:         tty = OPEN_TTYIN();
        !            51: #else
        !            52:        /*
        !            53:         * Try /dev/tty.
        !            54:         * If that doesn't work, use file descriptor 2,
        !            55:         * which in Unix is usually attached to the screen,
        !            56:         * but also usually lets you read from the keyboard.
        !            57:         */
        !            58:        tty = OPEN_TTYIN();
        !            59:        if (tty < 0)
        !            60:                tty = 2;
        !            61: #endif
        !            62: }
        !            63:
        !            64: /*
        !            65:  * Get a character from the keyboard.
        !            66:  */
        !            67:        public int
        !            68: getchr()
        !            69: {
        !            70:        char c;
        !            71:        int result;
        !            72:
        !            73:        do
        !            74:        {
        !            75: #if MSOFTC
        !            76:                /*
        !            77:                 * In raw read, we don't see ^C so look here for it.
        !            78:                 */
        !            79:                flush();
        !            80:                c = getch();
        !            81:                result = 1;
        !            82:                if (c == '\003')
        !            83:                        return (READ_INTR);
        !            84: #else
        !            85: #if OS2
        !            86:                flush();
        !            87:                while (_read_kbd(0, 0, 0) != -1)
        !            88:                        continue;
        !            89:                if ((c = _read_kbd(0, 1, 0)) == -1)
        !            90:                        return (READ_INTR);
        !            91:                result = 1;
        !            92: #else
        !            93:                result = iread(tty, &c, sizeof(char));
        !            94:                if (result == READ_INTR)
        !            95:                        return (READ_INTR);
        !            96:                if (result < 0)
        !            97:                {
        !            98:                        /*
        !            99:                         * Don't call error() here,
        !           100:                         * because error calls getchr!
        !           101:                         */
        !           102:                        quit(QUIT_ERROR);
        !           103:                }
        !           104: #endif
        !           105: #endif
        !           106:                /*
        !           107:                 * Various parts of the program cannot handle
        !           108:                 * an input character of '\0'.
        !           109:                 * If a '\0' was actually typed, convert it to '\340' here.
        !           110:                 */
        !           111:                if (c == '\0')
        !           112:                        c = '\340';
        !           113:        } while (result != 1);
        !           114:
        !           115:        return (c & 0377);
        !           116: }