X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Ftest_addchstr.c;h=2aae844e7651bdf4215944eb6448e8d247f77991;hp=9f8a34910fc0c32cedd12dde3d66cb9514651200;hb=445bfe6a0fb691e3433d586a188be2ebe062384b;hpb=3511767aa77f332927de0c4a610f9fb37ea18101 diff --git a/test/test_addchstr.c b/test/test_addchstr.c index 9f8a3491..2aae844e 100644 --- a/test/test_addchstr.c +++ b/test/test_addchstr.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2009 Free Software Foundation, Inc. * + * Copyright (c) 2009-2010,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 * @@ -26,7 +26,7 @@ * authorization. * ****************************************************************************/ /* - * $Id: test_addchstr.c,v 1.4 2009/09/13 00:00:58 tom Exp $ + * $Id: test_addchstr.c,v 1.18 2012/12/16 00:36:27 tom Exp $ * * Demonstrate the waddchstr() and waddch functions. * Thomas Dickey - 2009/9/12 @@ -36,18 +36,19 @@ #include +#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 @@ -60,31 +61,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 attr_t 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 +124,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 +162,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); @@ -195,6 +239,15 @@ test_adds(int level) (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,14 +281,11 @@ 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 = (attr_t) COLOR_PAIR(1); + wbkgdset(work, show_attr | ' '); + } else { + show_attr = A_STANDOUT; } while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) { @@ -244,11 +294,13 @@ test_adds(int level) case key_RECUR: test_adds(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; } @@ -346,7 +398,7 @@ test_adds(int level) beep(); break; } - buffer[length++] = ch; + buffer[length++] = (char) ch; buffer[length] = '\0'; /* put the string in, one character at a time */ @@ -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;