From 50d7036e03a29fdc509c2a4b0f45938806610560 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 24 Jun 2018 17:25:46 +0200 Subject: [PATCH] mescc: Support binutils 2.10.1: strrchr: Stop at start of string. * 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 | 1 + lib/libc+tcc.c | 17 +++++++++++------ scaffold/tests/88-strrchr.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 scaffold/tests/88-strrchr.c diff --git a/build-aux/check-mescc.sh b/build-aux/check-mescc.sh index eec5b9a3..26403a31 100755 --- a/build-aux/check-mescc.sh +++ b/build-aux/check-mescc.sh @@ -134,6 +134,7 @@ t 85-sizeof 86-strncpy 87-sscanf +88-strrchr 90-strpbrk 91-fseek 92-stat diff --git a/lib/libc+tcc.c b/lib/libc+tcc.c index e7cf1cc7..3c4f8650 100644 --- a/lib/libc+tcc.c +++ b/lib/libc+tcc.c @@ -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 index 00000000..44d1ad57 --- /dev/null +++ b/scaffold/tests/88-strrchr.c @@ -0,0 +1,37 @@ +/* -*-comment-start: "//";comment-end:""-*- + * Mes --- Maxwell Equations of Software + * Copyright © 2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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; +}