ncurses 6.1 - patch 20180825
[ncurses.git] / test / test_addchstr.c
index 247a75604c903fa1c806cf5acf0e843b95afb1bc..2158d147982ec48498786adf4f2e4534edb45777 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 2009 Free Software Foundation, Inc.                        *
+ * Copyright (c) 2009-2016,2017 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            *
  * authorization.                                                           *
  ****************************************************************************/
 /*
- * $Id: test_addchstr.c,v 1.5 2009/10/10 16:01:41 tom Exp $
+ * $Id: test_addchstr.c,v 1.24 2017/09/28 23:10:29 tom Exp $
  *
  * Demonstrate the waddchstr() and waddch functions.
  * Thomas Dickey - 2009/9/12
  */
 
 #include <test.priv.h>
-
 #include <linedata.h>
 
+/*
+ * redefinitions to simplify comparison between test_*str programs
+ */
+#undef MvAddStr
+#undef MvWAddStr
+
 #define AddNStr    addchnstr
 #define AddStr     addchstr
-#define MvAddNStr  mvaddchnstr
-#define MvAddStr   mvaddchstr
-#define MvWAddNStr mvwaddchnstr
-#define MvWAddStr  mvwaddchstr
+#define MvAddNStr  (void) mvaddchnstr
+#define MvAddStr   (void) mvaddchstr
+#define MvWAddNStr (void) mvwaddchnstr
+#define MvWAddStr  (void) mvwaddchstr
 #define WAddNStr   waddchnstr
 #define WAddStr    waddchstr
 
-#define AddCh      addch
-#define MvAddCh    mvaddch
-#define MvWAddCh   mvwaddch
-#define WAddCh     waddch
-
 #define MY_TABSIZE 8
 
 typedef enum {
@@ -60,31 +60,61 @@ typedef enum {
 } Options;
 
 static bool m_opt = FALSE;
+static bool pass_ctls = FALSE;
 static bool w_opt = FALSE;
 static int n_opt = -1;
 
+static chtype show_attr;
 static chtype *temp_buffer;
 static size_t temp_length;
 
 #define TempBuffer(source_cast)
 
+static size_t
+ChLen(const char *source)
+{
+    size_t result = strlen(source);
+
+    if (!pass_ctls) {
+       size_t adjust = 0;
+       size_t n;
+
+       for (n = 0; n < result; ++n) {
+           const char *s = unctrl(UChar(source[n]));
+           if (s != 0) {
+               adjust += (strlen(s) - 1);
+           }
+       }
+       result += adjust;
+    }
+    return result;
+}
+
 static chtype *
 ChStr(const char *source)
 {
     if (source != 0) {
-       size_t need = strlen(source) + 1;
-       wchar_t have[2];
+       size_t need = ChLen(source) + 1;
        int n = 0;
 
        if (need > temp_length) {
            temp_length = need * 2;
            temp_buffer = typeRealloc(chtype, temp_length, temp_buffer);
+           if (!temp_buffer)
+               failed("TempBuffer");
        }
-       have[0] = 0;
-       have[1] = 0;
        do {
-           temp_buffer[n++] = UChar(*source++);
-       } while (have[0] != 0);
+           const char *s;
+           chtype ch = UChar(*source++);
+           if (!pass_ctls && (s = unctrl(ch)) != 0) {
+               while (*s != '\0') {
+                   temp_buffer[n++] = UChar(*s++);
+               }
+           } else {
+               temp_buffer[n++] = ch;
+           }
+       } while (source[0] != 0);
+       temp_buffer[n] = 0;
     } else if (temp_buffer != 0) {
        free(temp_buffer);
        temp_buffer = 0;
@@ -93,10 +123,23 @@ ChStr(const char *source)
     return temp_buffer;
 }
 
+/* color the strings drawn in the workspace */
+static chtype *
+ChStr2(const char *source)
+{
+    size_t len = ChLen(source);
+    size_t n;
+    chtype *result = ChStr(source);
+    for (n = 0; n < len; ++n) {
+       result[n] |= show_attr;
+    }
+    return result;
+}
+
 static void
 legend(WINDOW *win, int level, Options state, char *buffer, int length)
 {
-    NCURSES_CONST char *showstate;
+    const char *showstate;
 
     switch (state) {
     default:
@@ -118,7 +161,7 @@ legend(WINDOW *win, int level, Options state, char *buffer, int length)
     wprintw(win,
            "The Strings/Chars displays should match.  Enter any characters, except:\n");
     wprintw(win,
-           "down-arrow or ^N to repeat on next line, 'w' for inner window, 'q' to exit.\n");
+           "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n");
     wclrtoeol(win);
     wprintw(win, "Level %d,%s added %d characters <%s>", level,
            showstate, length, buffer);
@@ -163,7 +206,7 @@ ColOf(char *buffer, int length, int margin)
 
 #define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n)))
 static void
-test_adds(int level)
+recursive_test(int level)
 {
     static bool first = TRUE;
 
@@ -189,12 +232,22 @@ test_adds(int level)
        static char cmd[80];
        setlocale(LC_ALL, "");
 
-       putenv(strcpy(cmd, "TABSIZE=8"));
+       _nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd));
+       putenv(cmd);
 
        initscr();
        (void) cbreak();        /* take input chars one at a time, no wait for \n */
        (void) noecho();        /* don't echo input */
        keypad(stdscr, TRUE);
+
+       /*
+        * Show the characters added in color, to distinguish from those that
+        * are shifted.
+        */
+       if (has_colors()) {
+           start_color();
+           init_pair(1, COLOR_WHITE, COLOR_BLUE);
+       }
     }
 
     limit = LINES - 5;
@@ -212,14 +265,14 @@ test_adds(int level)
     keypad(work, TRUE);
 
     for (col = margin + 1; col < COLS; col += MY_TABSIZE)
-       mvwvline(work, row, col, '.', limit - 2);
+       MvWVLine(work, row, col, '.', limit - 2);
 
-    mvwvline(work, row, margin, ACS_VLINE, limit - 2);
-    mvwvline(work, row, margin + 1, ACS_VLINE, limit - 2);
+    MvWVLine(work, row, margin, ACS_VLINE, limit - 2);
+    MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2);
     limit /= 2;
 
-    mvwaddchstr(work, 1, 2, ChStr("String"));
-    mvwaddchstr(work, limit + 1, 2, ChStr("Chars"));
+    MvWAddChStr(work, 1, 2, ChStr("String"));
+    MvWAddChStr(work, limit + 1, 2, ChStr("Chars"));
     wnoutrefresh(work);
 
     buffer[length = 0] = '\0';
@@ -228,27 +281,26 @@ test_adds(int level)
 
     doupdate();
 
-    /*
-     * Show the characters added in color, to distinguish from those that
-     * are shifted.
-     */
     if (has_colors()) {
-       start_color();
-       init_pair(1, COLOR_WHITE, COLOR_BLUE);
-       wbkgdset(work, COLOR_PAIR(1) | ' ');
+       show_attr = (chtype) COLOR_PAIR(1);
+       wbkgdset(work, show_attr | ' ');
+    } else {
+       show_attr = A_STANDOUT;
     }
 
     while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) {
        wmove(work, row, margin + 1);
        switch (ch) {
        case key_RECUR:
-           test_adds(level + 1);
+           recursive_test(level + 1);
 
-           touchwin(look);
+           if (look)
+               touchwin(look);
            touchwin(work);
            touchwin(show);
 
-           wnoutrefresh(look);
+           if (look)
+               wnoutrefresh(look);
            wnoutrefresh(work);
            wnoutrefresh(show);
 
@@ -265,12 +317,12 @@ test_adds(int level)
                        for (col = 0; col < length; col += n_opt) {
                            col2 = ColOf(buffer, col, margin);
                            if (move(row, col2) != ERR) {
-                               AddNStr(ChStr(buffer + col), LEN(col));
+                               AddNStr(ChStr2(buffer + col), LEN(col));
                            }
                        }
                    } else {
                        if (move(row, col2) != ERR) {
-                           AddStr(ChStr(buffer));
+                           AddStr(ChStr2(buffer));
                        }
                    }
                    break;
@@ -278,10 +330,10 @@ test_adds(int level)
                    if (n_opt > 1) {
                        for (col = 0; col < length; col += n_opt) {
                            col2 = ColOf(buffer, col, margin);
-                           MvAddNStr(row, col2, ChStr(buffer + col), LEN(col));
+                           MvAddNStr(row, col2, ChStr2(buffer + col), LEN(col));
                        }
                    } else {
-                       MvAddStr(row, col2, ChStr(buffer));
+                       MvAddStr(row, col2, ChStr2(buffer));
                    }
                    break;
                case oWindow:
@@ -289,12 +341,12 @@ test_adds(int level)
                        for (col = 0; col < length; col += n_opt) {
                            col2 = ColOf(buffer, col, margin);
                            if (wmove(work, row, col2) != ERR) {
-                               WAddNStr(work, ChStr(buffer + col), LEN(col));
+                               WAddNStr(work, ChStr2(buffer + col), LEN(col));
                            }
                        }
                    } else {
                        if (wmove(work, row, col2) != ERR) {
-                           WAddStr(work, ChStr(buffer));
+                           WAddStr(work, ChStr2(buffer));
                        }
                    }
                    break;
@@ -302,11 +354,11 @@ test_adds(int level)
                    if (n_opt > 1) {
                        for (col = 0; col < length; col += n_opt) {
                            col2 = ColOf(buffer, col, margin);
-                           MvWAddNStr(work, row, col2, ChStr(buffer + col),
+                           MvWAddNStr(work, row, col2, ChStr2(buffer + col),
                                       LEN(col));
                        }
                    } else {
-                       MvWAddStr(work, row, col2, ChStr(buffer));
+                       MvWAddStr(work, row, col2, ChStr2(buffer));
                    }
                    break;
                }
@@ -354,19 +406,19 @@ test_adds(int level)
            switch (option) {
            case oDefault:
                if (move(row, col) != ERR) {
-                   AddStr(ChStr(buffer + length - 1));
+                   AddStr(ChStr2(buffer + length - 1));
                }
                break;
            case oMove:
-               MvAddStr(row, col, ChStr(buffer + length - 1));
+               MvAddStr(row, col, ChStr2(buffer + length - 1));
                break;
            case oWindow:
                if (wmove(work, row, col) != ERR) {
-                   WAddStr(work, ChStr(buffer + length - 1));
+                   WAddStr(work, ChStr2(buffer + length - 1));
                }
                break;
            case oMoveWindow:
-               MvWAddStr(work, row, col, ChStr(buffer + length - 1));
+               MvWAddStr(work, row, col, ChStr2(buffer + length - 1));
                break;
            }
 
@@ -400,10 +452,10 @@ test_adds(int level)
        }
     }
     if (level > 0) {
-       delwin(show);
        delwin(work);
        delwin(look);
     }
+    delwin(show);
 }
 
 static void
@@ -417,6 +469,7 @@ usage(void)
        ,"  -f FILE read data from given file"
        ,"  -n NUM  limit string-adds to NUM bytes on ^N replay"
        ,"  -m      perform wmove/move separately from add-functions"
+       ,"  -p      pass-thru control characters without using unctrl()"
        ,"  -w      use window-parameter even when stdscr would be implied"
     };
     unsigned n;
@@ -432,7 +485,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
 
     setlocale(LC_ALL, "");
 
-    while ((ch = getopt(argc, argv, "f:mn:w")) != -1) {
+    while ((ch = getopt(argc, argv, "f:mn:pw")) != -1) {
        switch (ch) {
        case 'f':
            init_linedata(optarg);
@@ -445,6 +498,9 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
            if (n_opt == 0)
                n_opt = -1;
            break;
+       case 'p':
+           pass_ctls = TRUE;
+           break;
        case 'w':
            w_opt = TRUE;
            break;
@@ -456,7 +512,10 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
     if (optind < argc)
        usage();
 
-    test_adds(0);
+    recursive_test(0);
     endwin();
+#if NO_LEAKS
+    free(temp_buffer);
+#endif
     ExitProgram(EXIT_SUCCESS);
 }