diff options
author | Dmitry Mikhirev | 2012-08-27 23:39:56 +0400 |
---|---|---|
committer | Dmitry Mikhirev | 2012-08-27 23:39:56 +0400 |
commit | e6d874c734fb9ebec3de5c9b652425b704480a55 (patch) | |
tree | 136def1c0678b8974c2d1c7f18849f9bdb502f46 /utf8.cpp | |
parent | 94527a8213c689181ca2b2b11b6d919176ceb33f (diff) | |
download | brainuino-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.cpp | 63 |
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; +} |