/*
 * System-dependent routines for BSD 4.3 UNIX 
 */

#include "stevie.h"
#include <sgtty.h>

/*
 * inchar() - get a character from the keyboard 
 */
int
inchar()
{
    int             c;

    fflush(stdout);		/* flush any pending output */

    c = getchar();

    return c;
}

void
outstr(s)
    char           *s;
{
    while (*s)
	outchar(*s++);
}

void
beep()
{
    if (RedrawingDisabled)
	return;

    outchar('\007');
}

void
delay()
{
    sleep(1);
}

static struct sgttyb ostate;

void
windinit()
{
    char           *getenv();
    char           *term;
    struct sgttyb   nstate;

    term = getenv("TERM");
    if (!term) {
	fprintf(stderr, "Invalid terminal type '%s'\n", term);
	exit(1);
    }
    if ((strncmp(term, "vt", 2) != 0) && (strncmp(term, "kd", 2) != 0)) {
	fprintf(stderr, "Invalid terminal type '%s'\n", term);
	exit(1);
    }
    Columns = 80;
    P(P_LI) = Rows = 24;

    /*
     * Go into cbreak mode 
     */
    ioctl(1, (long) TIOCGETP, (char *) &ostate);
    nstate = ostate;
    nstate.sg_flags = nstate.sg_flags & ~(ECHO | CRMOD) | CBREAK;
    ioctl(1, (long) TIOCSETP, (char *) &nstate);
}

void
windexit(r)
    int             r;
{
    fflush(stdout);

    ioctl(0, (long) TIOCSETP, (char *) &ostate);

    exit(r);
}

void
windgoto(r, c)
    int             c;
    int             r;
{
    r++;
    c++;

    outstr("\033[");
    if (r >= 10)
	outchar((char) (r / 10 + '0'));
    outchar((char) (r % 10 + '0'));
    outchar(';');
    if (c >= 10)
	outchar((char) (c / 10 + '0'));
    outchar((char) (c % 10 + '0'));
    outchar('H');
}

FILE           *
fopenb(fname, mode)
    char           *fname;
    char           *mode;
{
    return fopen(fname, mode);
}
