X-Git-Url: http://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=test%2Finchs.c;h=1d1691a61bddc975cfbc4508ec69e66b2c993e2b;hb=HEAD;hp=38747a2f39bd2c70162b0b16831a420b99374f3a;hpb=a1aff38c9421e79f92cd4e8ab0587fdf3806cc28;p=ncurses.git diff --git a/test/inchs.c b/test/inchs.c index 38747a2f..b5922dd6 100644 --- a/test/inchs.c +++ b/test/inchs.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2007 Free Software Foundation, Inc. * + * Copyright 2019-2020,2022 Thomas E. Dickey * + * Copyright 2007-2012,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 * @@ -26,7 +27,9 @@ * authorization. * ****************************************************************************/ /* - * $Id: inchs.c,v 1.6 2007/06/09 21:25:06 tom Exp $ + * $Id: inchs.c,v 1.19 2022/12/11 00:01:39 tom Exp $ + * + * Author: Thomas E Dickey */ /* chtype inch(void); @@ -44,10 +47,21 @@ */ #include +#include #define BASE_Y 7 #define MAX_COLS 1024 +static void +failed(const char *s) +{ + int save = errno; + endwin(); + errno = save; + perror(s); + ExitProgram(EXIT_FAILURE); +} + static bool Quit(int ch) { @@ -57,13 +71,23 @@ Quit(int ch) static int test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) { + static const char *help[] = + { + "Test input from screen using inch(), etc., in a moveable viewport.", + "", + "Commands:", + " ESC/^Q - quit", + " h,j,k,l (and arrow-keys) - move viewport", + " w - recur to new window", + " for next input file", + 0 + }; WINDOW *txtbox = 0; WINDOW *txtwin = 0; FILE *fp; int ch, j; int txt_x = 0, txt_y = 0; int base_y; - int limit; chtype text[MAX_COLS]; if (argv[level] == 0) { @@ -85,6 +109,8 @@ test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) txtwin = stdscr; base_y = BASE_Y; } + if (txtwin == 0) + failed("cannot create txtwin"); keypad(txtwin, TRUE); /* enable keyboard mapping */ (void) cbreak(); /* take input chars one at a time, no wait for \n */ @@ -96,16 +122,18 @@ test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) if ((fp = fopen(argv[level], "r")) != 0) { while ((j = fgetc(fp)) != EOF) { - if (waddch(txtwin, j) != OK) { + if (waddch(txtwin, UChar(j)) != OK) { break; } } + fclose(fp); } else { wprintw(txtwin, "Cannot open:\n%s", argv[1]); } - fclose(fp); while (!Quit(j = mvwgetch(txtwin, txt_y, txt_x))) { + int limit; + switch (j) { case KEY_DOWN: case 'j': @@ -145,21 +173,24 @@ test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) wnoutrefresh(txtwin); } break; + case HELP_KEY_1: + popup_msg(txtwin, help); + break; default: beep(); break; } - mvwprintw(chrwin, 0, 0, "char:"); + MvWPrintw(chrwin, 0, 0, "char:"); wclrtoeol(chrwin); if (txtwin != stdscr) { wmove(txtwin, txt_y, txt_x); - if ((ch = winch(txtwin)) != ERR) { + if ((ch = (int) winch(txtwin)) != ERR) { if (waddch(chrwin, (chtype) ch) != ERR) { for (j = txt_x + 1; j < getmaxx(txtwin); ++j) { - if ((ch = mvwinch(txtwin, txt_y, j)) != ERR) { + if ((ch = (int) mvwinch(txtwin, txt_y, j)) != ERR) { if (waddch(chrwin, (chtype) ch) == ERR) { break; } @@ -172,10 +203,10 @@ test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) } else { move(txt_y, txt_x); - if ((ch = inch()) != ERR) { + if ((ch = (int) inch()) != ERR) { if (waddch(chrwin, (chtype) ch) != ERR) { for (j = txt_x + 1; j < getmaxx(txtwin); ++j) { - if ((ch = mvinch(txt_y, j)) != ERR) { + if ((ch = (int) mvinch(txt_y, j)) != ERR) { if (waddch(chrwin, (chtype) ch) == ERR) { break; } @@ -188,7 +219,7 @@ test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) } wnoutrefresh(chrwin); - mvwprintw(strwin, 0, 0, "text:"); + MvWPrintw(strwin, 0, 0, "text:"); wclrtobot(strwin); limit = getmaxx(strwin) - 5; @@ -196,38 +227,38 @@ test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) if (txtwin != stdscr) { wmove(txtwin, txt_y, txt_x); if (winchstr(txtwin, text) != ERR) { - mvwaddchstr(strwin, 0, 5, text); + MvWAddChStr(strwin, 0, 5, text); } wmove(txtwin, txt_y, txt_x); if (winchnstr(txtwin, text, limit) != ERR) { - mvwaddchstr(strwin, 1, 5, text); + MvWAddChStr(strwin, 1, 5, text); } if (mvwinchstr(txtwin, txt_y, txt_x, text) != ERR) { - mvwaddchstr(strwin, 2, 5, text); + MvWAddChStr(strwin, 2, 5, text); } if (mvwinchnstr(txtwin, txt_y, txt_x, text, limit) != ERR) { - mvwaddchstr(strwin, 3, 5, text); + MvWAddChStr(strwin, 3, 5, text); } } else { move(txt_y, txt_x); if (inchstr(text) != ERR) { - mvwaddchstr(strwin, 0, 5, text); + MvWAddChStr(strwin, 0, 5, text); } move(txt_y, txt_x); if (inchnstr(text, limit) != ERR) { - mvwaddchstr(strwin, 1, 5, text); + MvWAddChStr(strwin, 1, 5, text); } if (mvinchstr(txt_y, txt_x, text) != ERR) { - mvwaddchstr(strwin, 2, 5, text); + MvWAddChStr(strwin, 2, 5, text); } if (mvinchnstr(txt_y, txt_x, text, limit) != ERR) { - mvwaddchstr(strwin, 3, 5, text); + MvWAddChStr(strwin, 3, 5, text); } } @@ -240,19 +271,49 @@ test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) return TRUE; } +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: inchs [options] file1 [file2 [...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + int main(int argc, char *argv[]) { WINDOW *chrbox; WINDOW *chrwin; WINDOW *strwin; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } setlocale(LC_ALL, ""); - if (argc < 2) { - fprintf(stderr, "usage: %s file\n", argv[0]); - return EXIT_FAILURE; - } + if (optind + 1 > argc) + usage(FALSE); initscr(); @@ -263,8 +324,8 @@ main(int argc, char *argv[]) chrwin = derwin(chrbox, 1, COLS - 2, 1, 1); strwin = derwin(chrbox, 4, COLS - 2, 2, 1); - test_inchs(1, argv, chrwin, strwin); + test_inchs(optind, argv, chrwin, strwin); endwin(); - return EXIT_SUCCESS; + ExitProgram(EXIT_SUCCESS); }