/*****************************************************************************

NAME:
   longoptions.h -- definitions for longoptions.c

AUTHOR:
   David Relson <relson@osagesoftware.com>

******************************************************************************/

#ifndef OPTIONS_H
#define OPTIONS_H

#include "getopt.h"

/* Definitions */

/** has_arg symbolic values */
enum field_e {
    N = 0,	/* no_argument		(or 0) if the option does not take an argument, */
    R = 1,	/* required_argument	(or 1) if the option requires an argument, */
    O = 2	/* optional_argument 	(or 2) if the option takes an optional argument. */
};

typedef enum longopts_e {
    O_BLOCK_ON_SUBNETS = 1000,
    O_CHARSET_DEFAULT,
    O_CONFIG_FILE,
    O_DB_CHECKPOINT,
    O_DB_LIST_LOGFILES,
    O_DB_PRINT_LEAFPAGE_COUNT,
    O_DB_PRINT_PAGESIZE,
    O_DB_PRUNE,
    O_DB_RECOVER,
    O_DB_RECOVER_HARDER,
    O_DB_REMOVE_ENVIRONMENT,
    O_DB_VERIFY,
    O_DB_LOG_AUTOREMOVE,
    O_DB_TRANSACTION,
    O_DB_TXN_DURABLE,
    O_NS_ESF,
    O_SP_ESF,
    O_HAM_CUTOFF,
    O_HAM_TRUE,
    O_HEADER_FORMAT,
    O_LOG_HEADER_FORMAT,
    O_LOG_UPDATE_FORMAT,
    O_MIN_DEV,
    O_MIN_TOKEN_LEN,
    O_MAX_TOKEN_LEN,
    O_MAX_MULTI_TOKEN_LEN,
    O_MULTI_TOKEN_COUNT,
    O_REPLACE_NONASCII_CHARACTERS,
    O_ROBS,
    O_ROBX,
    O_SPAM_CUTOFF,
    O_SPAM_HEADER_NAME,
    O_SPAM_HEADER_PLACE,
    O_SPAM_SUBJECT_TAG,
    O_SPAMICITY_FORMATS,
    O_SPAMICITY_TAGS,
    O_STATS_IN_HEADER,
    O_TERSE,
    O_TERSE_FORMAT,
    O_THRESH_UPDATE,
    O_TOKEN_COUNT_FIX,
    O_TOKEN_COUNT_MIN,
    O_TOKEN_COUNT_MAX,
    O_TIMESTAMP,
    O_UNICODE,
    O_UNSURE_SUBJECT_TAG,
    O_USER_CONFIG_FILE,
    O_WORDLIST
} longopts_t;

#ifndef	DISABLE_UNICODE
#define	UNICODE_OPTION	\
    { "unicode",			R, 0, O_UNICODE },
#else
#define	UNICODE_OPTION
#endif

/* common options */
#define LONGOPTIONS_COMMON \
    { "config-file",			R, 0, O_CONFIG_FILE }, \
    { "no-config-file",			N, 0, 'C' }, \
    { "help",				N, 0, 'h' }, \
    { "input-file",			R, 0, 'I' }, \
    { "output-file",			R, 0, 'O' }, \
    { "min-token-len",			R, 0, O_MIN_TOKEN_LEN }, \
    { "max-token-len",			R, 0, O_MAX_TOKEN_LEN }, \
    { "max-multi-token-len",		R, 0, O_MAX_MULTI_TOKEN_LEN }, \
    { "multi-token-count",		R, 0, O_MULTI_TOKEN_COUNT }, \
       UNICODE_OPTION \
    { "version",			N, 0, 'V' }, \
    { "verbosity",			N, 0, 'v' },

/* options for bogofilter */
#define LONGOPTIONS_MAIN \
    { "ham-true"	,		N, 0, O_HAM_TRUE },

/* options for bogofilter */
#define LONGOPTIONS_MAIN_TUNE \
    { "token-count"     ,               R, 0, O_TOKEN_COUNT_FIX }, \
    { "token-count-min" ,               R, 0, O_TOKEN_COUNT_MIN }, \
    { "token-count-max" ,               R, 0, O_TOKEN_COUNT_MAX },

/* options for bogofilter and bogolexer */
#define LONGOPTIONS_LEX \
    { "block-on-subnets",		R, 0, O_BLOCK_ON_SUBNETS }, \
    { "charset-default",		R, 0, O_CHARSET_DEFAULT }, \
    { "user-config-file",		R, 0, O_USER_CONFIG_FILE }, \
    { "replace-nonascii-characters",	R, 0, O_REPLACE_NONASCII_CHARACTERS },

/* options for bogolexer and bogoutil */
#define LONGOPTIONS_LEX_UTIL

/* options for bogofilter and bogoutil - some preprocessor workarounds here */
#define lo1
#define lo2
#ifdef	HAVE_DECL_DB_CREATE
 #undef lo1
 #define lo1 \
    { "db-log-autoremove",		R, 0, O_DB_LOG_AUTOREMOVE },
 #ifdef	FUTURE_DB_OPTIONS
  #undef lo2
  #define lo2 \
    { "db-txn-durable",			R, 0, O_DB_TXN_DURABLE },
 #endif
#endif

#define LONGOPTIONS_DB \
    { "db-transaction",			R, 0, O_DB_TRANSACTION }, \
    { "timestamp-date",			R, 0, 'y' }, \
    lo1 lo2

extern int getopt_long_chk(int argc, char * const argv[], char const
	*optstring, const struct option *longopts, int *longindex);

#endif
