]> sjero.net Git - wget/blobdiff - src/cmpt.c
[svn] Parse Content-Disposition better. Implement memrchr where missing.
[wget] / src / cmpt.c
index a41429512795cae0d718e57531afba98ebda8a57..d1cff3b7bdfdab6e9ff27c3786dd821dfa6bff48 100644 (file)
@@ -111,10 +111,28 @@ strncasecmp (const char *s1, const char *s2, size_t n)
   return c1 - c2;
 }
 #endif /* not HAVE_STRNCASECMP */
+
+#ifndef HAVE_MEMRCHR
+/* memrchr is a GNU extension.  It is like the memchr function, except
+   that it searches backwards from the end of the n bytes pointed to
+   by s instead of forwards from the front.  */
+
+void *
+memrchr (const void *s, int c, size_t n)
+{
+  const char *b = s;
+  const char *e = b + n;
+  while (e > b)
+    if (*--e == c)
+      return (void *) e;
+  return NULL;
+}
+#endif
 \f
 /* strptime is required by POSIX, but it is missing from Windows,
    which means we must keep a fallback implementation.  It is
-   reportedly missing or broken on many older systems as well.  */
+   reportedly missing or broken on many older Unix systems as well, so
+   it's good to have around.  */
 
 #ifndef HAVE_STRPTIME
 /* From GNU libc 2.1.3.  */
@@ -1348,6 +1366,13 @@ strtoll (const char *nptr, char **endptr, int base)
        {
          base = 16;
          nptr += 2;
+         /* "0x" must be followed by at least one hex char.  If not,
+            return 0 and place ENDPTR on 'x'. */
+         if (!ISXDIGIT (*nptr))
+           {
+             --nptr;
+             goto out;
+           }
        }
       else if (base == 0)
        base = 8;
@@ -1387,6 +1412,7 @@ strtoll (const char *nptr, char **endptr, int base)
          result = newresult;
        }
     }
+ out:
   if (endptr)
     *endptr = (char *) nptr;
   return result;