Changeset: 03f2cd8fa1b9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=03f2cd8fa1b9
Added Files:
        monetdb5/modules/atoms/strptime.c
        sql/test/miscellaneous/Tests/simple_selects.sql
        sql/test/miscellaneous/Tests/simple_selects.stable.err
        sql/test/miscellaneous/Tests/simple_selects.stable.out
Removed Files:
        common/utils/strptime.cpp
Modified Files:
        common/utils/Makefile.ag
        monetdb5/modules/atoms/Makefile.ag
        monetdb5/modules/mal/Makefile.ag
        monetdb5/tools/Makefile.ag
        sql/backends/monet5/sql_scenario.c
        sql/server/rel_select.c
        sql/test/miscellaneous/Tests/All
Branch: default
Log Message:

Merge with Aug2018 branch.


diffs (truncated from 657 to 300 lines):

diff --git a/common/utils/Makefile.ag b/common/utils/Makefile.ag
--- a/common/utils/Makefile.ag
+++ b/common/utils/Makefile.ag
@@ -29,9 +29,3 @@ lib_msabaoth = {
        NOINST
        SOURCES = msabaoth.h msabaoth.c
 }
-
-lib_strptime = {
-       NOINST
-       SOURCES = strptime.cpp
-       COND = NATIVE_WIN32
-}
diff --git a/monetdb5/modules/atoms/Makefile.ag 
b/monetdb5/modules/atoms/Makefile.ag
--- a/monetdb5/modules/atoms/Makefile.ag
+++ b/monetdb5/modules/atoms/Makefile.ag
@@ -9,7 +9,7 @@ INCLUDES = ../../mal \
                   ../../../common/stream \
                   ../../../common/utils \
                   ../../../gdk \
-                  $(libxml2_CFLAGS) $(curl_CFLAGS) $(openssl_CFLAGS)
+                  $(libxml2_CFLAGS) $(openssl_CFLAGS)
 MTSAFE
 
 lib_atoms = {
@@ -29,6 +29,12 @@ lib_atoms = {
                xml.c xml.h
 }
 
+lib_strptime = {
+       NOINST
+       SOURCES = strptime.c
+       COND = NATIVE_WIN32
+}
+
 headers_mal = {
        HEADERS = mal
        DIR = libdir/monetdb5
diff --git a/common/utils/strptime.cpp b/monetdb5/modules/atoms/strptime.c
rename from common/utils/strptime.cpp
rename to monetdb5/modules/atoms/strptime.c
--- a/common/utils/strptime.cpp
+++ b/monetdb5/modules/atoms/strptime.c
@@ -1,17 +1,355 @@
-/* https://stackoverflow.com/questions/321849/strptime-equivalent-on-windows */
+/* Adapted from 
https://opensource.apple.com/source/lukemftp/lukemftp-3/lukemftp/libukem/strptime.c
 */
+/*     $Id$    */
+/*     $NetBSD: strptime.c,v 1.18 1999/04/29 02:58:30 tv Exp $ */
+
+/*-
+ * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code was contributed to The NetBSD Foundation by Klaus Klein.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#include "monetdb_config.h"
+#include "gdk.h"
 
 #include <time.h>
-#include <iomanip>
-#include <sstream>
+#include <ctype.h>
+#include <string.h>
+
+#ifdef WIN32
+
+/*
+ * We do not implement alternate representations. However, we always
+ * check whether a given modifier is allowed for a certain conversion.
+ */
+#define ALT_E                  0x01
+#define ALT_O                  0x02
+#define LEGAL_ALT(x)   { if (alt_format & ~(x)) return NULL; }
+
+#ifndef TM_YEAR_BASE
+#define TM_YEAR_BASE 1900
+#endif
+
+static const char *day[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", 
"Thursday", "Friday", "Saturday"};
+
+static const char *abday[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", 
"Sat"};
+
+static const char *mon[12] = {"January", "February", "March", "April", "May", 
"June", "July", "August", "September",
+                                                         "October", 
"November", "December"};
+
+static const char *abmon[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", 
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 
-extern "C" char *
-strptime(const char *s, const char *f, struct tm *tm)
+static const char *am_pm[2] = {"am", "pm"};
+
+static int
+strptime_conv_num(const char **buf, int *dest, int llim, int ulim)
+{
+       int result = 0;
+
+       /* The limit also determines the number of valid digits. */
+       int rulim = ulim;
+
+       if (**buf < '0' || **buf > '9')
+               return 0;
+
+       do {
+               result *= 10;
+               result += *(*buf)++ - '0';
+               rulim /= 10;
+       } while ((result * 10 <= ulim) && rulim && **buf >= '0' && **buf <= 
'9');
+
+       if (result < llim || result > ulim)
+               return 0;
+
+       *dest = result;
+       return 1;
+}
+
+char *
+strptime(const char *buf, const char *fmt, struct tm *tm)
 {
-       std::istringstream input(s);
-       input.imbue(std::locale(setlocale(LC_ALL, nullptr)));
-       input >> std::get_time(tm, f);
-       if (input.fail()) {
-               return nullptr;
+       char c;
+       const char *bp = buf;
+       size_t len = 0;
+       int alt_format, i, split_year = 0;
+
+       if (THRhighwater()) /* defensive line for recursive strptime calls */
+               return NULL;
+
+       while ((c = *fmt) != '\0') {
+               /* Clear `alternate' modifier prior to new conversion. */
+               alt_format = 0;
+
+               /* Eat up white-space. */
+               if (isspace(c)) {
+                       while (isspace(*bp))
+                               bp++;
+
+                       fmt++;
+                       continue;
+               }
+
+               if ((c = *fmt++) != '%')
+                       goto literal;
+
+again:
+               switch (c = *fmt++) {
+                       case '%':       /* "%%" is converted to "%". */
+literal:
+                               if (c != *bp++)
+                                       return NULL;
+                               break;
+                               /*
+                                * "Alternative" modifiers. Just set the 
appropriate flag
+                                * and start over again.
+                                */
+                       case 'E':       /* "%E?" alternative conversion 
modifier. */
+                       LEGAL_ALT(0);
+                               alt_format |= ALT_E;
+                               goto again;
+                       case 'O':       /* "%O?" alternative conversion 
modifier. */
+                       LEGAL_ALT(0);
+                               alt_format |= ALT_O;
+                               goto again;
+                               /*
+                                * "Complex" conversion rules, implemented 
through recursion.
+                                */
+                       case 'c':       /* Date and time, using the locale's 
format. */
+                       LEGAL_ALT(ALT_E);
+                               if (!(bp = strptime(bp, "%x %X", tm)))
+                                       return NULL;
+                               break;
+                       case 'D':       /* The date as "%m/%d/%y". */
+                       LEGAL_ALT(0);
+                               if (!(bp = strptime(bp, "%m/%d/%y", tm)))
+                                       return NULL;
+                               break;
+                       case 'R':       /* The time as "%H:%M". */
+                       LEGAL_ALT(0);
+                               if (!(bp = strptime(bp, "%H:%M", tm)))
+                                       return NULL;
+                               break;
+                       case 'r':       /* The time in 12-hour clock 
representation. */
+                       LEGAL_ALT(0);
+                               if (!(bp = strptime(bp, "%I:%M:%S %p", tm)))
+                                       return NULL;
+                               break;
+                       case 'T':       /* The time as "%H:%M:%S". */
+                       LEGAL_ALT(0);
+                               if (!(bp = strptime(bp, "%H:%M:%S", tm)))
+                                       return NULL;
+                               break;
+                       case 'X':       /* The time, using the locale's format. 
*/
+                       LEGAL_ALT(ALT_E);
+                               if (!(bp = strptime(bp, "%H:%M:%S", tm)))
+                                       return NULL;
+                               break;
+                       case 'x':       /* The date, using the locale's format. 
*/
+                       LEGAL_ALT(ALT_E);
+                               if (!(bp = strptime(bp, "%m/%d/%y", tm)))
+                                       return NULL;
+                               break;
+                               /*
+                                * "Elementary" conversion rules.
+                                */
+                       case 'A':       /* The day of week, using the locale's 
form. */
+                       case 'a':
+                       LEGAL_ALT(0);
+                               for (i = 0; i < 7; i++) {
+                                       /* Full name. */
+                                       len = strlen(day[i]);
+                                       if (strncasecmp(day[i], bp, len) == 0)
+                                               break;
+                                       /* Abbreviated name. */
+                                       len = strlen(abday[i]);
+                                       if (strncasecmp(abday[i], bp, len) == 0)
+                                               break;
+                               }
+                               /* Nothing matched. */
+                               if (i == 7)
+                                       return NULL;
+                               tm->tm_wday = i;
+                               bp += len;
+                               break;
+                       case 'B':       /* The month, using the locale's form. 
*/
+                       case 'b':
+                       case 'h':
+                       LEGAL_ALT(0);
+                               for (i = 0; i < 12; i++) {
+                                       /* Full name. */
+                                       len = strlen(mon[i]);
+                                       if (strncasecmp(mon[i], bp, len) == 0)
+                                               break;
+
+                                       /* Abbreviated name. */
+                                       len = strlen(abmon[i]);
+                                       if (strncasecmp(abmon[i], bp, len) == 0)
+                                               break;
+                               }
+                               /* Nothing matched. */
+                               if (i == 12)
+                                       return NULL;
+                               tm->tm_mon = i;
+                               bp += len;
+                               break;
+                       case 'C':       /* The century number. */
+                       LEGAL_ALT(ALT_E);
+                               if (!(strptime_conv_num(&bp, &i, 0, 99)))
+                                       return NULL;
+                               if (split_year) {
+                                       tm->tm_year = (tm->tm_year % 100) + (i 
* 100);
+                               } else {
+                                       tm->tm_year = i * 100;
+                                       split_year = 1;
+                               }
+                               break;
+                       case 'd':       /* The day of month. */
+                       case 'e':
+                       LEGAL_ALT(ALT_O);
+                               if (!(strptime_conv_num(&bp, &tm->tm_mday, 1, 
31)))
+                                       return NULL;
+                               break;
+                       case 'k':       /* The hour (24-hour clock 
representation). */
+                       LEGAL_ALT(0);
+                               /* FALLTHROUGH */
+                       case 'H':
+                       LEGAL_ALT(ALT_O);
+                               if (!(strptime_conv_num(&bp, &tm->tm_hour, 0, 
23)))
+                                       return NULL;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to