From e6d874c734fb9ebec3de5c9b652425b704480a55 Mon Sep 17 00:00:00 2001 From: Dmitry Mikhirev Date: Mon, 27 Aug 2012 23:39:56 +0400 Subject: rewrite text convertion --- utf8.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 utf8.cpp (limited to 'utf8.cpp') 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 . +*/ + +#include "utf8.h" +#include + +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; +} -- cgit v1.2.1