@@ -50,27 +50,29 @@ void arg_parser::parse(
5050        arg_array.push_back (argv[i]);
5151
5252    }
53+     try_match_and_set_arg (raw_args, do_list);
54+     try_match_and_set_arg (raw_args, do_help);
55+     try_match_and_set_arg (raw_args, do_version);
56+     try_match_and_set_arg (raw_args, do_test);
57+     try_match_and_set_arg (raw_args, do_detect);
58+     try_match_and_set_arg (raw_args, do_sample);
59+     try_match_and_set_arg (raw_args, do_record);
60+     try_match_and_set_arg (raw_args, do_count);
5361
5462    while  (raw_args.size () > 0 )
5563    {
5664        size_t  initial_size = raw_args.size ();
5765        if  (command == COMMAND_CLASS::NO_COMMAND) {
58-             try_match_and_set_arg (raw_args, do_list);
59-             try_match_and_set_arg (raw_args, do_help);
60-             try_match_and_set_arg (raw_args, do_version);
61-             try_match_and_set_arg (raw_args, do_test);
62-             try_match_and_set_arg (raw_args, do_detect);
63-             try_match_and_set_arg (raw_args, do_sample);
64-             try_match_and_set_arg (raw_args, do_record);
65-             try_match_and_set_arg (raw_args, do_count);
66+             throw_invalid_arg (raw_args.front (), L" Error: at least one command is needed "  );
6667        }
67- 
68+          
6869        if  (command == COMMAND_CLASS::SAMPLE || command == COMMAND_CLASS::RECORD)
6970            parse_sampling_args (raw_args);
71+        
7072
7173        if  (commands_with_no_args.find (command) != commands_with_no_args.end ()) goto  standard_arguments;
7274
73-         if  (try_match_and_set_bool_flag (raw_args, record_commandline_separator )) {
75+         if  (try_match_arg (raw_args, record_commandline )) {
7476            if  (command != COMMAND_CLASS::RECORD && command != COMMAND_CLASS::STAT && command != COMMAND_CLASS::TIMELINE && command != COMMAND_CLASS::SPE)
7577                throw_invalid_arg (raw_args.front (), L" warning: only `stat` and `record` support process spawn!"  );
7678
@@ -203,17 +205,43 @@ void arg_parser::parse_sampling_args(wstr_vec& raw_args_vect)
203205            raw_args_vect.erase (raw_args_vect.begin ());
204206        }
205207
208+         if  (try_match_arg (raw_args_vect, events_string)) {
209+             check_flag_value_existance (raw_args_vect);
210+ 
211+             raw_args_vect.erase (raw_args_vect.begin ());
212+ 
213+         }
214+ 
206215        if  (initial_size == raw_args_vect.size ()) break ;
207216    }
208217}
209218
219+ void  arg_parser::parse_event_list (wstring i_events) {
220+     events_string.value  = i_events;
221+     if  (command == COMMAND_CLASS::SAMPLE || command == COMMAND_CLASS::RECORD) {
222+         if  (i_events.rfind (ARM_SPE_EVENT_PREFIX)) command = COMMAND_CLASS::SPE;
223+ 
224+         if  (i_events.rfind (L" {"  ) != std::wstring::npos) {
225+             throw_invalid_arg (L" {"  , L" Error: Event groups are only available in the stat command"  );
226+         }
227+     }
228+     if  (command == COMMAND_CLASS::STAT) {
229+         if  (i_events.rfind (ARM_SPE_EVENT_PREFIX)) 
230+             throw_invalid_arg (ARM_SPE_EVENT_PREFIX, L" Error: SPE sampling is not available with the stat command"  );
231+     }
232+     if  (commands_with_events_and_metrics.find (command) == commands_with_events_and_metrics.end ()) {
233+         throw_invalid_arg (events_string.key , L" Error: Event list is only supported with the commands: stat, record, sample"  );
234+     }
235+ }
236+ 
210237void  arg_parser::parse_cpu_core (wstr_vec& raw_args_vect, uint8_t  MAX_CPU_CORES)
211238{
212239    wstring cores = raw_args_vect.front ();
213240    if  (TokenizeWideStringOfInts (cores.c_str (), L' ,'  , cores_idx.value ) == false )
214241    {
215242        throw_invalid_arg (raw_args_vect.front ());
216243    }
244+     //  TODO: add CPU core ranges
217245    if  (cores_idx.value .size () > MAX_CPU_CORES)
218246    {
219247        std::wostringstream error_message;
@@ -255,12 +283,12 @@ void arg_parser::parse_record_commandline(wstr_vec& raw_args_vect)
255283        if  (sample_pe_file.value .empty ())
256284        {
257285            sample_pe_file.value  = arg;
258-             record_commandline = arg;
286+             record_commandline. value  = arg;
259287            fill_pdb_and_image_name_if_empty ();
260288
261289        }
262290        else 
263-             record_commandline += L"  "   + arg;
291+             record_commandline. value  += L"  "   + arg;
264292
265293        raw_args_vect.erase (raw_args_vect.begin ());
266294    }
0 commit comments