Commit 850b209e authored by Botond Baranyi's avatar Botond Baranyi
Browse files

Added command line option to list module parameters in built executables (bug 540052)



Change-Id: I477ecce4dbf03f44702c7457775e411a0b688e2a
Signed-off-by: Botond Baranyi's avatarBotond Baranyi <botond.baranyi@ericsson.com>
parent c1034cf0
......@@ -4099,6 +4099,9 @@ namespace Ttcn {
}
target->functions.log_param = mputprintf(target->functions.log_param,
"%s.log();\n", name);
target->functions.pre_init = mputprintf(target->functions.pre_init,
"module_object.add_modulepar(\"%s\");\n", dispname);
}
void Def_Modulepar::generate_code(Common::CodeGenHelper& cgh) {
......@@ -4272,6 +4275,9 @@ namespace Ttcn {
}
target->functions.log_param = mputprintf(target->functions.log_param,
"%s.log();\n", name);
target->functions.pre_init = mputprintf(target->functions.pre_init,
"module_object.add_modulepar(\"%s\");\n", dispname);
}
void Def_Modulepar_Template::generate_code(Common::CodeGenHelper& cgh) {
......
......@@ -417,6 +417,12 @@ void Module_List::list_testcases()
list_iter = list_iter->list_next) list_iter->list_testcases();
}
void Module_List::list_modulepars()
{
for (TTCN_Module *list_iter = list_head; list_iter != NULL;
list_iter = list_iter->list_next) list_iter->list_modulepars();
}
void Module_List::push_version(Text_Buf& text_buf)
{
int n_modules = 0;
......@@ -781,6 +787,11 @@ struct TTCN_Module::testcase_list_item {
testcase_list_item *next_testcase;
};
struct TTCN_Module::modulepar_list_item {
const char* name;
modulepar_list_item* next;
};
/** Constructor for TTCN modules */
TTCN_Module::TTCN_Module(const char *par_module_name,
const char *par_compilation_date,
......@@ -834,6 +845,8 @@ TTCN_Module::TTCN_Module(const char *par_module_name,
, altstep_tail(NULL)
, testcase_head(NULL)
, testcase_tail(NULL)
, modulepar_head(NULL)
, modulepar_tail(NULL)
{
Module_List::add_module(this);
}
......@@ -875,6 +888,8 @@ TTCN_Module::TTCN_Module(const char *par_module_name,
, altstep_tail(NULL)
, testcase_head(NULL)
, testcase_tail(NULL)
, modulepar_head(NULL)
, modulepar_tail(NULL)
{
Module_List::add_module(this);
}
......@@ -914,6 +929,8 @@ TTCN_Module::TTCN_Module(const char *par_module_name,
, altstep_tail(NULL)
, testcase_head(NULL)
, testcase_tail(NULL)
, modulepar_head(NULL)
, modulepar_tail(NULL)
{
Module_List::add_module(this);
}
......@@ -936,6 +953,11 @@ TTCN_Module::~TTCN_Module()
delete testcase_head;
testcase_head = tmp_ptr;
}
while (modulepar_head != NULL) {
modulepar_list_item *tmp_ptr = modulepar_head->next;
delete modulepar_head;
modulepar_head = tmp_ptr;
}
}
void TTCN_Module::pre_init_module()
......@@ -1016,6 +1038,20 @@ void TTCN_Module::add_testcase_pard(const char *testcase_name,
testcase_tail = new_item;
}
void TTCN_Module::add_modulepar(const char* name)
{
modulepar_list_item* new_item = new modulepar_list_item;
new_item->name = name;
new_item->next = NULL;
if (modulepar_head == NULL) {
modulepar_head = new_item;
}
else {
modulepar_tail->next = new_item;
}
modulepar_tail = new_item;
}
void TTCN_Module::execute_testcase(const char *testcase_name)
{
for (testcase_list_item *list_iter = testcase_head; list_iter != NULL;
......@@ -1227,6 +1263,14 @@ void TTCN_Module::list_testcases()
printf("%s.%s\n", module_name, list_iter->testcase_name);
}
void TTCN_Module::list_modulepars()
{
for (modulepar_list_item *list_iter = modulepar_head; list_iter != NULL;
list_iter = list_iter->next) {
printf("%s.%s\n", module_name, list_iter->name);
}
}
void TTCN_Module::push_version(Text_Buf& text_buf)
{
text_buf.push_string(module_name);
......
......@@ -78,6 +78,7 @@ public:
static void clean_up_usage_stats(pthread_t thread, thread_data* data);
#endif
static void list_testcases();
static void list_modulepars();
static void push_version(Text_Buf& text_buf);
static void encode_function(Text_Buf& text_buf,
......@@ -165,6 +166,8 @@ private:
altstep_list_item *altstep_head, *altstep_tail;
struct testcase_list_item;
testcase_list_item *testcase_head, *testcase_tail;
struct modulepar_list_item;
modulepar_list_item *modulepar_head, *modulepar_tail;
/// Copy constructor disabled
TTCN_Module(const TTCN_Module&);
......@@ -215,6 +218,7 @@ public:
testcase_t testcase_function);
void add_testcase_pard(const char *testcase_name,
genericfunc_t testcase_address);
void add_modulepar(const char* name);
void execute_testcase(const char *testcase_name);
void execute_all_testcases();
......@@ -232,6 +236,7 @@ public:
void print_version();
ModuleVersion* get_version() const;
void list_testcases();
void list_modulepars();
void push_version(Text_Buf& text_buf);
size_t get_num_ns() const { return num_namespaces; }
const namespace_t *get_ns(size_t p_index) const;
......
......@@ -84,47 +84,54 @@ static void usage(const char* program_name)
fprintf(stderr, "\n"
"usage: %s [-s local_addr] MC_host MC_port\n"
" or %s -l\n"
" or %s -p\n"
" or %s -v\n"
"\n"
"OPTIONS:\n"
" -s local_addr: use the given source IP address for control "
"connections\n"
" -l: list startable test cases and control parts\n"
" -p: list module parameters\n"
" -v: show version and module information\n",
program_name, program_name, program_name);
program_name, program_name, program_name, program_name);
}
/** Returns whether the caller should exit immediately */
static boolean process_options(int argc, char *argv[], int& ret_val,
const char*& local_addr, const char*& MC_host, unsigned short& MC_port)
{
boolean lflag = FALSE, sflag = FALSE, vflag = FALSE, errflag = FALSE;
boolean lflag = FALSE, sflag = FALSE, vflag = FALSE, pflag = FALSE,
errflag = FALSE;
for ( ; ; ) {
int c = getopt(argc, argv, "ls:v");
int c = getopt(argc, argv, "ls:vp");
if (c == -1) break;
switch (c) {
case 'l':
if (lflag || sflag || vflag) errflag = TRUE;
if (lflag || pflag || sflag || vflag) errflag = TRUE;
else lflag = TRUE;
break;
case 's':
if (lflag || sflag || vflag) errflag = TRUE;
if (lflag || pflag || sflag || vflag) errflag = TRUE;
else {
local_addr = optarg;
sflag = TRUE;
}
break;
case 'v':
if (lflag || sflag || vflag) errflag = TRUE;
if (lflag || pflag || sflag || vflag) errflag = TRUE;
else vflag = TRUE;
break;
case 'p':
if (pflag || lflag || sflag || vflag) errflag = TRUE;
else pflag = TRUE;
break;
default:
errflag = TRUE;
break;
}
}
if (lflag || vflag) {
if (lflag || vflag || pflag) {
if (optind != argc) errflag = TRUE;
} else {
if (optind == argc - 2) {
......@@ -145,14 +152,19 @@ static boolean process_options(int argc, char *argv[], int& ret_val,
usage(argv[0]);
ret_val = EXIT_FAILURE;
return TRUE;
} else if (lflag) {
} else if (lflag || pflag) {
// list of testcases
try {
// create buffer for error messages
TTCN_Runtime::install_signal_handlers();
TTCN_Logger::initialize_logger();
Module_List::pre_init_modules();
Module_List::list_testcases();
if (lflag) {
Module_List::list_testcases();
}
else { // pflag
Module_List::list_modulepars();
}
} catch (...) {
ret_val = EXIT_FAILURE;
}
......
......@@ -82,14 +82,16 @@ static void usage(const char* program_name)
fprintf(stderr, "\n"
"usage: %s [-h] [-b file] configuration_file\n"
" or %s -l\n"
" or %s -p\n"
" or %s -v\n"
"\n"
"OPTIONS:\n"
" -b file: run specified batch file at start (debugger must be activated)\n"
" -h: automatically halt execution at start (debugger must be activated)\n"
" -l: list startable test cases and control parts\n"
" -p: list module parameters\n"
" -v: show version and module information\n",
program_name, program_name, program_name);
program_name, program_name, program_name, program_name);
}
int main(int argc, char *argv[])
......@@ -107,32 +109,37 @@ int main(int argc, char *argv[])
#endif
errno = 0;
int c, i, ret_val = EXIT_SUCCESS;
boolean bflag = FALSE, hflag = FALSE, lflag = FALSE, vflag = FALSE, errflag = FALSE;
boolean bflag = FALSE, hflag = FALSE, lflag = FALSE, vflag = FALSE, pflag = FALSE,
errflag = FALSE;
const char *config_file = NULL;
TTCN_Module *only_runnable = Module_List::single_control_part();
while ((c = getopt(argc, argv, "b:hlv")) != -1) {
while ((c = getopt(argc, argv, "b:hlvp")) != -1) {
switch (c) {
case 'b':
if (bflag || lflag || vflag) errflag = TRUE; // duplicate or conflicting
if (bflag || lflag || vflag || pflag) errflag = TRUE; // duplicate or conflicting
else {
bflag = TRUE;
ttcn3_debugger.set_initial_batch_file(optarg);
}
break;
case 'h':
if (hflag || lflag || vflag) errflag = TRUE; // duplicate or conflicting
if (hflag || lflag || vflag || pflag) errflag = TRUE; // duplicate or conflicting
else {
hflag = TRUE;
ttcn3_debugger.set_halt_at_start();
}
break;
case 'l':
if (lflag || vflag) errflag = TRUE; // duplicate or conflicting
if (lflag || vflag || pflag || bflag || hflag) errflag = TRUE; // duplicate or conflicting
else lflag = TRUE;
break;
case 'p':
if (pflag || lflag || vflag || bflag || hflag) errflag = TRUE; // duplicate or conflicting
else pflag = TRUE;
break;
case 'v':
if (lflag || vflag) errflag = TRUE; // duplicate or conflicting
if (lflag || vflag || pflag || bflag || hflag) errflag = TRUE; // duplicate or conflicting
else vflag = TRUE;
break;
default:
......@@ -141,8 +148,8 @@ int main(int argc, char *argv[])
}
if (!errflag) {
if (lflag || vflag) {
if (optind != argc) errflag = TRUE; // -l or -v and non-option arg
if (lflag || vflag || pflag) {
if (optind != argc) errflag = TRUE; // -l, -p or -v and non-option arg
} else {
if (optind > argc - 1) { // no config file argument
errflag = (only_runnable == 0);
......@@ -157,12 +164,17 @@ int main(int argc, char *argv[])
usage(argv[0]);
TCov::close_file();
return EXIT_FAILURE;
} else if (lflag) {
} else if (lflag || pflag) {
try {
// create buffer for error messages
TTCN_Logger::initialize_logger();
Module_List::pre_init_modules();
Module_List::list_testcases();
if (lflag) {
Module_List::list_testcases();
}
else { // pflag
Module_List::list_modulepars();
}
} catch (...) {
ret_val = EXIT_FAILURE;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment