diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_helper.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_helper.cpp | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_helper.cpp b/TAO/TAO_IDL/be/be_helper.cpp new file mode 100644 index 00000000000..86c0dec4cd7 --- /dev/null +++ b/TAO/TAO_IDL/be/be_helper.cpp @@ -0,0 +1,457 @@ +// $Id$ + +// ============================================================================ +// +// +// = LIBRARY +// TAO IDL +// +// = FILENAME +// be_helper.cpp +// +// = DESCRIPTION +// Provides helper classes to print generated code to the output +// +// = AUTHOR +// Aniruddha Gokhale +// +// Improvements by Carlos O'Ryan +// +// ============================================================================ + +#include "be_helper.h" +#include "be_codegen.h" +#include "be_extern.h" +#include "idl_defines.h" +#include "ace/OS_NS_string.h" + +ACE_RCSID (be, + be_helper, + "$Id$") + +static const char copyright[] = +"// -*- C++ -*-\n" +"//\n" +"// $I" "d$\n\n" +"// **** Code generated by the The ACE ORB (TAO) IDL Compiler ****\n" +"// TAO and the TAO IDL Compiler have been developed by:\n" +"// Center for Distributed Object Computing\n" +"// Washington University\n" +"// St. Louis, MO\n" +"// USA\n" +"// http://www.cs.wustl.edu/~schmidt/doc-center.html\n" +"// and\n" +"// Distributed Object Computing Laboratory\n" +"// University of California at Irvine\n" +"// Irvine, CA\n" +"// USA\n" +"// http://doc.ece.uci.edu/\n" +"// and\n" +"// Institute for Software Integrated Systems\n" +"// Vanderbilt University\n" +"// Nashville, TN\n" +"// USA\n" +"// http://www.isis.vanderbilt.edu/\n" +"//\n" +"// Information about TAO is available at:\n" +"// http://www.cs.wustl.edu/~schmidt/TAO.html"; + +TAO_NL::TAO_NL (void) +{ + ACE_UNUSED_ARG (copyright); +} + +TAO_INDENT::TAO_INDENT (int do_now) + : do_now_ (do_now) +{ +} + +TAO_UNINDENT::TAO_UNINDENT (int do_now) + : do_now_ (do_now) +{ +} + +const TAO_NL be_nl; +const TAO_INDENT be_idt; +const TAO_INDENT be_idt_nl (1); +const TAO_UNINDENT be_uidt; +const TAO_UNINDENT be_uidt_nl (1); + +// Methods of the TAO_OutStream class. + +TAO_OutStream::TAO_OutStream (void) + : fp_ (0), + indent_level_ (0) +{ +} + +TAO_OutStream::~TAO_OutStream (void) +{ + // Close the underlying I/O handle only if it exists. + if (this->fp_ != 0) + { + ACE_OS::fclose (this->fp_); + this->fp_ = 0; + } + + indent_level_ = 0; +} + +int +TAO_OutStream::open (const char *fname, + TAO_OutStream::STREAM_TYPE st) +{ + if (fname != 0) + { + // File name exists, open an I/O file handle. + this->fp_ = ACE_OS::fopen (fname, "w"); + + if (this->fp_ != 0) + { + this->st_ = st; + // Put the copyright notice. Not for the gperf's temp input + // file. + if (st != TAO_OutStream::TAO_GPERF_INPUT) + { + ACE_OS::fprintf (this->fp_, + "%s\n", + copyright); + } + + return 0; + } + else + { + return -1; + } + } + else + { + return -1; + } +} + +// Set and get the stream type. +void +TAO_OutStream::stream_type (TAO_OutStream::STREAM_TYPE st) +{ + this->st_ = st; +} + +TAO_OutStream::STREAM_TYPE +TAO_OutStream::stream_type (void) +{ + return this->st_; +} + +// Return the underlying lowlevel file pointer. +// indentation. +FILE * +TAO_OutStream::file (void) +{ + return this->fp_; +} + +int +TAO_OutStream::incr_indent (unsigned short flag) +{ + ++indent_level_; + + if (flag != 0) + { + return this->indent (); + } + else + { + // Do not indent output. + return 0; + } +} + +// Indentation +int +TAO_OutStream::decr_indent (unsigned short flag) +{ + --this->indent_level_; + // Just in case somebody gets "unindent happy". + if (this->indent_level_ < 0) + { + // ACE_DEBUG ((LM_DEBUG, "negative indentation?\n")); + this->indent_level_ = 0; + } + if (flag != 0) + { + return this->indent (); + } + else + { + // Do not indent output. + return 0; + } +} + +int +TAO_OutStream::reset (void) +{ + this->indent_level_ = 0; + return 0; +} + +// Indented print. +int +TAO_OutStream::indent (void) +{ + // Based on the current indentation level, leave appropriate number of blank + // spaces in the output. + if (this->indent_level_ > 0) + { + for (int i = 0; i < this->indent_level_; i++) + { + ACE_OS::fprintf (this->fp_, " "); + } + } + + return 0; +} + +int +TAO_OutStream::nl (void) +{ + ACE_OS::fprintf (this->fp_, "\n"); + this->indent (); + return 0; +} + +// Macro generation. +int +TAO_OutStream::gen_ifdef_macro (const char *flat_name, + const char *suffix, + bool add_stream_type_suffix) +{ + static char macro [NAMEBUFSIZE]; + + ACE_OS::memset (macro, + '\0', + NAMEBUFSIZE); + + ACE_OS::sprintf (macro, + "_%s_", + tao_cg->upcase (flat_name)); + if (suffix != 0) + { + //ACE_OS::sprintf (macro, "%s_%s_", macro, cg->upcase (suffix)); + // Can't have macro on both sides of sprintf + // I'm not sure if the first strcat of "_" should be here or + // not, but having it gives the same functionality as the old + // sprintf call... + ACE_OS::strcat (macro, "_"); + ACE_OS::strcat (macro, tao_cg->upcase (suffix)); + ACE_OS::strcat (macro, "_"); + } + + // Append a suffix representing the stream type. + if (add_stream_type_suffix) + switch (this->st_) + { + case TAO_OutStream::TAO_CLI_HDR: + ACE_OS::strcat (macro, "CH_"); + break; + case TAO_OutStream::TAO_CLI_INL: + ACE_OS::strcat (macro, "CI_"); + break; + case TAO_OutStream::TAO_CLI_IMPL: + ACE_OS::strcat (macro, "CS_"); + break; + case TAO_OutStream::TAO_SVR_HDR: + ACE_OS::strcat (macro, "SH_"); + break; + case TAO_OutStream::TAO_IMPL_HDR: + ACE_OS::strcat (macro, "IH_"); + break; + case TAO_OutStream::TAO_IMPL_SKEL: + ACE_OS::strcat (macro, "IS_"); + break; + case TAO_OutStream::TAO_SVR_INL: + ACE_OS::strcat (macro, "SI_"); + break; + case TAO_OutStream::TAO_SVR_IMPL: + ACE_OS::strcat (macro, "SS_"); + break; + default: + return -1; + } + + *this << "\n\n#if !defined (" << macro << ")\n"; + *this << "#define " << macro; + + return 0; +} + +int +TAO_OutStream::gen_endif (void) +{ + *this << "\n\n#endif /* end #if !defined */"; + + return 0; +} + +// Printf style variable argument print. +int +TAO_OutStream::print (const char *format, ...) +{ + int result = 0; + va_list ap; + va_start (ap, format); + ACE_OSCALL (::vfprintf (this->fp_, + format, + ap), + int, + -1, + result); + va_end (ap); + + return result; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const char *str) +{ + ACE_OS::fprintf (this->fp_, "%s", str); + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const ACE_CDR::UShort num) +{ + ACE_OS::fprintf (this->fp_, + "%hu", + num); + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const ACE_CDR::Short num) +{ + ACE_OS::fprintf (this->fp_, + "%hd", + num); + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const ACE_CDR::ULong num) +{ + ACE_OS::fprintf (this->fp_, + "%lu", + (unsigned long) num); + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const ACE_CDR::Long num) +{ + ACE_OS::fprintf (this->fp_, + "%ld", + (long) num); + + return *this; +} + +#if defined (ACE_WIN64) +TAO_OutStream & +TAO_OutStream::operator<< (const ACE_CDR::ULongLong num) +{ + ACE_OS::fprintf (this->fp_, + ACE_UINT64_FORMAT_SPECIFIER, + num); + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const ACE_CDR::LongLong num) +{ + ACE_OS::fprintf (this->fp_, + ACE_INT64_FORMAT_SPECIFIER, + num); + + return *this; +} +#endif /* ACE_WIN64 */ + +TAO_OutStream & +TAO_OutStream::operator<< (const unsigned long num) +{ + ACE_OS::fprintf (this->fp_, + "%lu", + num); + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const long num) +{ + ACE_OS::fprintf (this->fp_, + "%ld", + num); + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const TAO_NL&) +{ + ACE_OS::fprintf (this->fp_ , + "\n"); + this->indent (); + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const TAO_INDENT& i) +{ + this->incr_indent (0); + + if (i.do_now_) + { + this->nl (); + } + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (const TAO_UNINDENT& i) +{ + this->decr_indent (0); + + if (i.do_now_) + { + this->nl (); + } + + return *this; +} + +TAO_OutStream & +TAO_OutStream::operator<< (Identifier *id) +{ + return this->print (id); +} + +TAO_OutStream & +TAO_OutStream::operator<< (UTL_IdList *id) +{ + return this->print (id); +} + +TAO_OutStream & +TAO_OutStream::operator<< (AST_Expression *expr) +{ + return this->print (expr); +} |