/*
 *  ttyin.c -- 文字入出力関係
 *
 *	0.0: May  1, 2014 (from utip.c)
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>

#define YES 1
#define NO 0

#define SELECT_TIMEOUT 10000	/* 10,000 [us] -> 10 [ms] -> 1/100 [sec] */
#define CURHOME "\033[;H"

#ifndef O_NONBLOCK	/* for Sony NEWS, NEWS-OS 4.x */
#include <stream/xti.h>
#endif
#define FILEMODE 0777

#ifdef _POSIX_VDISABLE
#define CC_UNDEF _POSIX_VDISABLE
#else
#define CC_UNDEF 0
#endif

static struct termios keyorg, keynew;	/* キーボード (stdin) の状態を保持 */
/* static struct termios portorg, portnew;  */


/* キーボード (stdin) を「生」モード、エコーなしに */
void kbdinit()
{
    if (isatty(fileno(stdin))) {
	tcgetattr(fileno(stdin), &keyorg);
	memcpy(&keynew, &keyorg, sizeof(struct termios));
	cfmakeraw(&keynew);
	keynew.c_lflag &= ~ECHO;
	tcsetattr(fileno(stdin), TCSANOW, &keynew);
    }
}


/* キーボード (stdin) の設定を元に戻す */
void kbdrestore()
{
    if (isatty(fileno(stdin))) {
	tcsetattr(fileno(stdin), TCSANOW, &keyorg);
    }
}


/* */
int ttyin(int select_timeout)
{
    unsigned char buf[1];
    int n;
    int ch;
    int nfds;
    fd_set readfds;
    struct timeval timeout;

    /* 入力があるかどうか調べる */
    FD_ZERO(&readfds);
    FD_SET(fileno(stdin), &readfds);
    timeout.tv_sec = 0;
    timeout.tv_usec = select_timeout;
    nfds = select(fileno(stdin) + 1, &readfds, NULL, NULL, &timeout);
    ch = -1;
    if ((nfds > 0) && (FD_ISSET(fileno(stdin), &readfds))) {
	/* 入力あり */
	n = read(fileno(stdin), &buf[0], 1);
	if (n > 0) {
	    fprintf(stderr, CURHOME);
	    fprintf(stderr, "%c", ch);
	    fflush(stderr);
	    ch = buf[0];
	}
    }
    return(ch);
}
