//
// aegis - project change supervisor
// Copyright (C) 1991-1995, 1999, 2001-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
#include
#include
#include
#include
#include
#include
#include
void
version_copyright()
{
static const char *const text[] =
{
"\n",
"The %s program comes with ABSOLUTELY NO WARRANTY; ",
"for details use the '%s -VERSion License' command. ",
"The %s program is free software, and you are welcome ",
"to redistribute it under certain conditions; for ",
"details use the '%s -VERSion License' command.\n",
};
const char *progname = progname_get();
output::pointer fp = output_pager::open();
fp = output_wrap_open(fp, -1);
fp->fprintf("%s version %s\n", progname, version_stamp());
fp->fprintf("Copyright (C) %s Peter Miller\n", copyright_years());
for (const char *const *cpp = text; cpp < ENDOF(text); ++cpp)
{
const char *line = *cpp;
for (;;)
{
const char *p = strstr(line, "%s");
if (!p)
break;
fp->write(line, p - line);
line = p + 2;
fp->fputs(progname);
}
fp->fputs(line);
}
}
static void
version_license(void)
{
help("aelic", (void (*)(void))0);
}
static void
version_usage(void)
{
const char *progname;
progname = progname_get();
fprintf(stderr, "usage: %s -VERSion [ ]\n", progname);
fprintf(stderr, " %s -VERSion -Help\n", progname);
quit(1);
}
struct table_ty
{
const char *name;
void (*func)(void);
};
static table_ty table[] =
{
{ "Copyright", version_copyright, },
{ "License", version_license, },
};
static void
version_main(void)
{
sub_context_ty *scp;
void (*func)(void);
const char *name;
trace(("version_main()\n{\n"));
arglex();
name = 0;
while (arglex_token != arglex_token_eoln)
{
switch (arglex_token)
{
default:
generic_argument(version_usage);
continue;
case arglex_token_string:
if (name)
{
scp = sub_context_new();
fatal_intl(scp, i18n("too many info names"));
}
name = arglex_value.alv_string;
break;
}
arglex();
}
if (name)
{
int nhit;
table_ty *tp;
string_ty *s1;
string_ty *s2;
table_ty *hit[SIZEOF(table)];
int j;
nhit = 0;
for (tp = table; tp < ENDOF(table); ++tp)
{
if (arglex_compare(tp->name, name, 0))
hit[nhit++] = tp;
}
switch (nhit)
{
case 0:
scp = sub_context_new();
sub_var_set_charstar(scp, "Name", name);
fatal_intl(scp, i18n("no info $name"));
// NOTWEACHED
case 1:
break;
default:
s1 = str_from_c(hit[0]->name);
for (j = 1; j < nhit; ++j)
{
s2 = str_format("%s, %s", s1->str_text, hit[j]->name);
str_free(s1);
s1 = s2;
}
scp = sub_context_new();
sub_var_set_charstar(scp, "Name", name);
sub_var_set_string(scp, "Name_List", s1);
fatal_intl(scp, i18n("info $name ambig ($name_list)"));
// NOTREACHED
}
arglex();
func = hit[0]->func;
}
else
func = version_copyright;
func();
trace(("}\n"));
}
static void
version_help(void)
{
help("aev", version_usage);
}
void
version(void)
{
static arglex_dispatch_ty dispatch[] =
{
{ arglex_token_help, version_help, 0 },
};
trace(("version()\n{\n"));
arglex_dispatch(dispatch, SIZEOF(dispatch), version_main);
trace(("}\n"));
}
// vim: set ts=8 sw=4 et :