summaryrefslogtreecommitdiffstats
path: root/unicode/unicode_bidi.c
diff options
context:
space:
mode:
authorSam Varshavchik2021-01-06 22:05:50 -0500
committerSam Varshavchik2021-01-06 22:05:53 -0500
commit23fffe52808157e36795af52266cc27ac03cbcb9 (patch)
treef0c62446b3f5d1dc3fbe623206719dee42ac36c5 /unicode/unicode_bidi.c
parentf6d00ac939f7c9c63eca8dbb2a237b3aa24bc85b (diff)
downloadcourier-libs-23fffe52808157e36795af52266cc27ac03cbcb9.tar.bz2
courier-unicode: implement bidi get_direction.
Diffstat (limited to 'unicode/unicode_bidi.c')
-rw-r--r--unicode/unicode_bidi.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/unicode/unicode_bidi.c b/unicode/unicode_bidi.c
index 73440ed..b23b833 100644
--- a/unicode/unicode_bidi.c
+++ b/unicode/unicode_bidi.c
@@ -560,13 +560,17 @@ static void directional_status_stack_push
stack->head=p;
}
-static unicode_bidi_level_t
+static struct unicode_bidi_direction
compute_paragraph_embedding_level(size_t i, size_t j,
enum_bidi_type_t (*get)(size_t i,
void *arg),
void *arg)
-
{
+ struct unicode_bidi_direction ret;
+
+ memset(&ret, 0, sizeof(ret));
+ ret.direction=UNICODE_BIDI_LR;
+
unicode_bidi_level_t in_isolation=0;
for (; i<j; ++i)
@@ -586,13 +590,18 @@ compute_paragraph_embedding_level(size_t i, size_t j,
if (t == UNICODE_BIDI_TYPE_AL ||
t == UNICODE_BIDI_TYPE_R)
{
- return UNICODE_BIDI_RL;
+ ret.direction=UNICODE_BIDI_RL;
+ ret.is_explicit=1;
+ break;
}
if (t == UNICODE_BIDI_TYPE_L)
+ {
+ ret.is_explicit=1;
break;
+ }
}
}
- return UNICODE_BIDI_LR;
+ return ret;
}
struct compute_paragraph_embedding_level_type_info {
@@ -619,7 +628,7 @@ compute_paragraph_embedding_level_from_types(const enum_bidi_type_t *p,
return compute_paragraph_embedding_level
(i, j,
get_enum_bidi_type_for_paragraph_embedding_level,
- &info);
+ &info).direction;
}
static directional_status_stack_t
@@ -2713,8 +2722,19 @@ char32_t unicode_bidi_embed_paragraph_level(const char32_t *str,
if ((compute_paragraph_embedding_level
(0, n,
get_enum_bidi_type_for_embedding_paragraph_level,
- &info) ^ paragraph_level) == 0)
+ &info).direction ^ paragraph_level) == 0)
return 0;
return (paragraph_level & 1) ? UNICODE_RLM:UNICODE_LRM;
}
+
+struct unicode_bidi_direction unicode_bidi_get_direction(const char32_t *str,
+ size_t n)
+{
+ struct compute_paragraph_embedding_level_char_info info;
+
+ info.str=str;
+ return compute_paragraph_embedding_level
+ (0, n,
+ get_enum_bidi_type_for_embedding_paragraph_level, &info);
+}