BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / tn3270 / sys_curses / termout.c
index 5f47b8b..0accd56 100644 (file)
@@ -3,15 +3,20 @@
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of California at Berkeley. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission. This software
- * is provided ``as is'' without express or implied warranty.
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)termout.c  3.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)termout.c  4.2 (Berkeley) 5/30/89";
 #endif /* not lint */
 
 #if defined(unix)
 #endif /* not lint */
 
 #if defined(unix)
@@ -33,22 +38,18 @@ static char sccsid[] = "@(#)termout.c       3.6 (Berkeley) %G%";
 
 #include "terminal.h"
 
 
 #include "terminal.h"
 
-#include "../telnet.ext"
-
 #include "../api/disp_asc.h"
 
 #include "../ctlr/hostctlr.h"
 #include "../api/disp_asc.h"
 
 #include "../ctlr/hostctlr.h"
-#include "../ctlr/inbound.ext"
+#include "../ctlr/externs.h"
+#include "../ctlr/declare.h"
 #include "../ctlr/oia.h"
 #include "../ctlr/oia.h"
-#include "../ctlr/options.ext"
-#include "../ctlr/outbound.ext"
 #include "../ctlr/screen.h"
 #include "../ctlr/screen.h"
-
-#include "../ascii/map3270.ext"
+#include "../ctlr/scrnctlr.h"
 
 #include "../general/globals.h"
 
 
 #include "../general/globals.h"
 
-extern void EmptyTerminal();
+#include "../telextrn.h"
 
 #define CorrectTerminalCursor() ((TransparentClock == OutputClock)? \
                CursorAddress:UnLocked? CursorAddress: HighestScreen())
 
 #define CorrectTerminalCursor() ((TransparentClock == OutputClock)? \
                CursorAddress:UnLocked? CursorAddress: HighestScreen())
@@ -101,8 +102,7 @@ init_screen()
 /* OurExitString - designed to keep us from going through infinite recursion */
 
 static void
 /* OurExitString - designed to keep us from going through infinite recursion */
 
 static void
-OurExitString(file, string, value)
-FILE   *file;
+OurExitString(string, value)
 char   *string;
 int    value;
 {
 char   *string;
 int    value;
 {
@@ -110,7 +110,7 @@ int value;
 
     if (!recursion) {
        recursion = 1;
 
     if (!recursion) {
        recursion = 1;
-       ExitString(file, string, value);
+       ExitString(string, value);
     }
 }
 
     }
 }
 
@@ -121,7 +121,7 @@ static void
 DoARefresh()
 {
     if (ERR == refresh()) {
 DoARefresh()
 {
     if (ERR == refresh()) {
-       OurExitString(stderr, "ERR from refresh\n", 1);
+       OurExitString("ERR from refresh\n", 1);
     }
 }
 
     }
 }
 
@@ -134,7 +134,7 @@ int where;          /* cursor address */
 
        sprintf(foo, "ERR from %s at %d (%d, %d)\n",
                from, where, ScreenLine(where), ScreenLineOffset(where));
 
        sprintf(foo, "ERR from %s at %d (%d, %d)\n",
                from, where, ScreenLine(where), ScreenLineOffset(where));
-       OurExitString(stderr, foo, 1);
+       OurExitString(foo, 1);
        /* NOTREACHED */
 }
 \f
        /* NOTREACHED */
 }
 \f
@@ -183,15 +183,34 @@ static void
 #endif /* defined(NOT43) */
 SlowScreen()
 {
 #endif /* defined(NOT43) */
 SlowScreen()
 {
+    register int is, shouldbe, isattr, shouldattr;
     register int pointer;
     register int pointer;
-    register int c;
-    register int fieldattr;
+    register int fieldattr, termattr;
     register int columnsleft;
 
     register int columnsleft;
 
-#   define  SetHighlightMode(p) { \
-               if (!IsStartField(p) && IsHighlightedAttr(fieldattr)) { \
+#define        NORMAL          0               
+#define        HIGHLIGHT       1               /* Mask bits */
+#define        NONDISPLAY      4               /* Mask bits */
+#define        UNDETERMINED    8               /* Mask bits */
+
+#define        DoAttributes(x) \
+           switch (x&ATTR_DSPD_MASK) { \
+           case ATTR_DSPD_NONDISPLAY: \
+               x = NONDISPLAY; \
+               break; \
+           case ATTR_DSPD_HIGH: \
+               x = HIGHLIGHT; \
+               break; \
+           default: \
+               x = 0; \
+               break; \
+           }
+
+#   define  SetHighlightMode(x) \
+           { \
+               if ((x)&HIGHLIGHT) { \
                    if (!inHighlightMode) { \
                    if (!inHighlightMode) { \
-                       inHighlightMode = 1; \
+                       inHighlightMode = HIGHLIGHT; \
                        standout(); \
                    } \
                } else { \
                        standout(); \
                    } \
                } else { \
@@ -203,10 +222,8 @@ SlowScreen()
            }
 
 #   define  DoCharacterAt(c,p) { \
            }
 
 #   define  DoCharacterAt(c,p) { \
-               SetTerminal(p, c); \
                if (p != HighestScreen()) { \
                if (p != HighestScreen()) { \
-                   c = TerminalCharacterAttr(disp_asc[c&0xff], p, \
-                                                               fieldattr); \
+                   c = disp_asc[c&0xff]; \
                    if (terminalCursorAddress != p) { \
                        if (ERR == mvaddch(ScreenLine(p), \
                                                ScreenLineOffset(p), c)) {\
                    if (terminalCursorAddress != p) { \
                        if (ERR == mvaddch(ScreenLine(p), \
                                                ScreenLineOffset(p), c)) {\
@@ -272,7 +289,8 @@ SlowScreen()
            pointer += (bunequal(Host+pointer, Terminal+pointer,
                        (Highest-pointer+1)*sizeof Host[0])/sizeof Host[0]);
 
            pointer += (bunequal(Host+pointer, Terminal+pointer,
                        (Highest-pointer+1)*sizeof Host[0])/sizeof Host[0]);
 
-               /* how many characters to change until the end of the
+               /*
+                * How many characters to change until the end of the
                 * current line
                 */
            columnsleft = NumberColumns - ScreenLineOffset(pointer);
                 * current line
                 */
            columnsleft = NumberColumns - ScreenLineOffset(pointer);
@@ -282,137 +300,131 @@ SlowScreen()
            move(ScreenLine(pointer), ScreenLineOffset(pointer));
 
                /* what is the field attribute of the current position */
            move(ScreenLine(pointer), ScreenLineOffset(pointer));
 
                /* what is the field attribute of the current position */
-           fieldattr = FieldAttributes(WhereAttrByte(pointer));
+           if (FormattedScreen()) {
+               fieldattr = FieldAttributes(pointer);
+               DoAttributes(fieldattr);
+           } else {
+               fieldattr = NORMAL;
+           }
+           if (TerminalFormattedScreen()) {
+               termattr = TermAttributes(pointer);
+               DoAttributes(termattr);
+           } else {
+               termattr = NORMAL;
+           }
 
 
-           if ((IsStartField(pointer) != TermIsStartField(pointer)) ||
-                   (IsStartField(pointer) &&
-                       fieldattr != TermAttributes(pointer))) {
+           SetHighlightMode(fieldattr);
+           /*
+            * The following will terminate at least when we get back
+            * to the original 'pointer' location (since we force
+            * things to be equal).
+            */
+           for (;;) {
+               if (IsStartField(pointer)) {
+                   shouldbe = DISP_BLANK;
+                   shouldattr = 0;
+                   fieldattr = GetHost(pointer);
+                   DoAttributes(fieldattr);
+               } else {
+                   if (fieldattr&NONDISPLAY) {
+                       shouldbe = DISP_BLANK;
+                   } else {
+                       shouldbe = GetHost(pointer);
+                   }
+                   shouldattr = fieldattr;
+               }
+               if (TermIsStartField(pointer)) {
+                   is = DISP_BLANK;
+                   isattr = 0;
+                   termattr = UNDETERMINED; /* Need to find out AFTER update */
+               } else {
+                   if (termattr&NONDISPLAY) {
+                       is = DISP_BLANK;
+                   } else {
+                       is = GetTerminal(pointer);
+                   }
+                   isattr = termattr;
+               }
+               if ((shouldbe == is) && (shouldattr == isattr)
+                       && (GetHost(pointer) == GetTerminal(pointer))
+                       && (GetHost(ScreenInc(pointer))
+                                       == GetTerminal(ScreenInc(pointer)))) {
+                   break;
+               }
 
 
-               int oldterm;
+               if (shouldattr^inHighlightMode) {
+                   SetHighlightMode(shouldattr);
+               }
 
 
-               oldterm = TermAttributes(pointer);
+               DoCharacterAt(shouldbe, pointer);
                if (IsStartField(pointer)) {
                if (IsStartField(pointer)) {
-                   TermNewField(pointer, fieldattr);
-                   SetTerminal(pointer, 0);
+                   TermNewField(pointer, FieldAttributes(pointer));
+                   termattr = GetTerminal(pointer);
+                   DoAttributes(termattr);
                } else {
                } else {
-                   TermDeleteField(pointer);
-               }
-                   /* We always do the first character in a divergent
-                    * field, since otherwise the start of a field in
-                    * the Host structure may leave a highlighted blank
-                    * on the screen, and the start of a field in the
-                    * Terminal structure may leave a non-highlighted
-                    * something in the middle of a highlighted field
-                    * on the screen.
+                   SetTerminal(pointer, GetHost(pointer));
+                   /*
+                    * If this USED to be a start field location,
+                    * recompute the terminal attributes.
                     */
                     */
-               SetHighlightMode(pointer);
-               c = GetHost(pointer);
-               DoCharacterAt(c,pointer);               /* MACRO */
-
-               if (NotVisuallyCompatibleAttributes
-                               (pointer, fieldattr, oldterm)) {
-                   int j;
-
-                   j = pointer;
-
-                   pointer = ScreenInc(pointer);
-                   if (!(--columnsleft)) {
-                       DoARefresh();
-                       EmptyTerminal();
-                       move(ScreenLine(pointer), 0);
-                       columnsleft = NumberColumns;
-                   }
-                   SetHighlightMode(pointer);  /* Turn on highlighting */
-                   while ((!IsStartField(pointer)) &&
-                               (!TermIsStartField(pointer))) {
-                       c = GetHost(pointer);
-                       DoCharacterAt(c,pointer);       /* MACRO */
-                       pointer = ScreenInc(pointer);
-                       if (!(--columnsleft)) {
-                           DoARefresh();
-                           EmptyTerminal();
-                           move(ScreenLine(pointer), 0);
-                           columnsleft = NumberColumns;
-                               /* We don't look at HaveInput here, since
-                                * if we leave this loop before the end of
-                                * the 3270 field, we could have pointer
-                                * higher than Highest.  This would cause
-                                * us to end the highest "while" loop,
-                                * but we may, in fact, need to go around the
-                                * screen once again.
-                                */
-                       }
-                       /*              The loop needs to be protected
-                        *      from the situation where there had been only
-                        *      one field on the Terminal, and none on the Host.
-                        *      In this case, we have just deleted our last
-                        *      field.  Hence, the break.
-                        */
-                       if (j == pointer) {
-                           break;
+                   if (termattr == UNDETERMINED) {
+                       termattr = WhereTermAttrByte(pointer);
+                       if ((termattr != 0) || TermIsStartField(0)) {
+                           termattr = GetTerminal(termattr);
+                           DoAttributes(termattr);
+                       } else {        /* Unformatted screen */
+                           termattr = NORMAL;
                        }
                    }
                        }
                    }
-                   if (IsStartField(pointer) && !TermIsStartField(pointer)) {
-                           /* Remember what the terminal looked like */
-                       TermNewField(pointer, oldterm);
-                           /*
-                            * The danger here is that the current position may
-                            * be the start of a Host field.  If so, and the
-                            * field is highlighted, and our terminal was
-                            * highlighted, then we will leave a highlighted
-                            * blank at this position.
-                            */
-                       SetHighlightMode(pointer);
-                       c = GetHost(pointer);
-                       DoCharacterAt(c,pointer);
-                   }
-                       /* We could be in the situation of needing to exit.
-                        * This could happen if the current field wrapped around
-                        * the end of the screen.
-                        */
-                   if (j > pointer) {
+               }
+               pointer = ScreenInc(pointer);
+               if (!(--columnsleft)) {
+                   DoARefresh();
+                   EmptyTerminal();
+                   if (HaveInput) {    /* if input came in, take it */
+                       int c, j;
+
                        /*
                        /*
-                        * pointer is guaranteed to be higher than Highest...
-                        */
-                       pointer = Highest+1;    /* We did the highest thing */
-                       break;
-                   }
-               } else {
-                   c = GetHost(pointer);
-                       /* We always do the first character in a divergent
-                        * field, since otherwise the start of a field in
-                        * the Host structure may leave a highlighted blank
-                        * on the screen, and the start of a field in the
-                        * Terminal structure may leave a non-highlighted
-                        * something in the middle of a highlighted field
-                        * on the screen.
+                        * We need to start a new terminal field
+                        * at this location iff the terminal attributes
+                        * of this location are not what we have had
+                        * them as (ie: we've overwritten the terminal
+                        * start field, a the previous field had different
+                        * display characteristics).
                         */
                         */
-                   SetHighlightMode(pointer);
-                   DoCharacterAt(c,pointer);
-               }
-           } else {
-               SetHighlightMode(pointer);
-               /*
-                * The following will terminate at least when we get back
-                * to the original 'pointer' location (since we force
-                * things to be equal).
-                */
-               while (((c = GetHost(pointer)) != GetTerminal(pointer)) &&
-                       !IsStartField(pointer) && !TermIsStartField(pointer)) {
-                   DoCharacterAt(c, pointer);
-                   pointer = ScreenInc(pointer);
-                   if (!(--columnsleft)) {
-                       DoARefresh();
-                       EmptyTerminal();
-                       if (HaveInput) {        /* if input came in, take it */
-                           break;
+
+                       isattr = TermAttributes(pointer);
+                       DoAttributes(isattr);
+                       if ((!TermIsStartField(pointer)) &&
+                                       (isattr != termattr)) {
+                           /*
+                            * Since we are going to leave a new field
+                            * at this terminal position, we
+                            * need to make sure that we get an actual
+                            * non-highlighted blank on the screen.
+                            */
+                           if ((is != DISP_BLANK) || (termattr&HIGHLIGHT)) {
+                               SetHighlightMode(0);    /* Turn off highlight */
+                               c = ScreenInc(pointer);
+                               j = DISP_BLANK;
+                               DoCharacterAt(j, c);
+                           }
+                           if (termattr&HIGHLIGHT) {
+                               termattr = ATTR_DSPD_HIGH;
+                           } else if (termattr&NONDISPLAY) {
+                               termattr = ATTR_DSPD_NONDISPLAY;
+                           } else {
+                               termattr = 0;
+                           }
+                           TermNewField(pointer, termattr);
                        }
                        }
-                       move(ScreenLine(pointer), 0);
-                       columnsleft = NumberColumns;
+                       break;
                    }
                    }
+                   move(ScreenLine(pointer), 0);
+                   columnsleft = NumberColumns;
                }
                }
-           }
-       }
+           }   /* end of for (;;) */
+       } /* end of while (...) */
     }
     DoARefresh();
     Lowest = pointer;
     }
     DoARefresh();
     Lowest = pointer;
@@ -490,7 +502,7 @@ FastScreen()
                return;
            } else if (fieldattr) {     /* Should we display? */
                            /* Display translated data */
                return;
            } else if (fieldattr) {     /* Should we display? */
                            /* Display translated data */
-               addch(disp_asc[GetTerminalPointer(p)]);
+               addch((char)disp_asc[GetTerminalPointer(p)]);
            } else {
                addch(' ');                     /* Display a blank */
            }
            } else {
                addch(' ');                     /* Display a blank */
            }
@@ -522,13 +534,14 @@ FastScreen()
            if (IsStartFieldPointer(p)) {       /* New field? */
                if (tmp != tmpbuf) {
                    *tmp++ = 0;                 /* close out */
            if (IsStartFieldPointer(p)) {       /* New field? */
                if (tmp != tmpbuf) {
                    *tmp++ = 0;                 /* close out */
-                   addstr(tmpbuf);
+                   addstr((char *)tmpbuf);
                    tmp = tmpbuf;
                    tmp = tmpbuf;
-                   tmpend = tmpbuf + NumberColumns - ScreenLineOffset(p-Host);
+                   tmpend = tmpbuf+NumberColumns-ScreenLineOffset(p-Host)-1;
                }
                }
+               standend();
+               addch(' ');
                fieldattr = FieldAttributesPointer(p);  /* Get attributes */
                DoAttribute(fieldattr); /* Set standout, non-display */
                fieldattr = FieldAttributesPointer(p);  /* Get attributes */
                DoAttribute(fieldattr); /* Set standout, non-display */
-               *tmp++ = ' ';
            } else {
                if (fieldattr) {        /* Should we display? */
                                /* Display translated data */
            } else {
                if (fieldattr) {        /* Should we display? */
                                /* Display translated data */
@@ -547,7 +560,7 @@ FastScreen()
                int i = p-Host;         /* Be sure the "p++" happened first! */
 
                *tmp++ = 0;
                int i = p-Host;         /* Be sure the "p++" happened first! */
 
                *tmp++ = 0;
-               addstr(tmpbuf);
+               addstr((char *)tmpbuf);
                tmp = tmpbuf;
                move(ScreenLine(i), 0);
                tmpend = tmpbuf + NumberColumns;
                tmp = tmpbuf;
                move(ScreenLine(i), 0);
                tmpend = tmpbuf + NumberColumns;
@@ -555,7 +568,7 @@ FastScreen()
        }
        if (tmp != tmpbuf) {
            *tmp++ = 0;
        }
        if (tmp != tmpbuf) {
            *tmp++ = 0;
-           addstr(tmpbuf);
+           addstr((char *)tmpbuf);
            tmp = tmpbuf;
        }
     }
            tmp = tmpbuf;
        }
     }
@@ -585,6 +598,7 @@ void
 #endif /* defined(NOT43) */
        (*TryToSend)() = FastScreen;
 \f
 #endif /* defined(NOT43) */
        (*TryToSend)() = FastScreen;
 \f
+/*ARGSUSED*/
 void
 ScreenOIA(oia)
 OIA *oia;
 void
 ScreenOIA(oia)
 OIA *oia;
@@ -602,6 +616,7 @@ InitTerminal()
     static int speeds[] = { 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800,
                2400, 4800, 9600 };
 #endif
     static int speeds[] = { 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800,
                2400, 4800, 9600 };
 #endif
+    extern void InitMapping();
     
     InitMapping();             /* Go do mapping file (MAP3270) first */
     if (!screenInitd) {        /* not initialized */
     
     InitMapping();             /* Go do mapping file (MAP3270) first */
     if (!screenInitd) {        /* not initialized */
@@ -732,6 +747,8 @@ ConnectScreen()
 void
 LocalClearScreen()
 {
 void
 LocalClearScreen()
 {
+    extern void Clear3270();
+
     outputPurge();             /* flush all data to terminal */
     clear();                   /* clear in curses */
     ClearArray(Terminal);
     outputPurge();             /* flush all data to terminal */
     clear();                   /* clear in curses */
     ClearArray(Terminal);
@@ -766,22 +783,22 @@ char *s;
            len = COLS-2;
        }
        if ((bellwin = newwin(3, len+2, LINES/2, 0)) == NULL) {
            len = COLS-2;
        }
        if ((bellwin = newwin(3, len+2, LINES/2, 0)) == NULL) {
-           OurExitString(stderr, "Error from newwin in RingBell", 1);
+           OurExitString("Error from newwin in RingBell", 1);
        }
        werase(bellwin);
        wstandout(bellwin);
        box(bellwin, '|', '-');
        if (wmove(bellwin, 1, 1) == ERR) {
        }
        werase(bellwin);
        wstandout(bellwin);
        box(bellwin, '|', '-');
        if (wmove(bellwin, 1, 1) == ERR) {
-           OurExitString(stderr, "Error from wmove in RingBell", 1);
+           OurExitString("Error from wmove in RingBell", 1);
        }
        while (len--) {
            if (waddch(bellwin, *s++) == ERR) {
        }
        while (len--) {
            if (waddch(bellwin, *s++) == ERR) {
-               OurExitString(stderr, "Error from waddch in RingBell", 1);
+               OurExitString("Error from waddch in RingBell", 1);
            }
        }
        wstandend(bellwin);
        if (wrefresh(bellwin) == ERR) {
            }
        }
        wstandend(bellwin);
        if (wrefresh(bellwin) == ERR) {
-           OurExitString(stderr, "Error from wrefresh in RingBell", 1);
+           OurExitString("Error from wrefresh in RingBell", 1);
        }
        bellwinup = 1;
     }
        }
        bellwinup = 1;
     }
@@ -845,7 +862,7 @@ int         control;        /* To see if we are done */
 {
 #if    defined(unix)
     extern char *transcom;
 {
 #if    defined(unix)
     extern char *transcom;
-    int inpipefd[2], outpipefd[2], savemode;
+    int inpipefd[2], outpipefd[2];
     void aborttc();
 #endif /* defined(unix) */
 
     void aborttc();
 #endif /* defined(unix) */
 
@@ -887,7 +904,7 @@ int         control;        /* To see if we are done */
             setcommandmode();
             tin = inpipefd[0];
             tout = outpipefd[1];
             setcommandmode();
             tin = inpipefd[0];
             tout = outpipefd[1];
-            (void) signal(SIGCHLD, aborttc);
+            (void) signal(SIGCHLD, (int (*)())aborttc);
             setconnmode();
             tcflag = 1;
             break;
             setconnmode();
             tcflag = 1;
             break;
@@ -897,10 +914,12 @@ int               control;        /* To see if we are done */
        }
     }
 #endif /* defined(unix) */
        }
     }
 #endif /* defined(unix) */
-    (void) DataToTerminal(buffer, count);
+    (void) DataToTerminal((char *)buffer, count);
     if (control && (kind == 0)) {              /* Send in AID byte */
        SendToIBM();
     } else {
     if (control && (kind == 0)) {              /* Send in AID byte */
        SendToIBM();
     } else {
+       extern void TransInput();
+
        TransInput(1, kind);                    /* Go get some data */
     }
 }
        TransInput(1, kind);                    /* Go get some data */
     }
 }
@@ -910,8 +929,6 @@ int         control;        /* To see if we are done */
 static void
 aborttc()
 {
 static void
 aborttc()
 {
-       int savemode;
-
        setcommandmode();
        (void) close(tin);
        (void) close(tout);
        setcommandmode();
        (void) close(tin);
        (void) close(tout);