OLD | NEW |
1 /* | 1 /* |
2 ****************************************************************************** | 2 ****************************************************************************** |
3 * Copyright (C) 2001-2014, International Business Machines | 3 * Copyright (C) 2001-2015, International Business Machines |
4 * Corporation and others. All Rights Reserved. | 4 * Corporation and others. All Rights Reserved. |
5 ****************************************************************************** | 5 ****************************************************************************** |
6 * | 6 * |
7 * File ucoleitr.cpp | 7 * File ucoleitr.cpp |
8 * | 8 * |
9 * Modification History: | 9 * Modification History: |
10 * | 10 * |
11 * Date Name Description | 11 * Date Name Description |
12 * 02/15/2001 synwee Modified all methods to process its own function | 12 * 02/15/2001 synwee Modified all methods to process its own function |
13 * instead of calling the equivalent c++ api (coleitr.h) | 13 * instead of calling the equivalent c++ api (coleitr.h) |
(...skipping 13 matching lines...) Expand all Loading... |
27 #include "cmemory.h" | 27 #include "cmemory.h" |
28 #include "usrchimp.h" | 28 #include "usrchimp.h" |
29 | 29 |
30 U_NAMESPACE_USE | 30 U_NAMESPACE_USE |
31 | 31 |
32 #define BUFFER_LENGTH 100 | 32 #define BUFFER_LENGTH 100 |
33 | 33 |
34 #define DEFAULT_BUFFER_SIZE 16 | 34 #define DEFAULT_BUFFER_SIZE 16 |
35 #define BUFFER_GROW 8 | 35 #define BUFFER_GROW 8 |
36 | 36 |
37 #define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) | |
38 | |
39 #define ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src),
(count) * sizeof (src)[0]) | 37 #define ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src),
(count) * sizeof (src)[0]) |
40 | 38 |
41 #define NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type)) | 39 #define NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type)) |
42 | 40 |
43 #define GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), (newSize) * si
zeof (array)[0]) | |
44 | |
45 #define DELETE_ARRAY(array) uprv_free((void *) (array)) | 41 #define DELETE_ARRAY(array) uprv_free((void *) (array)) |
46 | 42 |
47 struct RCEI | 43 struct RCEI |
48 { | 44 { |
49 uint32_t ce; | 45 uint32_t ce; |
50 int32_t low; | 46 int32_t low; |
51 int32_t high; | 47 int32_t high; |
52 }; | 48 }; |
53 | 49 |
54 U_NAMESPACE_BEGIN | 50 U_NAMESPACE_BEGIN |
55 | 51 |
56 struct RCEBuffer | 52 struct RCEBuffer |
57 { | 53 { |
58 RCEI defaultBuffer[DEFAULT_BUFFER_SIZE]; | 54 RCEI defaultBuffer[DEFAULT_BUFFER_SIZE]; |
59 RCEI *buffer; | 55 RCEI *buffer; |
60 int32_t bufferIndex; | 56 int32_t bufferIndex; |
61 int32_t bufferSize; | 57 int32_t bufferSize; |
62 | 58 |
63 RCEBuffer(); | 59 RCEBuffer(); |
64 ~RCEBuffer(); | 60 ~RCEBuffer(); |
65 | 61 |
66 UBool empty() const; | 62 UBool isEmpty() const; |
67 void put(uint32_t ce, int32_t ixLow, int32_t ixHigh); | 63 void put(uint32_t ce, int32_t ixLow, int32_t ixHigh, UErrorCode &errorCode)
; |
68 const RCEI *get(); | 64 const RCEI *get(); |
69 }; | 65 }; |
70 | 66 |
71 RCEBuffer::RCEBuffer() | 67 RCEBuffer::RCEBuffer() |
72 { | 68 { |
73 buffer = defaultBuffer; | 69 buffer = defaultBuffer; |
74 bufferIndex = 0; | 70 bufferIndex = 0; |
75 bufferSize = UPRV_LENGTHOF(defaultBuffer); | 71 bufferSize = UPRV_LENGTHOF(defaultBuffer); |
76 } | 72 } |
77 | 73 |
78 RCEBuffer::~RCEBuffer() | 74 RCEBuffer::~RCEBuffer() |
79 { | 75 { |
80 if (buffer != defaultBuffer) { | 76 if (buffer != defaultBuffer) { |
81 DELETE_ARRAY(buffer); | 77 DELETE_ARRAY(buffer); |
82 } | 78 } |
83 } | 79 } |
84 | 80 |
85 UBool RCEBuffer::empty() const | 81 UBool RCEBuffer::isEmpty() const |
86 { | 82 { |
87 return bufferIndex <= 0; | 83 return bufferIndex <= 0; |
88 } | 84 } |
89 | 85 |
90 void RCEBuffer::put(uint32_t ce, int32_t ixLow, int32_t ixHigh) | 86 void RCEBuffer::put(uint32_t ce, int32_t ixLow, int32_t ixHigh, UErrorCode &erro
rCode) |
91 { | 87 { |
| 88 if (U_FAILURE(errorCode)) { |
| 89 return; |
| 90 } |
92 if (bufferIndex >= bufferSize) { | 91 if (bufferIndex >= bufferSize) { |
93 RCEI *newBuffer = NEW_ARRAY(RCEI, bufferSize + BUFFER_GROW); | 92 RCEI *newBuffer = NEW_ARRAY(RCEI, bufferSize + BUFFER_GROW); |
| 93 if (newBuffer == NULL) { |
| 94 errorCode = U_MEMORY_ALLOCATION_ERROR; |
| 95 return; |
| 96 } |
94 | 97 |
95 ARRAY_COPY(newBuffer, buffer, bufferSize); | 98 ARRAY_COPY(newBuffer, buffer, bufferSize); |
96 | 99 |
97 if (buffer != defaultBuffer) { | 100 if (buffer != defaultBuffer) { |
98 DELETE_ARRAY(buffer); | 101 DELETE_ARRAY(buffer); |
99 } | 102 } |
100 | 103 |
101 buffer = newBuffer; | 104 buffer = newBuffer; |
102 bufferSize += BUFFER_GROW; | 105 bufferSize += BUFFER_GROW; |
103 } | 106 } |
(...skipping 26 matching lines...) Expand all Loading... |
130 if (buffer != defaultBuffer) { | 133 if (buffer != defaultBuffer) { |
131 DELETE_ARRAY(buffer); | 134 DELETE_ARRAY(buffer); |
132 } | 135 } |
133 } | 136 } |
134 | 137 |
135 void PCEBuffer::reset() | 138 void PCEBuffer::reset() |
136 { | 139 { |
137 bufferIndex = 0; | 140 bufferIndex = 0; |
138 } | 141 } |
139 | 142 |
140 UBool PCEBuffer::empty() const | 143 UBool PCEBuffer::isEmpty() const |
141 { | 144 { |
142 return bufferIndex <= 0; | 145 return bufferIndex <= 0; |
143 } | 146 } |
144 | 147 |
145 void PCEBuffer::put(uint64_t ce, int32_t ixLow, int32_t ixHigh) | 148 void PCEBuffer::put(uint64_t ce, int32_t ixLow, int32_t ixHigh, UErrorCode &erro
rCode) |
146 { | 149 { |
| 150 if (U_FAILURE(errorCode)) { |
| 151 return; |
| 152 } |
147 if (bufferIndex >= bufferSize) { | 153 if (bufferIndex >= bufferSize) { |
148 PCEI *newBuffer = NEW_ARRAY(PCEI, bufferSize + BUFFER_GROW); | 154 PCEI *newBuffer = NEW_ARRAY(PCEI, bufferSize + BUFFER_GROW); |
| 155 if (newBuffer == NULL) { |
| 156 errorCode = U_MEMORY_ALLOCATION_ERROR; |
| 157 return; |
| 158 } |
149 | 159 |
150 ARRAY_COPY(newBuffer, buffer, bufferSize); | 160 ARRAY_COPY(newBuffer, buffer, bufferSize); |
151 | 161 |
152 if (buffer != defaultBuffer) { | 162 if (buffer != defaultBuffer) { |
153 DELETE_ARRAY(buffer); | 163 DELETE_ARRAY(buffer); |
154 } | 164 } |
155 | 165 |
156 buffer = newBuffer; | 166 buffer = newBuffer; |
157 bufferSize += BUFFER_GROW; | 167 bufferSize += BUFFER_GROW; |
158 } | 168 } |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 { | 384 { |
375 int64_t result = UCOL_IGNORABLE; | 385 int64_t result = UCOL_IGNORABLE; |
376 int32_t low = 0, high = 0; | 386 int32_t low = 0, high = 0; |
377 | 387 |
378 if (U_FAILURE(*status)) { | 388 if (U_FAILURE(*status)) { |
379 return UCOL_PROCESSED_NULLORDER; | 389 return UCOL_PROCESSED_NULLORDER; |
380 } | 390 } |
381 | 391 |
382 // pceBuffer.reset(); | 392 // pceBuffer.reset(); |
383 | 393 |
384 while (pceBuffer.empty()) { | 394 while (pceBuffer.isEmpty()) { |
385 // buffer raw CEs up to non-ignorable primary | 395 // buffer raw CEs up to non-ignorable primary |
386 RCEBuffer rceb; | 396 RCEBuffer rceb; |
387 int32_t ce; | 397 int32_t ce; |
388 | 398 |
389 // **** do we need to reset rceb, or will it always be empty at this poi
nt **** | 399 // **** do we need to reset rceb, or will it always be empty at this poi
nt **** |
390 do { | 400 do { |
391 high = cei->getOffset(); | 401 high = cei->getOffset(); |
392 ce = cei->previous(*status); | 402 ce = cei->previous(*status); |
393 low = cei->getOffset(); | 403 low = cei->getOffset(); |
394 | 404 |
395 if (ce == UCOL_NULLORDER) { | 405 if (ce == UCOL_NULLORDER) { |
396 if (! rceb.empty()) { | 406 if (!rceb.isEmpty()) { |
397 break; | 407 break; |
398 } | 408 } |
399 | 409 |
400 goto finish; | 410 goto finish; |
401 } | 411 } |
402 | 412 |
403 rceb.put((uint32_t)ce, low, high); | 413 rceb.put((uint32_t)ce, low, high, *status); |
404 } while ((ce & UCOL_PRIMARYORDERMASK) == 0 || isContinuation(ce)); | 414 } while (U_SUCCESS(*status) && ((ce & UCOL_PRIMARYORDERMASK) == 0 || isC
ontinuation(ce))); |
405 | 415 |
406 // process the raw CEs | 416 // process the raw CEs |
407 while (! rceb.empty()) { | 417 while (U_SUCCESS(*status) && !rceb.isEmpty()) { |
408 const RCEI *rcei = rceb.get(); | 418 const RCEI *rcei = rceb.get(); |
409 | 419 |
410 result = processCE(rcei->ce); | 420 result = processCE(rcei->ce); |
411 | 421 |
412 if (result != UCOL_IGNORABLE) { | 422 if (result != UCOL_IGNORABLE) { |
413 pceBuffer.put(result, rcei->low, rcei->high); | 423 pceBuffer.put(result, rcei->low, rcei->high, *status); |
414 } | 424 } |
415 } | 425 } |
| 426 if (U_FAILURE(*status)) { |
| 427 return UCOL_PROCESSED_NULLORDER; |
| 428 } |
416 } | 429 } |
417 | 430 |
418 finish: | 431 finish: |
419 if (pceBuffer.empty()) { | 432 if (pceBuffer.isEmpty()) { |
420 // **** Is -1 the right value for ixLow, ixHigh? **** | 433 // **** Is -1 the right value for ixLow, ixHigh? **** |
421 if (ixLow != NULL) { | 434 if (ixLow != NULL) { |
422 *ixLow = -1; | 435 *ixLow = -1; |
423 } | 436 } |
424 | 437 |
425 if (ixHigh != NULL) { | 438 if (ixHigh != NULL) { |
426 *ixHigh = -1 | 439 *ixHigh = -1 |
427 ; | 440 ; |
428 } | 441 } |
429 return UCOL_PROCESSED_NULLORDER; | 442 return UCOL_PROCESSED_NULLORDER; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 return (order >> 8) & 0xff; | 520 return (order >> 8) & 0xff; |
508 } | 521 } |
509 | 522 |
510 U_CAPI int32_t U_EXPORT2 | 523 U_CAPI int32_t U_EXPORT2 |
511 ucol_tertiaryOrder (int32_t order) | 524 ucol_tertiaryOrder (int32_t order) |
512 { | 525 { |
513 return order & 0xff; | 526 return order & 0xff; |
514 } | 527 } |
515 | 528 |
516 #endif /* #if !UCONFIG_NO_COLLATION */ | 529 #endif /* #if !UCONFIG_NO_COLLATION */ |
OLD | NEW |