Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libcurses PR lib/56388



details:   https://anonhg.NetBSD.org/src/rev/c58efa4bcbd5
branches:  trunk
changeset: 1023420:c58efa4bcbd5
user:      rin <rin%NetBSD.org@localhost>
date:      Tue Sep 07 01:23:09 2021 +0000

description:
PR lib/56388

For __newwin() and __resizewin(), the line hash was calculated as if
HAVE_WCHAR is disabled.

Fix this bug by refactoring __hash_line() function, which calculates
the line hash by an appropriate method.

diffstat:

 lib/libcurses/cur_hash.c       |  26 ++++++++++++++++++++++++--
 lib/libcurses/curses_private.h |   3 ++-
 lib/libcurses/newwin.c         |  33 ++++-----------------------------
 lib/libcurses/refresh.c        |  37 ++++---------------------------------
 lib/libcurses/resize.c         |   7 +++----
 5 files changed, 37 insertions(+), 69 deletions(-)

diffs (222 lines):

diff -r 65c513b3557e -r c58efa4bcbd5 lib/libcurses/cur_hash.c
--- a/lib/libcurses/cur_hash.c  Mon Sep 06 21:56:03 2021 +0000
+++ b/lib/libcurses/cur_hash.c  Tue Sep 07 01:23:09 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cur_hash.c,v 1.13 2017/01/06 09:14:07 roy Exp $        */
+/*     $NetBSD: cur_hash.c,v 1.14 2021/09/07 01:23:09 rin Exp $        */
 
 /*
  * Copyright (c) 1992, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)cur_hash.c 8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: cur_hash.c,v 1.13 2017/01/06 09:14:07 roy Exp $");
+__RCSID("$NetBSD: cur_hash.c,v 1.14 2021/09/07 01:23:09 rin Exp $");
 #endif
 #endif                         /* not lint */
 
@@ -63,3 +63,25 @@
        }
        return h;
 }
+
+unsigned int
+__hash_line(const __LDATA *cp, int ncols)
+{
+#ifdef HAVE_WCHAR
+       unsigned int h;
+       const nschar_t *np;
+       int x;
+
+       h = 0;
+       for (x = 0; x < ncols; x++) {
+               h = __hash_more(&cp->ch, sizeof(cp->ch), h);
+               h = __hash_more(&cp->attr, sizeof(cp->attr), h);
+               for (np = cp->nsp; np != NULL; np = np->next)
+                       h = __hash_more(&np->ch, sizeof(np->ch), h);
+               cp++;
+       }
+       return h;
+#else
+       return __hash(cp, (size_t)(ncols * __LDATASIZE));
+#endif
+}
diff -r 65c513b3557e -r c58efa4bcbd5 lib/libcurses/curses_private.h
--- a/lib/libcurses/curses_private.h    Mon Sep 06 21:56:03 2021 +0000
+++ b/lib/libcurses/curses_private.h    Tue Sep 07 01:23:09 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: curses_private.h,v 1.75 2021/09/06 07:03:49 rin Exp $  */
+/*     $NetBSD: curses_private.h,v 1.76 2021/09/07 01:23:09 rin Exp $  */
 
 /*-
  * Copyright (c) 1998-2000 Brett Lymn
@@ -373,6 +373,7 @@
 int      _cursesi_setterm(char *, SCREEN *);
 int     __delay(void);
 unsigned int    __hash_more(const void *, size_t, unsigned int);
+unsigned int    __hash_line(const __LDATA *, int);
 #define        __hash(s, len)  __hash_more((s), (len), 0u)
 void    __id_subwins(WINDOW *);
 void    __init_getch(SCREEN *);
diff -r 65c513b3557e -r c58efa4bcbd5 lib/libcurses/newwin.c
--- a/lib/libcurses/newwin.c    Mon Sep 06 21:56:03 2021 +0000
+++ b/lib/libcurses/newwin.c    Tue Sep 07 01:23:09 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: newwin.c,v 1.61 2021/09/06 07:03:50 rin Exp $  */
+/*     $NetBSD: newwin.c,v 1.62 2021/09/07 01:23:09 rin Exp $  */
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)newwin.c   8.3 (Berkeley) 7/27/94";
 #else
-__RCSID("$NetBSD: newwin.c,v 1.61 2021/09/06 07:03:50 rin Exp $");
+__RCSID("$NetBSD: newwin.c,v 1.62 2021/09/07 01:23:09 rin Exp $");
 #endif
 #endif                         /* not lint */
 
@@ -169,8 +169,7 @@
                        SET_WCOL(*sp, 1);
 #endif /* HAVE_WCHAR */
                }
-               lp->hash = __hash((char *)(void *)lp->line,
-                                 (size_t)(maxx * __LDATASIZE));
+               lp->hash = __hash_line(lp->line, maxx);
        }
        return (win);
 }
@@ -227,11 +226,6 @@
 {
        int     i;
        __LINE *lp, *olp;
-#ifdef HAVE_WCHAR
-       __LDATA *cp;
-       int j;
-       nschar_t *np;
-#endif /* HAVE_WCHAR */
 
        win->ch_off = win->begx - orig->begx;
        /* Point line pointers to line space. */
@@ -244,26 +238,7 @@
                lp->line = &olp->line[win->ch_off];
                lp->firstchp = &olp->firstch;
                lp->lastchp = &olp->lastch;
-#ifndef HAVE_WCHAR
-               lp->hash = __hash((char *)(void *)lp->line,
-                                 (size_t)(win->maxx * __LDATASIZE));
-#else
-               lp->hash = 0;
-               for (cp = lp->line, j = 0; j < win->maxx; j++, cp++) {
-                       lp->hash = __hash_more( &cp->ch,
-                           sizeof( wchar_t ), lp->hash );
-                       lp->hash = __hash_more( &cp->attr,
-                           sizeof( wchar_t ), lp->hash );
-                       if ( cp->nsp ) {
-                               np = cp->nsp;
-                               while ( np ) {
-                                       lp->hash = __hash_more( &np->ch,
-                                           sizeof( wchar_t ), lp->hash );
-                                       np = np->next;
-                               }
-                       }
-               }
-#endif /* HAVE_WCHAR */
+               lp->hash = __hash_line(lp->line, win->maxx);
        }
 
        __CTRACE(__CTRACE_WINDOW, "__set_subwin: win->ch_off = %d\n",
diff -r 65c513b3557e -r c58efa4bcbd5 lib/libcurses/refresh.c
--- a/lib/libcurses/refresh.c   Mon Sep 06 21:56:03 2021 +0000
+++ b/lib/libcurses/refresh.c   Tue Sep 07 01:23:09 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: refresh.c,v 1.115 2021/09/06 07:45:48 rin Exp $        */
+/*     $NetBSD: refresh.c,v 1.116 2021/09/07 01:23:09 rin Exp $        */
 
 /*
  * Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)refresh.c  8.7 (Berkeley) 8/13/94";
 #else
-__RCSID("$NetBSD: refresh.c,v 1.115 2021/09/06 07:45:48 rin Exp $");
+__RCSID("$NetBSD: refresh.c,v 1.116 2021/09/07 01:23:09 rin Exp $");
 #endif
 #endif                         /* not lint */
 
@@ -515,11 +515,6 @@
        __LINE  *wlp, *vlp;
        short    wy;
        int      dnum, was_cleared, changed;
-#ifdef HAVE_WCHAR
-       __LDATA *lp;
-       nschar_t *np;
-       int x;
-#endif /* HAVE_WCHAR */
 
        /* Check if we need to restart ... */
        if (_cursesi_screen->endwin)
@@ -538,32 +533,8 @@
        if (!_cursesi_screen->curwin) {
                for (wy = 0; wy < win->maxy; wy++) {
                        wlp = win->alines[wy];
-                       if (wlp->flags & __ISDIRTY) {
-#ifndef HAVE_WCHAR
-                               wlp->hash = __hash(wlp->line,
-                                   (size_t)(win->maxx * __LDATASIZE));
-#else
-                               wlp->hash = 0;
-                               for ( x = 0; x < win->maxx; x++ ) {
-                                       lp = &wlp->line[ x ];
-                                       wlp->hash = __hash_more( &lp->ch,
-                                               sizeof(wchar_t), wlp->hash );
-                                       wlp->hash = __hash_more( &lp->attr,
-                                               sizeof(attr_t), wlp->hash );
-                                       np = lp->nsp;
-                                       if (np) {
-                                               while (np) {
-                                                       wlp->hash
-                                                           = __hash_more(
-                                                               &np->ch,
-                                                               sizeof(wchar_t),
-                                                               wlp->hash);
-                                                       np = np->next;
-                                               }
-                                       }
-                               }
-#endif /* HAVE_WCHAR */
-                       }
+                       if (wlp->flags & __ISDIRTY)
+                               wlp->hash = __hash_line(wlp->line, win->maxx);
                }
        }
 
diff -r 65c513b3557e -r c58efa4bcbd5 lib/libcurses/resize.c
--- a/lib/libcurses/resize.c    Mon Sep 06 21:56:03 2021 +0000
+++ b/lib/libcurses/resize.c    Tue Sep 07 01:23:09 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: resize.c,v 1.32 2021/09/06 07:03:50 rin Exp $  */
+/*     $NetBSD: resize.c,v 1.33 2021/09/07 01:23:09 rin Exp $  */
 
 /*
  * Copyright (c) 2001
@@ -33,7 +33,7 @@
 #if 0
 static char sccsid[] = "@(#)resize.c   blymn 2001/08/26";
 #else
-__RCSID("$NetBSD: resize.c,v 1.32 2021/09/06 07:03:50 rin Exp $");
+__RCSID("$NetBSD: resize.c,v 1.33 2021/09/07 01:23:09 rin Exp $");
 #endif
 #endif                         /* not lint */
 
@@ -360,8 +360,7 @@
                        SET_WCOL(*sp, 1);
 #endif /* HAVE_WCHAR */
                }
-               lp->hash = __hash((char *)(void *)lp->line,
-                                 (size_t)(ncols * __LDATASIZE));
+               lp->hash = __hash_line(lp->line, ncols);
        }
 
        __CTRACE(__CTRACE_WINDOW, "resize: win->wattr = %08x\n", win->wattr);



Home | Main Index | Thread Index | Old Index