X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=test%2Fview.c;h=72e0cfbb6b9768ed43227a977c799d0a68c45230;hb=6641601a9dd7f34deeaa978899b3730b27635afb;hp=c4c53c79a1dba1d674e163be0bd0bd42cdf10855;hpb=56a81c7e79f73d397cc8074401d039f59c34cad5;p=ncurses.git diff --git a/test/view.c b/test/view.c index c4c53c79..72e0cfbb 100644 --- a/test/view.c +++ b/test/view.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2019-2020,2021 Thomas E. Dickey * + * Copyright 2019-2021,2022 Thomas E. Dickey * * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * @@ -52,7 +52,7 @@ * scroll operation worked, and the refresh() code only had to do a * partial repaint. * - * $Id: view.c,v 1.141 2021/05/08 15:57:04 tom Exp $ + * $Id: view.c,v 1.145 2022/12/04 00:40:11 tom Exp $ */ #include @@ -257,9 +257,12 @@ read_file(const char *filename) } len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp); - my_blob[sb.st_size] = '\0'; fclose(fp); + if (len > (size_t) sb.st_size) + len = (size_t) sb.st_size; + my_blob[len] = '\0'; + for (pass = 0; pass < 2; ++pass) { char *base = my_blob; k = 0; @@ -273,12 +276,19 @@ read_file(const char *filename) ++k; } } + if (base != (my_blob + j)) { + if (pass) + my_vec[k] = base; + ++k; + } num_lines = k; - if (base != (my_blob + j)) - ++num_lines; - if (!pass && - ((my_vec = typeCalloc(char *, (size_t) k + 2)) == 0)) { - failed("cannot allocate line-vector #1"); + if (pass == 0) { + if (((my_vec = typeCalloc(char *, (size_t) k + 2)) == 0)) { + failed("cannot allocate line-vector #1"); + } + } else { + if (my_vec[0] == NULL) + my_vec[0] = my_blob; } } @@ -367,12 +377,13 @@ read_file(const char *filename) } static GCC_NORETURN void -usage(void) +usage(int ok) { static const char *msg[] = { "Usage: view [options] file" ,"" + ,USAGE_COMMON ,"Options:" ," -c use color if terminal supports it" ," -i ignore INT, QUIT, TERM signals" @@ -388,8 +399,11 @@ usage(void) size_t 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, char *argv[]) @@ -419,6 +433,7 @@ main(int argc, char *argv[]) 0 }; + int ch; int i; int my_delay = 0; NCURSES_CH_T **olptr; @@ -431,8 +446,8 @@ main(int argc, char *argv[]) setlocale(LC_ALL, ""); - while ((i = getopt(argc, argv, "cinstT:")) != -1) { - switch (i) { + while ((ch = getopt(argc, argv, OPTS_COMMON "cinstT:")) != -1) { + switch (ch) { case 'c': try_color = TRUE; break; @@ -453,7 +468,7 @@ main(int argc, char *argv[]) char *next = 0; int tvalue = (int) strtol(optarg, &next, 0); if (tvalue < 0 || (next != 0 && *next != 0)) - usage(); + usage(FALSE); curses_trace((unsigned) tvalue); } break; @@ -461,12 +476,16 @@ main(int argc, char *argv[]) curses_trace(TRACE_CALLS); break; #endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); default: - usage(); + usage(ch == OPTS_USAGE); + /* NOTREACHED */ } } if (optind + 1 != argc) - usage(); + usage(FALSE); InitAndCatch(initscr(), ignore_sigs ? SIG_IGN : finish); keypad(stdscr, TRUE); /* enable keyboard mapping */