X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fcombine.c;h=7bc909745a2a5c2144b4e003878a6d798aaf8a0f;hp=0a30dd60c7af27d72eca864287645720355448f1;hb=HEAD;hpb=5487d20851d0dea54352bb44817b39e9945f90c2 diff --git a/test/combine.c b/test/combine.c index 0a30dd60..eca72b80 100644 --- a/test/combine.c +++ b/test/combine.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2021 Thomas E. Dickey * + * Copyright 2021,2022 Thomas E. Dickey * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -26,13 +26,17 @@ * authorization. * ****************************************************************************/ /* - * $Id: combine.c,v 1.7 2021/12/12 01:10:28 tom Exp $ + * $Id: combine.c,v 1.23 2022/12/10 22:28:50 tom Exp $ */ #include #if USE_WIDEC_SUPPORT +#include +#include +#include + static int c_opt; static int r_opt; @@ -45,6 +49,15 @@ next_char(int value) return value; } +static int +prev_char(int value) +{ + do { + --value; + } while (!iswprint((wint_t) value)); + return value; +} + static void do_row(int row, int base_ch, int over_ch) { @@ -62,18 +75,18 @@ do_row(int row, int base_ch, int over_ch) source[1] = 0; - source[0] = base_ch; + source[0] = (wchar_t) base_ch; setcchar(&target, source, attr, 0, NULL); add_wch(&target); - source[0] = over_ch; + source[0] = (wchar_t) over_ch; setcchar(&target, source, attr, 0, NULL); add_wch(&target); } else { wchar_t data[3]; - data[0] = base_ch; - data[1] = over_ch; + data[0] = (wchar_t) base_ch; + data[1] = (wchar_t) over_ch; data[2] = 0; if (reverse) attr_on(A_REVERSE, NULL); @@ -106,54 +119,121 @@ prev_over(int value) } static void -do_all(int over_it) +do_all(int left_at, int over_it) { int row; for (row = 0; row < LINES; ++row) { - do_row(row, ' ', 0x300 + over_it); + do_row(row, left_at, 0x300 + over_it); over_it = next_over(over_it); } } static void -usage(void) +show_help(WINDOW *current) +{ + /* *INDENT-OFF* */ + static struct { + int key; + CONST_FMT char * msg; + } help[] = { + { HELP_KEY_1, "Show this screen" }, + { CTRL('L'), "Repaint screen" }, + { '$', "Scroll to end of combining-character range" }, + { '+', "Scroll to next combining-character in range" }, + { KEY_DOWN, "(same as \"+\")" }, + { '-', "Scroll to previous combining-character in range" }, + { KEY_UP, "(same as \"-\")" }, + { '0', "Scroll to beginning of combining-character range" }, + { 'c', "Toggle command-line option \"-c\"" }, + { 'd', "Dump screen using scr_dump unless \"-l\" option used" }, + { 'h', "Scroll test-data left one column" }, + { 'j', "Scroll test-data down one row" }, + { 'k', "Scroll test-data up one row" }, + { 'l', "Scroll test-data right one column" }, + { 'q', "Quit" }, + { ESCAPE, "(same as \"q\")" }, + { QUIT, "(same as \"q\")" }, + { 'r', "Toggle command-line option \"-r\"" }, + }; + /* *INDENT-ON* */ + + char **msgs = typeCalloc(char *, SIZEOF(help) + 3); + size_t s; + int d = 0; + + msgs[d++] = strdup("Test diacritic combining-characters range " + "U+0300..U+036F"); + msgs[d++] = strdup(""); + for (s = 0; s < SIZEOF(help); ++s) { + char *name = strdup(keyname(help[s].key)); + size_t need = (11 + strlen(name) + strlen(help[s].msg)); + msgs[d] = typeMalloc(char, need); + _nc_SPRINTF(msgs[d], _nc_SLIMIT(need) "%-10s%s", name, help[s].msg); + free(name); + ++d; + } + popup_msg2(current, msgs); + for (s = 0; msgs[s] != 0; ++s) { + free(msgs[s]); + } + free(msgs); +} + +static void +usage(int ok) { static const char *msg[] = { - "Usage: combine [options]", - "", - "Demonstrate combining-characters.", - "", - "Options:", - " -c use cchar_t data rather than wchar_t string", - " -r draw even-numbered rows in reverse-video", + "Usage: combine [options]" + ,"" + ,USAGE_COMMON + ,"Demonstrate combining-characters." + ,"" + ,"Options:" + ," -c use cchar_t data rather than wchar_t string" + ," -l FILE log window-dumps to this file" + ," -r draw even-numbered rows in reverse-video" }; unsigned n; for (n = 0; n < SIZEOF(msg); ++n) { fprintf(stderr, "%s\n", msg[n]); } - ExitProgram(EXIT_FAILURE); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); } +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ int -main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) +main(int argc, char *argv[]) { - int n; + int ch; + int left_at = ' '; int over_it = 0; bool done = FALSE; + bool log_option = FALSE; + const char *dump_log = "combine.log"; - while ((n = getopt(argc, argv, "cr")) != -1) { - switch (n) { + while ((ch = getopt(argc, argv, OPTS_COMMON "cl:r")) != -1) { + switch (ch) { case 'c': c_opt = TRUE; break; + case 'l': + log_option = TRUE; + if (!open_dump(optarg)) + usage(FALSE); + break; case 'r': r_opt = TRUE; break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); default: - usage(); - break; + usage(ch == OPTS_USAGE); + /* NOTREACHED */ } } @@ -164,13 +244,40 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) keypad(stdscr, TRUE); do { - do_all(over_it); + do_all(left_at, over_it); switch (getch()) { + case HELP_KEY_1: + show_help(stdscr); + break; case 'q': case QUIT: case ESCAPE: done = TRUE; break; + case CTRL('L'): + redrawwin(stdscr); + break; + case 'd': + if (log_option) + dump_window(stdscr); +#if HAVE_SCR_DUMP + else + scr_dump(dump_log); +#endif + break; + case 'h': + if (left_at > ' ') + left_at = prev_char(left_at); + break; + case 'l': + left_at = next_char(left_at); + break; + case 'c': + c_opt = !c_opt; + break; + case 'r': + r_opt = !r_opt; + break; case KEY_HOME: case '0': over_it = 0; @@ -180,10 +287,12 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) over_it = LAST_OVER; break; case KEY_UP: + case 'k': case '-': over_it = prev_over(over_it); break; case KEY_DOWN: + case 'j': case '+': over_it = next_over(over_it); break;