FreeCalypso > hg > freecalypso-tools
view rvinterf/libasync/ttymagic.c @ 21:10e0f8fdc37c
top README: lcdemu hack dropped
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 22 Oct 2016 05:31:14 +0000 |
parents | e7502631a0f9 |
children | 09b4fd9b3827 |
line wrap: on
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); }