view rvinterf/libasync/ttymagic.c @ 963:d69d1e097b18
rvinterf: g23sh and fc-sendsp are being retired, absorbed into fc-shell
author |
Mychaela Falconia <falcon@ivan.Harhan.ORG> |
date |
Fri, 06 Nov 2015 22:52:25 +0000 (2015-11-06) |
parents |
40b8557b9d04 |
children |
|
line source
/*
* This module contains the tty "magic" code for fc-tmsh.
*/
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
extern int ttyhacks;
struct termios orig_termios, our_termios;
#define MAX_USER_CMD 78
char usercmd[MAX_USER_CMD+1];
int usercmd_len;
void
tty_init()
{
if (!ttyhacks)
return;
tcgetattr(0, &orig_termios);
bcopy(&orig_termios, &our_termios, sizeof(struct termios));
our_termios.c_oflag &= ~(OCRNL | ONOCR | ONLRET);
our_termios.c_lflag &= ~(ICANON | ECHO);
our_termios.c_cc[VMIN] = 1;
our_termios.c_cc[VTIME] = 0;
tcsetattr(0, TCSAFLUSH, &our_termios);
putchar('>');
fflush(stdout);
}
void
tty_cleanup()
{
if (!ttyhacks)
return;
tcsetattr(0, TCSAFLUSH, &orig_termios);
}
void
handle_tty_input()
{
char buf[256];
int i, c, cc;
cc = read(0, buf, sizeof buf);
if (cc <= 0) {
tty_cleanup();
exit(0);
}
for (i = 0; i < cc; i++) {
c = buf[i];
if (c >= ' ' && c <= '~') {
if (usercmd_len >= MAX_USER_CMD)
continue;
usercmd[usercmd_len++] = c;
if (ttyhacks)
putchar(c); /* echo */
continue;
}
switch (c) {
case '\b':
case 0x7F:
if (!usercmd_len)
continue;
usercmd_len--;
if (ttyhacks) {
putchar('\b');
putchar(' ');
putchar('\b');
}
continue;
case '\n':
case '\r':
usercmd[usercmd_len] = '\0';
if (ttyhacks)
putchar('\n'); /* echo */
dispatch_user_cmd();
usercmd_len = 0;
if (ttyhacks)
putchar('>'); /* new prompt */
}
}
}
void
async_msg_output(msg)
char *msg;
{
int msglen, i;
msglen = strlen(msg);
if (ttyhacks)
putchar('\r');
fputs(msg, stdout);
if (ttyhacks)
for (i = msglen; i < usercmd_len + 1; i++)
putchar(' ');
putchar('\n');
if (!ttyhacks)
return;
/* reprint the input line */
putchar('>');
if (!usercmd_len)
return;
fwrite(usercmd, 1, usercmd_len, stdout);
}