Paul J. Lucas has proposed merging lp:~paul-lucas/zorba/pjl-misc into lp:zorba.

Commit message:
Fixed bug #1190710 (fn-format-date failures).

Requested reviews:
  Paul J. Lucas (paul-lucas)

For more details, see:
https://code.launchpad.net/~paul-lucas/zorba/pjl-misc/+merge/169974

Fixed bug #1190710 (fn-format-date failures).
-- 
https://code.launchpad.net/~paul-lucas/zorba/pjl-misc/+merge/169974
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'ChangeLog'
--- ChangeLog	2013-06-17 23:12:02 +0000
+++ ChangeLog	2013-06-18 02:30:40 +0000
@@ -35,6 +35,7 @@
   * Fixed bug #1188100 (regex issues with 'q' flag in fn:tokenize)
   * Fixed invalid memory access error occuring during sequence type matching
     for user-defined types.
+  * Fixed bug #1190710 (fn-format-date failures)
   * Fixed bug #1190407 (wrong rewrite of if-then-else return clause in case
     of general flwor)
   * jn:members function takes item()* as aparameter (instead of item())

=== added file 'include/zorba/internal/README.txt'
--- include/zorba/internal/README.txt	1970-01-01 00:00:00 +0000
+++ include/zorba/internal/README.txt	2013-06-18 02:30:40 +0000
@@ -0,0 +1,6 @@
+All the files in this directory are for Zorba internal use only in order to
+implement parts the public API.  You should NOT directly either #include any of
+these files or use any of the classes, constants, macros, or types defined
+herein in your own C++ code.  These files are subject either to change or
+removal at any time without notice and backwards compatibility is NOT
+guaranteed.

=== modified file 'include/zorba/internal/cxx_util.h'
--- include/zorba/internal/cxx_util.h	2013-06-01 00:30:39 +0000
+++ include/zorba/internal/cxx_util.h	2013-06-18 02:30:40 +0000
@@ -27,7 +27,9 @@
 namespace internal {
 
 /**
- * A \c nullptr type.
+ * \internal
+ * A \c nullptr type for C++ compilers that don't yet implement C++11's
+ * \c nullptr keyword.
  *
  * See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf
  * section 1.1: "Alternative #1: A Library Implementation of nullptr," p. 3.
@@ -50,11 +52,12 @@
 } // namespace zorba
 
 /**
+ * \internal
  * We use "zorba_nullptr" in combination with a macro to elimimate an
  * "identifier 'nullptr' will become a keyword in C++0x" warning.
  *
  * We also use a singleton object since using multiple instances as shown in
- * Bjarne's paper has a slight performance penalty.
+ * Bjarne's paper has a slight performance penalty (surprisingly).
  */
 ZORBA_DLL_PUBLIC
 extern zorba::internal::nullptr_type const zorba_nullptr;
@@ -71,6 +74,12 @@
 template<>     struct zorba_static_assert<true> { };
 template<int>  struct zorba_static_assert_type { };
 
+/** 
+ * \internal
+ * A \c static_assert macro for C++ compilers that don't yet implement C++11's
+ * \c static_assert keyword.
+ * \hideinitializer
+ */
 #define static_assert(expr,msg)                   \
   typedef ::zorba_static_assert_type<             \
     sizeof( ::zorba_static_assert<(expr) != 0> )  \

=== modified file 'include/zorba/internal/diagnostic.h'
--- include/zorba/internal/diagnostic.h	2013-03-22 23:40:03 +0000
+++ include/zorba/internal/diagnostic.h	2013-06-18 02:30:40 +0000
@@ -42,6 +42,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 /**
+ * \internal
  * A %location holds the file location of an error.
  */
 class ZORBA_DLL_PUBLIC location {

=== modified file 'include/zorba/internal/proxy.h'
--- include/zorba/internal/proxy.h	2012-01-18 05:43:09 +0000
+++ include/zorba/internal/proxy.h	2013-06-18 02:30:40 +0000
@@ -26,6 +26,8 @@
 /**
  * \internal
  * A %proxy<T> is-a \c T that also contains a T* -- a pointer to the original.
+ *
+ * @tparam OriginalType The original type to which this %proxy refers.
  */
 template<class OriginalType>
 class proxy : public OriginalType {

=== modified file 'include/zorba/internal/system_diagnostic.h'
--- include/zorba/internal/system_diagnostic.h	2013-06-04 00:34:52 +0000
+++ include/zorba/internal/system_diagnostic.h	2013-06-18 02:30:40 +0000
@@ -28,6 +28,10 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
+/**
+ * \internal
+ * The type-independent, factored-out-code base class for SystemDiagnostic.
+ */
 class ZORBA_DLL_PUBLIC SystemDiagnosticBase : public Diagnostic {
 public:
   /**

=== modified file 'include/zorba/internal/type_traits.h'
--- include/zorba/internal/type_traits.h	2013-02-07 17:24:36 +0000
+++ include/zorba/internal/type_traits.h	2013-06-18 02:30:40 +0000
@@ -23,7 +23,7 @@
 # include <tr1/type_traits>
 #else
 # include <type_traits>
-#endif
+#endif /* ZORBA_TR1_IN_TR1_SUBDIRECTORY */
 
 ///////////////////////////////////////////////////////////////////////////////
 

=== modified file 'include/zorba/internal/unique_ptr.h'
--- include/zorba/internal/unique_ptr.h	2013-06-01 00:30:39 +0000
+++ include/zorba/internal/unique_ptr.h	2013-06-18 02:30:40 +0000
@@ -36,14 +36,14 @@
 template<typename T> inline
 typename enable_if<!zorba::internal::is_movable<T>::value,T&>::type
 move( T &t ) {
-   return t;
+  return t;
 }
 
 template<typename T> inline
 typename enable_if<zorba::internal::is_movable<T>::value,
                    zorba::internal::rv<T>&>::type
 move( T const &t ) {
-   return *static_cast<zorba::internal::rv<T>*>( const_cast<T*>( &t ) );
+  return *static_cast<zorba::internal::rv<T>*>( const_cast<T*>( &t ) );
 }
 
 template<typename T> inline
@@ -131,6 +131,8 @@
  * \internal
  * Swaps two unique_ptr objects.
  *
+ * @tparam T The pointed-to type.
+ * @tparam D The deleter type.
  * @param a The first object to swap.
  * @param b The second object to swap.
  */
@@ -147,6 +149,8 @@
  * \internal
  * The default deleter class used by unique_ptr.  It simply calls \c delete on
  * the pointed-to object.
+ *
+ * @tparam T The pointed-to type.
  */
 template<typename T>
 struct default_delete {
@@ -179,6 +183,8 @@
  * \internal
  * Specialization of default_delete for arrays.  It simply calls \c delete[] on
  * the pointed-to array.
+ *
+ * @tparam T The pointed-to type.
  */
 template<typename T>
 struct default_delete<T[]> {

=== modified file 'include/zorba/internal/ztd.h'
--- include/zorba/internal/ztd.h	2013-06-01 00:30:39 +0000
+++ include/zorba/internal/ztd.h	2013-06-18 02:30:40 +0000
@@ -260,9 +260,22 @@
 ZORBA_DECL_HAS_MEM_FN( str );
 ZORBA_DECL_HAS_MEM_FN( toString );
 
+/**
+ * \internal
+ * Short-hand macro for use with enable_if to determine whether the given type
+ * has a member function with the signature
+ * <code>char const* (T::*)() const</code>.
+ * \hideinitializer
+ */
 #define ZORBA_HAS_C_STR(T) \
   ::zorba::internal::ztd::has_c_str<T,char const* (T::*)() const>::value
 
+/**
+ * \internal
+ * Short-hand macro for use with enable_if to determine whether the given type
+ * is a class having an API matching std::string.
+ * \hideinitializer
+ */
 #define ZORBA_IS_STRING(T) ZORBA_HAS_C_STR(T)
 
 /**

=== modified file 'src/diagnostics/diagnostic_en.xml'
--- src/diagnostics/diagnostic_en.xml	2013-06-15 02:57:08 +0000
+++ src/diagnostics/diagnostic_en.xml	2013-06-18 02:30:40 +0000
@@ -1134,6 +1134,9 @@
         incorrect.
       </comment>
       <value>"$1": invalid picture string for date/time${: 2}</value>
+      <entry key="BadCalendar">
+        <value>invalid calendar designator</value>
+      </entry>
       <entry key="BadComponent_3">
         <value>'$3': invalid component specifier</value>
       </entry>

=== modified file 'src/diagnostics/pregenerated/dict_en.cpp'
--- src/diagnostics/pregenerated/dict_en.cpp	2013-06-15 02:57:08 +0000
+++ src/diagnostics/pregenerated/dict_en.cpp	2013-06-18 02:30:40 +0000
@@ -604,6 +604,7 @@
   { "~FODF1310_NoPercentPermille", "sub-picture must not contain more than one percent-sign or per-mille-sign or one of each" },
   { "~FOFD1340_Bad2ndModifierHere_3", "'$3': valid second presentation modifier invalid here" },
   { "~FOFD1340_Bad2ndModifier_3", "'$3': invalid second presentation modifier" },
+  { "~FOFD1340_BadCalendar", "invalid calendar designator" },
   { "~FOFD1340_BadComponent_3", "'$3': invalid component specifier" },
   { "~FOFD1340_BadWidthModifier", "invalid width modifier" },
   { "~FOFD1340_DigitNotSameFamily_34", "\"$3\": digit not from same digit family as $4" },

=== modified file 'src/diagnostics/pregenerated/dict_zed_keys.h'
--- src/diagnostics/pregenerated/dict_zed_keys.h	2013-06-13 18:18:55 +0000
+++ src/diagnostics/pregenerated/dict_zed_keys.h	2013-06-18 02:30:40 +0000
@@ -70,6 +70,7 @@
 #define ZED_XQDY0074_NotCastToQName "~XQDY0074_NotCastToQName"
 #define ZED_XQDY0074_NoEmptyLocalname "~XQDY0074_NoEmptyLocalname"
 #define ZED_XQDY0074_NameSapceConstructor "~XQDY0074_NameSapceConstructor"
+#define ZED_FOFD1340_BadCalendar "~FOFD1340_BadCalendar"
 #define ZED_FOFD1340_BadComponent_3 "~FOFD1340_BadComponent_3"
 #define ZED_FOFD1340_Bad2ndModifier_3 "~FOFD1340_Bad2ndModifier_3"
 #define ZED_FOFD1340_Bad2ndModifierHere_3 "~FOFD1340_Bad2ndModifierHere_3"

=== modified file 'src/runtime/durations_dates_times/format_dateTime.cpp'
--- src/runtime/durations_dates_times/format_dateTime.cpp	2013-06-11 23:38:49 +0000
+++ src/runtime/durations_dates_times/format_dateTime.cpp	2013-06-18 02:30:40 +0000
@@ -37,6 +37,7 @@
 #include "util/string_util.h"
 #include "util/time_util.h"
 #include "util/utf8_util.h"
+#include "util/xml_util.h"
 #include "zorbatypes/datetime.h"
 #include "zorbatypes/zstring.h"
 
@@ -106,7 +107,7 @@
 
   //
   // This stuff isn't part of the "presentation modifier" as discussed in the
-  // XQuery 3.0 F&O spec, but this is a convenient place to put it nonetheless.
+  // XQuery F&O 3.0 spec, but this is a convenient place to put it nonetheless.
   //
   iso639_1::type lang;
   bool lang_is_fallback;
@@ -117,7 +118,7 @@
   void append_if_fallback_lang( zstring *s ) const {
     if ( lang_is_fallback ) {
       //
-      // XQuery 3.0 F&O: 9.8.4.3: If the fallback representation uses a
+      // XQuery F&O 3.0: 9.8.4.3: If the fallback representation uses a
       // different language from that requested, the output string must
       // identify the language actually used, for example by prefixing the
       // string with [Language: Y] (where Y is the language actually used)
@@ -287,7 +288,7 @@
         utf8_string<zstring> u_name( name );
         if ( mod.gt_max_width( u_name.size() ) ) {
           //
-          // XQuery 3.0 F&O: 9.8.4.1: If the full representation of the value
+          // XQuery F&O 3.0: 9.8.4.1: If the full representation of the value
           // exceeds the specified maximum width, then the processor should
           // attempt to use an alternative shorter representation that fits
           // within the maximum width.  Where the presentation modifier is N,
@@ -353,7 +354,7 @@
   switch ( mod.first.type ) {
     case modifier::NAME:
       //
-      // XQuery 3.0 F&O: 9.8.4.2: If the first presentation modifier is N, then
+      // XQuery F&O 3.0: 9.8.4.2: If the first presentation modifier is N, then
       // the timezone is output (where possible) as a timezone name, for
       // example EST or CET. The same timezone offset has different names in
       // different places; it is therefore recommended that this option should
@@ -528,7 +529,7 @@
         utf8_string<zstring> u_name( name );
         if ( mod.gt_max_width( u_name.size() ) ) {
           //
-          // XQuery 3.0 F&O: 9.8.4.1: If the full representation of the value
+          // XQuery F&O 3.0: 9.8.4.1: If the full representation of the value
           // exceeds the specified maximum width, then the processor should
           // attempt to use an alternative shorter representation that fits
           // within the maximum width.  Where the presentation modifier is N,
@@ -612,7 +613,7 @@
     utf8_string<zstring>::size_type const u_size = u_tmp.size();
     if ( mod.gt_max_width( u_size ) ) {
       //
-      // XQuery 3.0 F&O: 9.8.4.1: If the full representation of the value
+      // XQuery F&O 3.0: 9.8.4.1: If the full representation of the value
       // exceeds the specified maximum width, then the processor should attempt
       // to use an alternative shorter representation that fits within the
       // maximum width.  ... In the case of the year component, setting
@@ -646,7 +647,7 @@
 
   if ( cp != '#' && unicode::is_grouping_separator( cp ) ) {
     //
-    // XQuery 3.0 F&O: 4.6.1: A grouping-separator-sign must not appear
+    // XQuery F&O 3.0: 4.6.1: A grouping-separator-sign must not appear
     // at the start ... of the decimal-digit-pattern ....
     //
     throw XQUERY_EXCEPTION(
@@ -1067,10 +1068,32 @@
       }
 
       if ( consumeNext( item, theChildren[3].getp(), planState ) ) {
-        // TODO: handle calendar being a QName.
-        cal = calendar::find( item->getStringValue() );
-        if ( !cal )
+        zstring const cal_str( item->getStringValue() );
+        zstring prefix_or_uri, local;
+
+        xml::split_uri_name( cal_str, &prefix_or_uri, &local )
+        || xml::split_qname( cal_str, &prefix_or_uri, &local );
+
+        if ( !prefix_or_uri.empty() ) {
+          //
+          // We don't know what to do with calendar designators in a namespace.
+          //
           cal_is_fallback = true;
+        } else {
+          cal = calendar::find( local );
+          if ( !cal ) {
+            //
+            // XQuery F&O 3.0: 9.4.8.3: If the expanded QName is in no
+            // namespace, then it must identify a calendar with a designator
+            // specified [in the table given in the section].
+            //
+            throw XQUERY_EXCEPTION(
+              err::FOFD1340,
+              ERROR_PARAMS( cal_str, ZED( FOFD1340_BadCalendar ) ),
+              ERROR_LOC( loc )
+            );
+          }
+        }
       }
 
       if ( consumeNext( item, theChildren[4].getp(), planState ) ) {
@@ -1080,9 +1103,9 @@
 
     if ( !cal ) {
       //
-      // XQuery 3.0 F&O: 9.8.4.3: If the $calendar argument is omitted or is
-      // set to an empty sequence then the default calendar defined in the
-      // dynamic context is used.
+      // Ibid: If the $calendar argument is omitted or is set to an empty
+      // sequence then the default calendar defined in the dynamic context is
+      // used.
       //
       cal = planState.theLocalDynCtx->get_calendar();
     }

=== modified file 'src/runtime/json/jsonml_array.cpp'
--- src/runtime/json/jsonml_array.cpp	2013-06-01 00:30:39 +0000
+++ src/runtime/json/jsonml_array.cpp	2013-06-18 02:30:40 +0000
@@ -42,7 +42,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 inline void split_name( zstring const &name, zstring *prefix, zstring *local ) {
-  if ( !xml::split_name( name, prefix, local ) )
+  if ( !xml::split_qname( name, prefix, local ) )
     throw XQUERY_EXCEPTION(
       zerr::ZJPE0008_ILLEGAL_QNAME,
       ERROR_PARAMS( name )

=== modified file 'src/runtime/numerics/format_number.cpp'
--- src/runtime/numerics/format_number.cpp	2013-05-15 23:22:01 +0000
+++ src/runtime/numerics/format_number.cpp	2013-06-18 02:30:40 +0000
@@ -788,7 +788,7 @@
     zstring format_name( format_name_item->getStringValue() );
     ascii::trim_space( format_name );
     zstring prefix, local;
-    if ( !xml::split_name( format_name, &prefix, &local ) ||
+    if ( !xml::split_qname( format_name, &prefix, &local ) ||
          prefix.empty() ) {
       GENV_ITEMFACTORY->createQName( format_name_item, "", "", format_name );
     } else {

=== modified file 'src/util/xml_util.h'
--- src/util/xml_util.h	2013-05-09 00:48:27 +0000
+++ src/util/xml_util.h	2013-06-18 02:30:40 +0000
@@ -93,15 +93,15 @@
 }
 
 /**
- * Splits an XML name at a \c : if present.
+ * Splits a QName at a \c : if present.
  *
  * @tparam InputStringType The input string type.
  * @tparam PrefixStringType The output prefix string type.
  * @tparam LocalStringType The output local string type.
- * @param name The XML name to be split.
+ * @param qname The QName to be split.
  * @param prefix The prefix is put here, if any.
  * @param local The local name is put here.
- * @return If \a name contains a \c : and either \a prefix or \a local strings
+ * @return If \a qname contains a \c : and either \a prefix or \a local strings
  * become empty, returns \c false; otherwise returns \a true.
  */
 template<class InputStringType,class PrefixStringType,class LocalStringType>
@@ -110,20 +110,50 @@
                      && ZORBA_IS_STRING(PrefixStringType)
                      && ZORBA_IS_STRING(LocalStringType),
                         bool>::type
-split_name( InputStringType const &name, PrefixStringType *prefix,
-            LocalStringType *local ) {
-  typename InputStringType::size_type const colon = name.find( ':' );
+split_qname( InputStringType const &qname, PrefixStringType *prefix,
+             LocalStringType *local ) {
+  typename InputStringType::size_type const colon = qname.find( ':' );
   if ( colon != InputStringType::npos ) {
-    prefix->assign( name, 0, colon );
-    local->assign( name, colon + 1, LocalStringType::npos );
+    prefix->assign( qname, 0, colon );
+    local->assign( qname, colon + 1, LocalStringType::npos );
     return !( prefix->empty() || local->empty() );
   } else {
     prefix->clear();
-    *local = name;
+    *local = qname;
     return true;
   }
 }
 
+/**
+ * Splits a URIQualifiedName.
+ *
+ * @tparam InputStringType The input string type.
+ * @tparam URIStringType The output URI string type.
+ * @tparam LocalStringType The output local string type.
+ * @param uname The URIQualifiedName to be split.
+ * @param uri The URI is put here, if any.
+ * @param local The local name is put here.
+ * @return Returns \a true only if \a uname is a URIQualifiedName and \a local
+ * is not empty.
+ */
+template<class InputStringType,class URIStringType,class LocalStringType> inline
+typename std::enable_if<ZORBA_IS_STRING(InputStringType)
+                     && ZORBA_IS_STRING(URIStringType)
+                     && ZORBA_IS_STRING(LocalStringType),
+                        bool>::type
+split_uri_name( InputStringType const &uname, URIStringType *uri,
+                LocalStringType *local ) {
+  if ( uname.compare( 0, 2, "Q{" ) == 0 ) {
+    typename InputStringType::size_type const rbrace = uname.find( '}' );
+    if ( rbrace != InputStringType::npos ) {
+      uri->assign( uname, 2, rbrace - 2 );
+      local->assign( uname, rbrace + 1, LocalStringType::npos );
+      return !local->empty();
+    }
+  }
+  return false;
+}
+
 ////////// Character validity /////////////////////////////////////////////////
 
 /**

=== modified file 'test/fots/CMakeLists.txt'
--- test/fots/CMakeLists.txt	2013-06-13 23:04:41 +0000
+++ test/fots/CMakeLists.txt	2013-06-18 02:30:40 +0000
@@ -139,11 +139,6 @@
 
 EXPECTED_FOTS_FAILURE (fn-fold-left fold-left-009 1187685)
 EXPECTED_FOTS_FAILURE (fn-for-each-pair fn-for-each-pair-026 1187685)
-EXPECTED_FOTS_FAILURE (fn-format-date format-date-010 1190710)
-EXPECTED_FOTS_FAILURE (fn-format-date format-date-en155 1190710)
-EXPECTED_FOTS_FAILURE (fn-format-date format-date-en156 1190710)
-EXPECTED_FOTS_FAILURE (fn-format-date format-date-en157 1190710)
-EXPECTED_FOTS_FAILURE (fn-format-date format-date-en158 1190710)
 EXPECTED_FOTS_FAILURE (fn-format-number numberformat60a 1167609)
 EXPECTED_FOTS_FAILURE (fn-format-number numberformat60m 1167609)
 EXPECTED_FOTS_FAILURE (fn-format-number numberformat60o 1167609)

-- 
Mailing list: https://launchpad.net/~zorba-coders
Post to     : zorba-coders@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zorba-coders
More help   : https://help.launchpad.net/ListHelp

Reply via email to