Index: source/common/ubidi_props.c |
diff --git a/source/common/ubidi_props.c b/source/common/ubidi_props.c |
index 00255edc48f8ba7b01b3f7de1a22335922da52a6..42d05f1e2600058eb7fa4ec4d77db6414162de2c 100644 |
--- a/source/common/ubidi_props.c |
+++ b/source/common/ubidi_props.c |
@@ -1,7 +1,7 @@ |
/* |
******************************************************************************* |
* |
-* Copyright (C) 2004-2013, International Business Machines |
+* Copyright (C) 2004-2014, International Business Machines |
* Corporation and others. All Rights Reserved. |
* |
******************************************************************************* |
@@ -32,6 +32,7 @@ struct UBiDiProps { |
const int32_t *indexes; |
const uint32_t *mirrors; |
const uint8_t *jgArray; |
+ const uint8_t *jgArray2; |
UTrie2 trie; |
uint8_t formatVersion[4]; |
@@ -84,18 +85,28 @@ ubidi_addPropertyStarts(const UBiDiProps *bdp, const USetAdder *sa, UErrorCode * |
start=bdp->indexes[UBIDI_IX_JG_START]; |
limit=bdp->indexes[UBIDI_IX_JG_LIMIT]; |
jgArray=bdp->jgArray; |
- prev=0; |
- while(start<limit) { |
- jg=*jgArray++; |
- if(jg!=prev) { |
- sa->add(sa->set, start); |
- prev=jg; |
+ for(;;) { |
+ prev=0; |
+ while(start<limit) { |
+ jg=*jgArray++; |
+ if(jg!=prev) { |
+ sa->add(sa->set, start); |
+ prev=jg; |
+ } |
+ ++start; |
+ } |
+ if(prev!=0) { |
+ /* add the limit code point if the last value was not 0 (it is now start==limit) */ |
+ sa->add(sa->set, limit); |
+ } |
+ if(limit==bdp->indexes[UBIDI_IX_JG_LIMIT]) { |
+ /* switch to the second Joining_Group range */ |
+ start=bdp->indexes[UBIDI_IX_JG_START2]; |
+ limit=bdp->indexes[UBIDI_IX_JG_LIMIT2]; |
+ jgArray=bdp->jgArray2; |
+ } else { |
+ break; |
} |
- ++start; |
- } |
- if(prev!=0) { |
- /* add the limit code point if the last value was not 0 (it is now start==limit) */ |
- sa->add(sa->set, limit); |
} |
/* add code points with hardcoded properties, plus the ones following them */ |
@@ -204,9 +215,13 @@ ubidi_getJoiningGroup(const UBiDiProps *bdp, UChar32 c) { |
limit=bdp->indexes[UBIDI_IX_JG_LIMIT]; |
if(start<=c && c<limit) { |
return (UJoiningGroup)bdp->jgArray[c-start]; |
- } else { |
- return U_JG_NO_JOINING_GROUP; |
} |
+ start=bdp->indexes[UBIDI_IX_JG_START2]; |
+ limit=bdp->indexes[UBIDI_IX_JG_LIMIT2]; |
+ if(start<=c && c<limit) { |
+ return (UJoiningGroup)bdp->jgArray2[c-start]; |
+ } |
+ return U_JG_NO_JOINING_GROUP; |
} |
U_CFUNC UBidiPairedBracketType |