aboutsummaryrefslogtreecommitdiff
path: root/utf8.cpp
diff options
context:
space:
mode:
authorDmitry Mikhirev2012-08-27 23:39:56 +0400
committerDmitry Mikhirev2012-08-27 23:39:56 +0400
commite6d874c734fb9ebec3de5c9b652425b704480a55 (patch)
tree136def1c0678b8974c2d1c7f18849f9bdb502f46 /utf8.cpp
parent94527a8213c689181ca2b2b11b6d919176ceb33f (diff)
downloadbrainuino-e6d874c734fb9ebec3de5c9b652425b704480a55.tar.gz
brainuino-e6d874c734fb9ebec3de5c9b652425b704480a55.tar.bz2
brainuino-e6d874c734fb9ebec3de5c9b652425b704480a55.tar.xz
brainuino-e6d874c734fb9ebec3de5c9b652425b704480a55.zip
rewrite text convertion
Diffstat (limited to 'utf8.cpp')
-rw-r--r--utf8.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/utf8.cpp b/utf8.cpp
new file mode 100644
index 0000000..026d16e
--- /dev/null
+++ b/utf8.cpp
@@ -0,0 +1,63 @@
+/*
+ Brainuino Aleph
+
+ Copyright (C) 2012 Dmitry Mikhirev
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "utf8.h"
+#include <string.h>
+
+utf8::utf8 (char* string)
+{
+ bytes = strlen(string);
+ _string = (char *)malloc(bytes + 1);
+ strcpy(_string, string);
+ chars = 0;
+ for (_index = 0; _index < bytes; _index++) {
+ if (_string[_index] & 0x80 == 0) {
+ chars++;
+ } else if (_string[_index] & 0x20 == 0) {
+ chars += 2;
+ _index++;
+ } else if (_string[_index] & 0x10 == 0) {
+ chars += 3;
+ _index += 2;
+ } else if (_string[_index] & 0x8 == 0) {
+ chars += 4;
+ _index += 3;
+ }
+ }
+ _index = 0;
+}
+
+int32_t utf8::get()
+{
+ int32_t code;
+ if (_string[_index] & 0x80 == 0) {
+ code = int32_t(_string[_index]);
+ _index++;
+ } else if (_string[_index] & 0x20 == 0) {
+ code = int32_t(_string[_index] & 0x1f) << 6 | int32_t(_string[_index+1] & 0x3f);
+ _index += 2;
+ } else if (_string[_index] & 0x10 == 0) {
+ code = int32_t(_string[_index] & 0xf) << 12 | int32_t(_string[_index+1] & 0x3f) << 6 | int32_t(_string[_index+2] & 0x3f);
+ _index += 3;
+ } else if (_string[_index] & 0x8 == 0) {
+ code = int32_t(_string[_index] & 0x7) << 18 | int32_t(_string[_index+1] & 0x3f) << 12 | int32_t(_string[_index+2] & 0x3f) << 6 | int32_t(_string[_index+3] & 0x3f);
+ }
+ if (_index > bytes) _index = 0;
+ return code;
+}