don't overflow doing long writes on ptc (from thomas@utah-cs)
[unix-history] / usr / src / sys / kern / tty_subr.c
index 7558bf6..d584b5f 100644 (file)
@@ -1,4 +1,4 @@
-/*     tty_subr.c      4.11    81/04/17        */
+/*     tty_subr.c      6.1     83/07/29        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -13,7 +13,7 @@ char  cwaiting;
  * Character list get/put
  */
 getc(p)
  * Character list get/put
  */
 getc(p)
-register struct clist *p;
+       register struct clist *p;
 {
        register struct cblock *bp;
        register int c, s;
 {
        register struct cblock *bp;
        register int c, s;
@@ -54,13 +54,14 @@ register struct clist *p;
        return(c);
 }
 
        return(c);
 }
 
+#ifdef notdef
 /*
  * copy clist to buffer.
  * return number of bytes moved.
  */
 q_to_b(q, cp, cc)
 /*
  * copy clist to buffer.
  * return number of bytes moved.
  */
 q_to_b(q, cp, cc)
-register struct clist *q;
-register char *cp;
+       register struct clist *q;
+       register char *cp;
 {
        register struct cblock *bp;
        register int s;
 {
        register struct cblock *bp;
        register int s;
@@ -109,6 +110,7 @@ register char *cp;
        splx(s);
        return(cp-acp);
 }
        splx(s);
        return(cp-acp);
 }
+#endif
 
 /*
  * Return count of contiguous characters
 
 /*
  * Return count of contiguous characters
@@ -116,10 +118,10 @@ register char *cp;
  * Stop counting if flag&character is non-null.
  */
 ndqb(q, flag)
  * Stop counting if flag&character is non-null.
  */
 ndqb(q, flag)
-register struct clist *q;
+       register struct clist *q;
 {
 {
-register cc;
-int s;
+       register cc;
+       int s;
 
        s = spl5();
        if (q->c_cc <= 0) {
 
        s = spl5();
        if (q->c_cc <= 0) {
@@ -156,20 +158,15 @@ out:
  * Flush cc bytes from q.
  */
 ndflush(q, cc)
  * Flush cc bytes from q.
  */
 ndflush(q, cc)
-register struct clist *q;
-register cc;
+       register struct clist *q;
+       register cc;
 {
 {
-register struct cblock *bp;
-char *end;
-int rem;
-register s;
+       register struct cblock *bp;
+       char *end;
+       int rem, s;
 
        s = spl5();
 
        s = spl5();
-       if (q->c_cc < 0) {
-               printf("neg q flush\n");
-               goto out;
-       }
-       if (q->c_cc == 0) {
+       if (q->c_cc <= 0) {
                goto out;
        }
        while (cc>0 && q->c_cc) {
                goto out;
        }
        while (cc>0 && q->c_cc) {
@@ -216,7 +213,7 @@ out:
 
 
 putc(c, p)
 
 
 putc(c, p)
-register struct clist *p;
+       register struct clist *p;
 {
        register struct cblock *bp;
        register char *cp;
 {
        register struct cblock *bp;
        register char *cp;
@@ -258,9 +255,9 @@ register struct clist *p;
  * return number of bytes not transfered.
  */
 b_to_q(cp, cc, q)
  * return number of bytes not transfered.
  */
 b_to_q(cp, cc, q)
-register char *cp;
-struct clist *q;
-register int cc;
+       register char *cp;
+       struct clist *q;
+       register int cc;
 {
        register char *cq;
        register struct cblock *bp;
 {
        register char *cq;
        register struct cblock *bp;
@@ -312,8 +309,8 @@ out:
  */
 char *
 nextc(p, cp)
  */
 char *
 nextc(p, cp)
-register struct clist *p;
-register char *cp;
+       register struct clist *p;
+       register char *cp;
 {
 
        if (p->c_cc && ++cp != p->c_cl) {
 {
 
        if (p->c_cc && ++cp != p->c_cl) {
@@ -328,7 +325,7 @@ register char *cp;
  * Remove the last character in the list and return it.
  */
 unputc(p)
  * Remove the last character in the list and return it.
  */
 unputc(p)
-register struct clist *p;
+       register struct clist *p;
 {
        register struct cblock *bp;
        register int c, s;
 {
        register struct cblock *bp;
        register int c, s;
@@ -372,7 +369,7 @@ register struct clist *p;
  * SHOULD JUST USE q_to_b AND THEN b_to_q HERE.
  */
 catq(from, to)
  * SHOULD JUST USE q_to_b AND THEN b_to_q HERE.
  */
 catq(from, to)
-struct clist *from, *to;
+       struct clist *from, *to;
 {
        register c;
 
 {
        register c;
 
@@ -381,34 +378,46 @@ struct clist *from, *to;
 }
 
 /*
 }
 
 /*
- * integer (2-byte) get/put
+ * Integer (short) get/put
  * using clists
  */
  * using clists
  */
-#ifdef unneeded
+typedef        short word_t;
+union chword {
+       word_t  word;
+       struct {
+               char    Ch[sizeof (word_t)];
+       } Cha;
+#define        ch      Cha.Ch
+};
+
 getw(p)
 getw(p)
-register struct clist *p;
+       register struct clist *p;
 {
 {
-       register int s;
-
-       if (p->c_cc <= 1)
-               return(-1);
-       s = getc(p);
-       return(s | (getc(p)<<8));
+       register int i;
+       union chword x;
+
+       if (p->c_cc < sizeof (word_t))
+               return (-1);
+       for (i = 0; i < sizeof (word_t); i++)
+               x.ch[i] = getc(p);
+       return (x.word);
 }
 }
-#endif
 
 putw(c, p)
 
 putw(c, p)
-register struct clist *p;
+       register struct clist *p;
 {
        register s;
 {
        register s;
+       register int i;
+       union chword x;
 
        s = spl5();
        if (cfreelist==NULL) {
                splx(s);
                return(-1);
        }
 
        s = spl5();
        if (cfreelist==NULL) {
                splx(s);
                return(-1);
        }
-       (void) putc(c, p);
-       (void) putc(c>>8, p);
+       x.word = c;
+       for (i = 0; i < sizeof (word_t); i++)
+               (void) putc(x.ch[i], p);
        splx(s);
        splx(s);
-       return(0);
+       return (0);
 }
 }