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