Better input loop exit and exit status
[iomenu.git] / main.c
blobbce2abaec1b0663bb446c6a6377cd83cff6aedbe
1 #include <ctype.h>
2 #include <fcntl.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <sys/ioctl.h>
7 #include <termios.h>
8 #include <unistd.h>
10 #include "main.h"
13 void
14 usage(void)
16 fputs("usage: iomenu [-n] [-N] [-k key] [-s separator] ", stderr);
17 fputs("[-p prompt] [-l lines]\n", stderr);
19 exit(EXIT_FAILURE);
23 int
24 main(int argc, char *argv[])
26 int i, exit_code, tty_fd = open("/dev/tty", O_RDWR);
27 Buffer *buffer = NULL;
28 Opt *opt = malloc(sizeof(Opt));
30 opt->line_numbers = 0;
31 opt->print_number = 0;
32 opt->validate_key = CONTROL('M');
33 opt->separator = NULL;
34 opt->lines = 30;
35 opt->prompt = "";
37 /* command line arguments */
38 for (i = 1; i < argc; i++) {
39 if (argv[i][0] != '-' || strlen(argv[i]) != 2)
40 usage();
42 switch (argv[i][1]) {
43 case 'n':
44 opt->line_numbers = 1;
45 break;
46 case 'N':
47 opt->print_number = 1;
48 opt->line_numbers = 1;
49 break;
50 case 'k':
51 opt->validate_key = (argv[++i][0] == '^') ?
52 CONTROL(toupper(argv[i][1])): argv[i][0];
53 break;
54 case 's':
55 opt->separator = argv[++i];
56 break;
57 case 'l':
58 if (sscanf(argv[++i], "%d", &opt->lines) <= 0)
59 die("wrong number format after -l");
60 break;
61 case 'p':
62 if (++i >= argc)
63 die("wrong string format after -p");
64 opt->prompt = argv[i];
65 break;
66 default:
67 usage();
71 /* command line arguments */
72 buffer = fill_buffer(opt->separator);
74 /* set the interface */
75 filter_lines(buffer);
76 draw_screen(buffer, tty_fd, opt);
78 /* listen and interact to input */
79 exit_code = input_get(buffer, tty_fd, opt);
81 draw_clear(opt->lines);
83 /* close files descriptors and pointers, and free memory */
84 close(tty_fd);
85 free(opt);
86 free_buffer(buffer);
88 return exit_code;