static gdb::unique_xmalloc_ptr<char> explicit_location_lex_one (const char **inp, const struct language_defn *language) { const char *start = *inp; if (*start == '\0') return NULL; /* If quoted, skip to the ending quote. */ if (strchr (get_gdb_linespec_parser_quote_characters (), *start)) { char quote_char = *start; /* If the input is not an Ada operator, skip to the matching closing quote and return the string. */ if (!(language->la_language == language_ada && quote_char == '\"' && is_ada_operator (start))) { const char *end = find_toplevel_char (start + 1, quote_char); if (end == NULL) error (_("Unmatched quote, %s."), start); *inp = end + 1; return gdb::unique_xmalloc_ptr<char> (savestring (start + 1, *inp - start - 2)); } } /* If the input starts with '-' or '+', the string ends with the next whitespace or comma. */ if (*start == '-' || *start == '+') { while (*inp[0] != '\0' && *inp[0] != ',' && !isspace (*inp[0])) ++(*inp); } else { /* Handle numbers first, stopping at the next whitespace or ','. */ while (isdigit (*inp[0])) ++(*inp); if (*inp[0] == '\0' || isspace (*inp[0]) || *inp[0] == ',') return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start)); /* Otherwise stop at the next occurrence of whitespace, '\0', keyword, or ','. */ *inp = start; while ((*inp)[0] && (*inp)[0] != ',' && !(isspace ((*inp)[0]) || linespec_lexer_lex_keyword (&(*inp)[1]))) { /* Special case: C++ operator,. */ if (language->la_language == language_cplus && strncmp (*inp, "operator", 8) == 0) (*inp) += 8; ++(*inp); } } if (*inp - start > 0) return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start)); return NULL; }
static gdb::unique_xmalloc_ptr<char> explicit_location_lex_one_function (const char **inp, const struct language_defn *language, explicit_completion_info *completion_info) { const char *start = *inp; if (*start == '\0') return NULL; /* If quoted, skip to the ending quote. */ if (strchr (get_gdb_linespec_parser_quote_characters (), *start)) { char quote_char = *start; /* If the input is not an Ada operator, skip to the matching closing quote and return the string. */ if (!(language->la_language == language_ada && quote_char == '\"' && is_ada_operator (start))) { if (completion_info != NULL) completion_info->quoted_arg_start = start; const char *end = find_toplevel_char (start + 1, quote_char); if (end == NULL) { if (completion_info == NULL) error (_("Unmatched quote, %s."), start); end = start + strlen (start); *inp = end; char *saved = savestring (start + 1, *inp - start - 1); return gdb::unique_xmalloc_ptr<char> (saved); } if (completion_info != NULL) completion_info->quoted_arg_end = end; *inp = end + 1; char *saved = savestring (start + 1, *inp - start - 2); return gdb::unique_xmalloc_ptr<char> (saved); } } const char *comma = find_toplevel_char (start, ','); /* If we have "-function -myfunction", or perhaps better example, "-function -[BasicClass doIt]" (objc selector), treat "-myfunction" as the function name. I.e., skip the first char if it is an hyphen. Don't skip the first char always, because we may have C++ "operator<", and find_toplevel_char needs to see the 'o' in that case. */ const char *hyphen = (*start == '-' ? find_toplevel_char (start + 1, '-') : find_toplevel_char (start, '-')); /* Check for C++ "operator," and "operator-". */ comma = skip_op_false_positives (start, comma); hyphen = skip_op_false_positives (start, hyphen); /* Pick the one that appears first. */ const char *end = first_of (hyphen, comma); /* See if a linespec keyword appears first. */ const char *s = start; const char *ws = find_toplevel_char (start, ' '); while (ws != NULL && linespec_lexer_lex_keyword (ws + 1) == NULL) { s = ws + 1; ws = find_toplevel_char (s, ' '); } if (ws != NULL) end = first_of (end, ws + 1); /* If we don't have any terminator, then take the whole string. */ if (end == NULL) end = start + strlen (start); /* Trim whitespace at the end. */ while (end > start && end[-1] == ' ') end--; *inp = end; if (*inp - start > 0) return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start)); return NULL; }