1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Copyright (C) 2001 - 2005, International Business Machines
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   file name:  newcol.cpp
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   encoding:   US-ASCII
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   tab size:   8 (not used)
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   indentation:4
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created on: 2001jul24
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created by: Vladimir Weinstein
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************************
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This is the module that uses new collation
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************/
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h>
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucol.h"
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Very simple example code - sticks a sortkey in the buffer
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Not much error checking
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t getSortKey_current(const char *locale, const UChar *string, int32_t sLen, uint8_t *buffer, int32_t bLen) {
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UCollator *coll = ucol_open(locale, &status);
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(U_FAILURE(status)) {
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return -1;
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  int32_t result = ucol_getSortKey(coll, string, sLen, buffer, bLen);
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  ucol_close(coll);
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  return result;
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// This one can be used for passing to qsort function
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Not thread safe or anything
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UCollator *compareCollator = NULL;
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint compare_current(const void *string1, const void *string2) {
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(compareCollator != NULL) {
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollationResult res = ucol_strcoll(compareCollator, (UChar *) string1, -1, (UChar *) string2, -1);
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(res == UCOL_LESS) {
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return -1;
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else if(res == UCOL_GREATER) {
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return 1;
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return 0;
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  } else {
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid initCollator_current(const char *locale) {
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  compareCollator = ucol_open(locale, &status);
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid closeCollator_current(void) {
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  ucol_close(compareCollator);
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  compareCollator = NULL;
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern "C" void test_current(UChar data[][5], uint32_t size, uint32_t maxlen, uint8_t keys[][32]) {
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  uint32_t i = 0;
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  int32_t keySize = 0;
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  UVersionInfo uvi;
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  u_getVersion(uvi);
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  fprintf(stderr, "Entered current, version: [%d.%d.%d.%d]\nMoving to sortkeys\n", uvi[0], uvi[1], uvi[2], uvi[3]);
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  for(i = 0; i<size; i++) {
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    keySize = getSortKey_current("ja", data[i], -1, keys[i], 32);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stderr, "For i=%d, size of sortkey is %d\n", i, keySize);
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  fprintf(stderr, "Done sortkeys, doing qsort test\n");
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  initCollator_current("ja");
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  qsort(data, size, maxlen*sizeof(UChar), compare_current);
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  closeCollator_current();
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  fprintf(stderr, "Done current!\n");
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
91