| 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 | 
|  |