//
// aegis - project change supervisor
// Copyright (C) 1999, 2002-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
#include
#include
typedef string_ty *(*func_ptr)(project_ty *);
struct table_ty
{
const char *name;
func_ptr func;
};
static string_ty *
trunk_name_get(project_ty *pp)
{
return project_name_get(pp->trunk_get());
}
static string_ty *
trunk_description_get(project_ty *pp)
{
string_ty *s = project_description_get(pp->trunk_get());
const char *cp = s->str_text;
language_human();
while (isspace(*cp))
++cp;
const char *ep = cp;
while (*ep != '\n')
++ep;
while (ep > cp && isspace(ep[-1]))
--ep;
language_C();
return str_n_from_c(cp, ep - cp);
}
static table_ty table[] =
{
{"name", project_name_get, },
{"description", project_description_get, },
{"trunk_name", trunk_name_get, },
{"trunk_description", trunk_description_get, },
{"version", project_version_short_get },
{"version_long", project_version_get },
};
static symtab_ty *stp;
static func_ptr
find_func(const nstring &name)
{
if (!stp)
{
stp = symtab_alloc(SIZEOF(table));
for (const table_ty *tp = table; tp < ENDOF(table); ++tp)
{
nstring s(tp->name);
stp->assign(s, (void *)tp->func);
}
}
func_ptr result = (func_ptr)stp->query(name);
if (!result)
{
nstring guess = stp->query_fuzzy(name);
if (guess)
{
sub_context_ty sc;
sc.var_set_string("Name", name);
sc.var_set_string("Guess", guess);
sc.error_intl(i18n("no \"$name\", guessing \"$guess\""));
result = (func_ptr)stp->query(guess);
}
}
return result;
}
//
// NAME
// sub_project - the project substitution
//
// SYNOPSIS
// string_ty *sub_project(wstring_list_ty *arg);
//
// DESCRIPTION
// The sub_project function implements the project substitution.
// The project substitution is replaced by the project name.
//
// ARGUMENTS
// arg - list of arguments, including the function name as [0]
//
// RETURNS
// a pointer to a string in dynamic memory;
// or NULL on error, setting suberr appropriately.
//
wstring
sub_project(sub_context_ty *scp, const wstring_list &arg)
{
trace(("sub_project()\n{\n"));
wstring result;
project_ty *pp = sub_context_project_get(scp);
if (!pp)
{
scp->error_set(i18n("not valid in current context"));
trace(("}\n"));
return result;
}
if (arg.size() == 1)
result = str_to_wstr(project_name_get(pp));
else if (arg.size() == 2)
{
nstring s = arg[1].to_nstring();
func_ptr func = find_func(s);
if (!func)
{
scp->error_set(i18n("unknown substitution variant"));
trace(("}\n"));
return result;
}
result = wstring(func(pp));
}
else
{
scp->error_set(i18n("requires one argument"));
trace(("}\n"));
return result;
}
trace(("return %8.8lX;\n", (long)result.get_ref()));
trace(("}\n"));
return result;
}