//
// aegis - project change supervisor
// Copyright (C) 2007, 2008 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
enum
{
arglex_token_lt,
arglex_token_gt,
arglex_token_le,
arglex_token_ge,
arglex_token_eq,
arglex_token_ne
};
static arglex_table_ty argtab[] =
{
{ "!=", arglex_token_ne },
{ "-EQual_to", arglex_token_eq },
{ "-Greater_Than", arglex_token_gt },
{ "-Greater_than_or_Equal_to", arglex_token_ge },
{ "-Less_Than", arglex_token_lt },
{ "-Less_than_or_Equal_to", arglex_token_le },
{ "-Not_Equal_to", arglex_token_ne },
{ "<", arglex_token_lt },
{ "<=", arglex_token_le },
{ "<>", arglex_token_ne },
{ "=", arglex_token_eq },
{ "==", arglex_token_eq },
{ ">", arglex_token_lt },
{ ">=", arglex_token_ge },
ARGLEX_END_MARKER
};
static void
usage()
{
const char *prog = progname_get();
fprintf(stderr, "Usage: %s {string} {op} {string}\n", prog);
fprintf(stderr, "\n");
fprintf(stderr, "where {op} is one of the usual six comparisons\n");
exit(1);
}
typedef bool (*func_t)(const nstring &lhs, const nstring &rhs);
static nstring
get_string()
{
switch (arglex_token)
{
case arglex_token_number:
case arglex_token_string:
{
nstring result = arglex_value.alv_string;
arglex();
return result;
}
default:
usage();
}
return "";
}
static bool
lt(const nstring &lhs, const nstring &rhs)
{
return (strverscmp(lhs.c_str(), rhs.c_str()) < 0);
}
static bool
le(const nstring &lhs, const nstring &rhs)
{
return (strverscmp(lhs.c_str(), rhs.c_str()) <= 0);
}
static bool
gt(const nstring &lhs, const nstring &rhs)
{
return (strverscmp(lhs.c_str(), rhs.c_str()) > 0);
}
static bool
ge(const nstring &lhs, const nstring &rhs)
{
return (strverscmp(lhs.c_str(), rhs.c_str()) >= 0);
}
static bool
eq(const nstring &lhs, const nstring &rhs)
{
return (strverscmp(lhs.c_str(), rhs.c_str()) == 0);
}
static bool
ne(const nstring &lhs, const nstring &rhs)
{
return (strverscmp(lhs.c_str(), rhs.c_str()) != 0);
}
static func_t
get_op()
{
switch (arglex_token)
{
case arglex_token_le:
arglex();
return le;
case arglex_token_lt:
arglex();
return lt;
case arglex_token_ge:
arglex();
return ge;
case arglex_token_gt:
arglex();
return gt;
case arglex_token_eq:
arglex();
return eq;
case arglex_token_ne:
arglex();
return ne;
default:
usage();
return 0;
}
}
static void
get_eoln()
{
if (arglex_token == arglex_token_eoln)
return;
usage();
}
int
main(int argc, char **argv)
{
arglex_init(argc, argv, argtab);
language_init();
arglex();
//
// we expect to see
// string-or-number
// operator
// string-or-number
//
nstring lhs = get_string();
func_t op = get_op();
nstring rhs = get_string();
get_eoln();
return (op(lhs, rhs) ? EXIT_SUCCESS : EXIT_FAILURE);
}