/*
** vim: ts=4 sw=4 expandtab
*/
/*
** Copyright (C) 1998,2000-2002, 2006 The University of Melbourne.
** This file may only be copied under the terms of the GNU Library General
** Public License - see the file COPYING.LIB in the Mercury distribution.
*/

/*
** mercury_trace_alias.h
**
** Defines the interface of the alias system for the internal debugger.
*/

#ifndef MERCURY_TRACE_ALIAS_H
#define MERCURY_TRACE_ALIAS_H

#include "mercury_std.h"    /* for MR_bool */
#include <stdio.h>

#include "mercury_trace_completion.h"

typedef struct {
    char        *MR_alias_name;
    char        **MR_alias_words;
    int         MR_alias_word_count;
} MR_Alias;

/*
** Add an alias with the given name and expansion to the list.
** The name, the words in the expansion and the array of pointers to the
** expansion will all be copied, so their storage can be released
** when MR_trace_add_alias returns.
**
** Overwrites any previous alias with the same name.
*/

extern  void        MR_trace_add_alias(char *name, char **words,
                        int word_count);

/*
** Remove the given alias from the list. Returns MR_FALSE if there is no
** such alias, and MR_TRUE if there was such an alias and the removal was
** successful.
*/

extern  MR_bool     MR_trace_remove_alias(const char *name);

/*
** Looks up whether the given alias exists. If yes, returns MR_TRUE, and
** sets *words_ptr to point to a vector of words forming the alias expansion,
** and *word_count_ptr to the number of words in the expansion. If no,
** returns MR_FALSE.
*/

extern  MR_bool     MR_trace_lookup_alias(const char *name,
                        char ***words_ptr, int *word_count_ptr);

/*
** Print the alias of the given name, if it exists, and an error message
** if it does not.
*/

extern  void        MR_trace_print_alias(FILE *fp, const char *name);

/*
** Print all the aliases to the given file. If mdb_command_format is MR_TRUE,
** print them in a form that, when sourced from mdb , recreate the aliases.
** Otherwise, print the aliases in a format that is nice for humans to read.
*/

extern  void        MR_trace_print_all_aliases(FILE *fp,
                        MR_bool mdb_command_format);

/*
** If the main command in *words[0] MR_trace_expand_aliases is an alias, then
** expand the alias. Words, word_max and word_count should form a resizeable
** array of words, in the sense of mercury_array_macros.h.
*/

extern  void        MR_trace_expand_aliases(char ***words, int *word_max,
                        int *word_count);

/* A Readline completer for aliases. */ 
extern  MR_CompleterList
                    *MR_trace_alias_completer(const char *word,
                        size_t word_length);


#endif  /* MERCURY_TRACE_ALIAS_H */
