/* See documentation in cli-utils.h. */
-int
-parse_flags (const char **str, const char *flags)
-{
- const char *p = skip_spaces (*str);
-
- if (p[0] == '-'
- && isalpha (p[1])
- && (p[2] == '\0' || isspace (p[2])))
- {
- const char pf = p[1];
- const char *f = flags;
-
- while (*f != '\0')
- {
- if (*f == pf)
- {
- *str = skip_spaces (p + 2);
- return f - flags + 1;
- }
- f++;
- }
- }
-
- return 0;
-}
-
-/* See documentation in cli-utils.h. */
-
-bool
-parse_flags_qcs (const char *which_command, const char **str,
- qcs_flags *flags)
-{
- switch (parse_flags (str, "qcs"))
- {
- case 0:
- return false;
- case 1:
- flags->quiet = true;
- break;
- case 2:
- flags->cont = true;
- break;
- case 3:
- flags->silent = true;
- break;
- default:
- gdb_assert_not_reached ("int qcs flag out of bound");
- }
-
- validate_flags_qcs (which_command, flags);
-
- return true;
-}
-
-/* See documentation in cli-utils.h. */
-
void
validate_flags_qcs (const char *which_command, qcs_flags *flags)
{
return check_for_argument (str, arg, strlen (arg));
}
-/* A helper function that looks for a set of flags at the start of a
- string. The possible flags are given as a null terminated string.
- A flag in STR must either be at the end of the string,
- or be followed by whitespace.
- Returns 0 if no valid flag is found at the start of STR.
- Otherwise updates *STR, and returns N (which is > 0),
- such that FLAGS [N - 1] is the valid found flag. */
-extern int parse_flags (const char **str, const char *flags);
-
/* qcs_flags struct groups the -q, -c, and -s flags parsed by "thread
apply" and "frame apply" commands */
int silent = false;
};
-/* A helper function that uses parse_flags to handle the flags qcs :
- A flag -q sets FLAGS->QUIET to true.
- A flag -c sets FLAGS->CONT to true.
- A flag -s sets FLAGS->SILENT to true.
-
- The caller is responsible to initialize *FLAGS to false before the (first)
- call to parse_flags_qcs.
- parse_flags_qcs can then be called iteratively to search for more
- valid flags, as part of a 'main parsing loop' searching for -q/-c/-s
- flags together with other flags and options.
-
- Returns true and updates *STR and one of FLAGS->QUIET, FLAGS->CONT,
- FLAGS->SILENT if it finds a valid flag.
- Returns false if no valid flag is found at the beginning of STR.
-
- Throws an error if a flag is found such that both FLAGS->CONT and
- FLAGS->SILENT are true. */
-
-extern bool parse_flags_qcs (const char *which_command, const char **str,
- qcs_flags *flags);
-
/* Validate FLAGS. Throws an error if both FLAGS->CONT and
FLAGS->SILENT are true. WHICH_COMMAND is included in the error
message. */
}
}
-static void
-test_parse_flags ()
-{
- const char *flags = "abc";
- const char *non_flags_args = "non flags args";
-
- /* Extract twice the same flag, separated by one space. */
- {
- const char *t1 = "-a -a non flags args";
-
- SELF_CHECK (parse_flags (&t1, flags) == 1);
- SELF_CHECK (parse_flags (&t1, flags) == 1);
- SELF_CHECK (strcmp (t1, non_flags_args) == 0);
- }
-
- /* Extract some flags, separated by one or more spaces. */
- {
- const char *t2 = "-c -b -c -b -c non flags args";
-
- SELF_CHECK (parse_flags (&t2, flags) == 3);
- SELF_CHECK (parse_flags (&t2, flags) == 2);
- SELF_CHECK (parse_flags (&t2, flags) == 3);
- SELF_CHECK (parse_flags (&t2, flags) == 2);
- SELF_CHECK (parse_flags (&t2, flags) == 3);
- SELF_CHECK (strcmp (t2, non_flags_args) == 0);
- }
-
- /* Check behaviour where there is no flag to extract. */
- {
- const char *t3 = non_flags_args;
-
- SELF_CHECK (parse_flags (&t3, flags) == 0);
- SELF_CHECK (strcmp (t3, non_flags_args) == 0);
- }
-
- /* Extract 2 known flags in front of unknown flags. */
- {
- const char *t4 = "-c -b -x -y -z -c";
-
- SELF_CHECK (parse_flags (&t4, flags) == 3);
- SELF_CHECK (parse_flags (&t4, flags) == 2);
- SELF_CHECK (strcmp (t4, "-x -y -z -c") == 0);
- SELF_CHECK (parse_flags (&t4, flags) == 0);
- SELF_CHECK (strcmp (t4, "-x -y -z -c") == 0);
- }
-
- /* Check combined flags are not recognised. */
- {
- const char *t5 = "-c -cb -c";
-
- SELF_CHECK (parse_flags (&t5, flags) == 3);
- SELF_CHECK (parse_flags (&t5, flags) == 0);
- SELF_CHECK (strcmp (t5, "-cb -c") == 0);
- }
-}
-
-static void
-test_parse_flags_qcs ()
-{
- const char *non_flags_args = "non flags args";
-
- /* Test parsing of 2 flags out of the known 3. */
- {
- const char *t1 = "-q -s non flags args";
- qcs_flags flags;
-
- SELF_CHECK (parse_flags_qcs ("test_parse_flags_qcs.t1.q",
- &t1,
- &flags) == 1);
- SELF_CHECK (flags.quiet && !flags.cont && !flags.silent);
- SELF_CHECK (parse_flags_qcs ("test_parse_flags_qcs.t1.s",
- &t1,
- &flags) == 1);
- SELF_CHECK (flags.quiet && !flags.cont && flags.silent);
- SELF_CHECK (strcmp (t1, non_flags_args) == 0);
- }
-
- /* Test parsing when there is no flag. */
- {
- const char *t2 = "non flags args";
- qcs_flags flags;
-
- SELF_CHECK (parse_flags_qcs ("test_parse_flags_qcs.t2",
- &t2,
- &flags) == 0);
- SELF_CHECK (!flags.quiet && !flags.cont && !flags.silent);
- SELF_CHECK (strcmp (t2, non_flags_args) == 0);
- }
-
- /* Test parsing stops at a negative integer. */
- {
- const char *t3 = "-123 non flags args";
- const char *orig_t3 = t3;
- qcs_flags flags;
-
- SELF_CHECK (parse_flags_qcs ("test_parse_flags_qcs.t3",
- &t3,
- &flags) == 0);
- SELF_CHECK (!flags.quiet && !flags.cont && !flags.silent);
- SELF_CHECK (strcmp (t3, orig_t3) == 0);
- }
-
- /* Test mutual exclusion between -c and -s. */
- {
- const char *t4 = "-c -s non flags args";
- qcs_flags flags;
-
- try
- {
- SELF_CHECK (parse_flags_qcs ("test_parse_flags_qcs.t4.cs",
- &t4,
- &flags) == 1);
-
- (void) parse_flags_qcs ("test_parse_flags_qcs.t4.cs",
- &t4,
- &flags);
- SELF_CHECK (false);
- }
- catch (const gdb_exception_error &ex)
- {
- SELF_CHECK (ex.reason == RETURN_ERROR);
- SELF_CHECK (ex.error == GENERIC_ERROR);
- SELF_CHECK
- (strcmp (ex.what (),
- "test_parse_flags_qcs.t4.cs: "
- "-c and -s are mutually exclusive") == 0);
- }
- }
-
-}
-
static void
test_cli_utils ()
{
selftests::cli_utils::test_number_or_range_parser ();
- selftests::cli_utils::test_parse_flags ();
- selftests::cli_utils::test_parse_flags_qcs ();
}
}