Change to includes. no more ../h
[unix-history] / usr / src / sys / kern / tty_tb.c
index 49cfcda..de23b6c 100644 (file)
@@ -1,38 +1,43 @@
-/*     tty_tb.c        4.8     83/05/27        */
+/*     tty_tb.c        6.3     84/08/29        */
 
 #include "tb.h"
 #if NTB > 0
 
 
 #include "tb.h"
 #if NTB > 0
 
-#include "../h/param.h"
-#include "../h/systm.h"
-#include "../h/dir.h"
-#include "../h/user.h"
-#include "../h/ioctl.h"
-#include "../h/tty.h"
-#include "../h/proc.h"
-#include "../h/inode.h"
-#include "../h/file.h"
-#include "../h/conf.h"
-#include "../h/buf.h"
-#include "../h/uio.h"
+#include "param.h"
+#include "systm.h"
+#include "dir.h"
+#include "user.h"
+#include "ioctl.h"
+#include "tty.h"
+#include "proc.h"
+#include "inode.h"
+#include "file.h"
+#include "conf.h"
+#include "buf.h"
+#include "uio.h"
 
 /*
  * Line discipline for RS232 tablets.
  * Supplies binary coordinate data.
  *
 
 /*
  * Line discipline for RS232 tablets.
  * Supplies binary coordinate data.
  *
- * FIX WAY IN WHICH OVERLAYING IS DONE
  * MAKE TABLET TYPE AN ioctl TO AVOID HAVING ONE DISCIPLINE PER TABLET TYPE.
  */
 
  * MAKE TABLET TYPE AN ioctl TO AVOID HAVING ONE DISCIPLINE PER TABLET TYPE.
  */
 
-#define MTABCHAR 5
-#define MNTABCHAR 6
-
-struct tbposition {
-       int     xpos;
-       int     ypos;
-       short   status;
-       short   scount;
-};
+#define NTBS           (16)
+#define MALLTABCHAR    (8)
+#define MTABCHAR       (5)
+#define MNTABCHAR      (6)
+
+struct tb {
+       short used;
+       char cbuf[MALLTABCHAR];
+       struct tbpos {
+               int     xpos;
+               int     ypos;
+               short   status;
+               short   scount;
+       } tbpos;
+} tb[NTBS];
 
 /*
  * Open as tablet discipline.  Called when discipline changed
 
 /*
  * Open as tablet discipline.  Called when discipline changed
@@ -44,15 +49,22 @@ tbopen(dev, tp)
        dev_t dev;
        register struct tty *tp;
 {
        dev_t dev;
        register struct tty *tp;
 {
-       register struct tbposition *tbp;
+       register struct tb *tbp;
 
 
-       if (tp->t_line == TABLDISC || tp->t_line == NTABLDISC) {
-               return (EBUSY);
+       if (tp->t_line == TABLDISC || tp->t_line == NTABLDISC)
+               return (ENODEV);
        ttywflush(tp);
        ttywflush(tp);
-       tp->t_cp = (char *) &tp->t_un.T_CTLQ;   /* overlay control queue */
+       for (tbp = tb; tbp < &tb[NTBS]; tbp++)
+               if (!tbp->used)
+                       break;
+       if (tbp >= &tb[NTBS])
+               return (EBUSY);
+       tbp->used++;
+       tp->t_cp = tbp->cbuf;
        tp->t_inbuf = 0;
        tp->t_inbuf = 0;
-       tbp = (struct tbposition *) &tp->t_rocount;
-       tbp->xpos = tbp->ypos = tbp->status = tbp->scount = 0;
+       tbp->tbpos.xpos = tbp->tbpos.ypos = 0;
+       tbp->tbpos.status = tbp->tbpos.scount = 0;
+       tp->T_LINEP = (caddr_t) tbp;
        return (0);
 }
 
        return (0);
 }
 
@@ -65,13 +77,12 @@ tbclose(tp)
 {
        register int s = spl5();
 
 {
        register int s = spl5();
 
+       ((struct tb *) tp->T_LINEP)->used = 0;
        tp->t_cp = 0;
        tp->t_inbuf = 0;
        tp->t_rawq.c_cc = 0;            /* clear queues -- paranoid */
        tp->t_canq.c_cc = 0;
        tp->t_cp = 0;
        tp->t_inbuf = 0;
        tp->t_rawq.c_cc = 0;            /* clear queues -- paranoid */
        tp->t_canq.c_cc = 0;
-       tp->t_un.T_CTLQ.c_cc = 0;       /* clear overlaid queue status */
-       tp->t_un.T_CTLQ.c_cf = tp->t_un.T_CTLQ.c_cl = NULL;
-       tp->t_line = 0;         /* paranoid: avoid races */
+       tp->t_line = 0;                 /* paranoid: avoid races */
        splx(s);
 }
 
        splx(s);
 }
 
@@ -84,13 +95,12 @@ tbread(tp, uio)
        register struct tty *tp;
        struct uio *uio;
 {
        register struct tty *tp;
        struct uio *uio;
 {
-       register int i;
-       register s;
-       struct tbposition tbposition;
+       struct tbpos *tbpos;
 
        if ((tp->t_state&TS_CARR_ON)==0)
                return (EIO);
 
        if ((tp->t_state&TS_CARR_ON)==0)
                return (EIO);
-       return (iomove(&tp->t_rocount, sizeof tbposition, UIO_READ, uio));
+       tbpos = &(((struct tb *) (tp->T_LINEP))->tbpos);
+       return (uiomove(tbpos, sizeof *tbpos, UIO_READ, uio));
 }
 
 /*
 }
 
 /*
@@ -107,25 +117,24 @@ tbinput(c, tp)
        register int c;
        register struct tty *tp;
 {
        register int c;
        register struct tty *tp;
 {
+       register struct tb *tbp = (struct tb *) tp->T_LINEP;
 
        if (tp->t_line == TABLDISC) {
                if ((c&0200) || (tp->t_inbuf == MTABCHAR)) {
 
        if (tp->t_line == TABLDISC) {
                if ((c&0200) || (tp->t_inbuf == MTABCHAR)) {
-                       tp->t_cp = (char *) &tp->t_un.T_CTLQ;
+                       tp->t_cp = tbp->cbuf;
                        tp->t_inbuf = 0;
                }
                *tp->t_cp++ = c&0177;
                if (++tp->t_inbuf == MTABCHAR)
                        tp->t_inbuf = 0;
                }
                *tp->t_cp++ = c&0177;
                if (++tp->t_inbuf == MTABCHAR)
-                       tbdecode((char *) &tp->t_un.T_CTLQ,
-                               (struct tbposition *) &tp->t_rocount);
+                       tbdecode(tbp->cbuf, &tbp->tbpos);
        } else if (tp->t_line == NTABLDISC) {
                if ((c&0200) || (tp->t_inbuf == MNTABCHAR)) {
        } else if (tp->t_line == NTABLDISC) {
                if ((c&0200) || (tp->t_inbuf == MNTABCHAR)) {
-                       tp->t_cp = (char *) &tp->t_un.T_CTLQ;
+                       tp->t_cp = tbp->cbuf;
                        tp->t_inbuf = 0;
                }
                *tp->t_cp++ = c&0177;
                if (++tp->t_inbuf == MNTABCHAR)
                        tp->t_inbuf = 0;
                }
                *tp->t_cp++ = c&0177;
                if (++tp->t_inbuf == MNTABCHAR)
-                       tbndecode((char *) &tp->t_un.T_CTLQ,
-                                       (struct tbposition *) &tp->t_rocount);
+                       tbndecode(tbp->cbuf, &tbp->tbpos);
        }
 }
 
        }
 }
 
@@ -133,28 +142,28 @@ tbinput(c, tp)
  * Decode tablet coordinates from ascii to binary.
  *     (gtco 6 character format)
  */
  * Decode tablet coordinates from ascii to binary.
  *     (gtco 6 character format)
  */
-tbndecode(cp, tbposition)
+tbndecode(cp, tbpos)
        register char *cp;
        register char *cp;
-       register struct tbposition *tbposition;
+       register struct tbpos *tbpos;
 {
 
 {
 
-       tbposition->status = *cp>>2;    /* this needs to be decoded */
-       tbposition->xpos = ((*cp++)&03)<<14;
-       tbposition->xpos |= (*cp++)<<7;
-       tbposition->xpos |= (*cp++);
-       tbposition->ypos = ((*cp++)&03)<<14;
-       tbposition->ypos |= (*cp++)<<7;
-       tbposition->ypos |= (*cp++);
-       tbposition->scount++;
+       tbpos->status = *cp>>2; /* this needs to be decoded */
+       tbpos->xpos = ((*cp++)&03)<<14;
+       tbpos->xpos |= (*cp++)<<7;
+       tbpos->xpos |= (*cp++);
+       tbpos->ypos = ((*cp++)&03)<<14;
+       tbpos->ypos |= (*cp++)<<7;
+       tbpos->ypos |= (*cp++);
+       tbpos->scount++;
 }
 
 /*
  * Decode tablet coordinates from ascii to binary.
  *     (hitachi 5 character format)
  */
 }
 
 /*
  * Decode tablet coordinates from ascii to binary.
  *     (hitachi 5 character format)
  */
-tbdecode(cp, tbposition)
+tbdecode(cp, tbpos)
        register char *cp;
        register char *cp;
-       register struct tbposition *tbposition;
+       register struct tbpos *tbpos;
 {
        register int status;
        register char byte;
 {
        register int status;
        register char byte;
@@ -164,14 +173,14 @@ tbdecode(cp, tbposition)
        byte &= ~0100;
        if (byte > 036)
                status |= 1<<((byte-040)/2);
        byte &= ~0100;
        if (byte > 036)
                status |= 1<<((byte-040)/2);
-       tbposition->xpos = (*cp++)<<7;
-       tbposition->xpos |= (*cp++);
-       if (tbposition->xpos < 256)     /* tablet wraps around at 256 */
+       tbpos->xpos = (*cp++)<<7;
+       tbpos->xpos |= (*cp++);
+       if (tbpos->xpos < 256)          /* tablet wraps around at 256 */
                status &= 077777;       /* make it out of proximity */
                status &= 077777;       /* make it out of proximity */
-       tbposition->ypos = (*cp++)<<7;
-       tbposition->ypos |= (*cp++);
-       tbposition->status  = status;
-       tbposition->scount++;
+       tbpos->ypos = (*cp++)<<7;
+       tbpos->ypos |= (*cp++);
+       tbpos->status  = status;
+       tbpos->scount++;
 }
 
 /*
 }
 
 /*