X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fview.c;h=76a88a3096aeea8ac99f8b4721e3198048f724ae;hp=5c609fa6fd1604e74dad4562b0600dc0e4bfb90d;hb=938680fa3bc29d2a086031a2f648dfd6cadcb51e;hpb=92e187a3459ab7ce1613a3684ca6642447c73620 diff --git a/test/view.c b/test/view.c index 5c609fa6..76a88a30 100644 --- a/test/view.c +++ b/test/view.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * + * Copyright (c) 1998-2011,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 * @@ -50,10 +50,11 @@ * scroll operation worked, and the refresh() code only had to do a * partial repaint. * - * $Id: view.c,v 1.79 2010/05/01 21:56:10 tom Exp $ + * $Id: view.c,v 1.89 2012/12/29 22:38:28 tom Exp $ */ #include +#include #include @@ -81,23 +82,6 @@ #include #endif -#if USE_WIDEC_SUPPORT -#if HAVE_MBTOWC && HAVE_MBLEN -#define reset_mbytes(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(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); @@ -110,9 +94,9 @@ static void show_all(const char *tag); #if CAN_RESIZE static RETSIGTYPE adjust(int sig); static int interrupted; +static bool waiting = FALSE; #endif -static bool waiting = FALSE; static int shift = 0; static bool try_color = FALSE; @@ -121,6 +105,8 @@ static NCURSES_CH_T **vec_lines; static NCURSES_CH_T **lptr; static int num_lines; +static void usage(void) GCC_NORETURN; + static void usage(void) { @@ -178,9 +164,9 @@ ch_len(NCURSES_CH_T * src) static NCURSES_CH_T * ch_dup(char *src) { - unsigned len = strlen(src); + unsigned len = (unsigned) strlen(src); NCURSES_CH_T *dst = typeMalloc(NCURSES_CH_T, len + 1); - unsigned j, k; + size_t j, k; #if USE_WIDEC_SUPPORT wchar_t wstr[CCHARW_MAX + 1]; wchar_t wch; @@ -197,7 +183,7 @@ ch_dup(char *src) #endif for (j = k = 0; j < len; j++) { #if USE_WIDEC_SUPPORT - rc = check_mbytes(wch, src + j, len - j, state); + rc = (size_t) check_mbytes(wch, src + j, len - j, state); if (rc == (size_t) -1 || rc == (size_t) -2) break; j += rc - 1; @@ -214,7 +200,7 @@ ch_dup(char *src) wstr[l++] = L' '; wstr[l++] = wch; #else - dst[k++] = src[j]; + dst[k++] = (chtype) UChar(src[j]); #endif } #if USE_WIDEC_SUPPORT @@ -278,7 +264,13 @@ main(int argc, char *argv[]) #endif #ifdef TRACE case 'T': - trace((unsigned) atoi(optarg)); + { + char *next = 0; + int tvalue = strtol(optarg, &next, 0); + if (tvalue < 0 || (next != 0 && *next != 0)) + usage(); + trace((unsigned) tvalue); + } break; case 't': trace(TRACE_CALLS); @@ -291,7 +283,7 @@ main(int argc, char *argv[]) if (optind + 1 != argc) usage(); - if ((vec_lines = typeCalloc(NCURSES_CH_T *, MAXLINES + 2)) == 0) + if ((vec_lines = typeCalloc(NCURSES_CH_T *, (size_t) MAXLINES + 2)) == 0) usage(); assert(vec_lines != 0); @@ -306,7 +298,7 @@ main(int argc, char *argv[]) (void) signal(SIGWINCH, adjust); /* arrange interrupts to resize */ #endif - /* slurp the file */ + Trace(("slurp the file")); for (lptr = &vec_lines[0]; (lptr - vec_lines) < MAXLINES; lptr++) { char temp[BUFSIZ], *s, *d; int col; @@ -314,8 +306,26 @@ main(int argc, char *argv[]) if (fgets(buf, sizeof(buf), fp) == 0) break; - /* convert tabs so that shift will work properly */ +#if USE_WIDEC_SUPPORT + if (lptr == vec_lines) { + if (!memcmp("", buf, 3)) { + Trace(("trim BOM")); + s = buf + 3; + d = buf; + do { + } while ((*d++ = *s++) != '\0'); + } + } +#endif + + /* convert tabs and nonprinting chars so that shift will work properly */ for (s = buf, d = temp, col = 0; (*d = *s) != '\0'; s++) { + if (*d == '\r') { + if (s[1] == '\n') + continue; + else + break; + } if (*d == '\n') { *d = '\0'; break; @@ -333,14 +343,14 @@ main(int argc, char *argv[]) } else { sprintf(d, "\\%03o", UChar(*s)); d += strlen(d); - col = (d - temp); + col = (int) (d - temp); } #endif } *lptr = ch_dup(temp); } (void) fclose(fp); - num_lines = lptr - vec_lines; + num_lines = (int) (lptr - vec_lines); (void) initscr(); /* initialize the curses library */ keypad(stdscr, TRUE); /* enable keyboard mapping */ @@ -354,7 +364,7 @@ main(int argc, char *argv[]) if (has_colors()) { start_color(); init_pair(my_pair, COLOR_WHITE, COLOR_BLUE); - bkgd(COLOR_PAIR(my_pair)); + bkgd((chtype) COLOR_PAIR(my_pair)); } else { try_color = FALSE; } @@ -373,10 +383,12 @@ main(int argc, char *argv[]) adjust(0); my_label = "interrupt"; } -#endif waiting = TRUE; c = getch(); waiting = FALSE; +#else + c = getch(); +#endif if ((c < 127) && isdigit(c)) { if (!got_number) { MvPrintw(0, 0, "Count: "); @@ -405,7 +417,7 @@ main(int argc, char *argv[]) lptr++; else break; - scrl(lptr - olptr); + scrl((int) (lptr - olptr)); break; case KEY_UP: @@ -416,7 +428,7 @@ main(int argc, char *argv[]) lptr--; else break; - scrl(lptr - olptr); + scrl((int) (lptr - olptr)); break; case 'h': @@ -539,9 +551,12 @@ show_all(const char *tag) #if CAN_RESIZE sprintf(temp, "%.20s (%3dx%3d) col %d ", tag, LINES, COLS, shift); - i = strlen(temp); - if ((i + 7) < (int) sizeof(temp)) - sprintf(temp + i, "view %.*s", (int) (sizeof(temp) - 7 - i), fname); + i = (int) strlen(temp); + if ((i + 7) < (int) sizeof(temp)) { + sprintf(temp + i, "view %.*s", + (int) (sizeof(temp) - 7 - (size_t) i), + fname); + } #else (void) tag; sprintf(temp, "view %.*s", (int) sizeof(temp) - 7, fname); @@ -550,8 +565,8 @@ show_all(const char *tag) printw("%.*s", COLS, temp); clrtoeol(); this_time = time((time_t *) 0); - strcpy(temp, ctime(&this_time)); - if ((i = strlen(temp)) != 0) { + strncpy(temp, ctime(&this_time), 30); + if ((i = (int) strlen(temp)) != 0) { temp[--i] = 0; if (move(0, COLS - i - 2) != ERR) printw(" %s", temp);