]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/benchmark/src/util_cmdline.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / benchmark / src / util_cmdline.c
1 /***** includes *****/
2 #include "internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void util_cmdline_init( struct util_cmdline_state *cs )
10 {
11   lfds710_pal_uint_t
12     loop;
13
14   assert( cs != NULL );
15
16   for( loop = 0 ; loop < NUMBER_OF_LOWERCASE_LETTERS_IN_LATIN_ALPHABET ; loop++ )
17   {
18     cs->args[loop].arg_type = UTIL_CMDLINE_ARG_TYPE_UNSET;
19     cs->args[loop].processed_flag = LOWERED;
20   }
21
22   return;
23 }
24
25
26
27
28
29 /****************************************************************************/
30 #pragma warning( disable : 4100 )
31
32 void util_cmdline_cleanup( struct util_cmdline_state *cs )
33 {
34   assert( cs != NULL );
35
36   return;
37 }
38
39 #pragma warning( default : 4100 )
40
41
42
43
44
45 /****************************************************************************/
46 void util_cmdline_add_arg( struct util_cmdline_state *cs, char arg_letter, enum util_cmdline_arg_type arg_type )
47 {
48   lfds710_pal_uint_t
49     index;
50
51   assert( cs != NULL );
52   assert( arg_letter >= 'a' and arg_letter <= 'z' );
53   // TRD : arg_type can be any value in its range
54
55   index = arg_letter - 'a';
56
57   cs->args[index].arg_type = arg_type;
58
59   if( arg_type == UTIL_CMDLINE_ARG_TYPE_FLAG )
60     cs->args[index].arg_data.flag.flag = LOWERED;
61
62   if( arg_type == UTIL_CMDLINE_ARG_TYPE_STRING )
63     cs->args[index].arg_data.string.string = NULL;
64
65   return;
66 }
67
68
69
70
71
72 /****************************************************************************/
73 int util_cmdline_process_args( struct util_cmdline_state *cs, int argc, char **argv )
74 {
75   char
76     *arg;
77
78   int
79     arg_letter,
80     cc,
81     loop,
82     rv = 1;
83
84   lfds710_pal_uint_t
85     index;
86
87   assert( cs != NULL );
88   assert( argc >= 1 );
89   assert( argv != NULL );
90
91   for( loop = 1 ; loop < argc ; loop++ )
92   {
93     arg = *(argv+loop);
94
95     switch( *arg )
96     {
97       case '-':
98         arg_letter = tolower( *(arg+1) );
99
100         if( arg_letter >= 'a' and arg_letter <= 'z' )
101         {
102           index = arg_letter - 'a';
103
104           switch( cs->args[index].arg_type )
105           {
106             case UTIL_CMDLINE_ARG_TYPE_INTEGER_RANGE:
107               if( loop+1 >= argc )
108                 rv = 0;
109
110               if( loop+1 < argc )
111               {
112                 cc = sscanf( *(argv+loop+1), "%llu-%llu", &cs->args[index].arg_data.integer_range.integer_start, &cs->args[index].arg_data.integer_range.integer_end );
113
114                 if( cc != 2 )
115                   rv = 0;
116
117                 if( cc == 2 )
118                 {
119                   cs->args[index].processed_flag = RAISED;
120                   loop++;
121                 }
122               }
123             break;
124
125             case UTIL_CMDLINE_ARG_TYPE_INTEGER:
126               if( loop+1 >= argc )
127                 rv = 0;
128
129               if( loop+1 < argc )
130               {
131                 cc = sscanf( *(argv+loop+1), "%llu", &cs->args[index].arg_data.integer.integer );
132
133                 if( cc != 1 )
134                   rv = 0;
135
136                 if( cc == 1 )
137                 {
138                   cs->args[index].processed_flag = RAISED;
139                   loop++;
140                 }
141               }
142             break;
143
144             case UTIL_CMDLINE_ARG_TYPE_FLAG:
145               cs->args[index].arg_data.flag.flag = RAISED;
146               cs->args[index].processed_flag = RAISED;
147             break;
148
149             case UTIL_CMDLINE_ARG_TYPE_STRING:
150               cs->args[index].arg_data.string.string = *(argv+loop+1);
151               cs->args[index].processed_flag = RAISED;
152               loop++;
153             break;
154
155             case UTIL_CMDLINE_ARG_TYPE_UNSET:
156             break;
157           }
158         }
159       break;
160
161       default:
162         rv = 0;
163       break;
164     }
165   }
166
167   return rv;
168 }
169
170
171
172
173
174 /****************************************************************************/
175 void util_cmdline_get_arg_data( struct util_cmdline_state *cs, char arg_letter, union util_cmdline_arg_data **arg_data )
176 {
177   lfds710_pal_uint_t
178     index;
179
180   assert( cs != NULL );
181   assert( arg_letter >= 'a' and arg_letter <= 'z' );
182   assert( arg_data != NULL );
183
184   index = arg_letter - 'a';
185
186   if( cs->args[index].processed_flag == RAISED )
187     *arg_data = &cs->args[index].arg_data;
188   else
189     *arg_data = NULL;
190
191   return;
192 }
193