Changeset 5052046 in mainline


Ignore:
Timestamp:
2006-05-31T16:37:57Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1c20e22
Parents:
c0e674a
Message:

Modified tetris input to be helenos-friendly.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tetris/input.c

    rc0e674a r5052046  
    5151
    5252#include <async.h>
     53#include "../console/console.h"
    5354
    5455/* return true iff the given timeval is positive */
     
    6566        }
    6667
     68/* We will use a hack here - if lastchar is non-zero, it is
     69 * the last character read. We will somehow simulate the select
     70 * semantics.
     71 */
    6772static aid_t getchar_inprog = 0;
     73static char lastchar = '\0';
    6874
    6975/*
     
    7682 *
    7783 * Return 0 => no input, 1 => can read() from stdin
     84 *
    7885 */
    7986int
     
    8188{
    8289        struct timeval starttv, endtv, *s;
    83         fd_set fds;
     90        static ipc_call_t charcall;
     91        int rc;
    8492
    8593#define NILTZ ((struct timezone *)0)
     
    97105                s = NULL;
    98106again:
    99         FD_ZERO(&fds);
    100         FD_SET(STDIN_FILENO, &fds);
    101         switch (select(STDIN_FILENO + 1, &fds, (fd_set *)0, (fd_set *)0, s)) {
    102 
    103         case -1:
    104                 if (tvp == 0)
    105                         return (-1);
    106                 if (errno == EINTR)
    107                         goto again;
    108                 stop("select failed, help");
    109                 /* NOTREACHED */
    110 
    111         case 0: /* timed out */
    112                 tvp->tv_sec = 0;
    113                 tvp->tv_usec = 0;
    114                 return (0);
     107        if (!lastchar) {
     108                if (!getchar_inprog)
     109                        getchar_inprog = async_send_2(1,CONSOLE_GETCHAR,0,0,&charcall);
     110                if (async_wait_timeout(getchar_inprog, &rc, s->tv_usec) == ETIMEOUT) {
     111                        tvp->tv_sec = 0;
     112                        tvp->tv_usec = 0;
     113                        return (0);
     114                }
     115                getchar_inprog = 0;
     116                if (rc) {
     117                        stop("end of file, help");
     118                }
     119                lastchar = IPC_GET_ARG1(charcall);
    115120        }
    116121        if (tvp) {
     
    136141        tv.tv_usec = fallrate;
    137142        while (TV_POS(&tv))
    138                 if (rwait(&tv) && read(STDIN_FILENO, &c, 1) != 1)
     143                if (rwait(&tv)) {
     144                        lastchar = '\0';
     145                } else
    139146                        break;
    140147}
     
    165172        if (!rwait(&timeleft))
    166173                return (-1);
    167         if (read(STDIN_FILENO, &c, 1) != 1)
    168                 stop("end of file, help");
     174        c = lastchar;
     175        lastchar = '\0';
    169176        return ((int)(unsigned char)c);
    170177}
Note: See TracChangeset for help on using the changeset viewer.