summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/tao_idl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/tao_idl.cpp')
-rw-r--r--TAO/TAO_IDL/tao_idl.cpp389
1 files changed, 389 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/tao_idl.cpp b/TAO/TAO_IDL/tao_idl.cpp
new file mode 100644
index 00000000000..015afdf6b6e
--- /dev/null
+++ b/TAO/TAO_IDL/tao_idl.cpp
@@ -0,0 +1,389 @@
+// $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.
+
+*/
+
+#include "idl_defines.h"
+#include "be_extern.h"
+#include "global_extern.h"
+#include "fe_extern.h"
+#include "ast_root.h"
+#include "ast_extern.h"
+#include "utl_string.h"
+#include "utl_identifier.h"
+#include "drv_extern.h"
+#include "tao/Version.h"
+
+#if !defined (ACE_LACKS_IOSTREAM_TOTALLY)
+// FUZZ: disable check_for_streams_include
+# include "ace/streams.h"
+#endif /* ! ACE_LACKS_IOSTREAM_TOTALLY */
+
+ACE_RCSID (TAO_IDL,
+ tao_idl,
+ "$Id$")
+
+extern const char *DRV_arglist[];
+extern unsigned long DRV_argcount;
+
+char *DRV_files[NFILES];
+long DRV_nfiles = 0;
+long DRV_file_index = -1;
+
+void
+DRV_version (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "%s\n"
+ "%s %s (%s %s)\n",
+ idl_global->prog_name (),
+ ACE_TEXT ("TAO_IDL_FE, version"),
+ ACE_TEXT (TAO_VERSION),
+ ACE_TEXT ("Based on Sun IDL FE, version"),
+ ACE_TEXT (SUN_IDL_FE_VERSION)));
+
+ BE_version ();
+}
+
+int
+DRV_init (int &argc, char *argv[])
+{
+ // Initialize front end.
+ FE_init ();
+
+ // Initialize driver private data
+ DRV_nfiles = 0;
+ DRV_file_index = 0;
+
+#if defined (TAO_IDL_PREPROCESSOR)
+ idl_global->set_cpp_location (TAO_IDL_PREPROCESSOR);
+#elif defined (ACE_CC_PREPROCESSOR)
+ idl_global->set_cpp_location (ACE_CC_PREPROCESSOR);
+#else
+ // Just default to cc
+ idl_global->set_cpp_location ("cc");
+#endif /* TAO_IDL_PREPROCESSOR */
+
+ // Does nothing for IDL compiler, stores -ORB args, initializes
+ // ORB and IFR for IFR loader.
+ return BE_init (argc, argv);
+}
+
+void
+DRV_refresh (void)
+{
+ idl_global->set_err_count (0);
+ idl_global->set_filename (0);
+ idl_global->set_main_filename (0);
+ idl_global->set_real_filename (0);
+ idl_global->set_stripped_filename (0);
+ idl_global->set_lineno (-1);
+ idl_global->reset_flag_seen ();
+}
+
+void
+DRV_cleanup (void)
+{
+ // In case we got here via an init error or
+ // usage/version option - otherwise it's idempotent.
+ BE_cleanup ();
+
+ be_global->destroy ();
+ delete be_global;
+ be_global = 0;
+
+ idl_global->fini ();
+ delete idl_global;
+ idl_global = 0;
+
+ for (DRV_file_index = 0;
+ DRV_file_index < DRV_nfiles;
+ ++DRV_file_index)
+ {
+ ACE::strdelete (DRV_files[DRV_file_index]);
+ }
+
+ for (unsigned long i = 0; i < DRV_argcount; ++i)
+ {
+ delete [] (const_cast<char *> (DRV_arglist[i]));
+ }
+}
+
+/*
+** Drive the compilation
+**
+** LOGIC:
+**
+** 2. Initialize the BE. This builds an instance of the generator
+** 3. Initialize the FE. This builds the global scope
+** and populates it with the predefined types
+** 4. Invoke FE_yyparse
+** 5. Check for errors from FE_yyparse. If any, exit now
+** 6. Check for undefined forward declared interfaces. If any, exit now
+** 7. Check if asked to dump AST. If so, do.
+** 8. Invoke BE.
+*/
+
+void
+DRV_drive (const char *s)
+{
+ // Set the name of the IDL file we are parsing. This is useful to
+ // the backend when it generates C++ headers and files.
+ idl_global->idl_src_file (idl_global->utl_string_factory (s));
+
+ // Pass through CPP.
+ if (idl_global->compile_flags () & IDL_CF_INFORMATIVE)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "%s%s %s\n",
+ idl_global->prog_name (),
+ ACE_TEXT (": preprocessing"),
+ s));
+ }
+
+ DRV_pre_proc (s);
+
+ // Parse.
+ if (idl_global->compile_flags () & IDL_CF_INFORMATIVE)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "%s%s %s\n",
+ idl_global->prog_name (),
+ ACE_TEXT (": parsing"),
+ s));
+ }
+
+ // Return value not used - error count stored in idl_global
+ // and checked below.
+ (void) FE_yyparse ();
+
+ // Filename set by FE_yyparse(), so we output it immediately after.
+ ACE_DEBUG ((LM_DEBUG, "processing %s\n",
+ idl_global->filename ()->get_string ()));
+
+ // We must do this as late as possible to make sure any
+ // forward declared structs or unions contained in a
+ // primary key at some level have been fully defined.
+ idl_global->check_primary_keys ();
+
+ // If there were any errors, stop.
+ if (idl_global->err_count () > 0)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "%s%s %s%s %d %s%s\n",
+ idl_global->prog_name (),
+ ACE_TEXT (":"),
+ s,
+ ACE_TEXT (": found"),
+ idl_global->err_count (),
+ ACE_TEXT ("error"),
+ ACE_TEXT ((idl_global->err_count () > 1
+ ? ACE_TEXT ("s")
+ : ACE_TEXT ("")))));
+
+ // Backend will be cleaned up after the exception is caught.
+ throw FE_Bailout ();
+ }
+
+ // Dump the code.
+ if ((idl_global->compile_flags () & IDL_CF_INFORMATIVE)
+ && (idl_global->compile_flags () & IDL_CF_DUMP_AST))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "%s%s %s\n",
+ idl_global->prog_name (),
+ ACE_TEXT (": dump"),
+ s));
+ }
+
+ if (idl_global->compile_flags () & IDL_CF_DUMP_AST)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Dump of AST:\n")));
+
+ idl_global->root ()->dump (*ACE_DEFAULT_LOG_STREAM);
+ }
+
+ // Call the main entry point for the BE.
+ if (idl_global->compile_flags () & IDL_CF_INFORMATIVE)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "%s%s %s\n",
+ idl_global->prog_name (),
+ ACE_TEXT (": BE processing on"),
+ s));
+ }
+
+ // Make sure all forward declared structs and unions are defined
+ // before proceeding to code generation.
+ AST_check_fwd_decls ();
+
+ if (0 == idl_global->err_count ())
+ {
+ BE_produce ();
+ }
+ else
+ {
+ throw FE_Bailout ();
+ }
+
+ DRV_refresh ();
+}
+
+/*
+** LOGIC:
+**
+** 1. Initialize compiler driver
+** 2. Parse command line args
+** 3. If more than one file to parse, fork
+** 4. Otherwise, for the single file, invoke DRV_drive
+*/
+
+int
+main (int argc, char *argv[])
+{
+ // Return status.
+ int status = 0;
+
+ try
+ {
+ // Initialize driver and global variables.
+ status = DRV_init (argc, argv);
+
+ if (0 != status)
+ {
+ throw FE_Bailout ();
+ }
+
+ // Parse arguments.
+ DRV_parse_args (argc, argv);
+
+ // If a version message is requested, print it and exit.
+ if (idl_global->compile_flags () & IDL_CF_VERSION)
+ {
+ DRV_version ();
+ throw FE_Bailout ();
+ }
+
+ // If a usage message is requested, give it and exit.
+ if (idl_global->compile_flags () & IDL_CF_ONLY_USAGE)
+ {
+ DRV_usage ();
+ throw FE_Bailout ();
+ }
+
+ // If there are no input files, and we are not using the
+ // directory recursion option, there's no sense going any further.
+ if (0 == DRV_nfiles && 0 == idl_global->recursion_start ())
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("IDL: No input files\n")));
+
+ ++status;
+ throw FE_Bailout ();
+ }
+
+ AST_Generator *gen = be_global->generator_init ();
+
+ if (0 == gen)
+ {
+ ACE_ERROR ((
+ LM_ERROR,
+ ACE_TEXT ("IDL: DRV_generator_init() failed to create ")
+ ACE_TEXT ("generator, exiting\n")
+ ));
+
+ ++status;
+ throw FE_Bailout ();
+ }
+ else
+ {
+ idl_global->set_gen (gen);
+ }
+
+ // Initialize AST and load predefined types.
+ FE_populate ();
+
+ // Does various things in various backends.
+ BE_post_init (DRV_files, DRV_nfiles);
+
+ for (DRV_file_index = 0;
+ DRV_file_index < DRV_nfiles;
+ ++DRV_file_index)
+ {
+ DRV_drive (DRV_files[DRV_file_index]);
+ }
+ }
+ catch (FE_Bailout)
+ {
+ }
+
+ // Case 1: init error, status = 1, nothing added here.
+ // Case 2: other error(s), status = 0, error count added here.
+ status += idl_global->err_count ();
+
+ DRV_cleanup ();
+
+ return status;
+}