/***************************************************************************
 *
 * cmdopt.h - declarations of helper functions for the processing
 *            of command line options
 *
 * $Id$
 *
 ************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#ifndef RW_CMDOPT_H_INCLUDED
#define RW_CMDOPT_H_INCLUDED


#include <testdefs.h>   // for test config macros


/**
 * Appends a set of command line options and their handlers to the global
 * list of command line option handlers for the current process.
 *
 * @param optspec  A string of command line option specifiers describing
 *        the names and parameters of the command line options and their
 *        handlers. The string has the following syntax:
 *
 *        <optspec> ::= <opt> [ ':' | '=' | '#' ]
 *                            [ @N | @* | '!' ]
 *                            [ <opts> ]
 *        <opt>     ::= <sopt> [ '|' <lopt>]
 *                  ::= '|' <lopt>
 *        <sopt>    ::= char
 *        <lopt>    ::= '-' char char*
 *        <char>    ::= 'A' - 'Z', 'a'-'z', '0' - '9', '_'
 *
 *        Each command line option may have a short name, a long name,
 *        or both. When referenced (either on the command line or in
 *        the environment), the name of command line option is
 *        introduced by a hyphen ('-').
 *
 *        A short option name (<sopt>) consits of a single alphanumeric
 *        character or an underscore ('_').
 *
 *        A long name (<lopt>) starts with a hyphen ('-') followed by
 *        one or more aphanumeric characters or underscores.
 *
 *        The name of the command line option is followd by one or more
 *        special characters with the following meaning:
 *
 *        ':'   the option takes an optional argument
 *        '='   the option takes a required argument that must immediately
 *              follow the equals sign
 *        '#'   the handler for this option is not a function but rather
 *              a pointer to an signed integer that rw_runopts() sets to
 *              a non-zero value if the option appears on the command line
 *        @N    the option handler will be invoked for the first N
 *              occurrences of the option name on the command line
 *        @*    the option handler will be invoked for every occurrence
 *              of the option name on the command line
 *        !     the option handler will be invoked only if the option name
 *              does not appear on the command line
 *
 * @param ...  A list of zero or more command line option handlers whose
 *        type is either int (*)(int, char**) or int*, the latter
 *        corresponding to options denoted with the '#' special character.
 *
 * @return  On success, returns the number of command line options
 *          currently defined for the process, negative value on error.
 */
_TEST_EXPORT int
rw_setopts (const char *optspec, ...);


/**
 * Processes the set of command line options and arguments specified by
 * the function arguments (usually the same arguments as those passed to
 * main()).
 *
 * @param argc  The number of non-zero elements of the argv vector.
 * @param argv  An array of pointers to command line options and arguments
 *        whose the last element, argv [argc], has the value 0.
 *
 * @return  Returns the status of last evaluated command line option handler.
 */
_TEST_EXPORT int
rw_runopts (int argc, char *argv[]);


/**
 * Processes the set of command line options and arguments specified by
 * the function argument (usually the value of an environment variable).
 *
 * @param argvstr  A character string of command line options and arguments
 *        separated by one or more spaces.
 *
 * @return  Returns the status of last evaluated command line option handler.
 */
_TEST_EXPORT int
rw_runopts (const char *argvstr);


/**
 * Determines whether a feature is enabled.
 *
 * @param name  The name of a feature.
 *
 * @return  Returns a non-zero value if the named feature is enabled,
 *          otherwise 0.
 */
_TEST_EXPORT int
rw_enabled (const char *name);


/**
 * Determines whether a case (or line) is enabled.
 *
 * @param name  The case (or line) number
 *
 * @return  Returns a non-zero value if the case (line) is enabled,
 *          otherwise 0.
 */
_TEST_EXPORT int
rw_enabled (int line);


#endif   // RW_CMDOPT_H_INCLUDED
