summaryrefslogtreecommitdiff
path: root/trunk/TAO/TAO_IDL/driver/drv_args.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/TAO_IDL/driver/drv_args.cpp')
-rw-r--r--trunk/TAO/TAO_IDL/driver/drv_args.cpp584
1 files changed, 584 insertions, 0 deletions
diff --git a/trunk/TAO/TAO_IDL/driver/drv_args.cpp b/trunk/TAO/TAO_IDL/driver/drv_args.cpp
new file mode 100644
index 00000000000..fd584c8d756
--- /dev/null
+++ b/trunk/TAO/TAO_IDL/driver/drv_args.cpp
@@ -0,0 +1,584 @@
+// $Id$
+
+/*
+
+COPYRIGHT
+
+Copyright 1992, 1993, 1994 Sun Microsystems, Inc. Printed in the United
+States of America. All Rights Reserved.
+
+This product is protected by copyright and distributed under the following
+license restricting its use.
+
+The Interface Definition Language Compiler Front End (CFE) is made
+available for your use provided that you include this license and copyright
+notice on all media and documentation and the software program in which
+this product is incorporated in whole or part. You may copy and extend
+functionality (but may not remove functionality) of the Interface
+Definition Language CFE without charge, but you are not authorized to
+license or distribute it to anyone else except as part of a product or
+program developed by you or with the express written consent of Sun
+Microsystems, Inc. ("Sun").
+
+The names of Sun Microsystems, Inc. and any of its subsidiaries or
+affiliates may not be used in advertising or publicity pertaining to
+distribution of Interface Definition Language CFE as permitted herein.
+
+This license is effective until terminated by Sun for failure to comply
+with this license. Upon termination, you shall destroy or return all code
+and documentation for the Interface Definition Language CFE.
+
+INTERFACE DEFINITION LANGUAGE CFE IS PROVIDED AS IS WITH NO WARRANTIES OF
+ANY KIND INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS
+FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR ARISING FROM A COURSE OF
+DEALING, USAGE OR TRADE PRACTICE.
+
+INTERFACE DEFINITION LANGUAGE CFE IS PROVIDED WITH NO SUPPORT AND WITHOUT
+ANY OBLIGATION ON THE PART OF Sun OR ANY OF ITS SUBSIDIARIES OR AFFILIATES
+TO ASSIST IN ITS USE, CORRECTION, MODIFICATION OR ENHANCEMENT.
+
+SUN OR ANY OF ITS SUBSIDIARIES OR AFFILIATES SHALL HAVE NO LIABILITY WITH
+RESPECT TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY
+INTERFACE DEFINITION LANGUAGE CFE OR ANY PART THEREOF.
+
+IN NO EVENT WILL SUN OR ANY OF ITS SUBSIDIARIES OR AFFILIATES BE LIABLE FOR
+ANY LOST REVENUE OR PROFITS OR OTHER SPECIAL, INDIRECT AND CONSEQUENTIAL
+DAMAGES, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+Use, duplication, or disclosure by the government is subject to
+restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
+Technical Data and Computer Software clause at DFARS 252.227-7013 and FAR
+52.227-19.
+
+Sun, Sun Microsystems and the Sun logo are trademarks or registered
+trademarks of Sun Microsystems, Inc.
+
+SunSoft, Inc.
+2550 Garcia Avenue
+Mountain View, California 94043
+
+NOTE:
+
+SunOS, SunSoft, Sun, Solaris, Sun Microsystems or the Sun logo are
+trademarks or registered trademarks of Sun Microsystems, Inc.
+
+*/
+
+// drv_args.cpp - Argument parsing for IDL compiler main driver
+
+#include "idl_defines.h"
+#include "global_extern.h"
+#include "drv_extern.h"
+#include "fe_extern.h"
+#include "be_global.h"
+#include "be_extern.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/os_include/os_ctype.h"
+
+ACE_RCSID (driver,
+ drv_args,
+ "$Id$")
+
+extern long DRV_nfiles;
+extern char *DRV_files[];
+
+// Push a file into the list of files to be processed
+void
+DRV_push_file (const char *s)
+{
+ // If filenames come from the command line, there is no
+ // need to duplicate the string, but some backends have
+ // an option to recurse over a directory and add all
+ // IDL files found. In this latter case we have to
+ // duplicate the file name string.
+ DRV_files[DRV_nfiles++] = ACE::strnew (s);
+}
+
+// Prepare a CPP argument
+static void
+DRV_prep_cpp_arg (char *s)
+{
+ char *newarg = 0;
+ ACE_NEW (newarg,
+ char[512]);
+ char *farg;
+
+ newarg[0] = '\0';
+
+ for (farg = ACE_OS::strtok (s, ",");
+ farg != 0;
+ farg = ACE_OS::strtok (0, ","))
+ {
+ ACE_OS::strcat (newarg,
+ farg);
+ }
+
+ DRV_cpp_putarg (newarg);
+}
+
+// Print a usage message and exit.
+void
+DRV_usage (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("%s%s%s%s"),
+ idl_global->prog_name (),
+ ACE_TEXT (": usage: "),
+ idl_global->prog_name (),
+ ACE_TEXT (" [flag | file]*\n")));
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Legal flags:\n")));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -A...\t\t\tlocal implementation-specific escape\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -Cw\t\t\tWarning if identifier spellings differ ")
+ ACE_TEXT ("only in case (default is error)\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -Ce\t\t\tError if identifier spellings differ ")
+ ACE_TEXT ("only in case (default)\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -d\t\t\tOutputs (to stdout) a dump of the AST\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -Dname[=value]\t\tdefines name for preprocessor\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -E\t\t\truns preprocessor only, prints on stdout\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -Idir\t\t\tincludes dir in search path for preprocessor\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -t\t\t\tTemporary directory to be used")
+ ACE_TEXT (" by the IDL compiler.\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -u\t\t\tprints usage message and exits\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -Uname\t\t\tundefines name for preprocessor\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -v\t\t\ttraces compilation stages\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -V\t\t\tprints version info then exits\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -w\t\t\tsuppresses IDL compiler warning messages\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -Wp,<arg1,...,argn>\t\t\t\tpasses args to preprocessor\n")
+ ));
+ ACE_DEBUG ((
+ LM_DEBUG,
+ ACE_TEXT (" -Yp,path\t\tdefines location of preprocessor\n")
+ ));
+
+ be_global->usage ();
+}
+
+// Parse arguments on command line
+void
+DRV_parse_args (long ac, char **av)
+{
+ ACE_CString buffer;
+ char *s = 0;
+ long i;
+ bool has_space = false;
+
+ FE_store_env_include_paths ();
+ DRV_cpp_init ();
+ idl_global->set_prog_name (av[0]);
+
+ for (i = 1; i < ac; i++)
+ {
+ if (av[i][0] == '-')
+ {
+ idl_global->append_idl_flag (av[i]);
+
+ switch (av[i][1])
+ {
+ case 0:
+ // One or more letters expected after the dash.
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: Space between dash and option ")
+ ACE_TEXT ("letters not allowed\n")
+ ));
+
+ ++i;
+ idl_global->set_err_count (idl_global->err_count () + 1);
+ break;
+ case 'A':
+ if (av[i][2] == '\0')
+ {
+ if (i < ac - 1)
+ {
+ s = av[i + 1];
+ ++i;
+ }
+ else
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: incorrect use of ")
+ ACE_TEXT ("the -A option\n")
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ break;
+ }
+ }
+ else
+ {
+ s = av[i] + 2;
+ }
+
+ ACE_OS::strcat (idl_global->local_escapes (), s);
+ ACE_OS::strcat (idl_global->local_escapes (), " ");
+ break;
+ // Temp directory for the IDL compiler to keep its files.
+ case 't':
+ if ((av[i][2] == '\0') && (i < ac - 1))
+ {
+ idl_global->append_idl_flag (av[i + 1]);
+ idl_global->temp_dir (av[i + 1]);
+ ++i;
+ }
+ else
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: I don't understand")
+ ACE_TEXT (" the '%s' option\n"),
+ av[i]
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ }
+
+ break;
+ case 'D':
+ case 'U':
+ case 'I':
+ if (av[i][2] == '\0')
+ {
+ if (i < ac - 1)
+ {
+ idl_global->append_idl_flag (av[i + 1]);
+ has_space = idl_global->hasspace (av[i + 1]);
+
+ // If the include path has a space, we need to
+ // add literal "s.
+ ACE_CString arg = av[i];
+ arg += (has_space ? "\"" : "");
+ arg += av[i + 1];
+ arg += (has_space ? "\"" : "");
+
+ DRV_cpp_putarg (arg.c_str ());
+ idl_global->add_include_path (arg.substr (2).c_str ());
+ ++i;
+ }
+ else
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: I don't understand")
+ ACE_TEXT (" the '%s' option\n"),
+ av[i]
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ break;
+ }
+ }
+ else
+ {
+ has_space = idl_global->hasspace (av[i]);
+
+ // If the include path has a space, we need to
+ // add literal "s.
+ ACE_CString arg (av[i], 2);
+ arg += (has_space ? "\"" : "");
+ arg += av[i] + 2;
+ arg += (has_space? "\"" : "");
+
+ idl_global->add_include_path (arg.substr (2).c_str ());
+ DRV_cpp_putarg (arg.c_str ());
+ }
+
+ break;
+ case 'E':
+ idl_global->set_compile_flags (idl_global->compile_flags () |
+ IDL_CF_ONLY_PREPROC);
+ break;
+ case 'V':
+ idl_global->set_compile_flags (idl_global->compile_flags () |
+ IDL_CF_VERSION);
+ break;
+ case 'W':
+ if (av[i][2] == '\0')
+ {
+ if (i < ac - 1)
+ {
+ s = av[i + 1];
+ ++i;
+ }
+ else
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: I don't understand")
+ ACE_TEXT (" the '%s' option\n"),
+ av[i]
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ break;
+ }
+ }
+ else
+ {
+ s = av[i] + 2;
+ }
+
+ switch (*s)
+ {
+ default:
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: Incorrect use of -W option\n")
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ break;
+ case 'p':
+ if (*(s + 1) == ',')
+ {
+ DRV_prep_cpp_arg (s + 2);
+ }
+
+ break;
+ case 'b':
+ if (*(s + 1) == ',')
+ {
+ be_global->prep_be_arg (s + 2);
+ }
+
+ break;
+ }
+
+ break;
+ case 'Y':
+ if (av[i][2] == '\0')
+ {
+ if (i < ac - 1)
+ {
+ s = av[i + 1];
+ ++i;
+ }
+ else
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: I don't understand")
+ ACE_TEXT (" the '%s' option\n"),
+ av[i]
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ break;
+ }
+ }
+ else
+ {
+ s = av[i] + 2;
+ }
+
+ switch (*s)
+ {
+ case 'p':
+ if (*(s + 1) == ',')
+ {
+ idl_global->set_cpp_location (s + 2);
+ DRV_cpp_new_location (s + 2);
+ }
+ else
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: I don't understand")
+ ACE_TEXT (" the '-Y' option\n")
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ }
+
+ break;
+ default:
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: I dont' understand the use of")
+ ACE_TEXT (" %s with the '-Y' option\n"),
+ s
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ break;
+ }
+ break;
+ case 'd':
+ idl_global->set_compile_flags (idl_global->compile_flags ()
+ | IDL_CF_DUMP_AST);
+ break;
+ case 'u':
+ idl_global->set_compile_flags (idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE);
+ break;
+ case 'v':
+ idl_global->set_compile_flags (idl_global->compile_flags ()
+ | IDL_CF_INFORMATIVE);
+ break;
+ case 'w':
+ idl_global->set_compile_flags (idl_global->compile_flags ()
+ | IDL_CF_NOWARNINGS);
+ break;
+ case 'C':
+ // If identifiers in the same scope differ only by case...
+ if (av[i][2] == 'e')
+ {
+ // ...report an error.
+ idl_global->case_diff_error (true);
+ }
+ else if (av[i][2] == 'w')
+ {
+ // ...report a warning (default for now)
+ idl_global->case_diff_error (false);
+ }
+ else
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: I don't understand the '%s' option\n"),
+ av[i]
+ ));
+
+ idl_global->set_compile_flags (
+ idl_global->compile_flags ()
+ | IDL_CF_ONLY_USAGE
+ );
+ }
+
+ break;
+ default:
+ be_global->parse_args (i, av);
+ break;
+ } // End of switch (av[i][1])
+ } // End of IF (av[i][0] == '-')
+ else
+ {
+ DRV_push_file (av[i]);
+ }
+ } // End of FOR (i = 1; i < ac; i++)
+
+ be_global->arg_post_proc ();
+
+ // Make sure the output directory is valid.
+ if (idl_global->temp_dir () == 0)
+ {
+ char tmpdir[MAXPATHLEN + 1];
+
+ if (ACE::get_temp_dir (tmpdir, MAXPATHLEN) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("Temporary path too long, ")
+ ACE_TEXT ("defaulting to current directory\n")));
+
+ ACE_OS::strcpy (tmpdir, ".");
+ }
+
+#if defined(ACE_MVS)
+ if (ACE_OS::access (tmpdir, F_OK) == -1
+ || ACE_OS::access (tmpdir, R_OK) == -1
+ || ACE_OS::access (tmpdir, W_OK) == -1)
+#else
+ if (ACE_OS::access (tmpdir, F_OK | R_OK | W_OK) == -1)
+#endif /* ACE_MVS */
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("%s%s%s\n"),
+ ACE_TEXT ("Can't access temporary directory ("),
+ tmpdir,
+ ACE_TEXT ("), using current directory for temp files.")
+ ));
+
+ ACE_OS::strcpy (tmpdir, ".");
+#if defined(ACE_MVS)
+ if (ACE_OS::access (tmpdir, F_OK) == -1
+ || ACE_OS::access (tmpdir, R_OK) == -1
+ || ACE_OS::access (tmpdir, W_OK) == -1)
+#else
+ if (ACE_OS::access (tmpdir, F_OK | R_OK | W_OK) == -1)
+#endif /* ACE_MVS */
+ {
+ ACE_ERROR ((LM_ERROR,
+ "%s%s\n",
+ ACE_TEXT ("Error: Can't access ")
+ ACE_TEXT ("temporary directory "),
+ tmpdir));
+
+ idl_global->set_err_count (idl_global->err_count () + 1);
+ throw FE_Bailout ();
+ }
+ }
+
+ idl_global->temp_dir (tmpdir);
+ }
+
+ DRV_cpp_post_init ();
+}