X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftty%2Fhardscroll.c;h=4ec168a0028ecebf06e02e5ea36088c691574f5f;hp=a270a27cb4d8fbf59e6410e3af327ad7c535405e;hb=7d3e03f12f3e179f5780f733fa5b78d981080d48;hpb=3a0d9d27e0cf115ff9dcc6163c251bccaa62bd7d diff --git a/ncurses/tty/hardscroll.c b/ncurses/tty/hardscroll.c index a270a27c..4ec168a0 100644 --- a/ncurses/tty/hardscroll.c +++ b/ncurses/tty/hardscroll.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * Copyright (c) 1998-2010,2012 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 * @@ -147,7 +147,7 @@ AUTHOR #include -MODULE_ID("$Id: hardscroll.c,v 1.44 2009/10/24 21:57:38 tom Exp $") +MODULE_ID("$Id: hardscroll.c,v 1.51 2012/10/17 09:01:10 tom Exp $") #if defined(SCROLLDEBUG) || defined(HASHDEBUG) @@ -173,9 +173,9 @@ NCURSES_EXPORT_VAR (int *) # if USE_HASHMAP # define oldnums(sp) (sp)->_oldnum_list # define OLDNUM(sp,n) oldnums(sp)[n] -# else /* !USE_HASHMAP */ -# define OLDNUM(sp,n) sp->_newscr->_line[n].oldindex -# endif /* !USE_HASHMAP */ +# else /* !USE_HASHMAP */ +# define OLDNUM(sp,n) NewScreen(sp)->_line[n].oldindex +# endif /* !USE_HASHMAP */ #define OLDNUM_SIZE(sp) (sp)->_oldnum_size @@ -193,12 +193,20 @@ NCURSES_SP_NAME(_nc_scroll_optimize) (NCURSES_SP_DCL0) #if !defined(SCROLLDEBUG) && !defined(HASHDEBUG) #if USE_HASHMAP /* get enough storage */ - if (OLDNUM_SIZE(SP_PARM) < screen_lines(SP_PARM)) { - int *new_oldnums = typeRealloc(int, screen_lines(SP_PARM), oldnums(SP_PARM)); + assert(OLDNUM_SIZE(SP_PARM) >= 0); + assert(screen_lines(SP_PARM) > 0); + if ((oldnums(SP_PARM) == 0) + || (OLDNUM_SIZE(SP_PARM) < screen_lines(SP_PARM))) { + int need_lines = ((OLDNUM_SIZE(SP_PARM) < screen_lines(SP_PARM)) + ? screen_lines(SP_PARM) + : OLDNUM_SIZE(SP_PARM)); + int *new_oldnums = typeRealloc(int, + (size_t) need_lines, + oldnums(SP_PARM)); if (!new_oldnums) return; oldnums(SP_PARM) = new_oldnums; - OLDNUM_SIZE(SP_PARM) = screen_lines(SP_PARM); + OLDNUM_SIZE(SP_PARM) = need_lines; } /* calculate the indices */ NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_ARG); @@ -294,14 +302,16 @@ NCURSES_SP_NAME(_nc_linedump) (NCURSES_SP_DCL0) { int n; char *buf = 0; - size_t want = (screen_lines(SP_PARM) + 1) * 4; + size_t want = ((size_t) screen_lines(SP_PARM) + 1) * 4; if ((buf = typeMalloc(char, want)) != 0) { - (void) strcpy(buf, "virt"); + *buf = '\0'; for (n = 0; n < screen_lines(SP_PARM); n++) - (void) sprintf(buf + strlen(buf), " %02d", OLDNUM(SP_PARM, n)); - TR(TRACE_UPDATE | TRACE_MOVE, (buf)); + _nc_SPRINTF(buf + strlen(buf), + _nc_SLIMIT(want - strlen(buf)) + " %02d", OLDNUM(SP_PARM, n)); + TR(TRACE_UPDATE | TRACE_MOVE, ("virt %s", buf)); free(buf); } }