strptime 0.1.5 → 0.1.6
raw patch · 2 files changed
+202/−3 lines, 2 files
Files
- cbits/hstrptime.c +201/−2
- strptime.cabal +1/−1
cbits/hstrptime.c view
@@ -121,7 +121,10 @@ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } }; +static double our_strtod(const char *s, char **sret);+static double our_wcstod(const wchar_t *s, wchar_t **sret); + /* Status of lookup: do we use the locale data or the raw data? */ enum locale_status { Not, loc, raw }; @@ -549,7 +552,7 @@ { double sval; wchar_t *end;- sval = wcstod(rp, &end);+ sval = our_wcstod(rp, &end); if( sval >= 0.0 && sval <= 61.0) { tm->tm_sec = sval; *psecs = sval;@@ -1016,7 +1019,7 @@ { double sval; char *end;- sval = strtod(rp, &end);+ sval = our_strtod(rp, &end); if( sval >= 0.0 && sval <= 61.0) { tm->tm_sec = sval; *psecs = sval;@@ -1233,3 +1236,199 @@ return strptime_internal (buf, format, tm, &decided, psecs, poffset); } }++++// Copied from ReactOS, http://reactos-mirror.googlecode.com/svn/trunk/reactos/lib/sdk/crt/string/strtod.c+// and http://reactos-mirror.googlecode.com/svn/trunk/reactos/lib/sdk/crt/string/wcstod.c+// Modified to also handle ',' as decimal separator+/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */+/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */+++static double our_strtod(const char *s, char **sret)+{+ long double r; /* result */+ int e; /* exponent */+ long double d; /* scale */+ int sign; /* +- 1.0 */+ int esign;+ int i;+ int flags=0;++ r = 0.0;+ sign = 1;+ e = 0;+ esign = 1;++ if (s == NULL)+ return r;+++ while ((*s == ' ') || (*s == '\t'))+ s++;++ if (*s == '+')+ s++;+ else if (*s == '-')+ {+ sign = -1;+ s++;+ }++ while ((*s >= '0') && (*s <= '9'))+ {+ flags |= 1;+ r *= 10.0;+ r += *s - '0';+ s++;+ }++ if (*s == '.' || *s == ',')+ {+ d = 0.1L;+ s++;+ while ((*s >= '0') && (*s <= '9'))+ {+ flags |= 2;+ r += d * (*s - '0');+ s++;+ d *= 0.1L;+ }+ }++ if (flags == 0)+ {+ if (sret)+ *sret = (char *)s;+ return 0;+ }++ if ((*s == 'e') || (*s == 'E'))+ {+ s++;+ if (*s == '+')+ s++;+ else if (*s == '-')+ {+ s++;+ esign = -1;+ }+ if ((*s < '0') || (*s > '9'))+ {+ if (sret)+ *sret = (char *)s;+ return r;+ }++ while ((*s >= '0') && (*s <= '9'))+ {+ e *= 10;+ e += *s - '0';+ s++;+ }+ }++ if (esign < 0)+ for (i = 1; i <= e; i++)+ r *= 0.1L;+ else+ for (i = 1; i <= e; i++)+ r *= 10.0;++ if (sret)+ *sret = (char *)s;+ return r * sign;+}++static double our_wcstod(const wchar_t *s, wchar_t **sret)+{+ long double r; /* result */+ int e; /* exponent */+ long double d; /* scale */+ int sign; /* +- 1.0 */+ int esign;+ int i;+ int flags=0;++ r = 0.0;+ sign = 1;+ e = 0;+ esign = 1;++ while ((*s == L' ') || (*s == L'\t'))+ s++;++ if (*s == L'+')+ s++;+ else if (*s == L'-')+ {+ sign = -1;+ s++;+ }++ while ((*s >= L'0') && (*s <= L'9'))+ {+ flags |= 1;+ r *= 10.0;+ r += *s - L'0';+ s++;+ }++ if (*s == L'.' || *s == L',')+ {+ d = 0.1L;+ s++;+ while ((*s >= L'0') && (*s <= L'9'))+ {+ flags |= 2;+ r += d * (*s - L'0');+ s++;+ d *= 0.1L;+ }+ }++ if (flags == 0)+ {+ if (sret)+ *sret = (wchar_t *)s;+ return 0;+ }++ if ((*s == L'e') || (*s == L'E'))+ {+ s++;+ if (*s == L'+')+ s++;+ else if (*s == L'-')+ {+ s++;+ esign = -1;+ }+ if ((*s < L'0') || (*s > L'9'))+ {+ if (sret)+ *sret = (wchar_t *)s;+ return r;+ }++ while ((*s >= L'0') && (*s <= L'9'))+ {+ e *= 10;+ e += *s - L'0';+ s++;+ }+ }++ if (esign < 0)+ for (i = 1; i <= e; i++)+ r *= 0.1L;+ else+ for (i = 1; i <= e; i++)+ r *= 10.0;++ if (sret)+ *sret = (wchar_t *)s;+ return r * sign;+}+
strptime.cabal view
@@ -1,6 +1,6 @@ Name: strptime Category: System, Data, Parsing-Version: 0.1.5+Version: 0.1.6 Cabal-version: >= 1.2 Build-type: Simple Copyright: Eugene Kirpichov