ncurses 5.6 - patch 20080920
[ncurses.git] / ncurses / tty / hardscroll.c
index b80d08aa5467764cf5fe0a6d0dd30e7a243d0d10..2c40997fb6b1c090f5932458b2e72736f61d1b78 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998 Free Software Foundation, Inc.                        *
+ * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
 /****************************************************************************
  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
+ *     and: Alexander V Lukyanov                    1997-1998               *
  ****************************************************************************/
 
-
 /******************************************************************************
 
 NAME
@@ -146,53 +147,58 @@ AUTHOR
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: hardscroll.c,v 1.33 1999/02/27 20:01:29 tom Exp $")
+MODULE_ID("$Id: hardscroll.c,v 1.42 2008/08/03 23:49:30 tom Exp $")
 
 #if defined(SCROLLDEBUG) || defined(HASHDEBUG)
 
 # undef screen_lines
 # define screen_lines MAXLINES
-int oldnums[MAXLINES];
+NCURSES_EXPORT_VAR(int)
+oldnums[MAXLINES];
 # define OLDNUM(n)     oldnums[n]
 # define _tracef       printf
 # undef TR
 # define TR(n, a)      if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); }
 
+extern NCURSES_EXPORT_VAR(unsigned) _nc_tracing;
+
 #else /* no debug */
 
 /* OLDNUM(n) indicates which line will be shifted to the position n.
    if OLDNUM(n) == _NEWINDEX, then the line n in new, not shifted from
    somewhere. */
+NCURSES_EXPORT_VAR(int *)
+_nc_oldnums = 0;               /* obsolete: keep for ABI compat */
+
 # if USE_HASHMAP
-int *_nc_oldnums = 0;
-static int oldnums_allocated = 0;
-#  define oldnums       _nc_oldnums
+#  define oldnums       SP->_oldnum_list
 #  define OLDNUM(n)    oldnums[n]
-# else /* !USE_HASHMAP */
+# else                         /* !USE_HASHMAP */
 #  define OLDNUM(n)    newscr->_line[n].oldindex
-# endif /* !USE_HASHMAP */
+# endif                                /* !USE_HASHMAP */
 
-#endif /* defined(SCROLLDEBUG) || defined(HASHDEBUG) */
+#define OLDNUM_SIZE     SP->_oldnum_size
 
+#endif /* defined(SCROLLDEBUG) || defined(HASHDEBUG) */
 
-void _nc_scroll_optimize(void)
+NCURSES_EXPORT(void)
+_nc_scroll_optimize(void)
 /* scroll optimization to transform curscr to newscr */
 {
     int i;
     int start, end, shift;
 
-    TR(TRACE_ICALLS, ("_nc_scroll_optimize() begins"));
+    TR(TRACE_ICALLS, (T_CALLED("_nc_scroll_optimize")));
 
 #if !defined(SCROLLDEBUG) && !defined(HASHDEBUG)
 #if USE_HASHMAP
     /* get enough storage */
-    if (oldnums_allocated < screen_lines)
-    {
+    if (OLDNUM_SIZE < screen_lines) {
        int *new_oldnums = typeRealloc(int, screen_lines, oldnums);
        if (!new_oldnums)
            return;
        oldnums = new_oldnums;
-       oldnums_allocated = screen_lines;
+       OLDNUM_SIZE = screen_lines;
     }
     /* calculate the indices */
     _nc_hash_map();
@@ -200,30 +206,31 @@ void _nc_scroll_optimize(void)
 #endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */
 
 #ifdef TRACE
-    if (_nc_tracing & (TRACE_UPDATE | TRACE_MOVE))
+    if (USE_TRACEF(TRACE_UPDATE | TRACE_MOVE)) {
        _nc_linedump();
+       _nc_unlock_global(tracef);
+    }
 #endif /* TRACE */
 
     /* pass 1 - from top to bottom scrolling up */
-    for (i = 0; i < screen_lines; )
-    {
+    for (i = 0; i < screen_lines;) {
        while (i < screen_lines && (OLDNUM(i) == _NEWINDEX || OLDNUM(i) <= i))
            i++;
        if (i >= screen_lines)
            break;
 
-       shift = OLDNUM(i) - i; /* shift > 0 */
+       shift = OLDNUM(i) - i;  /* shift > 0 */
        start = i;
 
        i++;
-       while (i < screen_lines && OLDNUM(i) != _NEWINDEX && OLDNUM(i) - i == shift)
+       while (i < screen_lines && OLDNUM(i) != _NEWINDEX && OLDNUM(i) - i
+              == shift)
            i++;
-       end = i-1 + shift;
+       end = i - 1 + shift;
 
        TR(TRACE_UPDATE | TRACE_MOVE, ("scroll [%d, %d] by %d", start, end, shift));
 #if !defined(SCROLLDEBUG) && !defined(HASHDEBUG)
-       if (_nc_scrolln(shift, start, end, screen_lines - 1) == ERR)
-       {
+       if (_nc_scrolln(shift, start, end, screen_lines - 1) == ERR) {
            TR(TRACE_UPDATE | TRACE_MOVE, ("unable to scroll"));
            continue;
        }
@@ -231,81 +238,74 @@ void _nc_scroll_optimize(void)
     }
 
     /* pass 2 - from bottom to top scrolling down */
-    for (i = screen_lines-1; i >= 0; )
-    {
+    for (i = screen_lines - 1; i >= 0;) {
        while (i >= 0 && (OLDNUM(i) == _NEWINDEX || OLDNUM(i) >= i))
            i--;
        if (i < 0)
            break;
 
-       shift = OLDNUM(i) - i; /* shift < 0 */
+       shift = OLDNUM(i) - i;  /* shift < 0 */
        end = i;
 
        i--;
        while (i >= 0 && OLDNUM(i) != _NEWINDEX && OLDNUM(i) - i == shift)
            i--;
-       start = i+1 - (-shift);
+       start = i + 1 - (-shift);
 
        TR(TRACE_UPDATE | TRACE_MOVE, ("scroll [%d, %d] by %d", start, end, shift));
 #if !defined(SCROLLDEBUG) && !defined(HASHDEBUG)
-       if (_nc_scrolln(shift, start, end, screen_lines - 1) == ERR)
-       {
+       if (_nc_scrolln(shift, start, end, screen_lines - 1) == ERR) {
            TR(TRACE_UPDATE | TRACE_MOVE, ("unable to scroll"));
            continue;
        }
 #endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */
     }
+    TR(TRACE_ICALLS, (T_RETURN("")));
 }
 
 #if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG)
-void _nc_linedump(void)
+NCURSES_EXPORT(void)
+_nc_linedump(void)
 /* dump the state of the real and virtual oldnum fields */
 {
-    static size_t have;
-    static char *buf;
-
-    int        n;
-    size_t     want = (screen_lines + 1) * 4;
-
-    if (have < want)
-       buf = typeMalloc(char, have = want);
-
-    (void) strcpy(buf, "virt");
-    for (n = 0; n < screen_lines; n++)
-       (void) sprintf(buf + strlen(buf), " %02d", OLDNUM(n));
-    TR(TRACE_UPDATE | TRACE_MOVE, (buf));
-#if NO_LEAKS
-    free(buf);
-    have = 0;
-#endif
+    int n;
+    char *buf = 0;
+    size_t want = (screen_lines + 1) * 4;
+
+    if ((buf = typeMalloc(char, want)) != 0) {
+
+       (void) strcpy(buf, "virt");
+       for (n = 0; n < screen_lines; n++)
+           (void) sprintf(buf + strlen(buf), " %02d", OLDNUM(n));
+       TR(TRACE_UPDATE | TRACE_MOVE, (buf));
+       free(buf);
+    }
 }
 #endif /* defined(TRACE) || defined(SCROLLDEBUG) */
 
 #ifdef SCROLLDEBUG
 
 int
-main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED)
+main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
 {
-    char       line[BUFSIZ], *st;
+    char line[BUFSIZ], *st;
 
 #ifdef TRACE
     _nc_tracing = TRACE_MOVE;
 #endif
-    for (;;)
-    {
-       int     n;
+    for (;;) {
+       int n;
 
        for (n = 0; n < screen_lines; n++)
            oldnums[n] = _NEWINDEX;
 
        /* grab the test vector */
-       if (fgets(line, sizeof(line), stdin) == (char *)NULL)
+       if (fgets(line, sizeof(line), stdin) == (char *) NULL)
            exit(EXIT_SUCCESS);
 
        /* parse it */
        n = 0;
-       if (line[0] == '#')
-       {
+       if (line[0] == '#') {
            (void) fputs(line, stderr);
            continue;
        }
@@ -313,7 +313,7 @@ main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED)
        do {
            oldnums[n++] = atoi(st);
        } while
-           ((st = strtok((char *)NULL, " ")) != 0);
+           ((st = strtok((char *) NULL, " ")) != 0);
 
        /* display it */
        (void) fputs("Initial input:\n", stderr);