packages feed

strptime 0.1.5 → 0.1.6

raw patch · 2 files changed

+202/−3 lines, 2 files

Files

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