From 948fbf97438a0f8da0ef2a039586094cf5683a8c Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 20 May 2018 10:55:44 +0200 Subject: [PATCH] mescc: Tinycc support: strncpy. * lib/libc+tcc.c (strncpy): New function. * scaffold/tests/86-strncpy.c: Test it. * build-aux/check-mescc.sh (tests): Run it. * build-aux/cc-mlibc.sh (LIBC): Acknowlegde. * build-aux/test.sh (LIBC): Export it. --- build-aux/cc-mlibc.sh | 3 ++- build-aux/test.sh | 2 ++ lib/libc+tcc.c | 13 ++++++++++++ scaffold/tests/51-strcmp.c | 33 +++++++++++++++++++++-------- scaffold/tests/86-strncpy.c | 42 +++++++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 scaffold/tests/86-strncpy.c diff --git a/build-aux/cc-mlibc.sh b/build-aux/cc-mlibc.sh index e5bd8dd5..4c8190f1 100755 --- a/build-aux/cc-mlibc.sh +++ b/build-aux/cc-mlibc.sh @@ -39,6 +39,7 @@ C32FLAGS=${C32FLAGS-" -nostdinc -nostdlib "} +LIBC=${LIBC-lib/libc} c=$1 @@ -55,5 +56,5 @@ if [ -z "$NOLINK" ]; then -o "$c".mlibc-out\ lib/crt1.mlibc-o\ "$c".mlibc-o\ - lib/libc-gcc.mlibc-o + $LIBC-gcc.mlibc-o fi diff --git a/build-aux/test.sh b/build-aux/test.sh index af8bc491..5908f7bc 100755 --- a/build-aux/test.sh +++ b/build-aux/test.sh @@ -20,6 +20,8 @@ set -x +export LIBC + GUILE=${GUILE-$MES} DIFF=${DIFF-$(command -v diff)} [ -z "$DIFF" ] && DIFF="sh scripts/diff.scm" diff --git a/lib/libc+tcc.c b/lib/libc+tcc.c index 73824a9a..bf0d0499 100644 --- a/lib/libc+tcc.c +++ b/lib/libc+tcc.c @@ -271,6 +271,19 @@ strchr (char const *s, int c) return 0; } +char * +strncpy (char *dest, char const *src, size_t length) +{ + char *p = dest; + while (*src && length--) + *p++ = *src++; + if (*src) + length++; + while (length--) + *p++ = 0; + return dest; +} + char * strrchr (char const *s, int c) { diff --git a/scaffold/tests/51-strcmp.c b/scaffold/tests/51-strcmp.c index 5479b748..3ab20d30 100644 --- a/scaffold/tests/51-strcmp.c +++ b/scaffold/tests/51-strcmp.c @@ -1,6 +1,6 @@ /* -*-comment-start: "//";comment-end:""-*- * Mes --- Maxwell Equations of Software - * Copyright © 2017 Jan (janneke) Nieuwenhuizen + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen * * This file is part of Mes. * @@ -30,32 +30,47 @@ test () puts ("\n"); puts ("t: if (strcmp (p, \"foo\"))\n"); - if (!strcmp (p, "foo")) return 1; + if (!strcmp (p, "foo")) + return 1; puts ("t: if (strcmp (p, \"t.c\\n\"))\n"); - if (strcmp (p, "mes")) return 1; + if (strcmp (p, "mes")) + return 2; puts ("t: if (!strcmp (p, \"t.c\\n\"))\n"); if (!strcmp (p, "mes")) goto ok1; - return 1; + return 3; ok1: puts ("t: if (strcmp (p, \"foo\"))\n"); if (strcmp (p, "foo")) goto ok2; - return 1; + return 4; ok2: puts ("t: itoa (33) == \"33\"\n"); - if (strcmp (itoa (33), "33")) return 1; + if (strcmp (itoa (33), "33")) + return 5; puts ("strcmp (itoa (-1), \"-1\")\n"); - if (strcmp (itoa (-1), "-1")) return 1; + if (strcmp (itoa (-1), "-1")) + return 6; puts ("strcmp (itoa (0), \"0\")\n"); - if (strcmp (itoa (0), "0")) return 1; + if (strcmp (itoa (0), "0")) + return 7; puts ("strcmp (itoa (1), \"1\")\n"); - if (strcmp (itoa (1), "1")) return 1; + if (strcmp (itoa (1), "1")) + return 8; + + if (strncmp ("abc", "a", 1)) + return 9; + + if (!strncmp ("abc", "x", 1)) + return 10; + + if (!strncmp ("abc", "", 0)) + return 11; return 0; } diff --git a/scaffold/tests/86-strncpy.c b/scaffold/tests/86-strncpy.c new file mode 100644 index 00000000..7a09f147 --- /dev/null +++ b/scaffold/tests/86-strncpy.c @@ -0,0 +1,42 @@ +/* -*-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 "30-test.i" +#include +#include + +int +test () +{ + puts ("\n"); + char buf[10] = {0,0,0,0,0,0,0,0,0,0}; + strncpy (buf, "mesxxx", 3); + puts ("buf:"); + puts (buf); + puts ("\n"); + if (strncmp (buf, "mes", 3)) + return 1; + + strncpy (buf, "m", 4); + if (buf[3]) + return 2; + + return 0; +}