1*e4a6e799Ssimonb #include <setjmp.h>
2*e4a6e799Ssimonb #include "lesstest.h"
3*e4a6e799Ssimonb
4*e4a6e799Ssimonb extern TermInfo terminfo;
5*e4a6e799Ssimonb
6*e4a6e799Ssimonb int verbose = 0;
7*e4a6e799Ssimonb int less_quit = 0;
8*e4a6e799Ssimonb int details = 0;
9*e4a6e799Ssimonb int err_only = 0;
10*e4a6e799Ssimonb char* lt_screen = "./lt_screen";
11*e4a6e799Ssimonb char* lt_screen_opts = NULL;
12*e4a6e799Ssimonb
13*e4a6e799Ssimonb static char* testfile = NULL;
14*e4a6e799Ssimonb
usage(void)15*e4a6e799Ssimonb static int usage(void) {
16*e4a6e799Ssimonb fprintf(stderr, "usage: lesstest -o file.lt [-w#] [-h#] [-eEdv] [-S lt_screen-opts] [--] less.exe [flags] textfile\n");
17*e4a6e799Ssimonb fprintf(stderr, " or: lesstest -t file.lt less.exe\n");
18*e4a6e799Ssimonb return 0;
19*e4a6e799Ssimonb }
20*e4a6e799Ssimonb
setup(int argc,char * const * argv)21*e4a6e799Ssimonb static int setup(int argc, char* const* argv) {
22*e4a6e799Ssimonb char* logfile = NULL;
23*e4a6e799Ssimonb int ch;
24*e4a6e799Ssimonb while ((ch = getopt(argc, argv, "deEo:s:S:t:v")) != -1) {
25*e4a6e799Ssimonb switch (ch) {
26*e4a6e799Ssimonb case 'd':
27*e4a6e799Ssimonb details = 1;
28*e4a6e799Ssimonb break;
29*e4a6e799Ssimonb case 'e':
30*e4a6e799Ssimonb err_only = 1;
31*e4a6e799Ssimonb break;
32*e4a6e799Ssimonb case 'E':
33*e4a6e799Ssimonb err_only = 2;
34*e4a6e799Ssimonb break;
35*e4a6e799Ssimonb case 'o':
36*e4a6e799Ssimonb logfile = optarg;
37*e4a6e799Ssimonb break;
38*e4a6e799Ssimonb case 's':
39*e4a6e799Ssimonb lt_screen = optarg;
40*e4a6e799Ssimonb break;
41*e4a6e799Ssimonb case 'S':
42*e4a6e799Ssimonb lt_screen_opts = optarg;
43*e4a6e799Ssimonb break;
44*e4a6e799Ssimonb case 't':
45*e4a6e799Ssimonb testfile = optarg;
46*e4a6e799Ssimonb break;
47*e4a6e799Ssimonb case 'v':
48*e4a6e799Ssimonb verbose = 1;
49*e4a6e799Ssimonb break;
50*e4a6e799Ssimonb default:
51*e4a6e799Ssimonb return usage();
52*e4a6e799Ssimonb }
53*e4a6e799Ssimonb }
54*e4a6e799Ssimonb if (logfile != NULL && !log_open(logfile)) {
55*e4a6e799Ssimonb fprintf(stderr, "cannot create %s: %s\n", logfile, strerror(errno));
56*e4a6e799Ssimonb return 0;
57*e4a6e799Ssimonb }
58*e4a6e799Ssimonb return 1;
59*e4a6e799Ssimonb }
60*e4a6e799Ssimonb
main(int argc,char * const * argv,char * const * envp)61*e4a6e799Ssimonb int main(int argc, char* const* argv, char* const* envp) {
62*e4a6e799Ssimonb if (!setup(argc, argv))
63*e4a6e799Ssimonb return RUN_ERR;
64*e4a6e799Ssimonb int ok = 0;
65*e4a6e799Ssimonb if (testfile != NULL) { // run existing test
66*e4a6e799Ssimonb if (optind+1 != argc) {
67*e4a6e799Ssimonb usage();
68*e4a6e799Ssimonb return RUN_ERR;
69*e4a6e799Ssimonb }
70*e4a6e799Ssimonb ok = run_testfile(testfile, argv[optind]);
71*e4a6e799Ssimonb } else { // gen; create new test
72*e4a6e799Ssimonb if (optind+2 > argc) {
73*e4a6e799Ssimonb usage();
74*e4a6e799Ssimonb return RUN_ERR;
75*e4a6e799Ssimonb }
76*e4a6e799Ssimonb log_file_header();
77*e4a6e799Ssimonb ok = run_interactive(argv+optind, argc-optind, envp);
78*e4a6e799Ssimonb log_close();
79*e4a6e799Ssimonb }
80*e4a6e799Ssimonb return ok ? RUN_OK : RUN_ERR;
81*e4a6e799Ssimonb }
82