diff options
Diffstat (limited to 'core/ustring.cpp')
| -rw-r--r-- | core/ustring.cpp | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/core/ustring.cpp b/core/ustring.cpp index 261cc0778c..d445e4ed47 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -5,8 +5,8 @@ /* GODOT ENGINE */ /* https://godotengine.org */ /*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ +/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ @@ -27,6 +27,7 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ + #include "ustring.h" #include "color.h" @@ -56,6 +57,40 @@ #define IS_DIGIT(m_d) ((m_d) >= '0' && (m_d) <= '9') #define IS_HEX_DIGIT(m_d) (((m_d) >= '0' && (m_d) <= '9') || ((m_d) >= 'a' && (m_d) <= 'f') || ((m_d) >= 'A' && (m_d) <= 'F')) +bool is_symbol(CharType c) { + return c != '_' && ((c >= '!' && c <= '/') || (c >= ':' && c <= '@') || (c >= '[' && c <= '`') || (c >= '{' && c <= '~') || c == '\t' || c == ' '); +} + +bool select_word(const String &p_s, int p_col, int &r_beg, int &r_end) { + + const String &s = p_s; + int beg = CLAMP(p_col, 0, s.length()); + int end = beg; + + if (s[beg] > 32 || beg == s.length()) { + + bool symbol = beg < s.length() && is_symbol(s[beg]); + + while (beg > 0 && s[beg - 1] > 32 && (symbol == is_symbol(s[beg - 1]))) { + beg--; + } + while (end < s.length() && s[end + 1] > 32 && (symbol == is_symbol(s[end + 1]))) { + end++; + } + + if (end < s.length()) + end += 1; + + r_beg = beg; + r_end = end; + + return true; + } else { + + return false; + } +} + /** STRING **/ bool CharString::operator<(const CharString &p_right) const { @@ -651,6 +686,9 @@ Vector<String> String::split_spaces() const { int from = 0; int i = 0; int len = length(); + if (len == 0) + return ret; + bool inside = false; while (true) { @@ -1063,9 +1101,8 @@ String String::num(double p_num, int p_decimals) { String String::num_int64(int64_t p_num, int base, bool capitalize_hex) { bool sign = p_num < 0; - int64_t num = ABS(p_num); - int64_t n = num; + int64_t n = p_num; int chars = 0; do { @@ -1079,9 +1116,9 @@ String String::num_int64(int64_t p_num, int base, bool capitalize_hex) { s.resize(chars + 1); CharType *c = s.ptrw(); c[chars] = 0; - n = num; + n = p_num; do { - int mod = n % base; + int mod = ABS(n % base); if (mod >= 10) { char a = (capitalize_hex ? 'A' : 'a'); c[--chars] = a + (mod - 10); @@ -2180,7 +2217,7 @@ int String::find(const String &p_str, int p_from) const { const int len = length(); if (src_len == 0 || len == 0) - return -1; //wont find anything! + return -1; // won't find anything! const CharType *src = c_str(); const CharType *str = p_str.c_str(); @@ -2219,7 +2256,7 @@ int String::find(const char *p_str, int p_from) const { const int len = length(); if (len == 0) - return -1; //wont find anything! + return -1; // won't find anything! const CharType *src = c_str(); @@ -2280,7 +2317,7 @@ int String::findmk(const Vector<String> &p_keys, int p_from, int *r_key) const { int len = length(); if (len == 0) - return -1; //wont find anything! + return -1; // won't find anything! const CharType *src = c_str(); @@ -2329,7 +2366,7 @@ int String::findn(const String &p_str, int p_from) const { int src_len = p_str.length(); if (src_len == 0 || length() == 0) - return -1; //wont find anything! + return -1; // won't find anything! const CharType *srcd = c_str(); @@ -2425,7 +2462,7 @@ int String::rfindn(const String &p_str, int p_from) const { int len = length(); if (src_len == 0 || len == 0) - return -1; //wont find anything! + return -1; // won't find anything! const CharType *src = c_str(); @@ -3130,7 +3167,7 @@ String String::http_unescape() const { if ((ord1 >= '0' && ord1 <= '9') || (ord1 >= 'A' && ord1 <= 'Z')) { CharType ord2 = ord_at(i + 2); if ((ord2 >= '0' && ord2 <= '9') || (ord2 >= 'A' && ord2 <= 'Z')) { - char bytes[2] = { ord1, ord2 }; + char bytes[2] = { (char)ord1, (char)ord2 }; res += (char)strtol(bytes, NULL, 16); i += 2; } |