/* Copyright (C) 2023 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef GDB_BREAK_COND_PARSE_H
#define GDB_BREAK_COND_PARSE_H

/* Given TOK, a string possibly containing a condition, thread, inferior,
   task and force-condition flag, as accepted by the 'break' command,
   extract the condition string, thread, inferior, task number, and the
   force_condition flag, then set *COND_STRING, *THREAD, *INFERIOR, *TASK,
   and *FORCE.

   As TOK is parsed, if an unknown keyword is encountered before the 'if'
   keyword then everything starting from the unknown keyword is placed into
   *REST.

   Both *COND and *REST are initialized to nullptr.  If no 'if' keyword is
   found then *COND will be returned as nullptr.  If no unknown content is
   found then *REST is returned as nullptr.

   If no thread is found, *THREAD is set to -1.  If no inferior is found,
   *INFERIOR is set to -1.  If no task is found, *TASK is set to -1.  If
   the -force-condition flag is not found then *FORCE is set to false.

   Due to the free-form nature that the string TOK might take (a 'thread'
   keyword can appear before or after an 'if' condition) then we end up
   having to check for keywords from both the start of TOK and the end of
   TOK.

   If TOK is nullptr, or TOK is the empty string, then the output variables
   are all given their default values.  */

extern void create_breakpoint_parse_arg_string
  (const char *tok, gdb::unique_xmalloc_ptr<char> *cond_string,
   int *thread, int *inferior, int *task,
   gdb::unique_xmalloc_ptr<char> *rest, bool *force);

#endif /* GDB_BREAK_COND_PARSE_H */
