chiark / gitweb /
serialmgr: Copy from woking.cam.xci-test.com
[sympathy.git] / src / tty.c
index f27afea2bff68c1990956a3dc80494d0d151fc81..b0f1d29c2e188d24dc6ea137acaaf397b1b4830d 100644 (file)
--- a/src/tty.c
+++ b/src/tty.c
@@ -1,15 +1,42 @@
-/*
+/* 
  * tty.c:
  *
- * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
+ * Copyright (c) 2008 James McKenzie <sympathy@madingley.org>,
  * 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 ***
  *
@@ -66,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;
 }
@@ -152,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;
 }
 
@@ -240,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);
@@ -340,13 +363,19 @@ tty_hangup (TTY * t)
 
 }
 
+void
+tty_length (TTY * t, int l)
+{
+  t->displayed_length = l;
+}
 
-void tty_winch(TTY * t,CRT_Pos size)
+void
+tty_winch (TTY * t, CRT_Pos size)
 {
   struct winsize sz = { 0 };
 
-  sz.ws_col=size.x;
-  sz.ws_row=size.y;
+  sz.ws_col = size.x;
+  sz.ws_row = size.y;
 
   ioctl (t->wfd, TIOCSWINSZ, &sz);
 }
@@ -354,8 +383,7 @@ void tty_winch(TTY * t,CRT_Pos size)
 
 
 #if 0
-typedef struct
-{
+typedef struct {
   int in_dle;
   int in_errmark;
 
@@ -363,9 +391,7 @@ typedef struct
   int errs;
 }
 #endif
-
 #define DLE 0377
-
 #define bit(p,b,z,o) \
        do { \
          if ((b && z)) { \
@@ -385,7 +411,6 @@ typedef struct
            z++; \
          } \
        while (0)
-
 static void
 tty_bit_analyse (Context * c, int err, int ch)
 {
@@ -396,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,
-             "<tty_bit_analyse: 0%d%d%d%d%d%d%d%d1  [%d,%d,%d,%d,%d,%d,%d,%d,%d,%d]>",
-             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,
+           "<tty_bit_analyse: 0%d%d%d%d%d%d%d%d1  [%d,%d,%d,%d,%d,%d,%d,%d,%d,%d]>",
+           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]);
+  }
 
 }
 
@@ -440,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, "<tty_analyse: %6d errors, current rate %db is too low>",
-             p->biterrs, i);
-    }
-  else
-    {
-      log_f (c->l, "<tty_analyse: %6d errors, current rate %db, suggest %db>",
-             p->biterrs, i, p->guessed_baud);
-    }
+  if (p->guessed_baud == -1) {
+    log_f (c->l, "<tty_analyse: %6d errors, current rate %db is too low>",
+           p->biterrs, i);
+  } else {
+    log_f (c->l, "<tty_analyse: %6d errors, current rate %db, suggest %db>",
+           p->biterrs, i, p->guessed_baud);
+  }
 
 }
 
@@ -506,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, "<tty reports error: \\377 \\000 \\%03o>",
-                 __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, "<tty reports error: \\377 \\000 \\%03o>",
+             __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;
 }