]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/test/src/util_cmdline.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / test / 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   return;
63 }
64
65
66
67
68
69 /****************************************************************************/
70 int util_cmdline_process_args( struct util_cmdline_state *cs, int argc, char **argv )
71 {
72   char
73     *arg;
74
75   int
76     arg_letter,
77     cc,
78     loop,
79     rv = 1;
80
81   lfds710_pal_uint_t
82     index;
83
84   assert( cs != NULL );
85   assert( argc >= 1 );
86   assert( argv != NULL );
87
88   for( loop = 1 ; loop < argc ; loop++ )
89   {
90     arg = *(argv+loop);
91
92     switch( *arg )
93     {
94       case '-':
95         arg_letter = tolower( *(arg+1) );
96
97         if( arg_letter >= 'a' and arg_letter <= 'z' )
98         {
99           index = arg_letter - 'a';
100
101           switch( cs->args[index].arg_type )
102           {
103             case UTIL_CMDLINE_ARG_TYPE_INTEGER_RANGE:
104               if( loop+1 >= argc )
105                 rv = 0;
106
107               if( loop+1 < argc )
108               {
109                 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 );
110
111                 if( cc != 2 )
112                   rv = 0;
113
114                 if( cc == 2 )
115                 {
116                   cs->args[index].processed_flag = RAISED;
117                   loop++;
118                 }
119               }
120             break;
121
122             case UTIL_CMDLINE_ARG_TYPE_INTEGER:
123               if( loop+1 >= argc )
124                 rv = 0;
125
126               if( loop+1 < argc )
127               {
128                 cc = sscanf( *(argv+loop+1), "%llu", &cs->args[index].arg_data.integer.integer );
129
130                 if( cc != 1 )
131                   rv = 0;
132
133                 if( cc == 1 )
134                 {
135                   cs->args[index].processed_flag = RAISED;
136                   loop++;
137                 }
138               }
139             break;
140
141             case UTIL_CMDLINE_ARG_TYPE_FLAG:
142               cs->args[index].arg_data.flag.flag = RAISED;
143               cs->args[index].processed_flag = RAISED;
144             break;
145
146             case UTIL_CMDLINE_ARG_TYPE_UNSET:
147             break;
148           }
149         }
150       break;
151
152       default:
153         rv = 0;
154       break;
155     }
156   }
157
158   return rv;
159 }
160
161
162
163
164
165 /****************************************************************************/
166 void util_cmdline_get_arg_data( struct util_cmdline_state *cs, char arg_letter, union util_cmdline_arg_data **arg_data )
167 {
168   lfds710_pal_uint_t
169     index;
170
171   assert( cs != NULL );
172   assert( arg_letter >= 'a' and arg_letter <= 'z' );
173   assert( arg_data != NULL );
174
175   index = arg_letter - 'a';
176
177   if( cs->args[index].processed_flag == RAISED )
178     *arg_data = &cs->args[index].arg_data;
179   else
180     *arg_data = NULL;
181
182   return;
183 }
184