aboutsummaryrefslogtreecommitdiff
path: root/src/opts.c
blob: 3120317f185a647151fafe70afc9985d35a2b9dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "unalf.h"

#define OPTIONS "aeklLopqtvVd:x:"

/* uncomment to test exclude/include glob lists */
// #define DEBUG_GLOBS

static void add_exclude(const char *glob) {
	if(exclude_count == MAX_EXCLUDES)
		return;
	exclude_globs[exclude_count++] = glob;
}

#ifdef DEBUG_GLOBS
static void show_globs(void) {
	int i;

	printf("Include globs:\n");
	while(*include_globs)
		printf(" + %s\n", *include_globs++);
	printf("Exclude globs:\n");
	for(i = 0; i < exclude_count; i++)
		printf(" - %s\n", exclude_globs[i]);
	exit(0);
}
#endif

void parse_opts(int argc, char * const *argv) {
	int opt;

	while((opt = getopt(argc, argv, OPTIONS)) != -1) {
		switch(opt) {
			case 'a': opts.txtconv++; break;
			case 'e': opts.listonly = opts.testonly = 0; break;
			case 'k': opts.keepdot++; break;
			case 'l': opts.listonly++; opts.testonly = 0; break;
			case 'L': opts.lowercase++; break;
			case 'o': opts.overwrite++; break;
			case 'p': opts.extract_to_stdout++; opts.quiet++; break;
			case 'q': opts.quiet++; break;
			case 't': opts.testonly++; opts.listonly = 0; break;
			case 'v': opts.listonly = 1; opts.testonly = 0; opts.verbose_list++; break;
			case 'V': puts(VERSION); exit(0); break;
			case 'd': opts.outdir = optarg; break;
			case 'x': add_exclude(optarg); break;
			default:
				fprintf(stderr, "%s: invalid option (try -h or --help)\n", self);
				exit(1);
		}
	}

	if(optind >= argc) {
		fprintf(stderr, "%s: missing alf file argument (try -h or --help)\n", self);
		exit(1);
	}

	in_filename = argv[optind];
	include_globs = &argv[optind + 1]; /* might be null, that's OK */

#ifdef DEBUG_GLOBS
	show_globs();
#endif
}