From ab1c32a6981e6742cb6c463c01ff59680c2ac773 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Thu, 25 Oct 2001 10:20:40 +0000 Subject: [PATCH] * stdlib/a64l.c: Expect least significant digit first. * stdlib/l64a.c: Produce least significant digit first. * stdlib/Makefile (tests): Add test-a64l. * stdlib/test-a64l.c: New file. --- stdlib/Makefile | 2 +- stdlib/a64l.c | 5 ++-- stdlib/l64a.c | 7 +++-- stdlib/test-a64l.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 stdlib/test-a64l.c diff --git a/stdlib/Makefile b/stdlib/Makefile index 0d4cc06..5c91f26 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -59,7 +59,7 @@ test-srcs := tst-fmtmsg tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ test-canon test-canon2 tst-strtoll tst-environ \ tst-xpg-basename tst-random tst-bsearch tst-limits \ - tst-rand48 bug-strtod tst-setcontext + tst-rand48 bug-strtod tst-setcontext test-a64l # Several mpn functions from GNU MP are used by the strtod function. diff --git a/stdlib/a64l.c b/stdlib/a64l.c index 036e552..23faf27 100644 --- a/stdlib/a64l.c +++ b/stdlib/a64l.c @@ -43,6 +43,7 @@ a64l (string) const char *ptr = string; unsigned long int result = 0ul; const char *end = ptr + 6; + int shift = 0; do { @@ -55,9 +56,9 @@ a64l (string) value = (int) a64l_table[index]; if (value == (int) XX) break; - result <<= 6; ++ptr; - result |= value; + result |= value << shift; + shift += 6; } while (ptr != end); diff --git a/stdlib/l64a.c b/stdlib/l64a.c index 958f8a0..f3a249f 100644 --- a/stdlib/l64a.c +++ b/stdlib/l64a.c @@ -47,13 +47,12 @@ l64a (n) /* The value for N == 0 is defined to be the empty string. */ return (char *) ""; - result[6] = '\0'; - - for (cnt = 5; m > 0ul; --cnt) + for (cnt = 0; m > 0ul; ++cnt) { result[cnt] = conv_table[m & 0x3f]; m >>= 6; } + result[cnt] = '\0'; - return &result[cnt + 1]; + return result; } diff --git a/stdlib/test-a64l.c b/stdlib/test-a64l.c new file mode 100644 index 0000000..31ef5ea --- /dev/null +++ b/stdlib/test-a64l.c @@ -0,0 +1,75 @@ +/* Test program for the l64a and a64l functions. + Copyright (C) 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Schwab . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include + +/* Prototype for our test function. */ +extern int do_test (int argc, char *argv[]); +#include + +struct a64l_test +{ + const char *base64; + long int value; +}; + +static const struct a64l_test tests[] = + { + { "./", 64 }, + { "", 0 }, + { "/", 1 }, + { "FT", 2001 }, + { NULL, 0 } + }; + +int +do_test (int argc, char ** argv) +{ + const struct a64l_test *at; + long int l; + const char *s; + int status = 0; + + for (at = tests; at->base64 != NULL; ++at) + { + printf ("a64l (\"%s\")", at->base64); + l = a64l (at->base64); + if (l == at->value) + puts ("\tOK"); + else + { + printf ("\tBAD\n returns %ld, expected %ld\n", l, at->value); + status = 1; + } + printf ("l64a (%ld)", at->value); + s = l64a (at->value); + if (strcmp (s, at->base64) == 0) + puts ("\tOK"); + else + { + printf ("\tBAD\n returns \"%s\", expected \"%s\"\n", s, at->base64); + status = 1; + } + } + + return status ? EXIT_FAILURE : EXIT_SUCCESS; +} -- 2.7.4