BSD 4_4_Lite2 release
[unix-history] / usr / src / lib / libcurses / addbytes.c
index a7f58e8..6dd8bf9 100644 (file)
 /*
 /*
- * Copyright (c) 1987 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1987, 1993, 1994
+ *     The Regents of the University of California.  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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)addbytes.c 5.2 (Berkeley) %G%";
-#endif /* not lint */
+static char sccsid[] = "@(#)addbytes.c 8.4 (Berkeley) 5/4/94";
+#endif /* not lint */
+
+#include "curses.h"
 
 
-# include      "curses.ext"
+#define        SYNCH_IN        {y = win->cury; x = win->curx;}
+#define        SYNCH_OUT       {win->cury = y; win->curx = x;}
 
 /*
 
 /*
- *     This routine adds the character to the current position
- *
+ * waddbytes --
+ *     Add the character to the current position in the given window.
  */
  */
-waddbytes(win, bytes, count)
-reg WINDOW     *win;
-reg char       *bytes;
-reg int                count;
+int
+__waddbytes(win, bytes, count, so)
+       register WINDOW *win;
+       register const char *bytes;
+       register int count;
+       int so;
 {
 {
-#define        SYNCH_OUT()     {win->_cury = y; win->_curx = x;}
-#define        SYNCH_IN()      {y = win->_cury; x = win->_curx;}
-       reg int         x, y;
-       reg int         newx;
+       static char blanks[] = "        ";
+       register int c, newx, x, y;
+       char stand;
+       __LINE *lp;
 
 
-       SYNCH_IN();
-# ifdef FULLDEBUG
-       fprintf(outf, "ADDBYTES('%c') at (%d, %d)\n", c, y, x);
-# endif
-       while (count--) {
-           register int c;
-           static char blanks[] = "        ";
+       SYNCH_IN;
 
 
-           c = *bytes++;
-           switch (c) {
-             case '\t':
-                   SYNCH_IN();
-                   if (waddbytes(win, blanks, 8-(x%8)) == ERR) {
-                       return ERR;
-                   }
-                   SYNCH_OUT();
-                   break;
+#ifdef DEBUG
+       __CTRACE("ADDBYTES('%c') at (%d, %d)\n", c, y, x);
+#endif
+       while (count--) {
+               c = *bytes++;
+               switch (c) {
+               case '\t':
+                       SYNCH_OUT;
+                       if (waddbytes(win, blanks, 8 - (x % 8)) == ERR)
+                               return (ERR);
+                       SYNCH_IN;
+                       break;
 
 
-             default:
-# ifdef FULLDEBUG
-                   fprintf(outf, "ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
-# endif
-                   if (win->_flags & _STANDOUT)
-                           c |= _STANDOUT;
-                   {
-# ifdef        FULLDEBUG
-                           fprintf(outf, "ADDBYTES(%0.2o, %d, %d)\n", win, y, x);
-# endif
-                           if (win->_y[y][x] != c) {
-                                   newx = x + win->_ch_off;
-                                   if (win->_firstch[y] == _NOCHANGE) {
-                                           win->_firstch[y] =
-                                                           win->_lastch[y] = newx;
-                                   } else if (newx < win->_firstch[y])
-                                           win->_firstch[y] = newx;
-                                   else if (newx > win->_lastch[y])
-                                           win->_lastch[y] = newx;
-# ifdef FULLDEBUG
-                                   fprintf(outf, "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n",
-                                           win->_firstch[y], win->_lastch[y],
-                                           win->_firstch[y] - win->_ch_off,
-                                           win->_lastch[y] - win->_ch_off);
-# endif
-                           }
-                   }
-                   win->_y[y][x++] = c;
-                   if (x >= win->_maxx) {
-                           x = 0;
-    newline:
-                           if (++y >= win->_maxy)
-                                   if (win->_scroll) {
-                                           SYNCH_OUT();
-                                           scroll(win);
-                                           SYNCH_IN();
-                                           --y;
-                                   }
-                                   else
-                                           return ERR;
-                   }
-# ifdef FULLDEBUG
-                   fprintf(outf, "ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
-# endif
-                   break;
-             case '\n':
-                   SYNCH_OUT();
-                   wclrtoeol(win);
-                   SYNCH_IN();
-                   if (!NONL)
-                           x = 0;
-                   goto newline;
-             case '\r':
-                   x = 0;
-                   break;
-             case '\b':
-                   if (--x < 0)
-                           x = 0;
-                   break;
-           }
-    }
-    SYNCH_OUT();
-    return OK;
+               default:
+#ifdef DEBUG
+       __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x);
+#endif
+                       
+                       lp = win->lines[y];
+                       if (lp->flags & __ISPASTEOL) {
+                               lp->flags &= ~__ISPASTEOL;
+newline:                       if (y == win->maxy - 1) {
+                                       if (win->flags & __SCROLLOK) {
+                                               SYNCH_OUT;
+                                               scroll(win);
+                                               SYNCH_IN;
+                                               lp = win->lines[y];
+                                               x = 0;
+                                       } else
+                                               return (ERR);
+                               } else {
+                                       y++;
+                                       lp = win->lines[y];
+                                       x = 0;
+                               }
+                               if (c == '\n')
+                                       break;
+                       }
+                               
+                       stand = '\0';
+                       if (win->flags & __WSTANDOUT || so)
+                               stand |= __STANDOUT;
+#ifdef DEBUG
+       __CTRACE("ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n",
+           y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp);
+#endif
+                       if (lp->line[x].ch != c || 
+                           !(lp->line[x].attr & stand)) {
+                               newx = x + win->ch_off;
+                               if (!(lp->flags & __ISDIRTY)) {
+                                       lp->flags |= __ISDIRTY;
+                                       *lp->firstchp = *lp->lastchp = newx;
+                               }
+                               else if (newx < *lp->firstchp)
+                                       *lp->firstchp = newx;
+                               else if (newx > *lp->lastchp)
+                                       *lp->lastchp = newx;
+#ifdef DEBUG
+       __CTRACE("ADDBYTES: change gives f/l: %d/%d [%d/%d]\n",
+           *lp->firstchp, *lp->lastchp,
+           *lp->firstchp - win->ch_off,
+           *lp->lastchp - win->ch_off);
+#endif
+                       }
+                       lp->line[x].ch = c;
+                       if (stand)
+                               lp->line[x].attr |= __STANDOUT;
+                       else
+                               lp->line[x].attr &= ~__STANDOUT;
+                       if (x == win->maxx - 1)
+                               lp->flags |= __ISPASTEOL;
+                       else
+                               x++;
+#ifdef DEBUG
+       __CTRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n",
+           y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp);
+#endif
+                       break;
+               case '\n':
+                       SYNCH_OUT;
+                       wclrtoeol(win);
+                       SYNCH_IN;
+                       if (!NONL)
+                               x = 0;
+                       goto newline;
+               case '\r':
+                       x = 0;
+                       break;
+               case '\b':
+                       if (--x < 0)
+                               x = 0;
+                       break;
+               }
+       }
+       SYNCH_OUT;
+       return (OK);
 }
 }