X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fview.c;h=48c86e6b80e024282951fa8458787aed9a7ef0f1;hp=a6303c1d30d123b4cd812bb8dd3b3dcbeec7120f;hb=772f879d17117c5b766022f28099e341ebea825b;hpb=46722468f47c2b77b3987729b4bcf2321cccfd01 diff --git a/test/view.c b/test/view.c index a6303c1d..48c86e6b 100644 --- a/test/view.c +++ b/test/view.c @@ -1,3 +1,30 @@ +/**************************************************************************** + * Copyright (c) 1998-2006,2007 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 * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ /* * view.c -- a silly little viewer program * @@ -23,13 +50,14 @@ * scroll operation worked, and the refresh() code only had to do a * partial repaint. * - * $Id: view.c,v 1.53 2002/06/29 23:28:27 tom Exp $ + * $Id: view.c,v 1.66 2007/07/21 17:41:55 tom Exp $ */ -#include +#include + #include -#include +#undef CTRL /* conflict on AIX 5.2 with */ #if HAVE_TERMIOS_H # include @@ -54,7 +82,7 @@ static RETSIGTYPE finish(int sig) GCC_NORETURN; static void show_all(const char *tag); -#if defined(SIGWINCH) && defined(TIOCGWINSZ) && HAVE_RESIZETERM +#if defined(SIGWINCH) && defined(TIOCGWINSZ) && HAVE_RESIZE_TERM #define CAN_RESIZE 1 #else #define CAN_RESIZE 0 @@ -70,8 +98,9 @@ static int shift = 0; static bool try_color = FALSE; static char *fname; -static NCURSES_CH_T **my_lines; +static NCURSES_CH_T **vec_lines; static NCURSES_CH_T **lptr; +static int num_lines; static void usage(void) @@ -165,7 +194,8 @@ ch_dup(char *src) if (setcchar(dst + k, wstr, 0, 0, NULL) == OK) ++k; } - setcchar(dst + k, L"", 0, 0, NULL); + wstr[0] = L'\0'; + setcchar(dst + k, wstr, 0, 0, NULL); #else dst[k] = 0; #endif @@ -181,7 +211,6 @@ main(int argc, char *argv[]) int i; int my_delay = 0; NCURSES_CH_T **olptr; - int length = 0; int value = 0; bool done = FALSE; bool got_number = FALSE; @@ -200,15 +229,13 @@ main(int argc, char *argv[]) (void) signal(SIGINT, finish); /* arrange interrupts to terminate */ #endif - while ((i = getopt(argc, argv, "cin:rtT:")) != EOF) { + while ((i = getopt(argc, argv, "cin:rtT:")) != -1) { switch (i) { case 'c': try_color = TRUE; break; case 'i': - signal(SIGINT, SIG_IGN); - signal(SIGQUIT, SIG_IGN); - signal(SIGTERM, SIG_IGN); + CATCHALL(SIG_IGN); break; case 'n': if ((MAXLINES = atoi(optarg)) < 1) @@ -221,7 +248,7 @@ main(int argc, char *argv[]) #endif #ifdef TRACE case 'T': - trace(atoi(optarg)); + trace((unsigned) atoi(optarg)); break; case 't': trace(TRACE_CALLS); @@ -234,7 +261,7 @@ main(int argc, char *argv[]) if (optind + 1 != argc) usage(); - if ((my_lines = typeMalloc(NCURSES_CH_T *, MAXLINES + 2)) == 0) + if ((vec_lines = typeMalloc(NCURSES_CH_T *, MAXLINES + 2)) == 0) usage(); fname = argv[optind]; @@ -248,7 +275,7 @@ main(int argc, char *argv[]) #endif /* slurp the file */ - for (lptr = &my_lines[0]; (lptr - my_lines) < MAXLINES; lptr++) { + for (lptr = &vec_lines[0]; (lptr - vec_lines) < MAXLINES; lptr++) { char temp[BUFSIZ], *s, *d; int col; @@ -281,7 +308,7 @@ main(int argc, char *argv[]) *lptr = ch_dup(temp); } (void) fclose(fp); - length = lptr - my_lines; + num_lines = lptr - vec_lines; (void) initscr(); /* initialize the curses library */ keypad(stdscr, TRUE); /* enable keyboard mapping */ @@ -301,7 +328,7 @@ main(int argc, char *argv[]) } } - lptr = my_lines; + lptr = vec_lines; while (!done) { int n, c; @@ -324,7 +351,7 @@ main(int argc, char *argv[]) mvprintw(0, 0, "Count: "); clrtoeol(); } - addch(c); + addch(UChar(c)); value = 10 * value + (c - '0'); got_number = TRUE; } else @@ -343,35 +370,35 @@ main(int argc, char *argv[]) case 'n': olptr = lptr; for (i = 0; i < n; i++) - if ((lptr - my_lines) < (length - LINES + 1)) + if ((lptr - vec_lines) < (num_lines - LINES + 1)) lptr++; else break; - wscrl(stdscr, lptr - olptr); + scrl(lptr - olptr); break; case KEY_UP: case 'p': olptr = lptr; for (i = 0; i < n; i++) - if (lptr > my_lines) + if (lptr > vec_lines) lptr--; else break; - wscrl(stdscr, lptr - olptr); + scrl(lptr - olptr); break; case 'h': case KEY_HOME: - lptr = my_lines; + lptr = vec_lines; break; case 'e': case KEY_END: - if (length > LINES) - lptr = my_lines + length - LINES + 1; + if (num_lines > LINES) + lptr = vec_lines + num_lines - LINES + 1; else - lptr = my_lines; + lptr = vec_lines; break; case 'r': @@ -429,6 +456,15 @@ static RETSIGTYPE finish(int sig) { endwin(); +#if NO_LEAKS + if (vec_lines != 0) { + int n; + for (n = 0; n < num_lines; ++n) { + free(vec_lines[n]); + } + free(vec_lines); + } +#endif ExitProgram(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS); } @@ -492,18 +528,21 @@ show_all(const char *tag) scrollok(stdscr, FALSE); /* prevent screen from moving */ for (i = 1; i < LINES; i++) { move(i, 0); - printw("%3ld:", (long) (lptr + i - my_lines)); + printw("%3ld:", (long) (lptr + i - vec_lines)); clrtoeol(); if ((s = lptr[i - 1]) != 0) { int len = ch_len(s); - if (len > shift) + if (len > shift) { #if USE_WIDEC_SUPPORT add_wchstr(s + shift); #else addchstr(s + shift); #endif + } +#if defined(NCURSES_VERSION) || defined(HAVE_WCHGAT) if (try_color) wchgat(stdscr, -1, A_NORMAL, my_pair, NULL); +#endif } } setscrreg(1, LINES - 1);