diff options
Diffstat (limited to 'ncurses-5.2/test/view.c')
-rw-r--r-- | ncurses-5.2/test/view.c | 447 |
1 files changed, 0 insertions, 447 deletions
diff --git a/ncurses-5.2/test/view.c b/ncurses-5.2/test/view.c deleted file mode 100644 index 0627948..0000000 --- a/ncurses-5.2/test/view.c +++ /dev/null @@ -1,447 +0,0 @@ -/* - * view.c -- a silly little viewer program - * - * written by Eric S. Raymond <esr@snark.thyrsus.com> December 1994 - * to test the scrolling code in ncurses. - * - * modified by Thomas Dickey <dickey@clark.net> July 1995 to demonstrate - * the use of 'resizeterm()', and May 2000 to illustrate wide-character - * handling. - * - * Takes a filename argument. It's a simple file-viewer with various - * scroll-up and scroll-down commands. - * - * n -- scroll one line forward - * p -- scroll one line back - * - * Either command accepts a numeric prefix interpreted as a repeat count. - * Thus, typing `5n' should scroll forward 5 lines in the file. - * - * The way you can tell this is working OK is that, in the trace file, - * there should be one scroll operation plus a small number of line - * updates, as opposed to a whole-page update. This means the physical - * scroll operation worked, and the refresh() code only had to do a - * partial repaint. - * - * $Id$ - */ - -#include <test.priv.h> - -#include <string.h> -#include <ctype.h> -#include <signal.h> - -#if HAVE_TERMIOS_H -# include <termios.h> -#else -# include <sgtty.h> -#endif - -#if !defined(sun) || !HAVE_TERMIOS_H -# if HAVE_SYS_IOCTL_H -# include <sys/ioctl.h> -# endif -#endif - -/* This is needed to compile 'struct winsize' */ -#if NEED_PTEM_H -#include <sys/stream.h> -#include <sys/ptem.h> -#endif - -static RETSIGTYPE finish(int sig) GCC_NORETURN; -static void show_all(void); - -#if defined(SIGWINCH) && defined(TIOCGWINSZ) && HAVE_RESIZETERM -#define CAN_RESIZE 1 -#else -#define CAN_RESIZE 0 -#endif - -#if CAN_RESIZE -static RETSIGTYPE adjust(int sig); -static int interrupted; -#endif - -static int waiting; -static int shift; -static int utf8_mode = FALSE; - -static char *fname; -static chtype **lines; -static chtype **lptr; - -static void -usage(void) -{ - static const char *msg[] = - { - "Usage: view [options] file" - ,"" - ,"Options:" - ," -n NUM specify maximum number of lines (default 1000)" -#if defined(KEY_RESIZE) - ," -r use experimental KEY_RESIZE rather than our own handler" -#endif -#ifdef TRACE - ," -t trace screen updates" - ," -T NUM specify trace mask" -#endif - ," -u translate UTF-8 data" - }; - size_t n; - for (n = 0; n < SIZEOF(msg); n++) - fprintf(stderr, "%s\n", msg[n]); - exit(EXIT_FAILURE); -} - -static int -ch_len(chtype * src) -{ - int result = 0; - while (*src++) - result++; - return result; -} - -/* - * Allocate a string into an array of chtype's. If UTF-8 mode is - * active, translate the string accordingly. - */ -static chtype * -ch_dup(char *src) -{ - unsigned len = strlen(src); - chtype *dst = typeMalloc(chtype, len + 1); - unsigned j, k; - unsigned utf_count = 0; - unsigned utf_char = 0; - -#define UCS_REPL 0xfffd - - for (j = k = 0; j < len; j++) { - if (utf8_mode) { - unsigned c = src[j] & 0xff; - /* Combine UTF-8 into Unicode */ - if (c < 0x80) { - /* We received an ASCII character */ - if (utf_count > 0) - dst[k++] = UCS_REPL; /* prev. sequence incomplete */ - dst[k++] = c; - utf_count = 0; - } else if (c < 0xc0) { - /* We received a continuation byte */ - if (utf_count < 1) { - dst[k++] = UCS_REPL; /* ... unexpectedly */ - } else { - if (!utf_char && !((c & 0x7f) >> (7 - utf_count))) { - utf_char = UCS_REPL; - } - /* characters outside UCS-2 become UCS_REPL */ - if (utf_char > 0x03ff) { - /* value would be >0xffff */ - utf_char = UCS_REPL; - } else { - utf_char <<= 6; - utf_char |= (c & 0x3f); - } - utf_count--; - if (utf_count == 0) - dst[k++] = utf_char; - } - } else { - /* We received a sequence start byte */ - if (utf_count > 0) - dst[k++] = UCS_REPL; /* prev. sequence incomplete */ - if (c < 0xe0) { - utf_count = 1; - utf_char = (c & 0x1f); - if (!(c & 0x1e)) - utf_char = UCS_REPL; /* overlong sequence */ - } else if (c < 0xf0) { - utf_count = 2; - utf_char = (c & 0x0f); - } else if (c < 0xf8) { - utf_count = 3; - utf_char = (c & 0x07); - } else if (c < 0xfc) { - utf_count = 4; - utf_char = (c & 0x03); - } else if (c < 0xfe) { - utf_count = 5; - utf_char = (c & 0x01); - } else { - dst[k++] = UCS_REPL; - utf_count = 0; - } - } - } else { - dst[k++] = src[j]; - } - } - dst[k] = 0; - return dst; -} - -int -main(int argc, char *argv[]) -{ - int MAXLINES = 1000; - FILE *fp; - char buf[BUFSIZ]; - int i; - chtype **olptr; - int done = FALSE; - int length = 0; -#if CAN_RESIZE - bool use_resize = TRUE; -#endif - - while ((i = getopt(argc, argv, "n:rtT:u")) != EOF) { - switch (i) { - case 'n': - if ((MAXLINES = atoi(optarg)) < 1) - usage(); - break; -#if CAN_RESIZE - case 'r': - use_resize = FALSE; - break; -#endif -#ifdef TRACE - case 'T': - trace(atoi(optarg)); - break; - case 't': - trace(TRACE_CALLS); - break; -#endif - case 'u': - utf8_mode = TRUE; - break; - default: - usage(); - } - } - if (optind + 1 != argc) - usage(); - - if ((lines = typeMalloc(chtype *, MAXLINES + 2)) == 0) - usage(); - - fname = argv[optind]; - if ((fp = fopen(fname, "r")) == 0) { - perror(fname); - return EXIT_FAILURE; - } - - (void) signal(SIGINT, finish); /* arrange interrupts to terminate */ -#if CAN_RESIZE - if (use_resize) - (void) signal(SIGWINCH, adjust); /* arrange interrupts to resize */ -#endif - - /* slurp the file */ - for (lptr = &lines[0]; (lptr - lines) < MAXLINES; lptr++) { - char temp[BUFSIZ], *s, *d; - int col; - - if (fgets(buf, sizeof(buf), fp) == 0) - break; - - /* convert tabs so that shift will work properly */ - for (s = buf, d = temp, col = 0; (*d = *s) != '\0'; s++) { - if (*d == '\n') { - *d = '\0'; - break; - } else if (*d == '\t') { - col = (col | 7) + 1; - while ((d - temp) != col) - *d++ = ' '; - } else if (isprint(*d) || utf8_mode) { - col++; - d++; - } else { - sprintf(d, "\\%03o", *s & 0xff); - d += strlen(d); - col = (d - temp); - } - } - *lptr = ch_dup(temp); - } - (void) fclose(fp); - length = lptr - lines; - - (void) initscr(); /* initialize the curses library */ - keypad(stdscr, TRUE); /* enable keyboard mapping */ - (void) nonl(); /* tell curses not to do NL->CR/NL on output */ - (void) cbreak(); /* take input chars one at a time, no wait for \n */ - (void) noecho(); /* don't echo input */ - idlok(stdscr, TRUE); /* allow use of insert/delete line */ - - lptr = lines; - while (!done) { - int n, c; - bool got_number; - - show_all(); - - got_number = FALSE; - n = 0; - for (;;) { -#if CAN_RESIZE - if (interrupted) - adjust(0); -#endif - waiting = TRUE; - c = getch(); - waiting = FALSE; - if ((c < 127) && isdigit(c)) { - if (!got_number) { - mvprintw(0, 0, "Count: "); - clrtoeol(); - } - addch(c); - n = 10 * n + (c - '0'); - got_number = TRUE; - } else - break; - } - if (!got_number && n == 0) - n = 1; - - switch (c) { - case KEY_DOWN: - case 'n': - olptr = lptr; - for (i = 0; i < n; i++) - if ((lptr - lines) < (length - LINES + 1)) - lptr++; - else - break; - wscrl(stdscr, lptr - olptr); - break; - - case KEY_UP: - case 'p': - olptr = lptr; - for (i = 0; i < n; i++) - if (lptr > lines) - lptr--; - else - break; - wscrl(stdscr, lptr - olptr); - break; - - case 'h': - case KEY_HOME: - lptr = lines; - break; - - case 'e': - case KEY_END: - if (length > LINES) - lptr = lines + length - LINES + 1; - else - lptr = lines; - break; - - case 'r': - case KEY_RIGHT: - shift++; - break; - - case 'l': - case KEY_LEFT: - if (shift) - shift--; - else - beep(); - break; - - case 'q': - done = TRUE; - break; - -#ifdef KEY_RESIZE - case KEY_RESIZE: /* ignore this; ncurses will repaint */ - break; -#endif -#if CAN_RESIZE - case ERR: - break; -#endif - default: - beep(); - } - } - - finish(0); /* we're done */ -} - -static RETSIGTYPE -finish(int sig) -{ - endwin(); - exit(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS); -} - -#if CAN_RESIZE -/* - * This uses functions that are "unsafe", but it seems to work on SunOS and - * Linux. The 'wrefresh(curscr)' is needed to force the refresh to start from - * the top of the screen -- some xterms mangle the bitmap while resizing. - */ -static RETSIGTYPE -adjust(int sig) -{ - if (waiting || sig == 0) { - struct winsize size; - - if (ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) { - resizeterm(size.ws_row, size.ws_col); - wrefresh(curscr); /* Linux needs this */ - show_all(); - } - interrupted = FALSE; - } else { - interrupted = TRUE; - } - (void) signal(SIGWINCH, adjust); /* some systems need this */ -} -#endif /* CAN_RESIZE */ - -static void -show_all(void) -{ - int i; - char temp[BUFSIZ]; - chtype *s; - -#if CAN_RESIZE - sprintf(temp, "(%3dx%3d) col %d ", LINES, COLS, shift); - i = strlen(temp); - sprintf(temp + i, "view %.*s", (int) (sizeof(temp) - 7 - i), fname); -#else - sprintf(temp, "view %.*s", (int) sizeof(temp) - 7, fname); -#endif - move(0, 0); - printw("%.*s", COLS, temp); - clrtoeol(); - - scrollok(stdscr, FALSE); /* prevent screen from moving */ - for (i = 1; i < LINES; i++) { - move(i, 0); - printw("%3ld:", (long) (lptr + i - lines)); - clrtoeol(); - if ((s = lptr[i - 1]) != 0) { - int len = ch_len(s); - if (len > shift) - addchstr(s + shift); - } - } - setscrreg(1, LINES - 1); - scrollok(stdscr, TRUE); - refresh(); -} |