// vim: ts=4 sw=4 expandtab ft=c

// Copyright (C) 1998-2006 The University of Melbourne.
// Copyright (C) 2014, 2016, 2018 The Mercury team.
// This file is distributed under the terms specified in COPYING.LIB.

#include "mercury_std.h"
#include "mercury_types.h"

#include "mercury_trace.h"
#include "mercury_trace_completion.h"

#ifndef MERCURY_TRACE_CMDS_H
#define MERCURY_TRACE_CMDS_H

typedef enum {
    KEEP_INTERACTING,
    STOP_INTERACTING
} MR_Next;

typedef MR_Next MR_TraceCmdFunc(char **words, int word_count,
                    MR_TraceCmdInfo *cmd, MR_EventInfo *event_info,
                    MR_Code **jumpaddr);

// We keep a table of the available commands. The information we have about
// each command is stored in a value of type MR_TraceCmdTableEntry.
//
// The name of the command itself is stored in the name field; the category
// field contains the name of the category to which the command belongs,
// e.g. "browsing".
//
// The code that the command loop should execute to handle a command of a given
// type is the function pointed to by the function field.
//
// Some commands take fixed strings as arguments. The arg_strings field
// is a NULL terminated array of those strings, or NULL if there are
// no fixed strings.
//
// The arg_completer field contains the address of a function for more
// arbitrary completion, e.g. on predicate names. This field should not be
// null; if the command cannot use a completion function, the field should
// contain MR_trace_null_completer.

typedef struct
{
    const char                  *MR_cmd_category;
    const char                  *MR_cmd_name;
    MR_TraceCmdFunc             *MR_cmd_function;
    const char *const           *MR_cmd_arg_strings;
    const MR_MakeCompleter      MR_cmd_arg_completer;
} MR_TraceCmdTableEntry;

#endif  // MERCURY_TRACE_CMDS_H
