]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - test/view.c
ncurses 5.7 - patch 20090803
[ncurses.git] / test / view.c
index 05e7d4812d5d33a2edfecda3903e9e8344aadadf..d6de0d0a3985938657c774edc29fd3f2317b850f 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2008,2009 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.64 2006/05/20 15:37:03 tom Exp $
+ * $Id: view.c,v 1.75 2009/07/19 00:34:07 tom Exp $
  */
 
 #include <test.priv.h>
 #if HAVE_TERMIOS_H
 # include <termios.h>
 #else
+#if !defined(__MINGW32__)
 # include <sgtty.h>
 #endif
+#endif
 
 #if !defined(sun) || !HAVE_TERMIOS_H
 # if HAVE_SYS_IOCTL_H
 #include <sys/ptem.h>
 #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);
 
@@ -132,11 +151,19 @@ ch_len(NCURSES_CH_T * src)
 {
     int result = 0;
 #if USE_WIDEC_SUPPORT
+    int count;
 #endif
 
 #if USE_WIDEC_SUPPORT
-    while (getcchar(src++, NULL, NULL, NULL, NULL) > 0)
-       result++;
+    for (;;) {
+       TEST_CCHAR(src, count, {
+           ++result;
+           ++src;
+       }
+       , {
+           break;
+       })
+    }
 #else
     while (*src++)
        result++;
@@ -158,17 +185,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 +258,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 +267,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
@@ -261,7 +291,7 @@ main(int argc, char *argv[])
     if (optind + 1 != argc)
        usage();
 
-    if ((vec_lines = typeMalloc(NCURSES_CH_T *, MAXLINES + 2)) == 0)
+    if ((vec_lines = typeCalloc(NCURSES_CH_T *, MAXLINES + 2)) == 0)
        usage();
 
     fname = argv[optind];
@@ -374,7 +404,7 @@ main(int argc, char *argv[])
                    lptr++;
                else
                    break;
-           wscrl(stdscr, lptr - olptr);
+           scrl(lptr - olptr);
            break;
 
        case KEY_UP:
@@ -385,7 +415,7 @@ main(int argc, char *argv[])
                    lptr--;
                else
                    break;
-           wscrl(stdscr, lptr - olptr);
+           scrl(lptr - olptr);
            break;
 
        case 'h':
@@ -508,10 +538,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);