//
// aegis - project change supervisor
// Copyright (C) 1991-1995, 1997, 1999, 2002-2006, 2008, 2012 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
#include
#include
#include
#include
#include
#include
#define DEFAULT_TAB_WIDTH 8
#define LEVEL_TERSE 1
#define LEVEL_UNFORMATTED 2
#define LEVEL_UNSET 3
#define LEVEL_VERBOSE 4
static int verbose_flag = LEVEL_UNSET;
static int tab_width;
static int page_headers = -1;
static void
too_many(void (*usage)(void))
{
mutually_exclusive_options3
(
arglex_token_terse,
arglex_token_unformatted,
arglex_token_verbose,
usage
);
}
void
option_verbose_set(void (*usage)(void))
{
trace(("option_set_werbose()\n{\n"));
if (verbose_flag == LEVEL_VERBOSE)
duplicate_option_by_name(arglex_token_verbose, usage);
if (verbose_flag != LEVEL_UNSET)
too_many(usage);
verbose_flag = LEVEL_VERBOSE;
trace(("}\n"));
}
bool
option_verbose_get(void)
{
return (verbose_flag == LEVEL_VERBOSE);
}
void
option_terse_set(void (*usage)(void))
{
trace(("option_set_terse()\n{\n"));
if (verbose_flag == LEVEL_TERSE)
duplicate_option_by_name(arglex_token_terse, usage);
if (verbose_flag != LEVEL_UNSET)
too_many(usage);
verbose_flag = LEVEL_TERSE;
trace(("}\n"));
}
int
option_terse_get(void)
{
return (verbose_flag == LEVEL_TERSE);
}
void
option_unformatted_set(void (*usage)(void))
{
trace(("option_set_unformatted()\n{\n"));
if (verbose_flag == LEVEL_UNFORMATTED)
duplicate_option_by_name(arglex_token_unformatted, usage);
if (verbose_flag != LEVEL_UNSET)
too_many(usage);
verbose_flag = LEVEL_UNFORMATTED;
trace(("}\n"));
}
int
option_unformatted_get(void)
{
return (verbose_flag == LEVEL_TERSE || verbose_flag == LEVEL_UNFORMATTED);
}
void
option_page_width_set(int n, void (*usage)(void))
{
sub_context_ty *scp;
switch (page_width_set(n))
{
case PAGE_SET_ERROR_DUPLICATE:
duplicate_option_by_name(arglex_token_page_width, usage);
// NOTREACHED
case PAGE_SET_ERROR_RANGE:
scp = sub_context_new();
sub_var_set_long(scp, "Number", n);
error_intl(scp, i18n("page width $number out of range"));
sub_context_delete(scp);
usage();
// NOTREACHED
}
}
void
option_page_length_set(int n, void (*usage)(void))
{
sub_context_ty *scp;
switch (page_length_set(n))
{
case PAGE_SET_ERROR_DUPLICATE:
duplicate_option_by_name(arglex_token_page_length, usage);
// NOTREACHED
case PAGE_SET_ERROR_RANGE:
scp = sub_context_new();
sub_var_set_long(scp, "Number", n);
error_intl(scp, i18n("page length $number out of range"));
sub_context_delete(scp);
usage();
// NOTREACHED
}
}
void
option_tab_width_set(int n, void (*usage)(void))
{
if (tab_width)
duplicate_option_by_name(arglex_token_tab_width, usage);
if (n < 0 || n > 40)
{
sub_context_ty *scp;
scp = sub_context_new();
sub_var_set_long(scp, "Number", n);
error_intl(scp, i18n("tab width $number out of range"));
sub_context_delete(scp);
usage();
}
if (n < 2)
tab_width = -1;
else
tab_width = n;
}
int
option_tab_width_get(void)
{
if (!tab_width)
tab_width = DEFAULT_TAB_WIDTH;
return (tab_width < 2 ? 0 : tab_width);
}
void
option_page_headers_set(int n, void (*usage)(void))
{
if (!usage)
{
page_headers = !!n;
return;
}
switch (page_headers)
{
case 0:
if (n)
{
mutually_exclusive_options
(
arglex_token_page_headers,
arglex_token_page_headers_not,
usage
);
}
else
{
duplicate_option_by_name(arglex_token_page_headers_not, usage);
}
break;
case 1:
if (n)
{
duplicate_option_by_name(arglex_token_page_headers, usage);
}
else
{
mutually_exclusive_options
(
arglex_token_page_headers,
arglex_token_page_headers_not,
usage
);
}
break;
default:
page_headers = !!n;
break;
}
}
int
option_page_headers_get(void)
{
if (page_headers < 0)
page_headers = 1;
return page_headers;
}
static int signed_off_by = -1;
void
option_signed_off_by_argument(void (*usage)(void))
{
switch (arglex_token)
{
case arglex_token_signed_off_by_not:
if (signed_off_by > 0)
{
mutually_exclusive_options
(
arglex_token_signed_off_by,
arglex_token_signed_off_by_not,
usage
);
}
else if (signed_off_by == 0)
{
duplicate_option_by_name(arglex_token_signed_off_by_not, usage);
}
signed_off_by = 0;
break;
case arglex_token_signed_off_by:
if (signed_off_by > 0)
{
duplicate_option_by_name(arglex_token_signed_off_by, usage);
}
else if (signed_off_by == 0)
{
mutually_exclusive_options
(
arglex_token_signed_off_by,
arglex_token_signed_off_by_not,
usage
);
}
signed_off_by = 1;
break;
}
}
bool
option_signed_off_by_get(bool dflt)
{
return (signed_off_by < 0 ? dflt : (signed_off_by != 0));
}
// vim: set ts=8 sw=4 et :