ICU-2153 C implementation and test for uprv_getCharNameCharacters()

X-SVN-Rev: 9819
This commit is contained in:
Alan Liu 2002-08-29 23:11:50 +00:00
parent 541ae0e468
commit 6a1ee4f141

View File

@ -24,6 +24,7 @@
#include "uparse.h"
#include "unicode/uscript.h"
#include "usc_impl.h"
#include "uprops.h"
#include <string.h>
#include <math.h>
@ -1851,6 +1852,18 @@ enumExtCharNamesFn(void *context,
return enumCharNamesFn(&ecncp->length, code, nameChoice, name, length);
}
/**
* This can be made more efficient by moving it into putil.c and having
* it directly access the ebcdic translation tables.
* TODO: If we get this method in putil.c, then delete it from here.
*/
static UChar
u_charToUChar(char c) {
UChar uc;
u_charsToUChars(&c, &uc, 1);
return uc;
}
static void
TestCharNames() {
static char name[80];
@ -1928,6 +1941,96 @@ TestCharNames() {
log_err("u_charFromName(U_UNICODE_CHAR_NAME, \"LATin smALl letTER A\") did not find U+0061 (%s)\n", u_errorName(errorCode));
}
/* Test getCharNameCharacters */
{
enum { BUFSIZE = 256 };
UErrorCode ec = U_ZERO_ERROR;
char buf[BUFSIZE];
int32_t i;
UChar32 cp;
UChar pat[BUFSIZE], dumbPat[BUFSIZE];
int32_t l1, l2;
UBool map[256];
USet* set = uset_open(1, 0); /* empty set */
USet* dumb = uset_open(1, 0); /* empty set */
uprv_getCharNameCharacters(set);
/* build set the dumb (but sure-fire) way */
for (i=0; i<256; ++i) map[i] = FALSE;
for (cp=0; cp<0x110000; ++cp) {
int32_t choice;
for (choice=0; choice<3; ++choice) {
int32_t len = u_charName(cp, (UCharNameChoice) choice,
buf, BUFSIZE, &ec);
if (U_FAILURE(ec)) {
log_err("FAIL: u_charName failed when it shouldn't\n");
uset_close(set);
uset_close(dumb);
return;
}
for (i=0; i<len; ++i) {
if (!map[(uint8_t) buf[i]]) {
uset_add(dumb, (UChar32)u_charToUChar(buf[i]));
map[(uint8_t) buf[i]] = TRUE;
}
}
}
}
/* add all lowers, uppers, and #s to the dumb set */
for (i=u_charToUChar('A'); i<=u_charToUChar('Z'); ++i) {
uset_add(dumb, (UChar32)i);
}
for (i=u_charToUChar('a'); i<=u_charToUChar('z'); ++i) {
uset_add(dumb, (UChar32)i);
}
for (i=u_charToUChar('0'); i<=u_charToUChar('9'); ++i) {
uset_add(dumb, (UChar32)i);
}
/* compare the sets. Where is my uset_equals?!! */
l1 = uset_toPattern(set, pat, BUFSIZE, TRUE, &ec);
l2 = uset_toPattern(dumb, dumbPat, BUFSIZE, TRUE, &ec);
if (U_FAILURE(ec)) {
log_err("FAIL: uset_toPattern failed when it shouldn't\n");
uset_close(set);
uset_close(dumb);
return;
}
if (l1 >= BUFSIZE) {
l1 = BUFSIZE-1;
pat[l1] = 0;
}
if (l2 >= BUFSIZE) {
l2 = BUFSIZE-1;
dumbPat[l2] = 0;
}
if (l1 != l2 ||
0 != u_strcmp(pat, dumbPat)) {
char c1[256], c2[256];
u_UCharsToChars(pat, c1, l1);
u_UCharsToChars(dumbPat, c2, l2);
c1[l1] = c2[l2] = 0;
log_err("FAIL: uprv_getCharNameCharacters() returned %s, expected %s\n",
c1, c2);
} else {
char c1[256];
u_UCharsToChars(pat, c1, l1);
c1[l1] = 0;
log_verbose("Ok: uprv_getCharNameCharacters() returned %s\n",
c1);
}
uset_close(set);
uset_close(dumb);
}
/* ### TODO: test error cases and other interesting things */
}