X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=sympathy.git;a=blobdiff_plain;f=src%2Ftty.c;h=b0f1d29c2e188d24dc6ea137acaaf397b1b4830d;hp=316133b7e111346b9eb176d0e5b325b558933e53;hb=e398b84ba34f0290e21830e36ff40719e2ec7125;hpb=385fdc489899b159a0b28c4914cf8b2b3d306045 diff --git a/src/tty.c b/src/tty.c index 316133b..b0f1d29 100644 --- a/src/tty.c +++ b/src/tty.c @@ -1,15 +1,51 @@ -/* +/* * tty.c: * - * Copyright (c) 2008 James McKenzie , + * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ -static char rcsid[] = "$Id$"; +static char rcsid[] = "$Id: tty.c,v 1.27 2010/07/27 14:49:35 james Exp $"; -/* - * $Log$ +/* + * $Log: tty.c,v $ + * Revision 1.27 2010/07/27 14:49:35 james + * add support for byte logging + * + * Revision 1.26 2008/03/10 11:49:33 james + * *** empty log message *** + * + * Revision 1.25 2008/03/07 13:16:02 james + * *** empty log message *** + * + * Revision 1.24 2008/03/07 12:37:04 james + * *** empty log message *** + * + * Revision 1.23 2008/03/06 16:49:39 james + * *** empty log message *** + * + * Revision 1.22 2008/03/06 16:49:05 james + * *** empty log message *** + * + * Revision 1.21 2008/03/03 06:04:42 james + * *** empty log message *** + * + * Revision 1.20 2008/03/02 10:37:56 james + * *** empty log message *** + * + * Revision 1.19 2008/02/28 16:57:52 james + * *** empty log message *** + * + * Revision 1.18 2008/02/28 16:37:16 james + * *** empty log message *** + * + * Revision 1.17 2008/02/28 15:37:06 james + * *** empty log message *** + * + * Revision 1.16 2008/02/28 12:12:25 james + * *** empty log message *** + * * Revision 1.15 2008/02/28 00:10:44 james * *** empty log message *** * @@ -57,85 +93,84 @@ static char rcsid[] = "$Id$"; static int speed_t_to_baud (speed_t s) { - switch (s) - { + switch (s) { #ifdef B0 - case B0: - return 0; + case B0: + return 0; #endif #ifdef B50 - case B50: - return 50; + case B50: + return 50; #endif #ifdef B75 - case B75: - return 75; + case B75: + return 75; #endif #ifdef B110 - case B110: - return 110; + case B110: + return 110; #endif #ifdef B134 - case B134: - return 134; + case B134: + return 134; #endif #ifdef B150 - case B150: - return 150; + case B150: + return 150; #endif #ifdef B200 - case B200: - return 200; + case B200: + return 200; #endif #ifdef B300 - case B300: - return 300; + case B300: + return 300; #endif #ifdef B600 - case B600: - return 600; + case B600: + return 600; #endif #ifdef B1200 - case B1200: - return 1200; + case B1200: + return 1200; #endif #ifdef B1800 - case B1800: - return 1800; + case B1800: + return 1800; #endif #ifdef B2400 - case B2400: - return 2400; + case B2400: + return 2400; #endif #ifdef B4800 - case B4800: - return 4800; + case B4800: + return 4800; #endif #ifdef B9600 - case B9600: - return 9600; + case B9600: + return 9600; #endif #ifdef B19200 - case B19200: - return 19200; + case B19200: + return 19200; #endif #ifdef B38400 - case B38400: - return 38400; + case B38400: + return 38400; #endif #ifdef B57600 - case B57600: - return 57600; + case B57600: + return 57600; #endif #ifdef B115200 - case B115200: - return 115200; + case B115200: + return 115200; #endif #ifdef B230400 - case B230400: - return 230400; + case B230400: + return 230400; #endif - } + } return -1; } @@ -143,85 +178,84 @@ speed_t_to_baud (speed_t s) static speed_t baud_to_speed_t (int baud) { - switch (baud) - { + switch (baud) { #ifdef B0 - case 0: - return B0; + case 0: + return B0; #endif #ifdef B50 - case 50: - return B50; + case 50: + return B50; #endif #ifdef B75 - case 75: - return B75; + case 75: + return B75; #endif #ifdef B110 - case 110: - return B110; + case 110: + return B110; #endif #ifdef B134 - case 134: - return B134; + case 134: + return B134; #endif #ifdef B150 - case 150: - return B150; + case 150: + return B150; #endif #ifdef B200 - case 200: - return B200; + case 200: + return B200; #endif #ifdef B300 - case 300: - return B300; + case 300: + return B300; #endif #ifdef B600 - case 600: - return B600; + case 600: + return B600; #endif #ifdef B1200 - case 1200: - return B1200; + case 1200: + return B1200; #endif #ifdef B1800 - case 1800: - return B1800; + case 1800: + return B1800; #endif #ifdef B2400 - case 2400: - return B2400; + case 2400: + return B2400; #endif #ifdef B4800 - case 4800: - return B4800; + case 4800: + return B4800; #endif #ifdef B9600 - case 9600: - return B9600; + case 9600: + return B9600; #endif #ifdef B19200 - case 19200: - return B19200; + case 19200: + return B19200; #endif #ifdef B38400 - case 38400: - return B38400; + case 38400: + return B38400; #endif #ifdef B57600 - case 57600: - return B57600; + case 57600: + return B57600; #endif #ifdef B115200 - case 115200: - return B115200; + case 115200: + return B115200; #endif #ifdef B230400 - case 230400: - return B230400; + case 230400: + return B230400; #endif - } + } return -1; } @@ -231,18 +265,16 @@ tty_pre_select (TTY * t, fd_set * rfds, fd_set * wfds) int line; struct timeval now, dif; - if (t->hanging_up) - { - - gettimeofday (&now, NULL); - timersub (&now, &t->hangup_clock, &dif); - if (dif.tv_sec) - { - line = TIOCM_DTR; - ioctl (t->rfd, TIOCMBIS, &line); - t->hanging_up = 0; - } + if (t->hanging_up) { + + gettimeofday (&now, NULL); + timersub (&now, &t->hangup_clock, &dif); + if (dif.tv_sec) { + line = TIOCM_DTR; + ioctl (t->rfd, TIOCMBIS, &line); + t->hanging_up = 0; } + } FD_SET (t->rfd, rfds); @@ -331,10 +363,27 @@ tty_hangup (TTY * t) } +void +tty_length (TTY * t, int l) +{ + t->displayed_length = l; +} -#if 0 -typedef struct +void +tty_winch (TTY * t, CRT_Pos size) { + struct winsize sz = { 0 }; + + sz.ws_col = size.x; + sz.ws_row = size.y; + + ioctl (t->wfd, TIOCSWINSZ, &sz); +} + + + +#if 0 +typedef struct { int in_dle; int in_errmark; @@ -342,9 +391,7 @@ typedef struct int errs; } #endif - #define DLE 0377 - #define bit(p,b,z,o) \ do { \ if ((b && z)) { \ @@ -364,7 +411,6 @@ typedef struct z++; \ } \ while (0) - static void tty_bit_analyse (Context * c, int err, int ch) { @@ -375,31 +421,28 @@ tty_bit_analyse (Context * c, int err, int ch) bit (p, 0, zc, oc); - for (d = 1; d < 0x100; d <<= 1) - { - bit (p, ch & d, zc, oc); - } + for (d = 1; d < 0x100; d <<= 1) { + bit (p, ch & d, zc, oc); + } bit (p, 1, zc, oc); - if (err) - { - p->biterrs++; - gettimeofday (&p->lasterr, NULL); - } + if (err) { + p->biterrs++; + gettimeofday (&p->lasterr, NULL); + } - if (p->biterrs) - { - log_f (c->l, - "", - ch & 0x01 ? 1 : 0, ch & 0x02 ? 1 : 0, ch & 0x04 ? 1 : 0, - ch & 0x08 ? 1 : 0, ch & 0x10 ? 1 : 0, ch & 0x20 ? 1 : 0, - ch & 0x40 ? 1 : 0, ch & 0x80 ? 1 : 0, p->bitfreq[0], - p->bitfreq[1], p->bitfreq[2], p->bitfreq[3], p->bitfreq[4], - p->bitfreq[5], p->bitfreq[6], p->bitfreq[7], p->bitfreq[8], - p->bitfreq[9]); - } + if (p->biterrs) { + log_f (c->l, + "", + ch & 0x01 ? 1 : 0, ch & 0x02 ? 1 : 0, ch & 0x04 ? 1 : 0, + ch & 0x08 ? 1 : 0, ch & 0x10 ? 1 : 0, ch & 0x20 ? 1 : 0, + ch & 0x40 ? 1 : 0, ch & 0x80 ? 1 : 0, p->bitfreq[0], + p->bitfreq[1], p->bitfreq[2], p->bitfreq[3], p->bitfreq[4], + p->bitfreq[5], p->bitfreq[6], p->bitfreq[7], p->bitfreq[8], + p->bitfreq[9]); + } } @@ -419,64 +462,54 @@ tty_analyse (Context * c) struct timeval now, dif; int i, j, max; - if (!p->biterrs) - { - p->guessed_baud = 0; - return; - } + if (!p->biterrs) { + p->guessed_baud = 0; + return; + } gettimeofday (&now, NULL); timersub (&now, &p->lasterr, &dif); - if (dif.tv_sec > 10) - { - tty_parse_reset (c); - return; - } + if (dif.tv_sec > 10) { + tty_parse_reset (c); + return; + } max = -1; j = 0; - for (i = 0; i < TTY_BITFREQ_LEN; ++i) - { - if (p->bitfreq[i] > max) - { - max = p->bitfreq[i]; - j = i; - } + for (i = 0; i < TTY_BITFREQ_LEN; ++i) { + if (p->bitfreq[i] > max) { + max = p->bitfreq[i]; + j = i; } + } if (c->t) i = tty_get_baud (c->t); else i = -1; - if (j == 1) - { - /*Closest bit edge is one bit, so the baud rate is too low */ - p->guessed_baud = -1; + if (j == 1) { + /* Closest bit edge is one bit, so the baud rate is too low */ + p->guessed_baud = -1; - } - else - { - if (i > 0) - p->guessed_baud = i / j; - else - p->guessed_baud = 0; + } else { + if (i > 0 && j > 0) + p->guessed_baud = i / j; + else + p->guessed_baud = 0; - } + } - if (p->guessed_baud == -1) - { - log_f (c->l, "", - p->biterrs, i); - } - else - { - log_f (c->l, "", - p->biterrs, i, p->guessed_baud); - } + if (p->guessed_baud == -1) { + log_f (c->l, "", + p->biterrs, i); + } else { + log_f (c->l, "", + p->biterrs, i, p->guessed_baud); + } } @@ -485,70 +518,63 @@ tty_parser_new (void) { TTY_Parser *p; - p = (TTY_Parser *) malloc (sizeof (TTY_Parser)); + p = (TTY_Parser *) xmalloc (sizeof (TTY_Parser)); memset (p, 0, sizeof (TTY_Parser)); return p; } -void +int tty_parse (Context * c, uint8_t * buf, int len) { TTY_Parser *p; + int err = 0; p = c->tp; - while (len--) - { - - if (p->in_dle) - { - p->in_dle = 0; - switch (*buf) - { - case DLE: - tty_bit_analyse (c, 0, *buf); - utf8_parse (c, *buf); - break; - case 0: - p->in_errmark = 1; - break; - default: - log_f (c->l, "%s:%d DLE parsing error: \\377 \\%03o", __FILE__, - __LINE__, *buf); - } - } - else if (p->in_errmark) - { - p->in_errmark = 0; - - log_f (c->l, "", - __FILE__, __LINE__, *buf); - - tty_bit_analyse (c, 1, *buf); - - tty_analyse (c); - - utf8_parse (c, *buf); - - utf8_parse (c, SYM_CHAR_RESET); - - } - else if (*buf == DLE) - { - p->in_dle = 1; - - } - else - { - tty_bit_analyse (c, 0, *buf); - - tty_analyse (c); - - utf8_parse (c, *buf); - - } - buf++; + while (len--) { + + if (p->in_dle) { + p->in_dle = 0; + switch (*buf) { + case DLE: + tty_bit_analyse (c, 0, *buf); + err += utf8_parse (c, *buf); + break; + case 0: + p->in_errmark = 1; + break; + default: + log_f (c->l, "%s:%d DLE parsing error: \\377 \\%03o", __FILE__, + __LINE__, *buf); + } + } else if (p->in_errmark) { + p->in_errmark = 0; + + log_f (c->l, "", + __FILE__, __LINE__, *buf); + + tty_bit_analyse (c, 1, *buf); + + tty_analyse (c); + + err += utf8_parse (c, *buf); + + err += utf8_parse (c, SYM_CHAR_RESET); + + } else if (*buf == DLE) { + p->in_dle = 1; + + } else { + tty_bit_analyse (c, 0, *buf); + + tty_analyse (c); + + err += utf8_parse (c, *buf); + } + buf++; + } + return err; }