BSD 4_4_Lite2 release
[unix-history] / usr / src / lib / libcurses / addbytes.c
index b93948b..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.
  *
  *
- * %sccs.include.redist.c%
+ * 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.5 (Berkeley) %G%";
+static char sccsid[] = "@(#)addbytes.c 8.4 (Berkeley) 5/4/94";
 #endif /* not lint */
 
 #endif /* not lint */
 
-#include <curses.h>
+#include "curses.h"
 
 
-#define        SYNCH_IN        {y = win->_cury; x = win->_curx;}
-#define        SYNCH_OUT       {win->_cury = y; win->_curx = x;}
+#define        SYNCH_IN        {y = win->cury; x = win->curx;}
+#define        SYNCH_OUT       {win->cury = y; win->curx = x;}
 
 /*
  * waddbytes --
  *     Add the character to the current position in the given window.
  */
 
 /*
  * waddbytes --
  *     Add the character to the current position in the given window.
  */
-waddbytes(win, bytes, count)
+int
+__waddbytes(win, bytes, count, so)
        register WINDOW *win;
        register WINDOW *win;
-       register char *bytes;
+       register const char *bytes;
        register int count;
        register int count;
+       int so;
 {
        static char blanks[] = "        ";
        register int c, newx, x, y;
 {
        static char blanks[] = "        ";
        register int c, newx, x, y;
+       char stand;
+       __LINE *lp;
 
        SYNCH_IN;
 
        SYNCH_IN;
+
 #ifdef DEBUG
 #ifdef DEBUG
-       __TRACE("ADDBYTES('%c') at (%d, %d)\n", c, y, x);
+       __CTRACE("ADDBYTES('%c') at (%d, %d)\n", c, y, x);
 #endif
        while (count--) {
                c = *bytes++;
                switch (c) {
                case '\t':
 #endif
        while (count--) {
                c = *bytes++;
                switch (c) {
                case '\t':
-                       SYNCH_IN;
+                       SYNCH_OUT;
                        if (waddbytes(win, blanks, 8 - (x % 8)) == ERR)
                                return (ERR);
                        if (waddbytes(win, blanks, 8 - (x % 8)) == ERR)
                                return (ERR);
-                       SYNCH_OUT;
+                       SYNCH_IN;
                        break;
 
                default:
 #ifdef DEBUG
                        break;
 
                default:
 #ifdef DEBUG
-       __TRACE("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 DEBUG
-       __TRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x);
+       __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x);
 #endif
 #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 __TRACE
-       __TRACE("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) {
+                       
+                       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;
                                                SYNCH_OUT;
                                                scroll(win);
                                                SYNCH_IN;
-                                               --y;
+                                               lp = win->lines[y];
+                                               x = 0;
                                        } else
                                                return (ERR);
                                        } 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
 #ifdef DEBUG
-       __TRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n",
-           y, x, win->_firstch[y], win->_lastch[y]);
+       __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':
 #endif
                        break;
                case '\n':