summaryrefslogtreecommitdiffstats
path: root/x11-toolkits/wxgtk24/files/patch-src-common-datetime.cpp
blob: f4931273f720e7f1bc2ef905f1eaac249efd77f9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
--- src/common/datetime.cpp.orig    Tue Nov  4 09:50:09 2003
+++ src/common/datetime.cpp Tue Nov  4 09:52:02 2003
@@ -349,6 +349,35 @@
     return wxString(buf);
 }
 
+#ifdef HAVE_STRPTIME
+    
+// Unicode-friendly strptime() wrapper
+static const wxChar *
+CallStrptime(const wxChar *input, const char *fmt, tm *tm)
+{
+    // the problem here is that strptime() returns pointer into the string we
+    // passed to it while we're really interested in the pointer into the
+    // original, Unicode, string so we try to transform the pointer back
+#if wxUSE_UNICODE
+    wxCharBuffer inputMB(wxConvertWX2MB(input));
+#else // ASCII
+    const char * const inputMB = input;
+#endif // Unicode/Ascii
+
+    const char *result = strptime(inputMB, fmt, tm);
+    if ( !result )
+        return NULL;
+    
+#if wxUSE_UNICODE
+    // FIXME: this is wrong in presence of surrogates &c
+    return input + (result - inputMB.data());
+#else // ASCII
+    return result;
+#endif // Unicode/Ascii
+}
+
+#endif // HAVE_STRPTIME
+
 // if year and/or month have invalid values, replace them with the current ones
 static void ReplaceDefaultYearMonthWithCurrent(int *year,
                                                wxDateTime::Month *month)
@@ -2920,7 +2949,7 @@
                 // to our generic code anyhow (FIXME !Unicode friendly)
                 {
                     struct tm tm;
-                    const wxChar *result = strptime(input, "%x", &tm);
+                    const wxChar *result = CallStrptime(input, "%x", &tm);
                     if ( result )
                     {
                         input = result;
@@ -2985,7 +3014,7 @@
                 {
                     // use strptime() to do it for us (FIXME !Unicode friendly)
                     struct tm tm;
-                    input = strptime(input, "%X", &tm);
+                    input = CallStrptime(input, "%X", &tm);
                     if ( !input )
                     {
                         return (wxChar *)NULL;