/*
 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
 *                         University Research and Technology
 *                         Corporation.  All rights reserved.
 * Copyright (c) 2004-2006 The University of Tennessee and The University
 *                         of Tennessee Research Foundation.  All rights
 *                         reserved.
 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
 *                         University of Stuttgart.  All rights reserved.
 * Copyright (c) 2004-2005 The Regents of the University of California.
 *                         All rights reserved.
 * $COPYRIGHT$
 * 
 * Additional copyrights may follow
 * 
 * $HEADER$
 */
/**
 * @file
 *
 * The "show help" subsystem (SHS) in Open MPI is intended to help the
 * developer convey meaningful information to the user (read longer
 * than is convenient in a single printf), particularly when errors
 * occur.  The SHS allows the storage of arbitrary-length help
 * messages in text files which can be parameterized by text filename,
 * message name, POSIX locale, and printf()-style parameters (e.g.,
 * "%s", "%d", etc.).  Note that the primary purpose of the SHS is to
 * display help messages, but it can actually be used to display any
 * arbitrary text messages.
 *
 * The function opal_show_help() is used to find a help message and
 * display it.  Its important parameters are a filename, message name,
 * and printf()-style varargs parameters used to substitute into the
 * message.
 * 
 * There's work pending about i18n-like support (nothing near as
 * complex as GNU gettext -- just a simple mechanism that may be
 * used).  But I won't describe it here until/if it's actually used.
 * So right now, the file lookup is quite straightforward -- the
 * caller passes in the filename to find the help message, and the SHS
 * looks for that file in $pkgdatadir (typically
 * $prefix/share/openmpi).
 *
 * Once the file is successfully opened, the SHS looks for the
 * appropriate help message to display.  It looks for the message name
 * in the file, reads in the message, and displays it.  printf()-like
 * substitutions are performed (e.g., %d, %s, etc.) --
 * opal_show_help() takes a variable legnth argument list that are
 * used for these substitutions.
 *
 * The format of the help file is simplistic:
 *
 * - Comments begin with #.  Any characters after a # on a line are
 *   ignored.  It is not possible to escape a #.
 * - Message names are on a line by themselves and marked with [].
 *   Names can be any ASCII string within the [] (excluding the
 *   characters newline, linefeed, [, ], and #).  
 * - Messages are any characters between message names and/or the end
 *   of the file.
 *
 * Here's a sample helpfile:
 *
 * \verbatimbegin
 * # This is a comment.
 * [topic 1]
 * Here's the first message.  Let's substitute in an integer: %d.
 * The quick brown fox jumped over the lazy %s.
 * # This is another comment -- it's not displayed in the first message.
 * [another:topic:foo:foo:foo]
 * This is the second message.  Let's just keep rolling along to get
 * to the second line in the message for this example.
 * \verbatimend
 *
 * It is expected that help messages will be grouped by filename;
 * similar messages should be in a single file.  For example, an MCA
 * component may install its own helpfile in Open MPI's $pkgdatadir,
 * and therefore the component can invoke opal_show_help() to display
 * its own help messages.
 *
 * Message files in $pkgdatadir have a naming convention: they
 * generally start with the prefix "help-" and are followed by a name
 * descriptive of what kind of messages they contain.  MCA components
 * should generally abide by the MCA prefix rule, with the exception
 * that they should start the filename with "help-", as mentioned
 * previously.
 */

#ifndef OPAL_SHOW_HELP_H
#define OPAL_SHOW_HELP_H

#include "opal_config.h"

#include <stdarg.h>

#if defined(c_plusplus) || defined(__cplusplus)
extern "C" {
#endif

    /**
     * Look up a text message in a text file and display it to the
     * stderr using printf()-like substitutions (%d, %s, etc.).
     *
     * @param filename File where the text messages are contained.
     * @param topic String index of which message to display from the
     * text file.
     * @param want_error_header Display error-bar line header and
     * footer with the message.
     * @param varargs Any additional parameters are substituted,
     * printf()-style into the help message that is displayed.
     *
     * This function looks for the filename in the $pkgdatadir
     * (typically $prefix/share/openmpi), and looks up the message
     * based on the topic, and displays it.  If want_error_header is
     * true, a header and footer of asterisks are also displayed.
     */
    OPAL_DECLSPEC int opal_show_help(const char *filename, const char *topic, 
                                     bool want_error_header, ...);

    /**
     * \internal
     *
     * Internal function to help clean up the flex parser.
     *
     * This function is called internally by the SHS to shut down the
     * flex parser since we may not hit the <<EOF>> rule and call this
     * function automatically.
     */
    OPAL_DECLSPEC int opal_show_help_finish_parsing(void);

#if defined(c_plusplus) || defined(__cplusplus)
}
#endif

#endif