X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Ftest_add_wchstr.c;h=a48f2c49e1c26f6c5b563c655c9b9eb9768bd9fb;hp=3413a37b969782cd7ece067189ebef0620a1dc8a;hb=03f728e5bb3630a54fffc4a2ff2f8dbfcce9088e;hpb=52aa842907b31bb56fb5133da3f023b45bd4355f diff --git a/test/test_add_wchstr.c b/test/test_add_wchstr.c index 3413a37b..a48f2c49 100644 --- a/test/test_add_wchstr.c +++ b/test/test_add_wchstr.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2009,2010 Free Software Foundation, Inc. * + * Copyright (c) 2009,2010,2011 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 * @@ -26,7 +26,7 @@ * authorization. * ****************************************************************************/ /* - * $Id: test_add_wchstr.c,v 1.9 2010/11/13 21:14:50 tom Exp $ + * $Id: test_add_wchstr.c,v 1.15 2011/01/15 18:15:11 tom Exp $ * * Demonstrate the waddwchstr() and wadd_wch functions. * Thomas Dickey - 2009/9/12 @@ -73,6 +73,7 @@ typedef enum { } Options; static bool m_opt = FALSE; +static bool pass_ctls = FALSE; static bool w_opt = FALSE; static int n_opt = -1; @@ -81,6 +82,7 @@ static size_t temp_length; #define TempBuffer(source_len, source_cast) \ if (source != 0) { \ + const char *temp; \ size_t need = source_len + 1; \ wchar_t have[2]; \ int n = 0; \ @@ -93,7 +95,18 @@ static size_t temp_length; have[1] = 0; \ do { \ have[0] = source_cast; \ - setcchar(&temp_buffer[n++], have, A_NORMAL, 0, NULL); \ + if (!pass_ctls \ + && have[0] != 0 \ + && have[0] < 256 \ + && (temp = unctrl((chtype) have[0])) != 0 \ + && strlen(temp) > 1) { \ + while (*temp != '\0') { \ + have[0] = *temp++; \ + setcchar(&temp_buffer[n++], have, A_NORMAL, 0, NULL); \ + } \ + } else { \ + setcchar(&temp_buffer[n++], have, A_NORMAL, 0, NULL); \ + } \ } while (have[0] != 0); \ } else if (temp_buffer != 0) { \ free(temp_buffer); \ @@ -102,6 +115,26 @@ static size_t temp_length; } \ return temp_buffer; +static size_t +ChWLen(const wchar_t *source) +{ + size_t result = wcslen(source); + + if (!pass_ctls) { + size_t adjust = 0; + size_t n; + const char *s; + + for (n = 0; n < result; ++n) { + if (source[n] < 256 && (s = unctrl((chtype) source[n])) != 0) { + adjust += (strlen(s) - 1); + } + } + result += adjust; + } + return result; +} + static cchar_t * ChStr(const char *source) { @@ -111,13 +144,13 @@ ChStr(const char *source) static cchar_t * ChWStr(const wchar_t *source) { - TempBuffer(wcslen(source), *source++); + TempBuffer(ChWLen(source), *source++); } static void legend(WINDOW *win, int level, Options state, wchar_t *buffer, int length) { - NCURSES_CONST char *showstate; + const char *showstate; switch (state) { default: @@ -139,7 +172,7 @@ legend(WINDOW *win, int level, Options state, wchar_t *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 <", level, showstate, length); @@ -499,6 +532,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; @@ -514,7 +548,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); @@ -527,6 +561,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;