summaryrefslogtreecommitdiff
path: root/CIAO/tools/IDL3_to_IDL2/be_helper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CIAO/tools/IDL3_to_IDL2/be_helper.cpp')
-rw-r--r--CIAO/tools/IDL3_to_IDL2/be_helper.cpp436
1 files changed, 436 insertions, 0 deletions
diff --git a/CIAO/tools/IDL3_to_IDL2/be_helper.cpp b/CIAO/tools/IDL3_to_IDL2/be_helper.cpp
new file mode 100644
index 00000000000..c5000558c24
--- /dev/null
+++ b/CIAO/tools/IDL3_to_IDL2/be_helper.cpp
@@ -0,0 +1,436 @@
+// $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 "idl_defines.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+#include "ace/os_include/os_ctype.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)
+{
+}
+
+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)
+{
+ if (fname != 0)
+ {
+ // File name exists, open an I/O file handle.
+ this->fp_ = ACE_OS::fopen (fname, "w");
+
+ if (this->fp_ != 0)
+ {
+ // Put the copyright notice.
+ ACE_OS::fprintf (this->fp_,
+ "%s\n",
+ copyright);
+
+ ACE_OS::fflush (this->fp_);
+
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+// 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_, " ");
+ ACE_OS::fflush (this->fp_);
+ }
+ }
+
+ return 0;
+}
+
+int
+TAO_OutStream::nl (void)
+{
+ ACE_OS::fprintf (this->fp_, "\n");
+ this->indent ();
+ 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);
+
+ ACE_OS::fflush (this->fp_);
+ va_end (ap);
+
+ return result;
+}
+
+void
+TAO_OutStream::gen_ifndef_string (const char *fname,
+ const char *prefix,
+ const char *suffix)
+{
+ static char macro_name [NAMEBUFSIZE];
+
+ ACE_OS::memset (macro_name,
+ '\0',
+ NAMEBUFSIZE);
+
+ const char *extension = ACE_OS::strrchr (fname, '.');
+
+ if (extension == 0)
+ {
+ // File seems to have no extension, so let us take the name
+ // as it is.
+ extension = fname;
+ }
+
+ ACE_OS::sprintf (macro_name, prefix);
+
+ size_t offset = ACE_OS::strlen (prefix);
+
+ // Convert letters in fname to upper case.
+ for (int i = 0; i < (extension - fname); i++)
+ {
+ if (isalpha (fname [i]))
+ {
+ macro_name[i + offset] = (char) toupper (fname [i]);
+ }
+ else if (isdigit (fname [i]))
+ {
+ macro_name[i + offset] = fname[i];
+ }
+ else
+ {
+ macro_name[i + offset] = '_';
+ }
+ }
+
+ ACE_OS::strcat (macro_name, suffix);
+
+ // Generate the #ifndef ... #define statements.
+ this->print ("#ifndef %s\n",
+ macro_name);
+ this->print ("#define %s",
+ macro_name);
+}
+
+TAO_OutStream &
+TAO_OutStream::operator<< (const char *str)
+{
+ ACE_OS::fprintf (this->fp_, "%s", str);
+ ACE_OS::fflush (this->fp_);
+ return *this;
+}
+
+TAO_OutStream &
+TAO_OutStream::operator<< (const ACE_CDR::UShort num)
+{
+ ACE_OS::fprintf (this->fp_,
+ "%hu",
+ num);
+
+ ACE_OS::fflush (this->fp_);
+
+ return *this;
+}
+
+TAO_OutStream &
+TAO_OutStream::operator<< (const ACE_CDR::Short num)
+{
+ ACE_OS::fprintf (this->fp_,
+ "%hd",
+ num);
+
+ ACE_OS::fflush (this->fp_);
+
+ return *this;
+}
+
+TAO_OutStream &
+TAO_OutStream::operator<< (const ACE_CDR::ULong num)
+{
+ ACE_OS::fprintf (this->fp_,
+ "%lu",
+ (unsigned long) num);
+
+ ACE_OS::fflush (this->fp_);
+
+ return *this;
+}
+
+TAO_OutStream &
+TAO_OutStream::operator<< (const ACE_CDR::Long num)
+{
+ ACE_OS::fprintf (this->fp_,
+ "%ld",
+ (long) num);
+
+ ACE_OS::fflush (this->fp_);
+
+ 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);
+
+ ACE_OS::fflush (this->fp_);
+
+ return *this;
+}
+
+TAO_OutStream &
+TAO_OutStream::operator<< (const ACE_CDR::LongLong num)
+{
+ ACE_OS::fprintf (this->fp_,
+ ACE_INT64_FORMAT_SPECIFIER,
+ num);
+
+ ACE_OS::fflush (this->fp_);
+
+ return *this;
+}
+#endif /* ACE_WIN64 */
+
+TAO_OutStream &
+TAO_OutStream::operator<< (const unsigned long num)
+{
+ ACE_OS::fprintf (this->fp_,
+ "%lu",
+ num);
+
+ ACE_OS::fflush (this->fp_);
+
+ return *this;
+}
+
+TAO_OutStream &
+TAO_OutStream::operator<< (const long num)
+{
+ ACE_OS::fprintf (this->fp_,
+ "%ld",
+ num);
+
+ ACE_OS::fflush (this->fp_);
+
+ 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);
+}