On Sun, Jul 29, 2007 at 05:17:39PM +0200, Stefan Schimanski wrote:

> > Hmm, I doubt that this is the same case as I think that the Mac has
> > proper support for wchar_t, hasn't it?
> >
> > My problem is due to the following line in InsetMathNest.cpp:
> >
> >             is >> m >> n >> v_align >> h_align;
> >
> > where 'is' is an idocstringstream. The extraction fails because 'm'
> > and 'n' (number of rows and columns, respectively) are 'unsigned int'
> > and only a facet for 'int' is currently implemented.
> >
> 
> It's exactly what I found in the debugger on mac. This call gives n=1  
> and m=1, everytime.

Doh! Seems that the Mac also needs using our custom facets. Please try
the attached patch and let me know if it works. You'll have to recompile
lyx pratically from scratch, sorry for that.

-- 
Enrico
Index: src/support/docstring.cpp
===================================================================
--- src/support/docstring.cpp   (revision 19230)
+++ src/support/docstring.cpp   (working copy)
@@ -560,19 +560,56 @@ public:
                string_num_get_facet() : std::num_get<char, 
std::basic_string<char>::iterator>(1) {}
        };
 
-private:
-       bool isNumpunct(lyx::char_type const c) const
+protected:
+       iter_type
+       do_get(iter_type iit, iter_type eit, std::ios_base & b,
+               std::ios_base::iostate & err, long & v) const
        {
-               /// Only account for the standard numpunct "C" locale facet.
-               return c < 0x80 && (c == '-' || c == '+' || isdigit(c)
-                       || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
-                       || c == 'x' || c == 'X');
+               return do_get_helper(iit, eit, b, err, v);
        }
 
-protected:
        iter_type
        do_get(iter_type iit, iter_type eit, std::ios_base & b,
-               std::ios_base::iostate & err, long & v) const
+               std::ios_base::iostate & err, unsigned short & v) const
+       {
+               return do_get_helper(iit, eit, b, err, v);
+       }
+
+       iter_type
+       do_get(iter_type iit, iter_type eit, std::ios_base & b,
+               std::ios_base::iostate & err, unsigned int & v) const
+       {
+               return do_get_helper(iit, eit, b, err, v);
+       }
+
+       iter_type
+       do_get(iter_type iit, iter_type eit, std::ios_base & b,
+               std::ios_base::iostate & err, unsigned long & v) const
+       {
+               return do_get_helper(iit, eit, b, err, v);
+       }
+
+#ifdef _GLIBCXX_USE_LONG_LONG
+       iter_type
+       do_get(iter_type iit, iter_type eit, std::ios_base & b,
+               std::ios_base::iostate & err, long long & v) const
+       {
+               return do_get_helper(iit, eit, b, err, v);
+       }
+
+       iter_type
+       do_get(iter_type iit, iter_type eit, std::ios_base & b,
+               std::ios_base::iostate & err, unsigned long long & v) const
+       {
+               return do_get_helper(iit, eit, b, err, v);
+       }
+#endif
+
+private:
+       template <typename ValueType>
+       iter_type
+       do_get_helper(iter_type iit, iter_type eit, std::ios_base & b,
+                       std::ios_base::iostate & err, ValueType & v) const
        {
                std::string s;
                s.reserve(64);
@@ -588,6 +625,14 @@ protected:
 
                return iit;
        }
+
+       bool isNumpunct(lyx::char_type const c) const
+       {
+               /// Only account for the standard numpunct "C" locale facet.
+               return c < 0x80 && (c == '-' || c == '+' || isdigit(c)
+                       || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
+                       || c == 'x' || c == 'X');
+       }
 };
 
 
Index: configure.ac
===================================================================
--- configure.ac        (revision 19230)
+++ configure.ac        (working copy)
@@ -393,7 +393,7 @@ int mkstemp(char*);
  * implements this with the help of libc, or whether it has own code
  * does not matter for us, because we don't use libc directly (Georg)
 */
-#if defined(HAVE_WCHAR_T) && SIZEOF_WCHAR_T == 4 && !defined(__FreeBSD__) && 
!defined(__FreeBSD_kernel__)
+#if defined(HAVE_WCHAR_T) && SIZEOF_WCHAR_T == 4 && !defined(__FreeBSD__) && 
!defined(__FreeBSD_kernel__) && !defined(__APPLE_)
 #  define USE_WCHAR_T
 #endif
 

Reply via email to