summaryrefslogtreecommitdiff
path: root/source/fitz/text.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2016-03-11 16:10:51 +0000
committerRobin Watts <robin.watts@artifex.com>2016-03-11 16:48:03 +0000
commit3272c66cee887b997171854484fa8a8086884b12 (patch)
tree06c188493903c7d2684d0467c127b0c3efd64ed8 /source/fitz/text.c
parenta3785935df081674d048655048984bcba09f8387 (diff)
downloadmupdf-3272c66cee887b997171854484fa8a8086884b12.tar.xz
Implement fz_text_language support functions.
Add code to convert to and from fz_text_language codes from ISO 639 language strings. No validation is carried out.
Diffstat (limited to 'source/fitz/text.c')
-rw-r--r--source/fitz/text.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/source/fitz/text.c b/source/fitz/text.c
index 29a4506e..512c671c 100644
--- a/source/fitz/text.c
+++ b/source/fitz/text.c
@@ -219,3 +219,58 @@ fz_clone_text(fz_context *ctx, const fz_text *text)
return new_text;
}
+
+fz_text_language fz_text_language_from_string(const char *str)
+{
+ fz_text_language lang;
+
+ if (str == NULL)
+ return FZ_LANG_UNSET;
+
+ /* 1st char */
+ if (str[0] >= 'a' && str[0] <= 'z')
+ lang = str[0] - 'a' + 1;
+ else if (str[0] >= 'A' && str[0] <= 'Z')
+ lang = str[0] - 'A' + 1;
+ else
+ return 0;
+
+ /* 2nd char */
+ if (str[1] >= 'a' && str[1] <= 'z')
+ lang += 27*(str[1] - 'a' + 1);
+ else if (str[1] >= 'A' && str[1] <= 'Z')
+ lang += 27*(str[1] - 'A' + 1);
+ else
+ return 0; /* There are no valid 1 char language codes */
+
+ /* 3nd char */
+ if (str[2] >= 'a' && str[2] <= 'z')
+ lang += 27*27*(str[2] - 'a' + 1);
+ else if (str[2] >= 'A' && str[2] <= 'Z')
+ lang += 27*27*(str[2] - 'A' + 1);
+
+ /* We don't support iso 639-6 4 char codes, cos the standard
+ * has been withdrawn, and no one uses them. */
+ return lang;
+}
+
+char *fz_string_from_text_language(char str[4], fz_text_language lang)
+{
+ int c;
+
+ /* str is supposed to be at least 4 chars in size */
+ if (str == NULL)
+ return NULL;
+
+ c = lang % 27;
+ lang = lang / 27;
+ str[0] = c == 0 ? 0 : c - 1 + 'a';
+ c = lang % 27;
+ lang = lang / 27;
+ str[1] = c == 0 ? 0 : c - 1 + 'a';
+ c = lang % 27;
+ str[2] = c == 0 ? 0 : c - 1 + 'a';
+ str[3] = 0;
+
+ return str;
+}