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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/common/command_line_parser.h>
int aws_cli_optind = 1;
int aws_cli_opterr = -1;
int aws_cli_optopt = 0;
const char *aws_cli_optarg = NULL;
static const struct aws_cli_option *s_find_option_from_char(
const struct aws_cli_option *longopts,
char search_for,
int *longindex) {
int index = 0;
const struct aws_cli_option *option = &longopts[index];
while (option->val != 0 || option->name) {
if (option->val == search_for) {
if (longindex) {
*longindex = index;
}
return option;
}
option = &longopts[++index];
}
return NULL;
}
static const struct aws_cli_option *s_find_option_from_c_str(
const struct aws_cli_option *longopts,
const char *search_for,
int *longindex) {
int index = 0;
const struct aws_cli_option *option = &longopts[index];
while (option->name || option->val != 0) {
if (option->name) {
if (option->name && !strcmp(search_for, option->name)) {
if (longindex) {
*longindex = index;
}
return option;
}
}
option = &longopts[++index];
}
return NULL;
}
int aws_cli_getopt_long(
int argc,
char *const argv[],
const char *optstring,
const struct aws_cli_option *longopts,
int *longindex) {
aws_cli_optarg = NULL;
if (aws_cli_optind >= argc) {
return -1;
}
char first_char = argv[aws_cli_optind][0];
char second_char = argv[aws_cli_optind][1];
char *option_start = NULL;
const struct aws_cli_option *option = NULL;
if (first_char == '-' && second_char != '-') {
option_start = &argv[aws_cli_optind][1];
option = s_find_option_from_char(longopts, *option_start, longindex);
} else if (first_char == '-' && second_char == '-') {
option_start = &argv[aws_cli_optind][2];
option = s_find_option_from_c_str(longopts, option_start, longindex);
} else {
return -1;
}
aws_cli_optind++;
if (option) {
bool has_arg = false;
char *opt_value = memchr(optstring, option->val, strlen(optstring));
if (!opt_value) {
return '?';
}
if (opt_value[1] == ':') {
has_arg = true;
}
if (has_arg) {
if (aws_cli_optind >= argc) {
return '?';
}
aws_cli_optarg = argv[aws_cli_optind++];
}
return option->val;
}
return '?';
}
|