//
// aegis - project change supervisor
// Copyright (C) 2004-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
#include
#include
#include
#include
#include
#include
#include
#include
enum
{
arglex_token_view_path = ARGLEX2_MAX,
arglex_token_usage,
arglex_token_action
};
static arglex_table_ty argtab[] =
{
{ "-Action", arglex_token_action },
{ "-Usage", arglex_token_usage },
{ "-View_Path", arglex_token_view_path },
ARGLEX_END_MARKER
};
static void
usage(void)
{
const char *prog;
prog = progname_get();
fprintf(stderr, "usage: %s [ -p ][ -c ][ ]\n", prog);
quit(1);
}
static view_path_ty
view_path_find(const char *s)
{
int j;
for (j = 0; j < view_path_MAX; ++j)
{
const char *s2;
s2 = view_path_ename((view_path_ty)j);
if (0 == strcasecmp(s, s2))
return (view_path_ty)j;
s2 += 10;
if (0 == strcasecmp(s, s2))
return (view_path_ty)j;
}
fatal_raw("view path type \"%s\" unknown", s);
// NOTREACHED
return view_path_simple;
}
static int
file_action_find(const char *s)
{
int j;
for (j = 0; j < file_action_max; ++j)
{
const char *s2;
s2 = file_action_ename((file_action_ty)j);
if (0 == strcasecmp(s, s2))
return j;
s2 += 12;
if (0 == strcasecmp(s, s2))
return j;
}
fatal_raw("file action \"%s\" unknown", s);
// NOTREACHED
return file_action_modify;
}
static int
file_usage_find(const char *s)
{
int j;
for (j = 0; j < file_usage_max; ++j)
{
const char *s2;
s2 = file_usage_ename((file_usage_ty)j);
if (0 == strcasecmp(s, s2))
return j;
s2 += 11;
if (0 == strcasecmp(s, s2))
return j;
}
fatal_raw("file usage \"%s\" unknown", s);
// NOTREACHED
return file_usage_source;
}
int
main(int argc, char **argv)
{
long change_number;
string_ty *project_name;
project_ty *pp;
change::pointer cp;
user_ty::pointer up;
size_t j;
view_path_ty vp;
int usage_mask;
int action_mask;
int usage_column;
int action_column;
int n;
os_become_init_mortal();
arglex2_init3(argc, argv, argtab);
env_initialize();
language_init();
arglex();
project_name = 0;
change_number = 0;
vp = view_path_extreme;
usage_mask = 0;
usage_column = 1;
action_mask = 0;
action_column = 1;
while (arglex_token != arglex_token_eoln)
{
switch (arglex_token)
{
default:
generic_argument(usage);
continue;
case arglex_token_change:
arglex();
// fall through...
case arglex_token_number:
arglex_parse_change(&project_name, &change_number, usage);
continue;
case arglex_token_project:
arglex();
arglex_parse_project(&project_name, usage);
continue;
case arglex_token_view_path:
if (arglex() != arglex_token_string)
option_needs_string(arglex_token_view_path, usage);
vp = view_path_find(arglex_value.alv_string);
break;
case arglex_token_usage:
if (arglex() != arglex_token_string)
option_needs_string(arglex_token_usage, usage);
n = file_usage_find(arglex_value.alv_string);
usage_mask |= 1 << n;
usage_column = 0;
break;
case arglex_token_action:
if (arglex() != arglex_token_string)
option_needs_string(arglex_token_action, usage);
n = file_action_find(arglex_value.alv_string);
action_mask |= 1 << n;
action_column = 0;
break;
}
arglex();
}
if (usage_mask == 0)
usage_mask = ~0;
if (action_mask == 0)
action_mask = ~0;
//
// locate project data
//
if (!project_name)
{
nstring pn = user_ty::create()->default_project();
project_name = str_copy(pn.get_ref());
}
pp = project_alloc(project_name);
str_free(project_name);
pp->bind_existing();
//
// locate user data
//
up = user_ty::create();
//
// locate change data
//
if (!change_number)
change_number = up->default_change(pp);
cp = change_alloc(pp, change_number);
change_bind_existing(cp);
for (j = 0; ; ++j)
{
fstate_src_ty *src;
src = change_file_nth(cp, j, vp);
if (!src)
break;
if (!(usage_mask & (1 << src->usage)))
continue;
if (!(action_mask & (1 << src->action)))
continue;
if (usage_column)
printf("%s ", file_usage_ename(src->usage));
if (action_column)
printf("%s ", file_action_ename(src->action));
printf("%s\n", src->file_name->str_text);
}
//
// report success
//
quit(0);
return 0;
}