diff options
Diffstat (limited to 'tests/uniname/test-uninames.c')
-rw-r--r-- | tests/uniname/test-uninames.c | 222 |
1 files changed, 43 insertions, 179 deletions
diff --git a/tests/uniname/test-uninames.c b/tests/uniname/test-uninames.c index 400b970c..21163513 100644 --- a/tests/uniname/test-uninames.c +++ b/tests/uniname/test-uninames.c @@ -1,5 +1,5 @@ /* Test the Unicode character name functions. - Copyright (C) 2000-2003, 2005, 2007, 2009-2015 Free Software Foundation, + Copyright (C) 2000-2003, 2005, 2007, 2009-2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -27,32 +27,52 @@ /* The names according to the UnicodeData.txt file, modified to contain the Hangul syllable names, as described in the Unicode 3.0 book. */ -static const char * unicode_names [0x110000]; +const char * unicode_names [0x110000]; -/* Maximum entries in unicode_aliases. */ -#define ALIASLEN 0x200 +/* Maximum length of a field in the UnicodeData.txt file. */ +#define FIELDLEN 120 -/* The aliases according to the NameAliases.txt file. */ -struct unicode_alias +/* Reads the next field from STREAM. The buffer BUFFER has size FIELDLEN. + Reads up to (but excluding) DELIM. + Returns 1 when a field was successfully read, otherwise 0. */ +static int +getfield (FILE *stream, char *buffer, int delim) { - const char *name; - unsigned int uc; -}; + int count = 0; + int c; + + for (; (c = getc (stream)), (c != EOF && c != delim); ) + { + /* Put c into the buffer. */ + if (++count >= FIELDLEN - 1) + { + fprintf (stderr, "field too long\n"); + exit (EXIT_FAILURE); + } + *buffer++ = c; + } + + if (c == EOF) + return 0; -static struct unicode_alias unicode_aliases [ALIASLEN]; -static int aliases_count; + *buffer = '\0'; + return 1; +} /* Stores in unicode_names[] the relevant contents of the UnicodeData.txt file. */ static void fill_names (const char *unicodedata_filename) { + unsigned int i; FILE *stream; - char *field0; - char *field1; - char line[1024]; + char field0[FIELDLEN]; + char field1[FIELDLEN]; int lineno = 0; + for (i = 0; i < 0x110000; i++) + unicode_names[i] = NULL; + stream = fopen (unicodedata_filename, "r"); if (stream == NULL) { @@ -60,43 +80,24 @@ fill_names (const char *unicodedata_filename) exit (EXIT_FAILURE); } - while (fgets (line, sizeof line, stream)) + for (;;) { int n; int c; - char *p; - char *comment; - unsigned int i; lineno++; - - comment = strchr (line, '#'); - if (comment != NULL) - *comment = '\0'; - if (line[strspn (line, " \t\r\n")] == '\0') - continue; - - field0 = p = line; - p = strchr (p, ';'); - if (!p) + n = getfield (stream, field0, ';'); + n += getfield (stream, field1, ';'); + if (n == 0) + break; + if (n != 2) { fprintf (stderr, "short line in '%s':%d\n", unicodedata_filename, lineno); exit (EXIT_FAILURE); } - *p++ = '\0'; - - field1 = p; - if (*field1 == '<') - continue; - p = strchr (p, ';'); - if (!p) - { - fprintf (stderr, "short line in '%s':%d\n", - unicodedata_filename, lineno); - exit (EXIT_FAILURE); - } - *p = '\0'; + for (; (c = getc (stream)), (c != EOF && c != '\n'); ) + ; i = strtoul (field0, NULL, 16); if (i >= 0x110000) { @@ -112,94 +113,6 @@ fill_names (const char *unicodedata_filename) } } -/* Stores in unicode_aliases[] the relevant contents of the NameAliases.txt - file. */ -static void -fill_aliases (const char *namealiases_filename) -{ - int i; - FILE *stream; - char *field0; - char *field1; - char line[1024]; - int lineno = 0; - - stream = fopen (namealiases_filename, "r"); - if (stream == NULL) - { - fprintf (stderr, "error during fopen of '%s'\n", namealiases_filename); - exit (EXIT_FAILURE); - } - - while (fgets (line, sizeof line, stream)) - { - int n; - int c; - char *p; - char *comment; - unsigned int uc; - - comment = strchr (line, '#'); - if (comment != NULL) - *comment = '\0'; - if (line[strspn (line, " \t\r\n")] == '\0') - continue; - - lineno++; - - field0 = p = line; - p = strchr (p, ';'); - if (!p) - { - fprintf (stderr, "short line in '%s':%d\n", - namealiases_filename, lineno); - exit (EXIT_FAILURE); - } - *p++ = '\0'; - - field1 = p; - p = strchr (p, ';'); - if (!p) - { - fprintf (stderr, "short line in '%s':%d\n", - namealiases_filename, lineno); - exit (EXIT_FAILURE); - } - *p = '\0'; - - uc = strtoul (field0, NULL, 16); - if (uc >= 0x110000) - { - fprintf (stderr, "index too large\n"); - exit (EXIT_FAILURE); - } - - if (aliases_count == ALIASLEN) - { - fprintf (stderr, "too many aliases\n"); - exit (EXIT_FAILURE); - } - unicode_aliases[aliases_count].name = xstrdup (field1); - unicode_aliases[aliases_count].uc = uc; - aliases_count++; - } - if (ferror (stream) || fclose (stream)) - { - fprintf (stderr, "error reading from '%s'\n", namealiases_filename); - exit (1); - } -} - -static int -name_has_alias (unsigned int uc) -{ - int i; - for (i = 0; i < ALIASLEN; i++) - if (unicode_aliases[i].uc == uc) - return 1; - return 0; -} - /* Perform an exhaustive test of the unicode_character_name function. */ static int test_name_lookup () @@ -315,7 +228,6 @@ test_inverse_lookup () result = unicode_name_character (buf); if (result != UNINAME_INVALID - && !name_has_alias (result) && !(unicode_names[result] != NULL && strcmp (unicode_names[result], buf) == 0)) { @@ -334,65 +246,17 @@ test_inverse_lookup () return error; } -/* Perform a test of the unicode_name_character function for aliases. */ -static int -test_alias_lookup () -{ - int error = 0; - unsigned int i; - char buf[UNINAME_MAX]; - - /* Verify all valid character names are recognized. */ - for (i = 0; i < ALIASLEN; i++) - if (unicode_aliases[i].uc != UNINAME_INVALID - /* Skip if the character has no canonical name (e.g. control - characters). */ - && unicode_character_name (unicode_aliases[i].uc, buf)) - { - unsigned int result = unicode_name_character (unicode_aliases[i].name); - if (result != unicode_aliases[i].uc) - { - if (result == UNINAME_INVALID) - fprintf (stderr, "inverse name lookup of \"%s\" failed\n", - unicode_aliases[i]); - else - fprintf (stderr, - "inverse name lookup of \"%s\" returned 0x%04X\n", - unicode_aliases[i], result); - error = 1; - } - } - - return error; -} - int main (int argc, char *argv[]) { int error = 0; - int i; set_program_name (argv[0]); - for (i = 1; i < argc && strcmp (argv[i], "--") != 0; i++) - fill_names (argv[i]); - - if (i < argc) - { - int j; - for (j = 0; j < ALIASLEN; j++) - unicode_aliases[j].uc = UNINAME_INVALID; - - i++; - for (; i < argc; i++) - fill_aliases (argv[i]); - } + fill_names (argv[1]); error |= test_name_lookup (); error |= test_inverse_lookup (); - if (aliases_count > 0) - error |= test_alias_lookup (); - return error; } |