diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_codegen.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_codegen.cpp | 787 |
1 files changed, 0 insertions, 787 deletions
diff --git a/TAO/TAO_IDL/be/be_codegen.cpp b/TAO/TAO_IDL/be/be_codegen.cpp deleted file mode 100644 index 13f7385a5ce..00000000000 --- a/TAO/TAO_IDL/be/be_codegen.cpp +++ /dev/null @@ -1,787 +0,0 @@ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// TAO IDL -// -// = FILENAME -// be_codegen.cpp -// -// = DESCRIPTION -// Code generation -// -// = AUTHOR -// Aniruddha Gokhale -// -// ============================================================================ - -#include "idl.h" -#include "idl_extern.h" -#include "be.h" - -ACE_RCSID(be, be_codegen, "$Id$") - -TAO_CodeGen *tao_cg = TAO_CODEGEN::instance (); - -/* BE global Data */ -TAO_CodeGen::TAO_CodeGen (void) - : client_header_ (0), - client_stubs_ (0), - client_inline_ (0), - server_header_ (0), - server_template_header_ (0), - server_skeletons_ (0), - server_template_skeletons_ (0), - server_inline_ (0), - server_template_inline_ (0), - gperf_input_stream_ (0), - gperf_input_filename_ (0), - curr_os_ (0), - visitor_factory_ (0), - strategy_ (TAO_PERFECT_HASH) -{ -} - -// destructor -TAO_CodeGen::~TAO_CodeGen (void) -{ - delete this->client_header_; - delete this->server_header_; - delete this->server_template_header_; - delete this->client_stubs_; - delete this->server_skeletons_; - delete this->server_template_skeletons_; - delete this->client_inline_; - delete this->server_inline_; - delete this->server_template_inline_; - this->curr_os_ = 0; - // delete this->visitor_factory_; -} - -// visitor factory method -be_visitor * -TAO_CodeGen::make_visitor (be_visitor_context *ctx) -{ - - if (!this->visitor_factory_) - { - ACE_ERROR_RETURN ((LM_ERROR, - "TAO_CodeGen::make_visitor - " - "No Visitor Factory\n\n"), - 0); - } - - return this->visitor_factory_->make_visitor (ctx); -} - -// change the string to all upcase -const char * -TAO_CodeGen::upcase (const char *str) -{ - static char upcase_str [NAMEBUFSIZE]; - - ACE_OS::memset (upcase_str, '\0', NAMEBUFSIZE); - // convert letters in str to upcase - for (unsigned int i=0; i < ACE_OS::strlen (str); i++) - { - if (isalpha (str [i])) - { - upcase_str[i] = toupper (str [i]); - } - else - { - // copy it as it is - upcase_str[i] = str[i]; - } - } - return upcase_str; -} - -// set the client header stream -int -TAO_CodeGen::start_client_header (const char *fname) -{ - // @@ We are making use of "included_idl_files" that is in the - // idl_global. We need to make sure the validity of those files. - idl_global->validate_included_idl_files (); - - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->client_header_ = factory->make_outstream (); - if (!this->client_header_) - { - return -1; - } - - if (this->client_header_->open (fname, TAO_OutStream::TAO_CLI_HDR) == -1) - return -1; - else - { - // now generate the #if !defined clause - static char macro_name [NAMEBUFSIZE]; - - ACE_OS::memset (macro_name, '\0', NAMEBUFSIZE); - const char *suffix = ACE_OS::strrchr (fname, '.'); - if (suffix == 0) - { - // File seems to have no extension, so let us take the name - // as it is. - if (fname == 0) - // bad file name - return -1; - else - suffix = fname; - } - - ACE_OS::sprintf (macro_name, "_TAO_IDL_"); - // convert letters in fname to upcase - for (int i=0; i < (suffix - fname); i++) - { - if (isalpha (fname [i])) - macro_name[i+9] = toupper (fname [i]); - else if (isdigit (fname [i])) - macro_name[i+9] = fname[i]; - else - macro_name[i+9] = '_'; - } - - ACE_OS::strcat (macro_name, "_H_"); - - // generate the #ifndef ... #define statements - this->client_header_->print ("#if !defined (%s)\n", macro_name); - this->client_header_->print ("#define %s\n\n", macro_name); - - *this->client_header_ << "#include \"tao/corba.h\"\n"; - - if (idl_global->export_include () != 0) - { - *this->client_header_ << "#include \"" - << idl_global->export_include () - << "\"\n"; - } - - // We must include all the skeleton headers corresponding to - // IDL files included by the current IDL file. - // We will use the included IDL file names as they appeared - // in the original main IDL file, not the one which went - // thru CC preprocessor. - for (size_t j = 0; - j < idl_global->n_included_idl_files (); - j++) - { - char* idl_name = - idl_global->included_idl_files ()[j]; - - // Make a String out of it. - String idl_name_str = idl_name; - - // Make sure this file was actually got included, not - // ignored by some #if defined compiler directive. - - - // Get the clnt header from the IDL file name. - const char* client_hdr = - IDL_GlobalData::be_get_client_hdr (&idl_name_str, 1); - - // Sanity check and then print. - if (client_hdr != 0) - { - this->client_header_->print ("#include \"%s\"\n", - client_hdr); - } - else - { - ACE_ERROR ((LM_WARNING, - "WARNING, invalid file '%s' included\n", - idl_name)); - } - } - *this->client_header_ << "\n"; - - // generate the TAO_EXPORT_MACRO macro - *this->client_header_ << "#if defined (TAO_EXPORT_MACRO)\n"; - *this->client_header_ << "#undef TAO_EXPORT_MACRO\n"; - *this->client_header_ << "#endif\n"; - *this->client_header_ << "#define TAO_EXPORT_MACRO " - << idl_global->export_macro () - << be_nl; - - *this->client_header_ << "#if defined(_MSC_VER)\n" - << "#pragma warning(disable:4250)\n" - << "#endif /* _MSC_VER */\n\n"; - - return 0; - } -} - -// get the client header stream -TAO_OutStream * -TAO_CodeGen::client_header (void) -{ - return this->client_header_; -} - -// set the client stub stream -int -TAO_CodeGen::start_client_stubs (const char *fname) -{ - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->client_stubs_ = factory->make_outstream (); - if (!this->client_stubs_) - { - return -1; - } - - if (this->client_stubs_->open (fname, TAO_OutStream::TAO_CLI_IMPL) == -1) - { - return -1; - } - - // generate the include statement for the client header. We just - // need to put only the base names. Path info is not required. - *this->client_stubs_ << "#include \"" << - idl_global->be_get_client_hdr_fname (1) << "\"\n\n"; - - *this->client_stubs_ << "#include \"" << - idl_global->be_get_server_hdr_fname (1) << "\"\n\n"; - - // generate the code that includes the inline file if not included in the - // header file - *this->client_stubs_ << "#if !defined (__ACE_INLINE__)\n"; - *this->client_stubs_ << "#include \"" << - idl_global->be_get_client_inline_fname (1) << "\"\n"; - *this->client_stubs_ << "#endif /* !defined INLINE */\n\n"; - return 0; -} - -// get the client stubs stream -TAO_OutStream * -TAO_CodeGen::client_stubs (void) -{ - return this->client_stubs_; -} - -// set the client inline stream -int -TAO_CodeGen::start_client_inline (const char *fname) -{ - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->client_inline_ = factory->make_outstream (); - if (!this->client_inline_) - { - return -1; - } - - return this->client_inline_->open (fname, TAO_OutStream::TAO_CLI_INL); -} - -// get the client inline stream -TAO_OutStream * -TAO_CodeGen::client_inline (void) -{ - return this->client_inline_; -} - -// set the server header stream. -int -TAO_CodeGen::start_server_header (const char *fname) -{ - // @@ We are making use of "included_idl_files" that is in the - // idl_global. We need to make sure the validity of those files. - idl_global->validate_included_idl_files (); - - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->server_header_ = factory->make_outstream (); - if (!this->server_header_) - { - return -1; - } - - if (this->server_header_->open (fname, TAO_OutStream::TAO_SVR_HDR) == -1) - return -1; - else - { - // now generate the #if !defined clause - static char macro_name [NAMEBUFSIZE]; - - ACE_OS::memset (macro_name, '\0', NAMEBUFSIZE); - const char *suffix = ACE_OS::strrchr (fname, '.'); - if (suffix == 0) - { - // File seems to have no extension, so let us take the name - // as it is. - if (fname == 0) - // bad file name - return -1; - else - suffix = fname; - } - - ACE_OS::sprintf (macro_name, "_TAO_IDL_"); - // convert letters in fname to upcase - for (int i=0; i < (suffix - fname); i++) - if (isalpha (fname [i])) - macro_name[i+9] = toupper (fname [i]); - else if (isdigit (fname [i])) - macro_name[i+9] = fname[i]; - else - macro_name[i+9] = '_'; - - ACE_OS::strcat (macro_name, "_H_"); - - this->server_header_->print ("#if !defined (%s)\n", macro_name); - this->server_header_->print ("#define %s\n\n", macro_name); - - // We must include all the skeleton headers corresponding to - // IDL files included by the current IDL file. - // We will use the included IDL file names as they appeared - // in the original main IDL file, not the one which went - // thru CC preprocessor. - for (size_t j = 0; - j < idl_global->n_included_idl_files (); - ++j) - { - char* idl_name = - idl_global->included_idl_files ()[j]; - - // String'ifying the name. - String idl_name_str (idl_name); - - const char* server_hdr = - IDL_GlobalData::be_get_server_hdr (&idl_name_str, 1); - - this->server_header_->print ("#include \"%s\"\n", - server_hdr); - } - // the server header should include the client header - *this->server_header_ << "#include \"" << - idl_global->be_get_client_hdr_fname (1) << "\"\n\n"; - - *this->server_header_ << "#if defined(_MSC_VER)\n" - << "#pragma warning(disable:4250)\n" - << "#endif /* _MSC_VER */\n\n"; - - return 0; - } -} - -// get the server header stream -TAO_OutStream * -TAO_CodeGen::server_header (void) -{ - return this->server_header_; -} - -// set the server header stream -int -TAO_CodeGen::start_server_template_header (const char *fname) -{ - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->server_template_header_ = factory->make_outstream (); - if (!this->server_template_header_) - return -1; - - if (this->server_template_header_->open (fname, - TAO_OutStream::TAO_SVR_TMPL_HDR) - == -1) - return -1; - else - { - // now generate the #if !defined clause - static char macro_name [NAMEBUFSIZE]; - - ACE_OS::memset (macro_name, '\0', NAMEBUFSIZE); - const char *suffix = ACE_OS::strrchr (fname, '.'); - if (suffix == 0) - { - // File seems to have no extension, so let us take the name - // as it is. - if (fname == 0) - // bad file name - return -1; - else - suffix = fname; - } - ACE_OS::sprintf (macro_name, "_TAO_IDL_"); - // convert letters in fname to upcase - for (int i=0; i < (suffix - fname); i++) - if (isalpha (fname [i])) - macro_name[i+9] = toupper (fname [i]); - else if (isdigit (fname [i])) - macro_name[i+9] = fname[i]; - else - macro_name[i+9] = '_'; - - ACE_OS::strcat (macro_name, "_H_"); - - this->server_template_header_->print ("#if !defined (%s)\n", - macro_name); - this->server_template_header_->print ("#define %s\n\n", macro_name); - - *this->server_template_header_ << "#if defined(_MSC_VER)\n" - << "#pragma warning(disable:4250)\n" - << "#endif /* _MSC_VER */\n\n"; - - return 0; - } -} - -// get the server header stream -TAO_OutStream * -TAO_CodeGen::server_template_header (void) -{ - return this->server_template_header_; -} - -// set the server skeletons stream -int -TAO_CodeGen::start_server_skeletons (const char *fname) -{ - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->server_skeletons_ = factory->make_outstream (); - if (!this->server_skeletons_) - { - return -1; - } - - if (this->server_skeletons_->open (fname, TAO_OutStream::TAO_SVR_IMPL) == -1) - { - return -1; - } - - // generate the include statement for the server header - *this->server_skeletons_ << "#include \"" << - idl_global->be_get_server_hdr_fname (1) << "\"\n\n"; - - // generate the code that includes the inline file if not included in the - // header file - *this->server_skeletons_ << "#if !defined (__ACE_INLINE__)\n"; - *this->server_skeletons_ << "#include \"" << - idl_global->be_get_server_inline_fname (1) << "\"\n"; - *this->server_skeletons_ << "#endif /* !defined INLINE */\n\n"; - return 0; -} - -// Get the server skeletons stream. -TAO_OutStream * -TAO_CodeGen::server_skeletons (void) -{ - return this->server_skeletons_; -} - -// Start the server template skeleton stream. -int -TAO_CodeGen::start_server_template_skeletons (const char *fname) -{ - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->server_template_skeletons_ = factory->make_outstream (); - if (!this->server_template_skeletons_) - { - return -1; - } - - if (this->server_template_skeletons_->open (fname, - TAO_OutStream::TAO_SVR_TMPL_IMPL) - == -1) - return -1; - else - { - // now generate the #if !defined clause - static char macro_name [NAMEBUFSIZE]; - - ACE_OS::memset (macro_name, '\0', NAMEBUFSIZE); - const char *suffix = ACE_OS::strrchr (fname, '.'); - if (suffix == 0) - { - // File seems to have no extension, so let us take the name - // as it is. - if (fname == 0) - // bad file name - return -1; - else - suffix = fname; - } - - ACE_OS::sprintf (macro_name, "_TAO_IDL_"); - // convert letters in fname to upcase - for (int i=0; i < (suffix - fname); i++) - if (isalpha (fname [i])) - macro_name[i+9] = toupper (fname [i]); - else if (isdigit (fname [i])) - macro_name[i+9] = fname[i]; - else - macro_name[i+9] = '_'; - - ACE_OS::strcat (macro_name, "_CPP_"); - - this->server_template_skeletons_->print ("#if !defined (%s)\n", - macro_name); - this->server_template_skeletons_->print ("#define %s\n\n", macro_name); - - *this->server_template_skeletons_ << "#if defined(_MSC_VER)\n" - << "#pragma warning(disable:4250)\n" - << "#endif /* _MSC_VER */\n\n"; - - // generate the include statement for the server header - *this->server_template_skeletons_ << "#include \"" << - idl_global->be_get_server_template_hdr_fname (1) << "\"\n\n"; - - // generate the code that includes the inline file if not included in the - // header file - *this->server_template_skeletons_ << "#if !defined (__ACE_INLINE__)\n"; - *this->server_template_skeletons_ << "#include \"" << - idl_global->be_get_server_template_inline_fname (1) << "\"\n"; - *this->server_template_skeletons_ << "#endif /* !defined INLINE */\n\n"; - return 0; - - } -} - -// get the server template skeletons stream -TAO_OutStream * -TAO_CodeGen::server_template_skeletons (void) -{ - return this->server_template_skeletons_; -} - -// set the server inline stream -int -TAO_CodeGen::start_server_inline (const char *fname) -{ - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->server_inline_ = factory->make_outstream (); - if (!this->server_inline_) - { - return -1; - } - - return this->server_inline_->open (fname, TAO_OutStream::TAO_SVR_INL); -} - -// get the server inline stream -TAO_OutStream * -TAO_CodeGen::server_inline (void) -{ - return this->server_inline_; -} - -// set the server template inline stream -int -TAO_CodeGen::start_server_template_inline (const char *fname) -{ - // retrieve the singleton instance to the outstream factory - TAO_OutStream_Factory *factory = TAO_OUTSTREAM_FACTORY::instance (); - - // retrieve a specialized instance - this->server_template_inline_ = factory->make_outstream (); - if (!this->server_template_inline_) - { - return -1; - } - - return this->server_template_inline_->open (fname, TAO_OutStream::TAO_SVR_INL); -} - -// get the server template inline stream -TAO_OutStream * -TAO_CodeGen::server_template_inline (void) -{ - return this->server_template_inline_; -} - -// put the last #endif in the client and server headers -int -TAO_CodeGen::end_client_header (void) -{ - // generate the <<= and >>= operators here - - // insert the code to include the inline file - *this->client_header_ << "\n#if defined (__ACE_INLINE__)\n"; - *this->client_header_ << "#include \"" << - idl_global->be_get_client_inline_fname (1) << "\"\n"; - *this->client_header_ << "#endif /* defined INLINE */\n\n"; - - *this->client_header_ << "#if defined(_MSC_VER)\n" - << "#pragma warning(default:4250)\n" - << "#endif /* _MSC_VER */\n"; - - // code to put the last #endif - *this->client_header_ << "\n#endif /* if !defined */\n"; - return 0; -} - -int -TAO_CodeGen::end_server_header (void) -{ - // insert the template header - *this->server_header_ << "#include \"" << - idl_global->be_get_server_template_hdr_fname (1) << "\"\n"; - - // insert the code to include the inline file - *this->server_header_ << "\n#if defined (__ACE_INLINE__)\n"; - *this->server_header_ << "#include \"" << - idl_global->be_get_server_inline_fname (1) << "\"\n"; - *this->server_header_ << "#endif /* defined INLINE */\n\n"; - - *this->server_header_ << "#if defined(_MSC_VER)\n" - << "#pragma warning(default:4250)\n" - << "#endif /* _MSC_VER */\n"; - - // code to put the last #endif - *this->server_header_ << "\n#endif /* if !defined */\n"; - return 0; -} - -int -TAO_CodeGen::end_server_template_header (void) -{ - // insert the code to include the inline file - *this->server_template_header_ << "\n#if defined (__ACE_INLINE__)\n"; - *this->server_template_header_ << "#include \"" << - idl_global->be_get_server_template_inline_fname (1) << "\"\n"; - *this->server_template_header_ << "#endif /* defined INLINE */\n\n"; - - // insert the code to include the template source file - *this->server_template_header_ - << "\n#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)\n"; - *this->server_template_header_ << "#include \"" << - idl_global->be_get_server_template_skeleton_fname (1) << "\"\n"; - *this->server_template_header_ << "#endif /* defined REQUIRED SOURCE */\n\n"; - - // insert the code to include the template pragma - *this->server_template_header_ - << "\n#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)\n"; - *this->server_template_header_ << "#pragma implementation (\"" << - idl_global->be_get_server_template_skeleton_fname (1) << "\")\n"; - *this->server_template_header_ << "#endif /* defined REQUIRED PRAGMA */\n\n"; - - *this->server_template_header_ << "#if defined(_MSC_VER)\n" - << "#pragma warning(default:4250)\n" - << "#endif /* _MSC_VER */\n"; - - // code to put the last #endif - *this->server_template_header_ << "\n#endif /* if !defined */\n"; - return 0; -} - -int -TAO_CodeGen::end_server_template_skeletons (void) -{ - // code to put the last #endif - *this->server_template_skeletons_ << "\n#endif /* if !defined */\n"; - return 0; -} - -// We use the following helper functions to pass information. This class is the -// best place to pass such information rather than passing information through -// global variables spread everywhere. This class is a singleton and is -// effectively a global. - -void -TAO_CodeGen::gperf_input_stream (TAO_OutStream *os) -{ -#if !defined (linux) - // This causes a seg fault on Linux RH 5.1. Let it leak . . . - delete this->gperf_input_stream_; -#endif /* ! linux */ - this->gperf_input_stream_ = os; -} - -TAO_OutStream * -TAO_CodeGen::gperf_input_stream (void) -{ - return this->gperf_input_stream_; -} - -void -TAO_CodeGen::gperf_input_filename (char *filename) -{ - delete[] this->gperf_input_filename_; - this->gperf_input_filename_ = ACE::strnew (filename); -} - -char * -TAO_CodeGen::gperf_input_filename (void) -{ - return this->gperf_input_filename_; -} - -void -TAO_CodeGen::outstream (TAO_OutStream *os) -{ - this->curr_os_ = os; -} - -TAO_OutStream * -TAO_CodeGen::outstream (void) -{ - return this->curr_os_; -} - -void -TAO_CodeGen::node (be_decl *n) -{ - this->node_ = n; -} - -be_decl * -TAO_CodeGen::node (void) -{ - return this->node_; -} - -void -TAO_CodeGen::config_visitor_factory (void) -{ - // What strategy are we interested in? Interpreted or Compiled Marshaling? - // This is the top level distinction we make and strategize our visitor - // factory object accordingly - if (idl_global->compiled_marshaling ()) - this->visitor_factory_ = TAO_COMPILED_VISITOR_FACTORY::instance (); - else - this->visitor_factory_ = TAO_INTERPRETIVE_VISITOR_FACTORY::instance (); -} - -void -TAO_CodeGen::lookup_strategy (LOOKUP_STRATEGY s) -{ - this->strategy_ = s; -} - -TAO_CodeGen::LOOKUP_STRATEGY -TAO_CodeGen::lookup_strategy (void) const -{ - return this->strategy_; -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Singleton<TAO_CodeGen, ACE_SYNCH_RECURSIVE_MUTEX>; -template class ACE_Singleton<TAO_OutStream_Factory, ACE_SYNCH_RECURSIVE_MUTEX>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Singleton<TAO_CodeGen, ACE_SYNCH_RECURSIVE_MUTEX> -#pragma instantiate ACE_Singleton<TAO_OutStream_Factory, ACE_SYNCH_RECURSIVE_MUTEX> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |