diff options
-rw-r--r-- | stdlib/Makefile | 2 | ||||
-rw-r--r-- | stdlib/a64l.c | 5 | ||||
-rw-r--r-- | stdlib/l64a.c | 7 | ||||
-rw-r--r-- | stdlib/test-a64l.c | 75 |
4 files changed, 82 insertions, 7 deletions
diff --git a/stdlib/Makefile b/stdlib/Makefile index 0d4cc060cc..5c91f26d36 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 036e552f7f..23faf2744f 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 958f8a09ee..f3a249fedf 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 0000000000..31ef5ea2c7 --- /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 <schwab@suse.de>. + + 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 <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* Prototype for our test function. */ +extern int do_test (int argc, char *argv[]); +#include <test-skeleton.c> + +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; +} |