Remove dynamic exceptions
[anna.git] / include / anna / core / util / defines.hpp
index 3acb459..cd846a3 100644 (file)
@@ -1,37 +1,9 @@
-// ANNA - Anna is Not 'N' Anymore
-//
-// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
-//
-// https://bitbucket.org/testillano/anna
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: eduardo.ramos.testillano@gmail.com
-//          cisco.tierra@gmail.com
+// ANNA - Anna is Not Nothingness Anymore                                                         //
+//                                                                                                //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
+//                                                                                                //
+// See project site at http://redmine.teslayout.com/projects/anna-suite                           //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
 
 
 #ifndef anna_core_util_defines_hpp
 #include <string>
 #include <vector>
 
+#include <stdio.h>
+
+#include <stdint.h>
+// For cstd0x compatibility we will use stdint.h types instead of std:: ones on cstdint:
+//#include <cstdint>  when C++11 available
+
+// For xml representations (xml::Compiler and json::functions::json2xml)
+#define ANNA_XML_INDENTATION_SPACES 3
 
 
 // Decoding helpers
 
 namespace anna {
 
-//      type                    bits (bytes)       %       Diameter Data   typedef
-//      -----------------------------------------------------------------------
-//      unsigned short int      16 (2)             hu                      U16
-//      short int               16 (2)             hd                      S16
-//      unsigned int            32 (4)             u       Unsigned32 (*)  U32
-//      int                     32 (4)             d       Integer32 (*)   S32
-//
-// Integer. Its length traditionally depends on the length of the system's Word type, thus in MSDOS
-// it is 16 bits long, whereas in 32 bit systems (like Windows 9x/2000/NT and systems that work under
-// protected mode in x86 systems) it is 32 bits long (4 bytes)
-//
-// Como está previsto que en algunas máquinas la palabra sea de 16 bits, los enteros serían
-// de 16 y por ello C contempla: int (serían 16 bits), long int (32), long long int (64). Sin embargo
-// en la práctica, 'int = long int = 32' y 'long long int = 64'.
-//
-// (*) Por un mal hábito, representamos enteros de 32 bits con el tipo 'int'/'unsigned int' de
-// toda la vida, sin darnos cuenta de que en alguna máquina antigua, no tendría 32 bits.
-// Corregir lo anterior sería tan sencillo como poner S32 = long int (no int),
-//  y U32 = unsigned long int (no unsigned int). Pero no lo vamos a hacer.
-//
-// El tipo 'long' tiene un tamaño que corresponde con el ancho de palabra del S.O.
-// En Solaris (palabra de 64) tenemos long = 64 = long long
-// En linux   (palabra de 32) tenemos long = 32,  long long = 64
-// En linux64 (palabra de 64) tenemos long = 64 = long long
-//
+#ifndef __x86_64__
+#undef  __anna64__
+#else
+#define __anna64__
+#endif
+
+//      TYPE                    BITS (bytes)       Format
+//      ----------------------- ------------------ ---------------------------
 //      unsigned long int       32/64 (4/8)        lu
 //      long int                32/64 (4/8)        ld
 //
-//      unsigned long long int  64 (8)             llu     Unsigned64      U64
-//      long long int           64 (8)             lld     Integer64       S64
+//      unsigned long long int  64 (8)             llu
+//      long long int           64 (8)             lld
 //
 //      float                   32 (4)             f
 //      double                  64 (8)             lf
 //      long double             80 (10)            Lf
+//
+//      pointer = S.O. word     32/64              p
 
 
-/** Alias for unsigned char: unsigned integer with 8 bits */
+/** Alias for unsigned integer with 8 bits */
+//typedef uint8_t U8;
 typedef unsigned char U8;
 
-/** Alias for char: signed integer with 8 bits */
+/** Alias for signed integer with 8 bits */
+//typedef int8_t S8;
 typedef char S8;
 
-/** Alias for unsigned short int: unsigned integer with 16 bits */
-typedef unsigned short int U16;
+/** Alias for unsigned integer with 16 bits */
+typedef uint16_t U16;
 
-/** Alias for short int: signed integer with 16 bits */
-typedef short int S16;
+/** Alias for signed integer with 16 bits */
+typedef int16_t S16;
 
-/** Alias for unsigned int: unsigned integer with 32 bits */
-typedef unsigned int U32;
+/** Alias for unsigned integer with 32 bits */
+typedef uint32_t U32;
 
-/** Alias for int: signed integer with 32 bits */
-typedef int S32;
+/** Alias for signed integer with 32 bits */
+typedef int32_t S32;
 
-/** Alias for unsigned long long: unsigned integer with 64 bits */
-typedef unsigned long long int U64;
+/** Alias for unsigned integer with 64 bits */
+typedef uint64_t U64;
 
-/** Alias for long long: signed integer with 64 bits */
-typedef long long int S64;
+/** Alias for signed integer with 64 bits */
+typedef int64_t S64;
 
 /** Alias for float: floating number with 32 bits (1-8-23) */
 typedef float F32;
@@ -122,7 +89,10 @@ typedef float F32;
 /** Alias for double: floating number with 64 bits (1-11-52) */
 typedef double F64;
 
-/** Alias for unsigned int: unsigned integer with 32 bits used to contain 24 bits */
+/** Alias for long double: floating number with 80 bits (1-15-64) */
+typedef long double F80;
+
+/** Alias for unsigned integer with 32 bits used to contain 24 bits */
 typedef U32 U24;
 
 
@@ -403,69 +373,71 @@ typedef struct {
 
 
 /**
-   Struct for IANA Addresses
+* IANA Address Family Numbers
+* @see http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml
 */
 typedef struct {
+  enum _v {
+    //Number    Description                                          Reference
+    //------    ---------------------------------------------------- ---------
+    //     0    Reserved
+    IPv4 = 1, //IP (IP version 4)
+    IPv6 = 2, //IP6 (IP version 6)
+    //     3    NSAP
+    //     4    HDLC (8-bit multidrop)
+    //     5    BBN 1822
+    //     6    802 (includes all 802 media plus Ethernet "canonical format")
+    //     7    E.163
+    E164 = 8  //E.164 (SMDS, Frame Relay, ATM)
+    //     9    F.69 (Telex)
+    //    10    X.121 (X.25, Frame Relay)
+    //    11    IPX
+    //    12    Appletalk
+    //    13    Decnet IV
+    //    14    Banyan Vines
+    //    15    E.164 with NSAP format subaddress           [UNI-3.1] [Andy_Malis]
+    //    16    DNS (Domain Name System)
+    //    17    Distinguished Name                                    [Charles_Lynn]
+    //    18    AS Number                                             [Charles_Lynn]
+    //    19    XTP over IP version 4                                 [Mike_Saul]
+    //    20    XTP over IP version 6                                 [Mike_Saul]
+    //    21    XTP native mode XTP                                   [Mike_Saul]
+    //    22    Fibre Channel World-Wide Port Name                   [Mark_Bakke]
+    //    23    Fibre Channel World-Wide Node Name                   [Mark_Bakke]
+    //    24    GWID                                                 [Subra_Hegde]
+    //    25    AFI for L2VPN information [RFC4761][RFC6074]
+    //    26-16383 Unassigned
+    //    16384 EIGRP Common Service Family [Donnie_Savage] 2008-05-13
+    //    16385 EIGRP IPv4 Service Family [Donnie_Savage] 2008-05-13
+    //    16386 EIGRP IPv6 Service Family [Donnie_Savage] 2008-05-13
+    //    16387 LISP Canonical Address Format (LCAF) [David_Meyer] 2009-11-12
+    //    16388-32767 Unassigned
+    //    32768-65534 Unassigned
+    //    65535 Reserved
+  };
 
   /**
-  * IANA Address Family Numbers
-  * @see http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml
+  * Version description
+  * @param v Version type
+  * @return Version description
   */
-  struct version {
-    enum _v {
-      //Number    Description                                          Reference
-      //------    ---------------------------------------------------- ---------
-      //     0    Reserved
-      IPv4 = 1, //IP (IP version 4)
-      IPv6 = 2, //IP6 (IP version 6)
-      //     3    NSAP
-      //     4    HDLC (8-bit multidrop)
-      //     5    BBN 1822
-      //     6    802 (includes all 802 media plus Ethernet "canonical format")
-      //     7    E.163
-      E164 = 8  //E.164 (SMDS, Frame Relay, ATM)
-      //     9    F.69 (Telex)
-      //    10    X.121 (X.25, Frame Relay)
-      //    11    IPX
-      //    12    Appletalk
-      //    13    Decnet IV
-      //    14    Banyan Vines
-      //    15    E.164 with NSAP format subaddress           [UNI-3.1] [Andy_Malis]
-      //    16    DNS (Domain Name System)
-      //    17    Distinguished Name                                    [Charles_Lynn]
-      //    18    AS Number                                             [Charles_Lynn]
-      //    19    XTP over IP version 4                                 [Mike_Saul]
-      //    20    XTP over IP version 6                                 [Mike_Saul]
-      //    21    XTP native mode XTP                                   [Mike_Saul]
-      //    22    Fibre Channel World-Wide Port Name                   [Mark_Bakke]
-      //    23    Fibre Channel World-Wide Node Name                   [Mark_Bakke]
-      //    24    GWID                                                 [Subra_Hegde]
-      //    25    AFI for L2VPN information [RFC4761][RFC6074]
-      //    26-16383 Unassigned
-      //    16384 EIGRP Common Service Family [Donnie_Savage] 2008-05-13
-      //    16385 EIGRP IPv4 Service Family [Donnie_Savage] 2008-05-13
-      //    16386 EIGRP IPv6 Service Family [Donnie_Savage] 2008-05-13
-      //    16387 LISP Canonical Address Format (LCAF) [David_Meyer] 2009-11-12
-      //    16388-32767 Unassigned
-      //    32768-65534 Unassigned
-      //    65535 Reserved
-    };
-
-    /**
-    * Version description
-    * @param v Version type
-    * @return Version description
-    */
-    static const char* asText(const version::_v v) throw() { // anna_declare_enum is not safe, because labels don't have to match a sequence
-      if(v == version::IPv4) return "IPv4";
-
-      if(v == version::IPv6) return "IPv6";
-
-      if(v == version::E164) return "E164";
-
-      return NULL;
-    }
-  };
+  static const char* asText(const _v v) { // anna_declare_enum is not safe, because labels don't have to match a sequence
+    if(v == IPv4) return "IPv4";
+
+    if(v == IPv6) return "IPv6";
+
+    if(v == E164) return "E164";
+
+    return NULL;
+  }
+
+} iana_address_version_t;
+
+
+/**
+   Struct for IANA Addresses
+*/
+typedef struct {
 
   /** address version */
   U16 Version;
@@ -475,29 +447,29 @@ typedef struct {
 
 
   /** Gets the address version */
-  const U16 & getVersion() const throw() { return Version; }
+  const U16 & getVersion() const { return Version; }
 
   /** Gets the address printable value */
-  const char * getValue() const throw() { return Value.c_str(); }
+  const char * getValue() const { return Value.c_str(); }
 
 
   // Helpers
 
   /** Return true when is an IPv4 address */
-  bool isIPv4() const throw() { return ((version::_v)Version == version::IPv4); }
+  bool isIPv4() const { return ((iana_address_version_t::_v)Version == iana_address_version_t::IPv4); }
   /** Return true when is an IPv6 address */
-  bool isIPv6() const throw() { return ((version::_v)Version == version::IPv6); }
+  bool isIPv6() const { return ((iana_address_version_t::_v)Version == iana_address_version_t::IPv6); }
   /** Return true when is an E164 (SMDS, Frame Relay, ATM) address */
-  bool isE164() const throw() { return ((version::_v)Version == version::E164); }
+  bool isE164() const { return ((iana_address_version_t::_v)Version == iana_address_version_t::E164); }
 
   /** Sets version for IPv4 address and address itself. Checking is not performed (could assign IPv6 instead ...) */
-  void setIPv4(const char *value) throw() { Version = version::IPv4; Value = value ? value : ""; }
+  void setIPv4(const char *value) { Version = iana_address_version_t::IPv4; Value = value ? value : ""; }
 
   /** Sets version for IPv6 address and address itself. Checking is not performed (could assign IPv4 instead ...) */
-  void setIPv6(const char *value) throw() { Version = version::IPv6; Value = value ? value : ""; }
+  void setIPv6(const char *value) { Version = iana_address_version_t::IPv6; Value = value ? value : ""; }
 
   /** Sets version for E164 address and address itself. Checking is not performed ... */
-  void setE164(const char *value) throw() { Version = version::E164; Value = value ? value : ""; }
+  void setE164(const char *value) { Version = iana_address_version_t::E164; Value = value ? value : ""; }
 
 
   /**
@@ -505,11 +477,11 @@ typedef struct {
   *
   * @return String with class content
   */
-  std::string asString() const throw() {
+  std::string asString() const {
     std::string result;
     result += Value.c_str(); // assume that all IANA addresses have a printable representation
     result += " (";
-    const char *versionAsText = version::asText((version::_v)Version);
+    const char *versionAsText = iana_address_version_t::asText((iana_address_version_t::_v)Version);
 
     if(versionAsText) {
       result += versionAsText;