diff options
Diffstat (limited to 'ACE/tests/ARGV_Test.cpp')
-rw-r--r-- | ACE/tests/ARGV_Test.cpp | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/ACE/tests/ARGV_Test.cpp b/ACE/tests/ARGV_Test.cpp new file mode 100644 index 00000000000..0e7e18f52d8 --- /dev/null +++ b/ACE/tests/ARGV_Test.cpp @@ -0,0 +1,277 @@ +// $Id$ + +// ============================================================================ +// +// = LIBRARY +// tests +// +// = DESCRIPTION +// This simple test illustrates how to use advanced features of +// <ACE_ARGV>. +// +// = AUTHOR +// Suresh Kannan <kannan@uav.ae.gatech.edu> and +// Duane Binder <duane.binder@veritas.com> + +// ============================================================================ + +#include "ace/ARGV.h" +#include "ace/Arg_Shifter.h" +#include "ace/OS_NS_string.h" +#include "ace/Argv_Type_Converter.h" +#include "test_config.h" + +ACE_RCSID (tests, ARGV_Test, "$Id$") + +static void +consume_arg (int argc, ACE_TCHAR *argv[]) +{ + ACE_Arg_Shifter arg_shifter (argc, argv); + + if (arg_shifter.is_anything_left ()) + arg_shifter.consume_arg (1); + // Once we initialize an arg_shifter, we must iterate through it all! + while ((arg_shifter.is_anything_left ())) + arg_shifter.ignore_arg (1); +} + +static int +test_simple_argv (ACE_TCHAR *argv[]) +{ + // From command line. + ACE_ARGV cl (argv); + + // My own stuff. + ACE_ARGV my; + + // Add to my stuff. + my.add (ACE_TEXT ("-ORBEndpoint iiop://localhost:12345")); + + // Combine the two (see the ace/ARGV.h constructors documentation). + ACE_ARGV a (cl.argv (), + my.argv ()); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("argc = %d\n"), + a.argc ())); + + // Print the contents of the combined <ACE_ARGV>. + for (int i = 0; i < a.argc (); i++) + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" (%d) %s\n"), + i, + a.argv ()[i])); + + return 0; +} + +static int +test_argv_type_converter (void) +{ + char *argv[20]; + argv[0] = ACE_OS_String::strdup ("one"); + argv[1] = ACE_OS_String::strdup ("two"); + argv[2] = ACE_OS_String::strdup ("three"); + argv[3] = ACE_OS_String::strdup ("four"); + argv[4] = 0; + + char *save_argv[20]; + ACE_OS_String::memcpy (save_argv, argv, sizeof (argv)); + + int argc = 4; + + { + ACE_Argv_Type_Converter ct2 (argc, argv); + } + + { + ACE_Argv_Type_Converter ct (argc, argv); + ct.get_argc (); ct.get_TCHAR_argv (); + consume_arg ( ct.get_argc (), ct.get_TCHAR_argv ()); + } + { + ACE_Argv_Type_Converter ct3 (argc, argv); + ct3.get_argc (); ct3.get_ASCII_argv (); + consume_arg ( ct3.get_argc (), ct3.get_TCHAR_argv ()); + } + + { + for (size_t i = 0; i < 4; i++) + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" (%d) %s\n"), + i, + ACE_TEXT_CHAR_TO_TCHAR (argv[i]))); + } + + for (size_t i = 0; save_argv[i]; ++i) + ACE_OS_Memory::free (save_argv[i]); + + return 0; +} + +static int +test_argv_type_converter2 (void) +{ + ACE_TCHAR *argv[20]; + argv[0] = ACE_OS_String::strdup (ACE_TEXT ("one")); + argv[1] = ACE_OS_String::strdup (ACE_TEXT ("two")); + argv[2] = ACE_OS_String::strdup (ACE_TEXT ("three")); + argv[3] = ACE_OS_String::strdup (ACE_TEXT ("four")); + argv[4] = 0; + + ACE_TCHAR *save_argv[20]; + ACE_OS_String::memcpy (save_argv, argv, sizeof (argv)); + + int argc = 4; + + { + ACE_Argv_Type_Converter ct (argc, argv); + ct.get_argc (); ct.get_TCHAR_argv (); + consume_arg ( ct.get_argc (), ct.get_TCHAR_argv ()); + } + + consume_arg (argc, argv); + + { + for (size_t i = 0; i < 4; i++) + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT (" (%d) %s\n"), + i, + argv[i])); + } + + for (size_t i = 0; save_argv[i]; ++i) + ACE_OS_Memory::free (save_argv[i]); + + return 0; +} + +static int +test_argv_buf (void) +{ + pid_t parent_pid = ACE_OS::getpid (); + + ACE_TCHAR *l_argv[3]; + ACE_TCHAR pid_str[100]; + // Store the parent's process id so we can pass it to the child + // portably. Also, pass the test number, as well. + ACE_OS::sprintf (pid_str, + ACE_TEXT ("-p %ld -t %d"), + static_cast <long> (parent_pid), + 1); + + // We're going to create a new process that runs this program again, + // so we need to indicate that it's the child. + const ACE_TCHAR *t = ACE_TEXT (".") + ACE_DIRECTORY_SEPARATOR_STR + ACE_TEXT ("Signal_Test") + ACE_PLATFORM_EXE_SUFFIX + ACE_TEXT (" -c"); + l_argv[0] = const_cast <ACE_TCHAR *> (t); + l_argv[1] = pid_str; + l_argv[2] = 0; + + ACE_ARGV my_argv (l_argv); + + // This shouldn't have any quotes in it. + ACE_DEBUG ((LM_DEBUG, "%s\n", my_argv.buf ())); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("argc: %d\n"), my_argv.argc ())); + return 0; +} + +static int +test_argv_quotes (void) +{ + const ACE_TCHAR *argv[] = { ACE_TEXT ("first without quotes"), + ACE_TEXT ("'second in single quotes'"), + ACE_TEXT ("\"third in double quotes\""), + 0 + }; + int argc = 3; + + // (argc, argv) + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** argv ***\n"))); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("argc: %d\n"), argc)); + + for (int i = 0; i < argc; ++i) + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("argv[%02d] = %s\n"), i, argv[i])); + + // args + ACE_ARGV args; + for (int i = 0; i < argc; ++i) + args.add (argv[i]); + args.add (ACE_TEXT ("'fourth in single quotes'")); + args.add (ACE_TEXT ("\"fifth in double quotes\"")); + args.add (ACE_TEXT ("sixth without any quotes")); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** args-1 ***\n"))); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args.argc ())); + + for (int i = 0; i < args.argc (); ++i) + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args[%02d]: %s\n"), i, args[i])); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args.argc ())); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** args-2 ***\n"))); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args.argc ())); + + for (int i = 0; i < args.argc (); ++i) + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argv ()[%02d]: %s\n"), + i, args.argv ()[i])); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args.argc ())); + + // args2 + ACE_ARGV args2; + for (int i = 0; i < argc; ++i) + args2.add (argv[i], true); + args2.add (ACE_TEXT ("'fourth in single quotes'"), true); + args2.add (ACE_TEXT ("\"fifth in double quotes\""), true); + args2.add (ACE_TEXT ("sixth without any quotes"), true); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** args-3 ***\n"))); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args2.argc ())); + + for (int i = 0; i < args2.argc (); ++i) + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args[%02d]: %s\n"), i, args2[i])); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args2.argc ())); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** args-4 ***\n"))); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args2.argc ())); + + for (int i = 0; i < args2.argc (); ++i) + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argv ()[%02d]: %s\n"), + i, args2.argv ()[i])); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args2.argc ())); + + // args3 + ACE_ARGV args3(argv); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n*** args-5 ***\n"))); + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args3.argc ())); + + for (int i = 0; i < args3.argc (); ++i) + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args[%02d]: %s\n"), i, args3[i])); + + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("args.argc (): %d\n"), args3.argc ())); + + return 0; +} + +int +run_main (int, ACE_TCHAR *argv[]) +{ + ACE_START_TEST (ACE_TEXT ("ARGV_Test")); + + test_simple_argv (argv); + test_argv_type_converter2 (); + test_argv_type_converter (); + test_argv_quotes (); + test_argv_buf (); + + ACE_END_TEST; + return 0; +} + |