mescc: Support binutils 2.10.1: strrchr: Stop at start of string.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 24 Jun 2018 15:25:46 +0000 (17:25 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 24 Jun 2018 15:25:46 +0000 (17:25 +0200)
* lib/libc+tcc.c (strrchr): Stop at start of string.
* scaffold/tests/88-strrchr.c: Test it.
* build-aux/check-mescc.sh (tests): Run it.

build-aux/check-mescc.sh
lib/libc+tcc.c
scaffold/tests/88-strrchr.c [new file with mode: 0644]

index eec5b9a3cc73ac02e808039617ae1448ea8bcb2e..26403a31aa398874ff99dfe0aadbe39ba1446d6b 100755 (executable)
@@ -134,6 +134,7 @@ t
 85-sizeof
 86-strncpy
 87-sscanf
+88-strrchr
 90-strpbrk
 91-fseek
 92-stat
index e7cf1cc7a7a500dc51427537c472659423819265..3c4f86507c7855ec374485a43afc3250779f2440 100644 (file)
@@ -448,7 +448,7 @@ strchr (char const *s, int c)
     {
       if (c == *p)
         return p;
-      *p++;
+      p++;
     }
   return 0;
 }
@@ -472,12 +472,17 @@ char *
 strrchr (char const *s, int c)
 {
   int n = strlen (s);
-  if (!n) return 0;
-  char const *p = s + n - 1;
-  while (*p || !c)
+  if (!n)
+    return 0;
+  char const *p = s + n;
+  if (!*p && !c)
+    return p;
+  p--;
+  while (n-- && (*p || !c))
     {
-      if (c == *p) return p;
-      *p--;
+      if (c == *p)
+        return p;
+      p--;
     }
   return 0;
 }
diff --git a/scaffold/tests/88-strrchr.c b/scaffold/tests/88-strrchr.c
new file mode 100644 (file)
index 0000000..44d1ad5
--- /dev/null
@@ -0,0 +1,37 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+int
+main (int argc, char *argv[])
+{
+  char *string = "foo.bar";
+  char *p = strrchr (string, 0);
+  if (!p)
+    return 1;
+  if (strcmp (p, ""))
+    return 2;
+  p = strrchr (string, '.');
+  if (strcmp (p, ".bar"))
+    return 3;
+
+  return 0;
+}