Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-10-20 13:47:05 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-10-20 13:47:05 +0400
commit8d6a554d7502029f04aca33efcdd004744b9bd84 (patch)
tree027f5dec3ea38784d3108f8d9b5c4a008bae7fb4 /source/blender/blenlib
parente02dfe4a79b3632b3143d5d45e0dee1463ff7aa6 (diff)
- add BLI_string_utf8.h for unicode functions.
- move font.c unicode functions into string_utf8.c and rename to fit with other BLI_string funcs.
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/BLI_blenlib.h2
-rw-r--r--source/blender/blenlib/BLI_string.h14
-rw-r--r--source/blender/blenlib/BLI_string_utf8.h55
-rw-r--r--source/blender/blenlib/CMakeLists.txt1
-rw-r--r--source/blender/blenlib/intern/BLI_args.c1
-rw-r--r--source/blender/blenlib/intern/string_utf8.c155
6 files changed, 214 insertions, 14 deletions
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h
index ba5d04f3021..cda7a51c47f 100644
--- a/source/blender/blenlib/BLI_blenlib.h
+++ b/source/blender/blenlib/BLI_blenlib.h
@@ -74,6 +74,8 @@ extern "C" {
#include "BLI_string.h"
+#include "BLI_string_utf8.h"
+
#include "BLI_path_util.h"
#include "BLI_storage.h"
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index 3ac8dba106a..958f240e3a8 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -25,9 +25,7 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- *
- * $Id$
-*/
+ */
#ifndef BLI_STRING_H
#define BLI_STRING_H
@@ -142,16 +140,6 @@ void BLI_timestr(double _time, char *str); /* time var is global */
void BLI_ascii_strtolower(char *str, int len);
void BLI_ascii_strtoupper(char *str, int len);
-
-/* string_utf8.c - may move these into their own header some day - campbell */
-char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy);
-int BLI_utf8_invalid_byte(const char *str, int length);
-int BLI_utf8_invalid_strip(char *str, int length);
- /* copied from glib */
-char *BLI_str_find_prev_char_utf8(const char *str, const char *p);
-char *BLI_str_find_next_char_utf8(const char *p, const char *end);
-char *BLI_str_prev_char_utf8(const char *p);
-
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h
new file mode 100644
index 00000000000..15884c4d2d9
--- /dev/null
+++ b/source/blender/blenlib/BLI_string_utf8.h
@@ -0,0 +1,55 @@
+/*
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BLI_STRING_UTF8_H
+#define BLI_STRING_UTF8_H
+
+/** \file BLI_string.h
+ * \ingroup bli
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy);
+int BLI_utf8_invalid_byte(const char *str, int length);
+int BLI_utf8_invalid_strip(char *str, int length);
+
+ /* copied from glib */
+char *BLI_str_find_prev_char_utf8(const char *str, const char *p);
+char *BLI_str_find_next_char_utf8(const char *p, const char *end);
+char *BLI_str_prev_char_utf8(const char *p);
+
+ /* wchar_t functions, copied from blenders own font.c originally */
+size_t BLI_wstrlen_utf8(const wchar_t *src);
+size_t BLI_strlen_utf8(const char *strc);
+size_t BLI_strncpy_wchar_as_utf8(char *dst, const wchar_t *src, const size_t maxcpy);
+size_t BLI_strncpy_wchar_from_utf8(wchar_t *dst, const char *src, const size_t maxcpy);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index aa822731474..ea9f72c19c3 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -128,6 +128,7 @@ set(SRC
BLI_storage.h
BLI_storage_types.h
BLI_string.h
+ BLI_string_utf8.h
BLI_threads.h
BLI_utildefines.h
BLI_uvproject.h
diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c
index cf3605a80ff..82891b1e121 100644
--- a/source/blender/blenlib/intern/BLI_args.c
+++ b/source/blender/blenlib/intern/BLI_args.c
@@ -39,7 +39,6 @@
#include "MEM_guardedalloc.h"
#include "BLI_listbase.h"
-#include "BLI_string.h"
#include "BLI_utildefines.h"
#include "BLI_args.h"
#include "BLI_ghash.h"
diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c
index dc6cb0ef228..f331d13e580 100644
--- a/source/blender/blenlib/intern/string_utf8.c
+++ b/source/blender/blenlib/intern/string_utf8.c
@@ -31,6 +31,8 @@
*/
#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
#include "BLI_string.h"
@@ -183,6 +185,159 @@ char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy)
return dst_r;
}
+
+/* --------------------------------------------------------------------------*/
+/* wchar_t / utf8 functions */
+
+/* UTF-8 <-> wchar transformations */
+static size_t chtoutf8(const unsigned long c, char o[4])
+{
+ // Variables and initialization
+/* memset(o, 0, 4); */
+
+ // Create the utf-8 string
+ if (c < 0x80) {
+ o[0] = (char) c;
+ return 1;
+ }
+ else if (c < 0x800) {
+ o[0] = (0xC0 | (c>>6));
+ o[1] = (0x80 | (c & 0x3f));
+ return 2;
+ }
+ else if (c < 0x10000) {
+ o[0] = (0xe0 | (c >> 12));
+ o[1] = (0x80 | (c >>6 & 0x3f));
+ o[2] = (0x80 | (c & 0x3f));
+ return 3;
+ }
+ else if (c < 0x200000) {
+ o[0] = (0xf0 | (c>>18));
+ o[1] = (0x80 | (c >>12 & 0x3f));
+ o[2] = (0x80 | (c >> 6 & 0x3f));
+ o[3] = (0x80 | (c & 0x3f));
+ return 4;
+ }
+
+ /* should we assert here? */
+ return 0;
+}
+
+size_t BLI_strncpy_wchar_as_utf8(char *dst, const wchar_t *src, const size_t maxcpy)
+{
+ size_t len = 0;
+ while(*src && len < maxcpy) { /* XXX can still run over the buffer because utf8 size isnt known :| */
+ len += chtoutf8(*src++, dst+len);
+ }
+
+ dst[len]= '\0';
+
+ return len;
+}
+
+/* wchar len in utf8 */
+size_t BLI_wstrlen_utf8(const wchar_t *src)
+{
+ char ch_dummy[4];
+ size_t len = 0;
+
+ while(*src) {
+ len += chtoutf8(*src++, ch_dummy);
+ }
+
+ return len;
+}
+
+// utf8slen
+size_t BLI_strlen_utf8(const char *strc)
+{
+ int len=0;
+
+ while(*strc) {
+ if ((*strc & 0xe0) == 0xc0) {
+ if((strc[1] & 0x80) && (strc[1] & 0x40) == 0x00)
+ strc++;
+ } else if ((*strc & 0xf0) == 0xe0) {
+ if((strc[1] & strc[2] & 0x80) && ((strc[1] | strc[2]) & 0x40) == 0x00)
+ strc += 2;
+ } else if ((*strc & 0xf8) == 0xf0) {
+ if((strc[1] & strc[2] & strc[3] & 0x80) && ((strc[1] | strc[2] | strc[3]) & 0x40) == 0x00)
+ strc += 3;
+ }
+
+ strc++;
+ len++;
+ }
+
+ return len;
+}
+
+
+/* Converts Unicode to wchar
+
+According to RFC 3629 "UTF-8, a transformation format of ISO 10646"
+(http://tools.ietf.org/html/rfc3629), the valid UTF-8 encoding are:
+
+ Char. number range | UTF-8 octet sequence
+ (hexadecimal) | (binary)
+ --------------------+---------------------------------------------
+ 0000 0000-0000 007F | 0xxxxxxx
+ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+ 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+If the encoding incidated by the first character is incorrect (because the
+1 to 3 following characters do not match 10xxxxxx), the output is a '?' and
+only a single input character is consumed.
+
+*/
+
+size_t BLI_strncpy_wchar_from_utf8(wchar_t *dst_w, const char *src_c, const size_t maxcpy)
+{
+ int len=0;
+
+ if(dst_w==NULL || src_c==NULL) return(0);
+
+ while(*src_c && len < maxcpy) {
+ if ((*src_c & 0xe0) == 0xc0) {
+ if((src_c[1] & 0x80) && (src_c[1] & 0x40) == 0x00) {
+ *dst_w=((src_c[0] &0x1f)<<6) | (src_c[1]&0x3f);
+ src_c++;
+ } else {
+ *dst_w = '?';
+ }
+ } else if ((*src_c & 0xf0) == 0xe0) {
+ if((src_c[1] & src_c[2] & 0x80) && ((src_c[1] | src_c[2]) & 0x40) == 0x00) {
+ *dst_w=((src_c[0] & 0x0f)<<12) | ((src_c[1]&0x3f)<<6) | (src_c[2]&0x3f);
+ src_c += 2;
+ } else {
+ *dst_w = '?';
+ }
+ } else if ((*src_c & 0xf8) == 0xf0) {
+ if((src_c[1] & src_c[2] & src_c[3] & 0x80) && ((src_c[1] | src_c[2] | src_c[3]) & 0x40) == 0x00) {
+ *dst_w=((src_c[0] & 0x07)<<18) | ((src_c[1]&0x1f)<<12) | ((src_c[2]&0x3f)<<6) | (src_c[3]&0x3f);
+ src_c += 3;
+ } else {
+ *dst_w = '?';
+ }
+ } else {
+ *dst_w=(src_c[0] & 0x7f);
+ }
+
+ src_c++;
+ dst_w++;
+ len++;
+ }
+ return len;
+}
+
+/* end wchar_t / utf8 functions */
+/* --------------------------------------------------------------------------*/
+
+
+
+
+
/* copied from glib */
/**
* g_utf8_find_prev_char: