diff options
author | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2016-10-24 20:22:12 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2016-10-24 20:22:12 +0200 |
commit | 7988979a722b4cdf287b2093956a76a3f19b9897 (patch) | |
tree | d35e251d0472ceca55a2eef61cff261c8ee68fab /test/locale/collate-test.c |
add uClibc-ng test directory
Diffstat (limited to 'test/locale/collate-test.c')
-rw-r--r-- | test/locale/collate-test.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/test/locale/collate-test.c b/test/locale/collate-test.c new file mode 100644 index 0000000..a84974c --- /dev/null +++ b/test/locale/collate-test.c @@ -0,0 +1,132 @@ +/* Test collation function using real data. + Copyright (C) 1997, 1999, 2000, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + 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, see + <http://www.gnu.org/licenses/>. */ + +#include <ctype.h> +#include <error.h> +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +struct lines +{ + char *key; + char *line; +}; + +static int xstrcoll (const void *, const void *); + +int +main (int argc, char *argv[]) +{ + int result = 0; + size_t nstrings, nstrings_max; + struct lines *strings; + char *line = NULL; + size_t len = 0; + size_t n; + + if (argc < 2) + error (1, 0, "usage: %s <random seed>", argv[0]); + + setlocale (LC_ALL, ""); + + nstrings_max = 100; + nstrings = 0; + strings = (struct lines *) malloc (nstrings_max * sizeof (struct lines)); + if (strings == NULL) + { + perror (argv[0]); + exit (1); + } + + while (1) + { + int l; + if (getline (&line, &len, stdin) < 0) + break; + + if (nstrings == nstrings_max) + { + strings = (struct lines *) realloc (strings, + (nstrings_max *= 2) + * sizeof (*strings)); + if (strings == NULL) + { + perror (argv[0]); + exit (1); + } + } + strings[nstrings].line = strdup (line); + l = strcspn (line, ":(;"); + while (l > 0 && isspace (line[l - 1])) + --l; + strings[nstrings].key = strndup (line, l); + ++nstrings; + } + free (line); + + /* First shuffle. */ + srandom (atoi (argv[1])); + for (n = 0; n < 10 * nstrings; ++n) + { + int r1, r2, r; + size_t idx1 = random () % nstrings; + size_t idx2 = random () % nstrings; + struct lines tmp = strings[idx1]; + strings[idx1] = strings[idx2]; + strings[idx2] = tmp; + + /* While we are at it a first little test. */ + r1 = strcoll (strings[idx1].key, strings[idx2].key); + r2 = strcoll (strings[idx2].key, strings[idx1].key); + r = r1 * r2; + + if (r > 0 || (r == 0 && r1 != 0) || (r == 0 && r2 != 0)) + printf ("`%s' and `%s' collate wrong: %d vs. %d\n", + strings[idx1].key, strings[idx2].key, r1, r2); + } + + /* Now sort. */ + qsort (strings, nstrings, sizeof (struct lines), xstrcoll); + + /* Print the result. */ + for (n = 0; n < nstrings; ++n) + { + fputs (strings[n].line, stdout); + free (strings[n].line); + free (strings[n].key); + } + free (strings); + + return result; +} + + +static int +xstrcoll (ptr1, ptr2) + const void *ptr1; + const void *ptr2; +{ + const struct lines *l1 = (const struct lines *) ptr1; + const struct lines *l2 = (const struct lines *) ptr2; + + return strcoll (l1->key, l2->key); +} |