Switch time() calls to monotonic clock calls (#7597)
[libt2n] / codegen / main.cpp
index ca91221..7271b22 100644 (file)
@@ -1,20 +1,24 @@
 /*
-    Copyright (C) 2006-2008
+    Copyright (C) 2006-2008 by Intra2net AG
     intra2net.com
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
+    The software in this package is distributed under the GNU General
+    Public License version 2 (with a special exception described below).
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+    A copy of GNU General Public License (GPL) is included in this distribution,
+    in the file COPYING.GPL.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    As a special exception, if other files instantiate templates or use macros
+    or inline functions from this file, or you compile this file and link it
+    with other works to produce a work based on this file, this file
+    does not by itself cause the resulting work to be covered
+    by the GNU General Public License.
+
+    However the source code for this file must still be made available
+    in accordance with section (3) of the GNU General Public License.
+
+    This exception does not invalidate any other reasons why a work based
+    on this file might be covered by the GNU General Public License.
 */
 
 #include <libxml++/libxml++.h>
 #include <fstream>
 #include <list>
 #include <stdexcept>
+#include <string>
 #include <boost/lexical_cast.hpp>
-#ifdef HAVE_CONFIG_H
+#include <boost/serialization/extended_type_info.hpp>
+
 #include "config.h"
-#endif
+
 
 
 //! map group to class name
@@ -137,6 +143,15 @@ struct parse_error : public std::runtime_error
     {}
 };
 
+struct error_name_too_long : public std::runtime_error
+{
+    error_name_too_long(const std::string &name)
+            : std::runtime_error("symbol name '" + name + "' too long for serialization ("
+                                 + boost::lexical_cast<std::string>(name.length()) + ">"
+                                 + boost::lexical_cast<std::string>(BOOST_SERIALIZATION_MAX_KEY_SIZE-1) + ")")
+    {}
+};
+
 //! get type by id
 /*!
   \return type name or empty string on error
@@ -219,11 +234,17 @@ struct t2n_procedure
 
     std::string ret_classname() const
     {
-        return name+mangled+"_res";
+        std::string result = name+mangled+"_res";
+        if (result.length() >= BOOST_SERIALIZATION_MAX_KEY_SIZE)
+            throw error_name_too_long(result);
+        return result;
     }
     std::string cmd_classname() const
     {
-        return name+mangled+"_cmd";
+        std::string result = name+mangled+"_cmd";
+        if (result.length() >= BOOST_SERIALIZATION_MAX_KEY_SIZE)
+            throw error_name_too_long(result);
+        return result;
     }
     bool hasReturn() const {return !ret_type.isVoid();}
 };
@@ -323,8 +344,22 @@ protected:
                 assert(arg->get_attribute("type"));
                 a.type=get_type(root, arg->get_attribute("type")->get_value());
 
-                if(arg->get_attribute("default"))
-                    a.defaultArg=arg->get_attribute("default")->get_value();
+                // this would be the nice way of solving the problem of default arguments
+                // but currently the output of gccxml is unreliable (e.g. namespace only
+                // sometimes available)
+                // if(arg->get_attribute("default"))
+                //    a.defaultArg=arg->get_attribute("default")->get_value();
+
+                // so we need to get the def. arg. via attribute
+                // which is previously set by the macro LIBT2N_DEFAULT_ARG(type,value)
+                if(arg->get_attribute("attributes"))
+                {
+                    std::string attr=arg->get_attribute("attributes")->get_value();
+                    const std::string look_for = "gccxml(libt2n-default-arg,";
+
+                    if (attr.compare(0,look_for.size(),look_for) == 0)
+                        a.defaultArg=attr.substr(look_for.size(),attr.size()-look_for.size()-1);
+                }
 
                 // todo: ugly - could be any other error
                 if (a.type.name.empty())
@@ -477,7 +512,7 @@ void output_client_hpp(std::ostream &o, const std::string &group, const std::lis
     o << "class " << groupClass(group) << "_client : public libt2n::command_client\n"
     << "{\n"
     << "public:\n"
-    << groupClass(group) << "_client(libt2n::client_connection &_c,\n"
+    << groupClass(group) << "_client(libt2n::client_connection *_c,\n"
     << " long long _command_timeout_usec=command_timeout_usec_default,\n"
     << " long long _hello_timeout_usec=hello_timeout_usec_default)\n"
     << " : libt2n::command_client(_c,_command_timeout_usec,_hello_timeout_usec)\n"