X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fview.c;h=9f2d72f64f0a46e2550963ce48efbf7563817d5f;hp=c76aded9583ea4297c3fd7e9b2caddab7689c5f7;hb=a7d99bb6b29485693a21c0cc70d7925f2211769c;hpb=eb312e0bb90463a33aa8a53f825b32dc189af023 diff --git a/test/view.c b/test/view.c index c76aded9..9f2d72f6 100644 --- a/test/view.c +++ b/test/view.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2006,2007 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 * @@ -50,7 +50,7 @@ * scroll operation worked, and the refresh() code only had to do a * partial repaint. * - * $Id: view.c,v 1.65 2007/06/30 16:40:04 tom Exp $ + * $Id: view.c,v 1.69 2008/09/06 22:10:50 tom Exp $ */ #include @@ -79,6 +79,23 @@ #include #endif +#if USE_WIDEC_SUPPORT +#if HAVE_MBTOWC && HAVE_MBLEN +#define reset_mbytes(state) mblen(NULL, 0), mbtowc(NULL, NULL, 0) +#define count_mbytes(buffer,length,state) mblen(buffer,length) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbtowc(&wch, buffer, length) +#define state_unused +#elif HAVE_MBRTOWC && HAVE_MBRLEN +#define reset_mbytes(state) init_mb(state) +#define count_mbytes(buffer,length,state) mbrlen(buffer,length,&state) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbrtowc(&wch, buffer, length, &state) +#else +make an error +#endif +#endif /* USE_WIDEC_SUPPORT */ + static RETSIGTYPE finish(int sig) GCC_NORETURN; static void show_all(const char *tag); @@ -158,17 +175,19 @@ ch_dup(char *src) wchar_t wstr[CCHARW_MAX + 1]; wchar_t wch; int l = 0; - mbstate_t state; size_t rc; int width; +#ifndef state_unused + mbstate_t state; #endif +#endif /* USE_WIDEC_SUPPORT */ #if USE_WIDEC_SUPPORT - memset(&state, 0, sizeof(state)); + reset_mbytes(state); #endif for (j = k = 0; j < len; j++) { #if USE_WIDEC_SUPPORT - rc = mbrtowc(&wch, src + j, len - j, &state); + rc = check_mbytes(wch, src + j, len - j, state); if (rc == (size_t) -1 || rc == (size_t) -2) break; j += rc - 1; @@ -229,7 +248,7 @@ 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; @@ -238,7 +257,8 @@ main(int argc, char *argv[]) CATCHALL(SIG_IGN); break; case 'n': - if ((MAXLINES = atoi(optarg)) < 1) + if ((MAXLINES = atoi(optarg)) < 1 || + (MAXLINES + 2) <= 1) usage(); break; #if CAN_RESIZE @@ -508,10 +528,12 @@ show_all(const char *tag) time_t this_time; #if CAN_RESIZE - sprintf(temp, "%s (%3dx%3d) col %d ", tag, LINES, COLS, shift); + sprintf(temp, "%.20s (%3dx%3d) col %d ", tag, LINES, COLS, shift); i = strlen(temp); - sprintf(temp + i, "view %.*s", (int) (sizeof(temp) - 7 - i), fname); + if ((i + 7) < (int) sizeof(temp)) + sprintf(temp + i, "view %.*s", (int) (sizeof(temp) - 7 - i), fname); #else + (void) tag; sprintf(temp, "view %.*s", (int) sizeof(temp) - 7, fname); #endif move(0, 0);