12e5b6d6dSopenharmony_ci// © 2017 and later: Unicode, Inc. and others. 22e5b6d6dSopenharmony_ci// License & terms of use: http://www.unicode.org/copyright.html 32e5b6d6dSopenharmony_ci/* 42e5b6d6dSopenharmony_ci******************************************************************************* 52e5b6d6dSopenharmony_ci* 62e5b6d6dSopenharmony_ci* Copyright (C) 2009-2012, International Business Machines 72e5b6d6dSopenharmony_ci* Corporation and others. All Rights Reserved. 82e5b6d6dSopenharmony_ci* 92e5b6d6dSopenharmony_ci******************************************************************************* 102e5b6d6dSopenharmony_ci*/ 112e5b6d6dSopenharmony_ci 122e5b6d6dSopenharmony_ci#include <unicode/coll.h> 132e5b6d6dSopenharmony_ci#include <unicode/uclean.h> 142e5b6d6dSopenharmony_ci#include <stdio.h> 152e5b6d6dSopenharmony_ci#include <string.h> 162e5b6d6dSopenharmony_ci#include <stdlib.h> 172e5b6d6dSopenharmony_ci 182e5b6d6dSopenharmony_ci 192e5b6d6dSopenharmony_ci/* String to use. */ 202e5b6d6dSopenharmony_ciconst UChar stuff[] = { 0x30BB, 0x0d4c, 0x53, 0x74, 0x75, 0x66, 0x66, 0x00 }; /* Stuff */ 212e5b6d6dSopenharmony_ci 222e5b6d6dSopenharmony_ci#include "provider_version.h" 232e5b6d6dSopenharmony_ci 242e5b6d6dSopenharmony_ci 252e5b6d6dSopenharmony_ci#define LOCALE_COUNT 4 262e5b6d6dSopenharmony_ciconst char *locale[LOCALE_COUNT] = { "fi", "en_US", "ja", "ml" }; /* List of locales to test */ 272e5b6d6dSopenharmony_ci 282e5b6d6dSopenharmony_ci/** 292e5b6d6dSopenharmony_ci * Set up ICU, print # of available collators 302e5b6d6dSopenharmony_ci */ 312e5b6d6dSopenharmony_civoid setup(UErrorCode &status) { 322e5b6d6dSopenharmony_ci u_init(&status); 332e5b6d6dSopenharmony_ci 342e5b6d6dSopenharmony_ci fprintf(stderr, "ICU %s init: %s\n", U_ICU_VERSION, u_errorName(status)); 352e5b6d6dSopenharmony_ci 362e5b6d6dSopenharmony_ci int32_t count; 372e5b6d6dSopenharmony_ci StringEnumeration *se = Collator::getAvailableLocales(); 382e5b6d6dSopenharmony_ci count = se->count(status); 392e5b6d6dSopenharmony_ci fprintf(stderr, "# Collators now available: %d,\t%s - %d providers expected.\n", count, u_errorName(status), (int32_t)PROVIDER_COUNT); 402e5b6d6dSopenharmony_ci} 412e5b6d6dSopenharmony_ci 422e5b6d6dSopenharmony_ciint main(int /* argc*/ , const char * /*argv*/ []) { 432e5b6d6dSopenharmony_ci UErrorCode status = U_ZERO_ERROR; 442e5b6d6dSopenharmony_ci int diffs = 0; 452e5b6d6dSopenharmony_ci int gbaddiffs =0; 462e5b6d6dSopenharmony_ci setup(status); 472e5b6d6dSopenharmony_ci if(U_FAILURE(status)) return 1; 482e5b6d6dSopenharmony_ci 492e5b6d6dSopenharmony_ci int expected = PROVIDER_COUNT; 502e5b6d6dSopenharmony_ci 512e5b6d6dSopenharmony_ci for(int l=0;l<LOCALE_COUNT;l++) { 522e5b6d6dSopenharmony_ci printf("\n"); 532e5b6d6dSopenharmony_ci uint8_t oldBytes[200]; 542e5b6d6dSopenharmony_ci int32_t oldLen = -1; 552e5b6d6dSopenharmony_ci for(int v=0;v<=expected;v++) { 562e5b6d6dSopenharmony_ci 572e5b6d6dSopenharmony_ci // Construct the locale ID 582e5b6d6dSopenharmony_ci char locID[200]; 592e5b6d6dSopenharmony_ci strcpy(locID, locale[l]); 602e5b6d6dSopenharmony_ci if((v!=expected)) { // -1 = no version 612e5b6d6dSopenharmony_ci strcat(locID, "@sp=icu"); 622e5b6d6dSopenharmony_ci strcat(locID, provider_version[v]); 632e5b6d6dSopenharmony_ci } 642e5b6d6dSopenharmony_ci 652e5b6d6dSopenharmony_ci printf("%-28s = ", locID); 662e5b6d6dSopenharmony_ci 672e5b6d6dSopenharmony_ci UErrorCode subStatus = U_ZERO_ERROR; 682e5b6d6dSopenharmony_ci uint8_t bytes[200]; 692e5b6d6dSopenharmony_ci uint8_t bytesb[200]; 702e5b6d6dSopenharmony_ci#define USE_CXX 0 712e5b6d6dSopenharmony_ci 722e5b6d6dSopenharmony_ci#if USE_CXX 732e5b6d6dSopenharmony_ci Collator *col = Collator::createInstance(Locale(locID),subStatus); 742e5b6d6dSopenharmony_ci if(U_FAILURE(subStatus)) { 752e5b6d6dSopenharmony_ci printf("ERR: %s\n", u_errorName(subStatus)); 762e5b6d6dSopenharmony_ci continue; 772e5b6d6dSopenharmony_ci } 782e5b6d6dSopenharmony_ci int32_t len = col->getSortKey(stuff, -1, bytes, 200); 792e5b6d6dSopenharmony_ci#else 802e5b6d6dSopenharmony_ci#if 1 812e5b6d6dSopenharmony_ci char xbuf2[200]; 822e5b6d6dSopenharmony_ci strcpy(xbuf2,"X/"); 832e5b6d6dSopenharmony_ci strcat(xbuf2,locID); 842e5b6d6dSopenharmony_ci strcat(xbuf2,"/"); 852e5b6d6dSopenharmony_ci //printf(" -> %s\n", xbuf2); 862e5b6d6dSopenharmony_ci UCollator *col = ucol_openFromShortString(xbuf2, false,NULL, &subStatus); 872e5b6d6dSopenharmony_ci#else 882e5b6d6dSopenharmony_ci UCollator *col = ucol_open(locID, &subStatus); 892e5b6d6dSopenharmony_ci#endif 902e5b6d6dSopenharmony_ci if(U_FAILURE(subStatus)) { 912e5b6d6dSopenharmony_ci printf("ERR: %s\n", u_errorName(subStatus)); 922e5b6d6dSopenharmony_ci continue; 932e5b6d6dSopenharmony_ci } 942e5b6d6dSopenharmony_ci 952e5b6d6dSopenharmony_ci 962e5b6d6dSopenharmony_ci char xbuf3[200]; 972e5b6d6dSopenharmony_ci { 982e5b6d6dSopenharmony_ci int32_t def = ucol_getShortDefinitionString(col,locID/*NULL*/,xbuf3,200,&subStatus); 992e5b6d6dSopenharmony_ci if(U_FAILURE(subStatus)) { 1002e5b6d6dSopenharmony_ci printf("Err getting short string name: %s\n", u_errorName(subStatus)); 1012e5b6d6dSopenharmony_ci } else { 1022e5b6d6dSopenharmony_ci printf(" --> %s\n", xbuf3); 1032e5b6d6dSopenharmony_ci } 1042e5b6d6dSopenharmony_ci } 1052e5b6d6dSopenharmony_ci 1062e5b6d6dSopenharmony_ci int32_t len = ucol_getSortKey(col, stuff, -1, bytes, 200); 1072e5b6d6dSopenharmony_ci#endif 1082e5b6d6dSopenharmony_ci 1092e5b6d6dSopenharmony_ci printf(" "); 1102e5b6d6dSopenharmony_ci 1112e5b6d6dSopenharmony_ci int tdiffs=0; 1122e5b6d6dSopenharmony_ci 1132e5b6d6dSopenharmony_ci for(int i=0;i<len;i++) { 1142e5b6d6dSopenharmony_ci if(i<oldLen&&bytes[i]!=oldBytes[i]) { 1152e5b6d6dSopenharmony_ci diffs++; 1162e5b6d6dSopenharmony_ci printf("*"); 1172e5b6d6dSopenharmony_ci } else { 1182e5b6d6dSopenharmony_ci printf(" "); 1192e5b6d6dSopenharmony_ci } 1202e5b6d6dSopenharmony_ci printf("%02X", (0xFF&bytes[i])); 1212e5b6d6dSopenharmony_ci } 1222e5b6d6dSopenharmony_ci printf("\n"); 1232e5b6d6dSopenharmony_ci 1242e5b6d6dSopenharmony_ci char xbuf4[200]; 1252e5b6d6dSopenharmony_ci UCollator *col2 = ucol_openFromShortString(xbuf3, false, NULL, &subStatus); 1262e5b6d6dSopenharmony_ci if(U_FAILURE(subStatus)) { 1272e5b6d6dSopenharmony_ci printf("Err opening from new short string : %s\n", u_errorName(subStatus)); 1282e5b6d6dSopenharmony_ci continue; 1292e5b6d6dSopenharmony_ci } else { 1302e5b6d6dSopenharmony_ci int32_t def4 = ucol_getShortDefinitionString(col,locID/*NULL*/,xbuf4,200,&subStatus); 1312e5b6d6dSopenharmony_ci if(strcmp(xbuf4,xbuf3)) { 1322e5b6d6dSopenharmony_ci printf(" --> reopened = %s (%s)\n", xbuf4, u_errorName(subStatus)); 1332e5b6d6dSopenharmony_ci } 1342e5b6d6dSopenharmony_ci } 1352e5b6d6dSopenharmony_ci int32_t len2 = ucol_getSortKey(col2, stuff, -1, bytesb, 200); 1362e5b6d6dSopenharmony_ci 1372e5b6d6dSopenharmony_ci int baddiffs=0; 1382e5b6d6dSopenharmony_ci for(int i=0;i<len;i++) { 1392e5b6d6dSopenharmony_ci if(i<len&&bytes[i]!=bytesb[i]) { 1402e5b6d6dSopenharmony_ci baddiffs++; 1412e5b6d6dSopenharmony_ci printf("!"); 1422e5b6d6dSopenharmony_ci } else { 1432e5b6d6dSopenharmony_ci // printf(" "); 1442e5b6d6dSopenharmony_ci } 1452e5b6d6dSopenharmony_ci // printf("%02X", (0xFF&bytesb[i])); 1462e5b6d6dSopenharmony_ci } 1472e5b6d6dSopenharmony_ci if(baddiffs>0) { 1482e5b6d6dSopenharmony_ci printf(" - ERR! Diffs from %s in %d places\n", xbuf2,baddiffs); 1492e5b6d6dSopenharmony_ci gbaddiffs+=baddiffs; 1502e5b6d6dSopenharmony_ci } else { 1512e5b6d6dSopenharmony_ci //printf(" OK.\n"); 1522e5b6d6dSopenharmony_ci } 1532e5b6d6dSopenharmony_ci // printf("\n"); 1542e5b6d6dSopenharmony_ci 1552e5b6d6dSopenharmony_ci 1562e5b6d6dSopenharmony_ci 1572e5b6d6dSopenharmony_ci#if USE_CXX 1582e5b6d6dSopenharmony_ci delete col; 1592e5b6d6dSopenharmony_ci#else 1602e5b6d6dSopenharmony_ci ucol_close(col); 1612e5b6d6dSopenharmony_ci#endif 1622e5b6d6dSopenharmony_ci 1632e5b6d6dSopenharmony_ci oldLen = len; 1642e5b6d6dSopenharmony_ci memcpy(oldBytes, bytes, len); 1652e5b6d6dSopenharmony_ci } 1662e5b6d6dSopenharmony_ci } 1672e5b6d6dSopenharmony_ci 1682e5b6d6dSopenharmony_ci if(diffs==0) { 1692e5b6d6dSopenharmony_ci#if (U_ICU_VERSION_MAJOR_NUM < 49) 1702e5b6d6dSopenharmony_ci printf("ERROR: 0 differences found between platforms. ICU " U_ICU_VERSION " does not support collator plugins properly (not until 49)\n"); 1712e5b6d6dSopenharmony_ci#else 1722e5b6d6dSopenharmony_ci printf("ERROR: 0 differences found between platforms.. are the platforms installed? Try 'icuinfo -L'\n"); 1732e5b6d6dSopenharmony_ci#endif 1742e5b6d6dSopenharmony_ci return 1; 1752e5b6d6dSopenharmony_ci } else { 1762e5b6d6dSopenharmony_ci printf("%d differences found among provider versions!\n", diffs); 1772e5b6d6dSopenharmony_ci } 1782e5b6d6dSopenharmony_ci 1792e5b6d6dSopenharmony_ci if(gbaddiffs>0) { 1802e5b6d6dSopenharmony_ci printf("ERROR: %d diffs found between a collator and it's reopened (from shortstring) variant.\n", gbaddiffs); 1812e5b6d6dSopenharmony_ci return 2; 1822e5b6d6dSopenharmony_ci } else { 1832e5b6d6dSopenharmony_ci printf("Collator and reopened (shortstring) are OK.\n"); 1842e5b6d6dSopenharmony_ci } 1852e5b6d6dSopenharmony_ci 1862e5b6d6dSopenharmony_ci printf("Success!\n"); 1872e5b6d6dSopenharmony_ci 1882e5b6d6dSopenharmony_ci return 0; 1892e5b6d6dSopenharmony_ci} 190