From 25d37e9c9059e03554b21ca58846b01eda9fc046 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Sun, 15 Sep 2024 01:27:28 -0300 Subject: [PATCH 01/24] primeiras funcoes --- CMakeLists.txt | 3 ++- lib/string/contains.rob | 18 ++++++++++++++++++ lib/string/diffstr.rob | 20 ++++++++++++++++++++ lib/string/equalstr.rob | 20 ++++++++++++++++++++ lib/string/lowerstr.rob | 11 +++++++++++ lib/string/upperstr.rob | 11 +++++++++++ lib/string/utf8strlen.rob | 11 +++++++++++ macbuild | 8 ++++++-- test/general/bool-branch-cond.rob | 11 +++++++++++ test/general/string-contains.rob | 10 ++++++++++ test/general/string-diff.rob | 10 ++++++++++ test/general/string-equal.rob | 10 ++++++++++ test/general/string-lower.rob | 13 +++++++++++++ test/general/string-upper.rob | 13 +++++++++++++ test/general/string-utf8len.rob | 12 ++++++++++++ 15 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 lib/string/contains.rob create mode 100644 lib/string/diffstr.rob create mode 100644 lib/string/equalstr.rob create mode 100644 lib/string/lowerstr.rob create mode 100644 lib/string/upperstr.rob create mode 100644 lib/string/utf8strlen.rob create mode 100644 test/general/bool-branch-cond.rob create mode 100644 test/general/string-contains.rob create mode 100644 test/general/string-diff.rob create mode 100644 test/general/string-equal.rob create mode 100644 test/general/string-lower.rob create mode 100644 test/general/string-upper.rob create mode 100644 test/general/string-utf8len.rob diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f97c7b..608b87b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,7 +66,8 @@ add_dependencies(robcmp parsers) llvm_map_components_to_libnames(llvm_libs support core irreader passes armasmparser armcodegen avrasmparser avrcodegen - x86asmparser x86codegen) + x86asmparser x86codegen + aarch64asmparser aarch64codegen) target_link_libraries(robcmp ${llvm_libs}) diff --git a/lib/string/contains.rob b/lib/string/contains.rob new file mode 100644 index 0000000..6ba83a1 --- /dev/null +++ b/lib/string/contains.rob @@ -0,0 +1,18 @@ +int16 containsstr(char[] str, char[] substr) { + i = int16 (0); + while i < str.size { + j = int16 (0); + + while (str[i + j] == substr[j]) { + j++; + } + + if j == substr.size { + return i; + } + + i++; + } + + return -1; +} \ No newline at end of file diff --git a/lib/string/diffstr.rob b/lib/string/diffstr.rob new file mode 100644 index 0000000..b521640 --- /dev/null +++ b/lib/string/diffstr.rob @@ -0,0 +1,20 @@ +use string.utf8strlen; + +int8 equalsrt(char[] s1, char[] s2) { + + i = int16 (0); + while (i < s1.size and i < s2.size) { + if (s1[i] == s2[i]) { + return 0; + } + i++; + } + + str1 = utf8strlen(s1); + str2 = utf8strlen(s2); + if str1 != str2 { + return 1; + } else { + return 0; + } +} diff --git a/lib/string/equalstr.rob b/lib/string/equalstr.rob new file mode 100644 index 0000000..6483972 --- /dev/null +++ b/lib/string/equalstr.rob @@ -0,0 +1,20 @@ +use string.utf8strlen; + +bool equalstr(char[] s1, char[] s2) { + + i = int16 (0); + while (i < s1.size and i < s2.size) { + if (s1[i] != s2[i]) { + return false; + } + i++; + } + + str1 = utf8strlen(s1); + str2 = utf8strlen(s2); + if str1 == str2 { + return true; + } else { + return false; + } +} diff --git a/lib/string/lowerstr.rob b/lib/string/lowerstr.rob new file mode 100644 index 0000000..e012505 --- /dev/null +++ b/lib/string/lowerstr.rob @@ -0,0 +1,11 @@ +char lowerchar(char c) { + return c | 0x20; +} + +void lowerstr(char[] s) { + i = int16 (0); + while i < s.size { + s[i] = lowerchar(s[i]); + i++; + } +} \ No newline at end of file diff --git a/lib/string/upperstr.rob b/lib/string/upperstr.rob new file mode 100644 index 0000000..8524ea5 --- /dev/null +++ b/lib/string/upperstr.rob @@ -0,0 +1,11 @@ +char upperchar(char c) { + return c & 0xDF; +} + +void upperstr(char[] s) { + i = int16 (0); + while i < s.size { + s[i] = upperchar(s[i]); + i++; + } +} \ No newline at end of file diff --git a/lib/string/utf8strlen.rob b/lib/string/utf8strlen.rob new file mode 100644 index 0000000..9891dc4 --- /dev/null +++ b/lib/string/utf8strlen.rob @@ -0,0 +1,11 @@ +int16 utf8strlen(char[] s) { + length = int16 (0); + i = int16 (0); + while i < s.size { + if ((s[i] & 0xC0) != 0x80) { + length++; + } + i++; + } + return length; +} \ No newline at end of file diff --git a/macbuild b/macbuild index 374cb2c..67f5889 100755 --- a/macbuild +++ b/macbuild @@ -1,6 +1,10 @@ -CXX=/usr/local/opt/llvm/bin/clang++ -CC=/usr/local/opt/llvm/bin/clang +CXX=/opt/homebrew/opt/llvm/bin/clang++ +CC=/opt/homebrew/opt/llvm/bin/clang +LLVM_DIR=/opt/homebrew/Cellar/llvm/18.1.8/lib/cmake/llvm +BISON_EXECUTABLE=/opt/homebrew/bin/bison export CXX export CC +export LLVM_DIR +export BISON_EXECUTABLE cmake -DCMAKE_BUILD_TYPE="Debug" .. #cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE="Debug" .. diff --git a/test/general/bool-branch-cond.rob b/test/general/bool-branch-cond.rob new file mode 100644 index 0000000..c74641f --- /dev/null +++ b/test/general/bool-branch-cond.rob @@ -0,0 +1,11 @@ +int8 boolteste() { + return 0; +} + +int8 main() { + if boolteste(){ + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/general/string-contains.rob b/test/general/string-contains.rob new file mode 100644 index 0000000..9b66c73 --- /dev/null +++ b/test/general/string-contains.rob @@ -0,0 +1,10 @@ +use string.contains; + +int8 main() { + r = containsstr("abcde", "cd"); + if r == 2 { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/general/string-diff.rob b/test/general/string-diff.rob new file mode 100644 index 0000000..ef0f842 --- /dev/null +++ b/test/general/string-diff.rob @@ -0,0 +1,10 @@ +use string.diffstr; + +int8 main() { + + if (diffsrt("abcd", "12ab")) { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/general/string-equal.rob b/test/general/string-equal.rob new file mode 100644 index 0000000..c9e4efa --- /dev/null +++ b/test/general/string-equal.rob @@ -0,0 +1,10 @@ +use string.equalstr; + +int8 main() { + + if equalstr("abcd", "abcd") { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/general/string-lower.rob b/test/general/string-lower.rob new file mode 100644 index 0000000..e8befb3 --- /dev/null +++ b/test/general/string-lower.rob @@ -0,0 +1,13 @@ +use string.lowerstr; +use string.equalstr; + +int8 main() { + r = "ABCDE" + lowerstr(r); + + if equalstr(r, "abcde") { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob new file mode 100644 index 0000000..9e4731c --- /dev/null +++ b/test/general/string-upper.rob @@ -0,0 +1,13 @@ +use string.upperstr; +use string.equalstr; + +int8 main() { + r = "abcde"; + upperstr(r); + + if equalstr (r, "ABCDE") { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/general/string-utf8len.rob b/test/general/string-utf8len.rob new file mode 100644 index 0000000..611b743 --- /dev/null +++ b/test/general/string-utf8len.rob @@ -0,0 +1,12 @@ +use string.utf8strlen; + +//const str = "a1अ中😂👍"; + +int8 main() { + r = utf8strlen("a1éñअ中😂👍"); + if r == 8 { + return 0; + } else { + return 1; + } +} \ No newline at end of file From 1ca7957faef59146fc5deb3902c7bd1ee848146b Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Thu, 19 Sep 2024 17:14:24 -0300 Subject: [PATCH 02/24] utf8len att --- test/general/string-utf8len.rob | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/general/string-utf8len.rob b/test/general/string-utf8len.rob index 611b743..ac69fe5 100644 --- a/test/general/string-utf8len.rob +++ b/test/general/string-utf8len.rob @@ -1,9 +1,9 @@ use string.utf8strlen; -//const str = "a1अ中😂👍"; +const str = "a1éñअ中😂👍"; int8 main() { - r = utf8strlen("a1éñअ中😂👍"); + r = utf8strlen(str); if r == 8 { return 0; } else { From 52084e8ec3b2d7f02eb7e8979d9642a7a28848f8 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Wed, 25 Sep 2024 16:29:14 -0300 Subject: [PATCH 03/24] utf8maiuscilosminusculo --- lib/string/diffstr.rob | 20 ------ lib/string/upperstr.rob | 125 ++++++++++++++++++++++++++++++++-- test/general/string-diff.rob | 10 --- test/general/string-lower.rob | 11 ++- test/general/string-upper.rob | 9 ++- 5 files changed, 130 insertions(+), 45 deletions(-) delete mode 100644 lib/string/diffstr.rob delete mode 100644 test/general/string-diff.rob diff --git a/lib/string/diffstr.rob b/lib/string/diffstr.rob deleted file mode 100644 index b521640..0000000 --- a/lib/string/diffstr.rob +++ /dev/null @@ -1,20 +0,0 @@ -use string.utf8strlen; - -int8 equalsrt(char[] s1, char[] s2) { - - i = int16 (0); - while (i < s1.size and i < s2.size) { - if (s1[i] == s2[i]) { - return 0; - } - i++; - } - - str1 = utf8strlen(s1); - str2 = utf8strlen(s2); - if str1 != str2 { - return 1; - } else { - return 0; - } -} diff --git a/lib/string/upperstr.rob b/lib/string/upperstr.rob index 8524ea5..1b8da9f 100644 --- a/lib/string/upperstr.rob +++ b/lib/string/upperstr.rob @@ -1,11 +1,124 @@ -char upperchar(char c) { - return c & 0xDF; +UnicodeMapping = { + { 0x00E1, 0x00C1 }, // á -> Á + { 0x00E9, 0x00C9 }, // é -> É + { 0x00F3, 0x00D3 }, // ó -> Ó + { 0x00F1, 0x00D1 }, // ñ -> Ñ + { 0x00E7, 0x00C7 }, // ç -> Ç + { 0x00ED, 0x00CD }, // í -> Í + { 0x00FA, 0x00DA } // ú -> Ú +}; + +int8 utf8_decode(char[] s, char[] codepoint) { + i = int16 (0); + if (s[i] < 0x80) { + codepoint[i] = s[i]; + return 1; // 1 byte + } else if ((s[i] & 0xE0) == 0xC0) { + codepoint[i] = ((s[i] & 0x1F) << 6) | (s[1] & 0x3F); + return 2; // 2 bytes + } else if ((s[i] & 0xF0) == 0xE0) { + codepoint[i] = ((s[i] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); + return 3; // 3 bytes + } else if ((s[i] & 0xF8) == 0xF0) { + codepoint[i] = ((s[i] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); + return 4; // 4 bytes + } + return -1; +} + +int8 utf8_encode(int32 codepoint, char[] output) { + if (codepoint <= 0x7F) { + output[0] = codepoint & 0x7F; + return 1; // 1 byte + } else if (codepoint <= 0x7FF) { + output[0] = 0xC0 | ((codepoint >> 6) & 0x1F); + output[1] = 0x80 | (codepoint & 0x3F); + return 2; // 2 bytes + } else if (codepoint <= 0xFFFF) { + output[0] = 0xE0 | ((codepoint >> 12) & 0x0F); + output[1] = 0x80 | ((codepoint >> 6) & 0x3F); + output[2] = 0x80 | (codepoint & 0x3F); + return 3; // 3 bytes + } else if (codepoint <= 0x10FFFF) { + output[0] = 0xF0 | ((codepoint >> 18) & 0x07); + output[1] = 0x80 | ((codepoint >> 12) & 0x3F); + output[2] = 0x80 | ((codepoint >> 6) & 0x3F); + output[3] = 0x80 | (codepoint & 0x3F); + return 4; // 4 bytes + } + return -1; +} + +int32 to_uppercase(int32 codepoint) { + int8 mapping_size = UnicodeMapping.size / UnicodeMapping[0].size; + for (int8 i = 0; i < mapping_size; i++) { + if (mapping[i].lowercase == codepoint) { + return mapping[i].uppercase; + } + } + + if (codepoint >= 0x61 and codepoint <= 0x7A) { + return codepoint & 0x5F; + } + return codepoint; +} + +int32 to_lowercase(int32 codepoint) { + int8 mapping_size = UnicodeMapping.size; + for (int8 i = 0; i < mapping_size; i++) { //acessar de 2 em 2 + if (mapping[i].uppercase == codepoint) { + return mapping[i].lowercase; + } + } + + if (codepoint >= 0x41 and codepoint <= 0x5A) { + return codepoint | 0x20; + } + return codepoint; +} + +void upperutf8str(char[] str) { + char[] p = str; + char output[4]; + i = int16 (0); + while (i < p.size) { + uint32_t codepoint; + int len = utf8_decode(p, &codepoint); + if (len < 1) { + p++; + continue; + } + uint32_t uppercase_codepoint = to_uppercase(codepoint); + int out_len = utf8_encode(uppercase_codepoint, output); + if (out_len > 0) { + memcpy(p, output, out_len); + if (out_len != len) { + memmove(p + out_len, p + len, strlen(p + len) + 1); + } + } + p += out_len; + } } -void upperstr(char[] s) { +void lowerutf8str(char[] str) { + char[] p = str; + char output[4]; i = int16 (0); - while i < s.size { - s[i] = upperchar(s[i]); - i++; + while (i < p.size) { + uint32_t codepoint; + int len = utf8_decode(p, &codepoint); + if (len < 1) { + p++; + continue; + } + uint32_t lowercase_codepoint = to_lowercase(codepoint); + int out_len = utf8_encode(lowercase_codepoint, output); + if (out_len > 0) { + memcpy(p, output, out_len); + if (out_len != len) { + memmove(p + out_len, p + len, strlen(p + len) + 1); + } + } + p += out_len; } } \ No newline at end of file diff --git a/test/general/string-diff.rob b/test/general/string-diff.rob deleted file mode 100644 index ef0f842..0000000 --- a/test/general/string-diff.rob +++ /dev/null @@ -1,10 +0,0 @@ -use string.diffstr; - -int8 main() { - - if (diffsrt("abcd", "12ab")) { - return 0; - } else { - return 1; - } -} \ No newline at end of file diff --git a/test/general/string-lower.rob b/test/general/string-lower.rob index e8befb3..ac69fe5 100644 --- a/test/general/string-lower.rob +++ b/test/general/string-lower.rob @@ -1,11 +1,10 @@ -use string.lowerstr; -use string.equalstr; +use string.utf8strlen; -int8 main() { - r = "ABCDE" - lowerstr(r); +const str = "a1éñअ中😂👍"; - if equalstr(r, "abcde") { +int8 main() { + r = utf8strlen(str); + if r == 8 { return 0; } else { return 1; diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index 9e4731c..dad00cf 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -2,10 +2,13 @@ use string.upperstr; use string.equalstr; int8 main() { - r = "abcde"; - upperstr(r); + str_upper = "olá, mundo! áéíóú ç ñ abc"; + str_lower = "OLÁ, MUNDO! ÁÉÍÓÚ Ç Ñ ABC"; - if equalstr (r, "ABCDE") { + upperutf8str(str_upper); + lowerutf8str(str_lower); + + if equalstr (str_upper, "OLÁ, MUNDO! ÁÉÍÓÚ Ç Ñ ABC") { return 0; } else { return 1; From ebe14ea941ab6a7cecc9eeab51712af10bae3001 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Wed, 16 Oct 2024 14:16:41 -0300 Subject: [PATCH 04/24] debug para funcao mai/min --- lib/string/lowerstr.rob | 11 - lib/string/upperstr.rob | 786 +++++++++++++++-- .../__pycache__/platform.cpython-311.pyc | Bin 0 -> 4567 bytes test/general/string-lower.rob | 12 - test/general/string-upper.rob | 811 +++++++++++++++++- 5 files changed, 1537 insertions(+), 83 deletions(-) delete mode 100644 lib/string/lowerstr.rob create mode 100644 platformio/platform/__pycache__/platform.cpython-311.pyc delete mode 100644 test/general/string-lower.rob diff --git a/lib/string/lowerstr.rob b/lib/string/lowerstr.rob deleted file mode 100644 index e012505..0000000 --- a/lib/string/lowerstr.rob +++ /dev/null @@ -1,11 +0,0 @@ -char lowerchar(char c) { - return c | 0x20; -} - -void lowerstr(char[] s) { - i = int16 (0); - while i < s.size { - s[i] = lowerchar(s[i]); - i++; - } -} \ No newline at end of file diff --git a/lib/string/upperstr.rob b/lib/string/upperstr.rob index 1b8da9f..fdb5c79 100644 --- a/lib/string/upperstr.rob +++ b/lib/string/upperstr.rob @@ -1,26 +1,690 @@ -UnicodeMapping = { - { 0x00E1, 0x00C1 }, // á -> Á - { 0x00E9, 0x00C9 }, // é -> É - { 0x00F3, 0x00D3 }, // ó -> Ó - { 0x00F1, 0x00D1 }, // ñ -> Ñ - { 0x00E7, 0x00C7 }, // ç -> Ç - { 0x00ED, 0x00CD }, // í -> Í - { 0x00FA, 0x00DA } // ú -> Ú +use string.equalstr; + +mapping = { + 0x0061, 0x0041 , + 0x0062, 0x0042 , + 0x0063, 0x0043 , + 0x0064, 0x0044 , + 0x0065, 0x0045 , + 0x0066, 0x0046 , + 0x0067, 0x0047 , + 0x0068, 0x0048 , + 0x0069, 0x0049 , + 0x006A, 0x004A , + 0x006B, 0x004B , + 0x006C, 0x004C , + 0x006D, 0x004D , + 0x006E, 0x004E , + 0x006F, 0x004F , + 0x0070, 0x0050 , + 0x0071, 0x0051 , + 0x0072, 0x0052 , + 0x0073, 0x0053 , + 0x0074, 0x0054 , + 0x0075, 0x0055 , + 0x0076, 0x0056 , + 0x0077, 0x0057 , + 0x0078, 0x0058 , + 0x0079, 0x0059 , + 0x007A, 0x005A , + 0x00E0, 0x00C0 , + 0x00E1, 0x00C1 , + 0x00E2, 0x00C2 , + 0x00E3, 0x00C3 , + 0x00E4, 0x00C4 , + 0x00E5, 0x00C5 , + 0x00E6, 0x00C6 , + 0x00E7, 0x00C7 , + 0x00E8, 0x00C8 , + 0x00E9, 0x00C9 , + 0x00EA, 0x00CA , + 0x00EB, 0x00CB , + 0x00EC, 0x00CC , + 0x00ED, 0x00CD , + 0x00EE, 0x00CE , + 0x00EF, 0x00CF , + 0x00F0, 0x00D0 , + 0x00F1, 0x00D1 , + 0x00F2, 0x00D2 , + 0x00F3, 0x00D3 , + 0x00F4, 0x00D4 , + 0x00F5, 0x00D5 , + 0x00F6, 0x00D6 , + 0x00F8, 0x00D8 , + 0x00F9, 0x00D9 , + 0x00FA, 0x00DA , + 0x00FB, 0x00DB , + 0x00FC, 0x00DC , + 0x00FD, 0x00DD , + 0x00FE, 0x00DE , + 0x00FF, 0x0178 , + 0x0101, 0x0100 , + 0x0103, 0x0102 , + 0x0105, 0x0104 , + 0x0107, 0x0106 , + 0x0109, 0x0108 , + 0x010B, 0x010A , + 0x010D, 0x010C , + 0x010F, 0x010E , + 0x0111, 0x0110 , + 0x0113, 0x0112 , + 0x0115, 0x0114 , + 0x0117, 0x0116 , + 0x0119, 0x0118 , + 0x011B, 0x011A , + 0x011D, 0x011C , + 0x011F, 0x011E , + 0x0121, 0x0120 , + 0x0123, 0x0122 , + 0x0125, 0x0124 , + 0x0127, 0x0126 , + 0x0129, 0x0128 , + 0x012B, 0x012A , + 0x012D, 0x012C , + 0x012F, 0x012E , + 0x0131, 0x0049 , + 0x0133, 0x0132 , + 0x0135, 0x0134 , + 0x0137, 0x0136 , + 0x013A, 0x0139 , + 0x013C, 0x013B , + 0x013E, 0x013D , + 0x0140, 0x013F , + 0x0142, 0x0141 , + 0x0144, 0x0143 , + 0x0146, 0x0145 , + 0x0148, 0x0147 , + 0x014B, 0x014A , + 0x014D, 0x014C , + 0x014F, 0x014E , + 0x0151, 0x0150 , + 0x0153, 0x0152 , + 0x0155, 0x0154 , + 0x0157, 0x0156 , + 0x0159, 0x0158 , + 0x015B, 0x015A , + 0x015D, 0x015C , + 0x015F, 0x015E , + 0x0161, 0x0160 , + 0x0163, 0x0162 , + 0x0165, 0x0164 , + 0x0167, 0x0166 , + 0x0169, 0x0168 , + 0x016B, 0x016A , + 0x016D, 0x016C , + 0x016F, 0x016E , + 0x0171, 0x0170 , + 0x0173, 0x0172 , + 0x0175, 0x0174 , + 0x0177, 0x0176 , + 0x017A, 0x0179 , + 0x017C, 0x017B , + 0x017E, 0x017D , + 0x0183, 0x0182 , + 0x0185, 0x0184 , + 0x0188, 0x0187 , + 0x018C, 0x018B , + 0x0192, 0x0191 , + 0x0199, 0x0198 , + 0x01A1, 0x01A0 , + 0x01A3, 0x01A2 , + 0x01A5, 0x01A4 , + 0x01A8, 0x01A7 , + 0x01AD, 0x01AC , + 0x01B0, 0x01AF , + 0x01B4, 0x01B3 , + 0x01B6, 0x01B5 , + 0x01B9, 0x01B8 , + 0x01BD, 0x01BC , + 0x01C6, 0x01C4 , + 0x01C9, 0x01C7 , + 0x01CC, 0x01CA , + 0x01CE, 0x01CD , + 0x01D0, 0x01CF , + 0x01D2, 0x01D1 , + 0x01D4, 0x01D3 , + 0x01D6, 0x01D5 , + 0x01D8, 0x01D7 , + 0x01DA, 0x01D9 , + 0x01DC, 0x01DB , + 0x01DF, 0x01DE , + 0x01E1, 0x01E0 , + 0x01E3, 0x01E2 , + 0x01E5, 0x01E4 , + 0x01E7, 0x01E6 , + 0x01E9, 0x01E8 , + 0x01EB, 0x01EA , + 0x01ED, 0x01EC , + 0x01EF, 0x01EE , + 0x01F3, 0x01F1 , + 0x01F5, 0x01F4 , + 0x01FB, 0x01FA , + 0x01FD, 0x01FC , + 0x01FF, 0x01FE , + 0x0201, 0x0200 , + 0x0203, 0x0202 , + 0x0205, 0x0204 , + 0x0207, 0x0206 , + 0x0209, 0x0208 , + 0x020B, 0x020A , + 0x020D, 0x020C , + 0x020F, 0x020E , + 0x0211, 0x0210 , + 0x0213, 0x0212 , + 0x0215, 0x0214 , + 0x0217, 0x0216 , + 0x0253, 0x0181 , + 0x0254, 0x0186 , + 0x0257, 0x018A , + 0x0258, 0x018E , + 0x0259, 0x018F , + 0x025B, 0x0190 , + 0x0260, 0x0193 , + 0x0263, 0x0194 , + 0x0268, 0x0197 , + 0x0269, 0x0196 , + 0x026F, 0x019C , + 0x0272, 0x019D , + 0x0275, 0x019F , + 0x0283, 0x01A9 , + 0x0288, 0x01AE , + 0x028A, 0x01B1 , + 0x028B, 0x01B2 , + 0x0292, 0x01B7 , + 0x03AC, 0x0386 , + 0x03AD, 0x0388 , + 0x03AE, 0x0389 , + 0x03AF, 0x038A , + 0x03B1, 0x0391 , + 0x03B2, 0x0392 , + 0x03B3, 0x0393 , + 0x03B4, 0x0394 , + 0x03B5, 0x0395 , + 0x03B6, 0x0396 , + 0x03B7, 0x0397 , + 0x03B8, 0x0398 , + 0x03B9, 0x0399 , + 0x03BA, 0x039A , + 0x03BB, 0x039B , + 0x03BC, 0x039C , + 0x03BD, 0x039D , + 0x03BE, 0x039E , + 0x03BF, 0x039F , + 0x03C0, 0x03A0 , + 0x03C1, 0x03A1 , + 0x03C3, 0x03A3 , + 0x03C4, 0x03A4 , + 0x03C5, 0x03A5 , + 0x03C6, 0x03A6 , + 0x03C7, 0x03A7 , + 0x03C8, 0x03A8 , + 0x03C9, 0x03A9 , + 0x03CA, 0x03AA , + 0x03CB, 0x03AB , + 0x03CC, 0x038C , + 0x03CD, 0x038E , + 0x03CE, 0x038F , + 0x03E3, 0x03E2 , + 0x03E5, 0x03E4 , + 0x03E7, 0x03E6 , + 0x03E9, 0x03E8 , + 0x03EB, 0x03EA , + 0x03ED, 0x03EC , + 0x03EF, 0x03EE , + 0x0430, 0x0410 , + 0x0431, 0x0411 , + 0x0432, 0x0412 , + 0x0433, 0x0413 , + 0x0434, 0x0414 , + 0x0435, 0x0415 , + 0x0436, 0x0416 , + 0x0437, 0x0417 , + 0x0438, 0x0418 , + 0x0439, 0x0419 , + 0x043A, 0x041A , + 0x043B, 0x041B , + 0x043C, 0x041C , + 0x043D, 0x041D , + 0x043E, 0x041E , + 0x043F, 0x041F , + 0x0440, 0x0420 , + 0x0441, 0x0421 , + 0x0442, 0x0422 , + 0x0443, 0x0423 , + 0x0444, 0x0424 , + 0x0445, 0x0425 , + 0x0446, 0x0426 , + 0x0447, 0x0427 , + 0x0448, 0x0428 , + 0x0449, 0x0429 , + 0x044A, 0x042A , + 0x044B, 0x042B , + 0x044C, 0x042C , + 0x044D, 0x042D , + 0x044E, 0x042E , + 0x044F, 0x042F , + 0x0451, 0x0401 , + 0x0452, 0x0402 , + 0x0453, 0x0403 , + 0x0454, 0x0404 , + 0x0455, 0x0405 , + 0x0456, 0x0406 , + 0x0457, 0x0407 , + 0x0458, 0x0408 , + 0x0459, 0x0409 , + 0x045A, 0x040A , + 0x045B, 0x040B , + 0x045C, 0x040C , + 0x045E, 0x040E , + 0x045F, 0x040F , + 0x0461, 0x0460 , + 0x0463, 0x0462 , + 0x0465, 0x0464 , + 0x0467, 0x0466 , + 0x0469, 0x0468 , + 0x046B, 0x046A , + 0x046D, 0x046C , + 0x046F, 0x046E , + 0x0471, 0x0470 , + 0x0473, 0x0472 , + 0x0475, 0x0474 , + 0x0477, 0x0476 , + 0x0479, 0x0478 , + 0x047B, 0x047A , + 0x047D, 0x047C , + 0x047F, 0x047E , + 0x0481, 0x0480 , + 0x0491, 0x0490 , + 0x0493, 0x0492 , + 0x0495, 0x0494 , + 0x0497, 0x0496 , + 0x0499, 0x0498 , + 0x049B, 0x049A , + 0x049D, 0x049C , + 0x049F, 0x049E , + 0x04A1, 0x04A0 , + 0x04A3, 0x04A2 , + 0x04A5, 0x04A4 , + 0x04A7, 0x04A6 , + 0x04A9, 0x04A8 , + 0x04AB, 0x04AA , + 0x04AD, 0x04AC , + 0x04AF, 0x04AE , + 0x04B1, 0x04B0 , + 0x04B3, 0x04B2 , + 0x04B5, 0x04B4 , + 0x04B7, 0x04B6 , + 0x04B9, 0x04B8 , + 0x04BB, 0x04BA , + 0x04BD, 0x04BC , + 0x04BF, 0x04BE , + 0x04C2, 0x04C1 , + 0x04C4, 0x04C3 , + 0x04C8, 0x04C7 , + 0x04CC, 0x04CB , + 0x04D1, 0x04D0 , + 0x04D3, 0x04D2 , + 0x04D5, 0x04D4 , + 0x04D7, 0x04D6 , + 0x04D9, 0x04D8 , + 0x04DB, 0x04DA , + 0x04DD, 0x04DC , + 0x04DF, 0x04DE , + 0x04E1, 0x04E0 , + 0x04E3, 0x04E2 , + 0x04E5, 0x04E4 , + 0x04E7, 0x04E6 , + 0x04E9, 0x04E8 , + 0x04EB, 0x04EA , + 0x04EF, 0x04EE , + 0x04F1, 0x04F0 , + 0x04F3, 0x04F2 , + 0x04F5, 0x04F4 , + 0x04F9, 0x04F8 , + 0x0561, 0x0531 , + 0x0562, 0x0532 , + 0x0563, 0x0533 , + 0x0564, 0x0534 , + 0x0565, 0x0535 , + 0x0566, 0x0536 , + 0x0567, 0x0537 , + 0x0568, 0x0538 , + 0x0569, 0x0539 , + 0x056A, 0x053A , + 0x056B, 0x053B , + 0x056C, 0x053C , + 0x056D, 0x053D , + 0x056E, 0x053E , + 0x056F, 0x053F , + 0x0570, 0x0540 , + 0x0571, 0x0541 , + 0x0572, 0x0542 , + 0x0573, 0x0543 , + 0x0574, 0x0544 , + 0x0575, 0x0545 , + 0x0576, 0x0546 , + 0x0577, 0x0547 , + 0x0578, 0x0548 , + 0x0579, 0x0549 , + 0x057A, 0x054A , + 0x057B, 0x054B , + 0x057C, 0x054C , + 0x057D, 0x054D , + 0x057E, 0x054E , + 0x057F, 0x054F , + 0x0580, 0x0550 , + 0x0581, 0x0551 , + 0x0582, 0x0552 , + 0x0583, 0x0553 , + 0x0584, 0x0554 , + 0x0585, 0x0555 , + 0x0586, 0x0556 , + 0x10D0, 0x10A0 , + 0x10D1, 0x10A1 , + 0x10D2, 0x10A2 , + 0x10D3, 0x10A3 , + 0x10D4, 0x10A4 , + 0x10D5, 0x10A5 , + 0x10D6, 0x10A6 , + 0x10D7, 0x10A7 , + 0x10D8, 0x10A8 , + 0x10D9, 0x10A9 , + 0x10DA, 0x10AA , + 0x10DB, 0x10AB , + 0x10DC, 0x10AC , + 0x10DD, 0x10AD , + 0x10DE, 0x10AE , + 0x10DF, 0x10AF , + 0x10E0, 0x10B0 , + 0x10E1, 0x10B1 , + 0x10E2, 0x10B2 , + 0x10E3, 0x10B3 , + 0x10E4, 0x10B4 , + 0x10E5, 0x10B5 , + 0x10E6, 0x10B6 , + 0x10E7, 0x10B7 , + 0x10E8, 0x10B8 , + 0x10E9, 0x10B9 , + 0x10EA, 0x10BA , + 0x10EB, 0x10BB , + 0x10EC, 0x10BC , + 0x10ED, 0x10BD , + 0x10EE, 0x10BE , + 0x10EF, 0x10BF , + 0x10F0, 0x10C0 , + 0x10F1, 0x10C1 , + 0x10F2, 0x10C2 , + 0x10F3, 0x10C3 , + 0x10F4, 0x10C4 , + 0x10F5, 0x10C5 , + 0x1E01, 0x1E00 , + 0x1E03, 0x1E02 , + 0x1E05, 0x1E04 , + 0x1E07, 0x1E06 , + 0x1E09, 0x1E08 , + 0x1E0B, 0x1E0A , + 0x1E0D, 0x1E0C , + 0x1E0F, 0x1E0E , + 0x1E11, 0x1E10 , + 0x1E13, 0x1E12 , + 0x1E15, 0x1E14 , + 0x1E17, 0x1E16 , + 0x1E19, 0x1E18 , + 0x1E1B, 0x1E1A , + 0x1E1D, 0x1E1C , + 0x1E1F, 0x1E1E , + 0x1E21, 0x1E20 , + 0x1E23, 0x1E22 , + 0x1E25, 0x1E24 , + 0x1E27, 0x1E26 , + 0x1E29, 0x1E28 , + 0x1E2B, 0x1E2A , + 0x1E2D, 0x1E2C , + 0x1E2F, 0x1E2E , + 0x1E31, 0x1E30 , + 0x1E33, 0x1E32 , + 0x1E35, 0x1E34 , + 0x1E37, 0x1E36 , + 0x1E39, 0x1E38 , + 0x1E3B, 0x1E3A , + 0x1E3D, 0x1E3C , + 0x1E3F, 0x1E3E , + 0x1E41, 0x1E40 , + 0x1E43, 0x1E42 , + 0x1E45, 0x1E44 , + 0x1E47, 0x1E46 , + 0x1E49, 0x1E48 , + 0x1E4B, 0x1E4A , + 0x1E4D, 0x1E4C , + 0x1E4F, 0x1E4E , + 0x1E51, 0x1E50 , + 0x1E53, 0x1E52 , + 0x1E55, 0x1E54 , + 0x1E57, 0x1E56 , + 0x1E59, 0x1E58 , + 0x1E5B, 0x1E5A , + 0x1E5D, 0x1E5C , + 0x1E5F, 0x1E5E , + 0x1E61, 0x1E60 , + 0x1E63, 0x1E62 , + 0x1E65, 0x1E64 , + 0x1E67, 0x1E66 , + 0x1E69, 0x1E68 , + 0x1E6B, 0x1E6A , + 0x1E6D, 0x1E6C , + 0x1E6F, 0x1E6E , + 0x1E71, 0x1E70 , + 0x1E73, 0x1E72 , + 0x1E75, 0x1E74 , + 0x1E77, 0x1E76 , + 0x1E79, 0x1E78 , + 0x1E7B, 0x1E7A , + 0x1E7D, 0x1E7C , + 0x1E7F, 0x1E7E , + 0x1E81, 0x1E80 , + 0x1E83, 0x1E82 , + 0x1E85, 0x1E84 , + 0x1E87, 0x1E86 , + 0x1E89, 0x1E88 , + 0x1E8B, 0x1E8A , + 0x1E8D, 0x1E8C , + 0x1E8F, 0x1E8E , + 0x1E91, 0x1E90 , + 0x1E93, 0x1E92 , + 0x1E95, 0x1E94 , + 0x1EA1, 0x1EA0 , + 0x1EA3, 0x1EA2 , + 0x1EA5, 0x1EA4 , + 0x1EA7, 0x1EA6 , + 0x1EA9, 0x1EA8 , + 0x1EAB, 0x1EAA , + 0x1EAD, 0x1EAC , + 0x1EAF, 0x1EAE , + 0x1EB1, 0x1EB0 , + 0x1EB3, 0x1EB2 , + 0x1EB5, 0x1EB4 , + 0x1EB7, 0x1EB6 , + 0x1EB9, 0x1EB8 , + 0x1EBB, 0x1EBA , + 0x1EBD, 0x1EBC , + 0x1EBF, 0x1EBE , + 0x1EC1, 0x1EC0 , + 0x1EC3, 0x1EC2 , + 0x1EC5, 0x1EC4 , + 0x1EC7, 0x1EC6 , + 0x1EC9, 0x1EC8 , + 0x1ECB, 0x1ECA , + 0x1ECD, 0x1ECC , + 0x1ECF, 0x1ECE , + 0x1ED1, 0x1ED0 , + 0x1ED3, 0x1ED2 , + 0x1ED5, 0x1ED4 , + 0x1ED7, 0x1ED6 , + 0x1ED9, 0x1ED8 , + 0x1EDB, 0x1EDA , + 0x1EDD, 0x1EDC , + 0x1EDF, 0x1EDE , + 0x1EE1, 0x1EE0 , + 0x1EE3, 0x1EE2 , + 0x1EE5, 0x1EE4 , + 0x1EE7, 0x1EE6 , + 0x1EE9, 0x1EE8 , + 0x1EEB, 0x1EEA , + 0x1EED, 0x1EEC , + 0x1EEF, 0x1EEE , + 0x1EF1, 0x1EF0 , + 0x1EF3, 0x1EF2 , + 0x1EF5, 0x1EF4 , + 0x1EF7, 0x1EF6 , + 0x1EF9, 0x1EF8 , + 0x1F00, 0x1F08 , + 0x1F01, 0x1F09 , + 0x1F02, 0x1F0A , + 0x1F03, 0x1F0B , + 0x1F04, 0x1F0C , + 0x1F05, 0x1F0D , + 0x1F06, 0x1F0E , + 0x1F07, 0x1F0F , + 0x1F10, 0x1F18 , + 0x1F11, 0x1F19 , + 0x1F12, 0x1F1A , + 0x1F13, 0x1F1B , + 0x1F14, 0x1F1C , + 0x1F15, 0x1F1D , + 0x1F20, 0x1F28 , + 0x1F21, 0x1F29 , + 0x1F22, 0x1F2A , + 0x1F23, 0x1F2B , + 0x1F24, 0x1F2C , + 0x1F25, 0x1F2D , + 0x1F26, 0x1F2E , + 0x1F27, 0x1F2F , + 0x1F30, 0x1F38 , + 0x1F31, 0x1F39 , + 0x1F32, 0x1F3A , + 0x1F33, 0x1F3B , + 0x1F34, 0x1F3C , + 0x1F35, 0x1F3D , + 0x1F36, 0x1F3E , + 0x1F37, 0x1F3F , + 0x1F40, 0x1F48 , + 0x1F41, 0x1F49 , + 0x1F42, 0x1F4A , + 0x1F43, 0x1F4B , + 0x1F44, 0x1F4C , + 0x1F45, 0x1F4D , + 0x1F51, 0x1F59 , + 0x1F53, 0x1F5B , + 0x1F55, 0x1F5D , + 0x1F57, 0x1F5F , + 0x1F60, 0x1F68 , + 0x1F61, 0x1F69 , + 0x1F62, 0x1F6A , + 0x1F63, 0x1F6B , + 0x1F64, 0x1F6C , + 0x1F65, 0x1F6D , + 0x1F66, 0x1F6E , + 0x1F67, 0x1F6F , + 0x1F80, 0x1F88 , + 0x1F81, 0x1F89 , + 0x1F82, 0x1F8A , + 0x1F83, 0x1F8B , + 0x1F84, 0x1F8C , + 0x1F85, 0x1F8D , + 0x1F86, 0x1F8E , + 0x1F87, 0x1F8F , + 0x1F90, 0x1F98 , + 0x1F91, 0x1F99 , + 0x1F92, 0x1F9A , + 0x1F93, 0x1F9B , + 0x1F94, 0x1F9C , + 0x1F95, 0x1F9D , + 0x1F96, 0x1F9E , + 0x1F97, 0x1F9F , + 0x1FA0, 0x1FA8 , + 0x1FA1, 0x1FA9 , + 0x1FA2, 0x1FAA , + 0x1FA3, 0x1FAB , + 0x1FA4, 0x1FAC , + 0x1FA5, 0x1FAD , + 0x1FA6, 0x1FAE , + 0x1FA7, 0x1FAF , + 0x1FB0, 0x1FB8 , + 0x1FB1, 0x1FB9 , + 0x1FD0, 0x1FD8 , + 0x1FD1, 0x1FD9 , + 0x1FE0, 0x1FE8 , + 0x1FE1, 0x1FE9 , + 0x24D0, 0x24B6 , + 0x24D1, 0x24B7 , + 0x24D2, 0x24B8 , + 0x24D3, 0x24B9 , + 0x24D4, 0x24BA , + 0x24D5, 0x24BB , + 0x24D6, 0x24BC , + 0x24D7, 0x24BD , + 0x24D8, 0x24BE , + 0x24D9, 0x24BF , + 0x24DA, 0x24C0 , + 0x24DB, 0x24C1 , + 0x24DC, 0x24C2 , + 0x24DD, 0x24C3 , + 0x24DE, 0x24C4 , + 0x24DF, 0x24C5 , + 0x24E0, 0x24C6 , + 0x24E1, 0x24C7 , + 0x24E2, 0x24C8 , + 0x24E3, 0x24C9 , + 0x24E4, 0x24CA , + 0x24E5, 0x24CB , + 0x24E6, 0x24CC , + 0x24E7, 0x24CD , + 0x24E8, 0x24CE , + 0x24E9, 0x24CF , + 0xFF41, 0xFF21 , + 0xFF42, 0xFF22 , + 0xFF43, 0xFF23 , + 0xFF44, 0xFF24 , + 0xFF45, 0xFF25 , + 0xFF46, 0xFF26 , + 0xFF47, 0xFF27 , + 0xFF48, 0xFF28 , + 0xFF49, 0xFF29 , + 0xFF4A, 0xFF2A , + 0xFF4B, 0xFF2B , + 0xFF4C, 0xFF2C , + 0xFF4D, 0xFF2D , + 0xFF4E, 0xFF2E , + 0xFF4F, 0xFF2F , + 0xFF50, 0xFF30 , + 0xFF51, 0xFF31 , + 0xFF52, 0xFF32 , + 0xFF53, 0xFF33 , + 0xFF54, 0xFF34 , + 0xFF55, 0xFF35 , + 0xFF56, 0xFF36 , + 0xFF57, 0xFF37 , + 0xFF58, 0xFF38 , + 0xFF59, 0xFF39 , + 0xFF5A, 0xFF3A }; + +type Codepoint { + code = int32(0); +} -int8 utf8_decode(char[] s, char[] codepoint) { - i = int16 (0); +int8 utf8_decode(char[] s, int16 i, Codepoint c) { if (s[i] < 0x80) { - codepoint[i] = s[i]; + c.code = s[i]; return 1; // 1 byte } else if ((s[i] & 0xE0) == 0xC0) { - codepoint[i] = ((s[i] & 0x1F) << 6) | (s[1] & 0x3F); + c.code = ((s[i] & 0x1F) << 6) | (s[1] & 0x3F); return 2; // 2 bytes } else if ((s[i] & 0xF0) == 0xE0) { - codepoint[i] = ((s[i] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); + c.code = ((s[i] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); return 3; // 3 bytes } else if ((s[i] & 0xF8) == 0xF0) { - codepoint[i] = ((s[i] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); + c.code = ((s[i] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); return 4; // 4 bytes } return -1; @@ -50,11 +714,12 @@ int8 utf8_encode(int32 codepoint, char[] output) { } int32 to_uppercase(int32 codepoint) { - int8 mapping_size = UnicodeMapping.size / UnicodeMapping[0].size; - for (int8 i = 0; i < mapping_size; i++) { - if (mapping[i].lowercase == codepoint) { - return mapping[i].uppercase; + i = uint16(0); + while i < mapping.size { + if mapping[i + 1] == codepoint { + return mapping[i]; } + i += 2; } if (codepoint >= 0x61 and codepoint <= 0x7A) { @@ -64,11 +729,12 @@ int32 to_uppercase(int32 codepoint) { } int32 to_lowercase(int32 codepoint) { - int8 mapping_size = UnicodeMapping.size; - for (int8 i = 0; i < mapping_size; i++) { //acessar de 2 em 2 - if (mapping[i].uppercase == codepoint) { - return mapping[i].lowercase; + i = uint16(0); + while i < mapping.size { + if mapping[i] == codepoint { + return mapping[i + 1]; } + i += 2; } if (codepoint >= 0x41 and codepoint <= 0x5A) { @@ -77,48 +743,60 @@ int32 to_lowercase(int32 codepoint) { return codepoint; } -void upperutf8str(char[] str) { - char[] p = str; - char output[4]; - i = int16 (0); - while (i < p.size) { - uint32_t codepoint; - int len = utf8_decode(p, &codepoint); +void strcpy (char[] src, int16 s, char[] dst, int16 d, int16 len) { + i = 0; + while (i < len) { + dst[d + i] = src[s + i]; + i++; + } +} + +void utf8_string_to_uppercase(char[] str) { + p = int16 (0); + w = int16 (0); + output = {0:4}; + + while p < str.size { + codepoint = Codepoint(); + len = utf8_decode(str, p, codepoint); if (len < 1) { p++; - continue; - } - uint32_t uppercase_codepoint = to_uppercase(codepoint); - int out_len = utf8_encode(uppercase_codepoint, output); - if (out_len > 0) { - memcpy(p, output, out_len); - if (out_len != len) { - memmove(p + out_len, p + len, strlen(p + len) + 1); + } else { + uppercase_codepoint = to_uppercase(codepoint.code); + out_len = utf8_encode(uppercase_codepoint, output); + + if (out_len > 0) { + strcpy(output, 0, str, w, out_len); + w += out_len; } + + p += len; } - p += out_len; + } } -void lowerutf8str(char[] str) { - char[] p = str; - char output[4]; - i = int16 (0); - while (i < p.size) { - uint32_t codepoint; - int len = utf8_decode(p, &codepoint); +void utf8_string_to_lowercase(char[] str) { + p = int16 (0); + w = int16 (0); + output = {0:4}; + + while p < str.size { + codepoint = Codepoint(); + len = utf8_decode(str, p, codepoint); if (len < 1) { p++; - continue; - } - uint32_t lowercase_codepoint = to_lowercase(codepoint); - int out_len = utf8_encode(lowercase_codepoint, output); - if (out_len > 0) { - memcpy(p, output, out_len); - if (out_len != len) { - memmove(p + out_len, p + len, strlen(p + len) + 1); + } else { + lowercase_codepoint = to_lowercase(codepoint.code); + out_len = utf8_encode(lowercase_codepoint, output); + + if (out_len > 0) { + strcpy(output, 0, str, w, out_len); + w += out_len; } + + p += len; } - p += out_len; + } } \ No newline at end of file diff --git a/platformio/platform/__pycache__/platform.cpython-311.pyc b/platformio/platform/__pycache__/platform.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a9ed5c2fae7b8de5b69dd66c10d20eae2a97a33 GIT binary patch literal 4567 zcmb_fU2NOd6}}Wj{Y#{5$A3y}+3}CmMpo>k`B|E@iQ~Fi5HCv;bTCqIj4my!ktLU; zoJ3QKU<)v{Ffg^~7Ox0UJq($DvjpJzb#EI z+2(B&vY}ao>H7%VMcX49p|9Yvu6Y_$@1Q92A5xu*QiktxT2L0U($YCW787+X^RLn8 z>0zk;5=IiyJcZG`t%w#VOxX>Dkcf6O%Zl=rpObTn&9Gk=k%nGQfC5ZeB5NbLK^T5X{2-T- zM9dQd4L8px(t<4Wyi9b$=5_Cz@W%@%$dr`wxB*`#e^OoZOsJ`_E|oXNs)O^*!)^>R(H$+?d9V z6&byEf6>3~?O$80ddDi>F`ez&Vh5}2VA-XzQH_n(5bd8@zqS=SU5%aITvTJTT5Q&Q zsfQ;@{*qr0c5elTs==Z1xEg##3%*iAlz&POPnP`8b^rddtLl$b{E=N?r^-e&HbT_m zCdRh67b@=4`tjF`=T|SS#WY`JyQ%{+xE zqPfIQ_(F|rY36oNg96zOls#$M62N;}K)HSusOB`gYb)4fc;11HMcP+D<-MadIw1&p zK-=9gK-*T{yG`wAHrsF>y?5|BAl{|#+S_9n=-sqz9;aX{&?HS)M~H=AQgcze)CG0J z0|CmL2__r8ynyjeWMlD0E@_4-#D7W=m*l8J>Lz{Y6y^ZTLWj!UJZD0}sBeHAFwz!YwG&ZuGXO z;nwwQo->884-ett0)r1eq*HL}?~Ubx-OL79-8SACX+>W#b7(g<3ijPH9{nF^W8VvH zoS>DcRR?UId-5Jr<|u^IM&=C0+$If%9Ots(u}*w`DUp+0&^zz34(V80#Ccn6A@3Qv zeC0>8{N=M(--h~9o{lZvGH9zcX;PdO;2Cb<4Y?&TqsaL{9YB`xvjZ-Wa6~XPtH# z9`UxA$SH(xNrynu@MkmTX;weDob{^VZxA-iQOu0JaoRO&DIx z;QD!IGB;_QG;%HMR5t8nT@5eLHE^71@a_Q^whq8B^vsX99DwbP+6XAie})YL7#X+k zv%nTNT;+z#$JfuPTwLSgz`?v7YoitKAl&+a!QxD5{G+*TFZZjHAD=8;FHfo7G0i(x zLp|;eoeiz!%I`k>u)@aR-tOvMJEVgcE&H_onBLX5_8L@cZf2J1C^4nvXMweX#vNM! ziN+n<_?gO0*8+$OmtR}&`Q4ccI|=s-AWm8k7aI_jK``_1Mz6;GVDps9&Hi67IJAH0 z;hC*atQv}~FK*h@&?zl+YAf_cHT1?~@87Seq03t6a>doFca7IjulpMH#FWMJI@?(Z zy;@<(y{>HJHsAgF!%BPxZk_Ah4h>d@j#v6m6ff$Xy$?=)da`mLrglzfofCvOoHgmg zSxV=QZsfkct#WTXp~>54d)l^rJzKtks&7E&x+>j~^`mNc+$_GT4~?$(R);1lLzATo zr3)K5=-hK=o9ilN*O@=M|KP4nol_&zT4Y-7o(3m`15Xg+XP*&KGldWNdoA#_+!uE~ zzf*~x-jvkAbK2lJ)iRCVi3yAcEm*$i?#+VM*k9!^87SS)5CgvXAFK$O&ny#r#|``JqH|#PHX@h7w{r z&GS*p;**3Zy=i3{tNV|I}88- literal 0 HcmV?d00001 diff --git a/test/general/string-lower.rob b/test/general/string-lower.rob deleted file mode 100644 index ac69fe5..0000000 --- a/test/general/string-lower.rob +++ /dev/null @@ -1,12 +0,0 @@ -use string.utf8strlen; - -const str = "a1éñअ中😂👍"; - -int8 main() { - r = utf8strlen(str); - if r == 8 { - return 0; - } else { - return 1; - } -} \ No newline at end of file diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index dad00cf..f638a0a 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -1,14 +1,813 @@ -use string.upperstr; use string.equalstr; +mapping = { + 0x0061, 0x0041 , + 0x0062, 0x0042 , + 0x0063, 0x0043 , + 0x0064, 0x0044 , + 0x0065, 0x0045 , + 0x0066, 0x0046 , + 0x0067, 0x0047 , + 0x0068, 0x0048 , + 0x0069, 0x0049 , + 0x006A, 0x004A , + 0x006B, 0x004B , + 0x006C, 0x004C , + 0x006D, 0x004D , + 0x006E, 0x004E , + 0x006F, 0x004F , + 0x0070, 0x0050 , + 0x0071, 0x0051 , + 0x0072, 0x0052 , + 0x0073, 0x0053 , + 0x0074, 0x0054 , + 0x0075, 0x0055 , + 0x0076, 0x0056 , + 0x0077, 0x0057 , + 0x0078, 0x0058 , + 0x0079, 0x0059 , + 0x007A, 0x005A , + 0x00E0, 0x00C0 , + 0x00E1, 0x00C1 , + 0x00E2, 0x00C2 , + 0x00E3, 0x00C3 , + 0x00E4, 0x00C4 , + 0x00E5, 0x00C5 , + 0x00E6, 0x00C6 , + 0x00E7, 0x00C7 , + 0x00E8, 0x00C8 , + 0x00E9, 0x00C9 , + 0x00EA, 0x00CA , + 0x00EB, 0x00CB , + 0x00EC, 0x00CC , + 0x00ED, 0x00CD , + 0x00EE, 0x00CE , + 0x00EF, 0x00CF , + 0x00F0, 0x00D0 , + 0x00F1, 0x00D1 , + 0x00F2, 0x00D2 , + 0x00F3, 0x00D3 , + 0x00F4, 0x00D4 , + 0x00F5, 0x00D5 , + 0x00F6, 0x00D6 , + 0x00F8, 0x00D8 , + 0x00F9, 0x00D9 , + 0x00FA, 0x00DA , + 0x00FB, 0x00DB , + 0x00FC, 0x00DC , + 0x00FD, 0x00DD , + 0x00FE, 0x00DE , + 0x00FF, 0x0178 , + 0x0101, 0x0100 , + 0x0103, 0x0102 , + 0x0105, 0x0104 , + 0x0107, 0x0106 , + 0x0109, 0x0108 , + 0x010B, 0x010A , + 0x010D, 0x010C , + 0x010F, 0x010E , + 0x0111, 0x0110 , + 0x0113, 0x0112 , + 0x0115, 0x0114 , + 0x0117, 0x0116 , + 0x0119, 0x0118 , + 0x011B, 0x011A , + 0x011D, 0x011C , + 0x011F, 0x011E , + 0x0121, 0x0120 , + 0x0123, 0x0122 , + 0x0125, 0x0124 , + 0x0127, 0x0126 , + 0x0129, 0x0128 , + 0x012B, 0x012A , + 0x012D, 0x012C , + 0x012F, 0x012E , + 0x0131, 0x0049 , + 0x0133, 0x0132 , + 0x0135, 0x0134 , + 0x0137, 0x0136 , + 0x013A, 0x0139 , + 0x013C, 0x013B , + 0x013E, 0x013D , + 0x0140, 0x013F , + 0x0142, 0x0141 , + 0x0144, 0x0143 , + 0x0146, 0x0145 , + 0x0148, 0x0147 , + 0x014B, 0x014A , + 0x014D, 0x014C , + 0x014F, 0x014E , + 0x0151, 0x0150 , + 0x0153, 0x0152 , + 0x0155, 0x0154 , + 0x0157, 0x0156 , + 0x0159, 0x0158 , + 0x015B, 0x015A , + 0x015D, 0x015C , + 0x015F, 0x015E , + 0x0161, 0x0160 , + 0x0163, 0x0162 , + 0x0165, 0x0164 , + 0x0167, 0x0166 , + 0x0169, 0x0168 , + 0x016B, 0x016A , + 0x016D, 0x016C , + 0x016F, 0x016E , + 0x0171, 0x0170 , + 0x0173, 0x0172 , + 0x0175, 0x0174 , + 0x0177, 0x0176 , + 0x017A, 0x0179 , + 0x017C, 0x017B , + 0x017E, 0x017D , + 0x0183, 0x0182 , + 0x0185, 0x0184 , + 0x0188, 0x0187 , + 0x018C, 0x018B , + 0x0192, 0x0191 , + 0x0199, 0x0198 , + 0x01A1, 0x01A0 , + 0x01A3, 0x01A2 , + 0x01A5, 0x01A4 , + 0x01A8, 0x01A7 , + 0x01AD, 0x01AC , + 0x01B0, 0x01AF , + 0x01B4, 0x01B3 , + 0x01B6, 0x01B5 , + 0x01B9, 0x01B8 , + 0x01BD, 0x01BC , + 0x01C6, 0x01C4 , + 0x01C9, 0x01C7 , + 0x01CC, 0x01CA , + 0x01CE, 0x01CD , + 0x01D0, 0x01CF , + 0x01D2, 0x01D1 , + 0x01D4, 0x01D3 , + 0x01D6, 0x01D5 , + 0x01D8, 0x01D7 , + 0x01DA, 0x01D9 , + 0x01DC, 0x01DB , + 0x01DF, 0x01DE , + 0x01E1, 0x01E0 , + 0x01E3, 0x01E2 , + 0x01E5, 0x01E4 , + 0x01E7, 0x01E6 , + 0x01E9, 0x01E8 , + 0x01EB, 0x01EA , + 0x01ED, 0x01EC , + 0x01EF, 0x01EE , + 0x01F3, 0x01F1 , + 0x01F5, 0x01F4 , + 0x01FB, 0x01FA , + 0x01FD, 0x01FC , + 0x01FF, 0x01FE , + 0x0201, 0x0200 , + 0x0203, 0x0202 , + 0x0205, 0x0204 , + 0x0207, 0x0206 , + 0x0209, 0x0208 , + 0x020B, 0x020A , + 0x020D, 0x020C , + 0x020F, 0x020E , + 0x0211, 0x0210 , + 0x0213, 0x0212 , + 0x0215, 0x0214 , + 0x0217, 0x0216 , + 0x0253, 0x0181 , + 0x0254, 0x0186 , + 0x0257, 0x018A , + 0x0258, 0x018E , + 0x0259, 0x018F , + 0x025B, 0x0190 , + 0x0260, 0x0193 , + 0x0263, 0x0194 , + 0x0268, 0x0197 , + 0x0269, 0x0196 , + 0x026F, 0x019C , + 0x0272, 0x019D , + 0x0275, 0x019F , + 0x0283, 0x01A9 , + 0x0288, 0x01AE , + 0x028A, 0x01B1 , + 0x028B, 0x01B2 , + 0x0292, 0x01B7 , + 0x03AC, 0x0386 , + 0x03AD, 0x0388 , + 0x03AE, 0x0389 , + 0x03AF, 0x038A , + 0x03B1, 0x0391 , + 0x03B2, 0x0392 , + 0x03B3, 0x0393 , + 0x03B4, 0x0394 , + 0x03B5, 0x0395 , + 0x03B6, 0x0396 , + 0x03B7, 0x0397 , + 0x03B8, 0x0398 , + 0x03B9, 0x0399 , + 0x03BA, 0x039A , + 0x03BB, 0x039B , + 0x03BC, 0x039C , + 0x03BD, 0x039D , + 0x03BE, 0x039E , + 0x03BF, 0x039F , + 0x03C0, 0x03A0 , + 0x03C1, 0x03A1 , + 0x03C3, 0x03A3 , + 0x03C4, 0x03A4 , + 0x03C5, 0x03A5 , + 0x03C6, 0x03A6 , + 0x03C7, 0x03A7 , + 0x03C8, 0x03A8 , + 0x03C9, 0x03A9 , + 0x03CA, 0x03AA , + 0x03CB, 0x03AB , + 0x03CC, 0x038C , + 0x03CD, 0x038E , + 0x03CE, 0x038F , + 0x03E3, 0x03E2 , + 0x03E5, 0x03E4 , + 0x03E7, 0x03E6 , + 0x03E9, 0x03E8 , + 0x03EB, 0x03EA , + 0x03ED, 0x03EC , + 0x03EF, 0x03EE , + 0x0430, 0x0410 , + 0x0431, 0x0411 , + 0x0432, 0x0412 , + 0x0433, 0x0413 , + 0x0434, 0x0414 , + 0x0435, 0x0415 , + 0x0436, 0x0416 , + 0x0437, 0x0417 , + 0x0438, 0x0418 , + 0x0439, 0x0419 , + 0x043A, 0x041A , + 0x043B, 0x041B , + 0x043C, 0x041C , + 0x043D, 0x041D , + 0x043E, 0x041E , + 0x043F, 0x041F , + 0x0440, 0x0420 , + 0x0441, 0x0421 , + 0x0442, 0x0422 , + 0x0443, 0x0423 , + 0x0444, 0x0424 , + 0x0445, 0x0425 , + 0x0446, 0x0426 , + 0x0447, 0x0427 , + 0x0448, 0x0428 , + 0x0449, 0x0429 , + 0x044A, 0x042A , + 0x044B, 0x042B , + 0x044C, 0x042C , + 0x044D, 0x042D , + 0x044E, 0x042E , + 0x044F, 0x042F , + 0x0451, 0x0401 , + 0x0452, 0x0402 , + 0x0453, 0x0403 , + 0x0454, 0x0404 , + 0x0455, 0x0405 , + 0x0456, 0x0406 , + 0x0457, 0x0407 , + 0x0458, 0x0408 , + 0x0459, 0x0409 , + 0x045A, 0x040A , + 0x045B, 0x040B , + 0x045C, 0x040C , + 0x045E, 0x040E , + 0x045F, 0x040F , + 0x0461, 0x0460 , + 0x0463, 0x0462 , + 0x0465, 0x0464 , + 0x0467, 0x0466 , + 0x0469, 0x0468 , + 0x046B, 0x046A , + 0x046D, 0x046C , + 0x046F, 0x046E , + 0x0471, 0x0470 , + 0x0473, 0x0472 , + 0x0475, 0x0474 , + 0x0477, 0x0476 , + 0x0479, 0x0478 , + 0x047B, 0x047A , + 0x047D, 0x047C , + 0x047F, 0x047E , + 0x0481, 0x0480 , + 0x0491, 0x0490 , + 0x0493, 0x0492 , + 0x0495, 0x0494 , + 0x0497, 0x0496 , + 0x0499, 0x0498 , + 0x049B, 0x049A , + 0x049D, 0x049C , + 0x049F, 0x049E , + 0x04A1, 0x04A0 , + 0x04A3, 0x04A2 , + 0x04A5, 0x04A4 , + 0x04A7, 0x04A6 , + 0x04A9, 0x04A8 , + 0x04AB, 0x04AA , + 0x04AD, 0x04AC , + 0x04AF, 0x04AE , + 0x04B1, 0x04B0 , + 0x04B3, 0x04B2 , + 0x04B5, 0x04B4 , + 0x04B7, 0x04B6 , + 0x04B9, 0x04B8 , + 0x04BB, 0x04BA , + 0x04BD, 0x04BC , + 0x04BF, 0x04BE , + 0x04C2, 0x04C1 , + 0x04C4, 0x04C3 , + 0x04C8, 0x04C7 , + 0x04CC, 0x04CB , + 0x04D1, 0x04D0 , + 0x04D3, 0x04D2 , + 0x04D5, 0x04D4 , + 0x04D7, 0x04D6 , + 0x04D9, 0x04D8 , + 0x04DB, 0x04DA , + 0x04DD, 0x04DC , + 0x04DF, 0x04DE , + 0x04E1, 0x04E0 , + 0x04E3, 0x04E2 , + 0x04E5, 0x04E4 , + 0x04E7, 0x04E6 , + 0x04E9, 0x04E8 , + 0x04EB, 0x04EA , + 0x04EF, 0x04EE , + 0x04F1, 0x04F0 , + 0x04F3, 0x04F2 , + 0x04F5, 0x04F4 , + 0x04F9, 0x04F8 , + 0x0561, 0x0531 , + 0x0562, 0x0532 , + 0x0563, 0x0533 , + 0x0564, 0x0534 , + 0x0565, 0x0535 , + 0x0566, 0x0536 , + 0x0567, 0x0537 , + 0x0568, 0x0538 , + 0x0569, 0x0539 , + 0x056A, 0x053A , + 0x056B, 0x053B , + 0x056C, 0x053C , + 0x056D, 0x053D , + 0x056E, 0x053E , + 0x056F, 0x053F , + 0x0570, 0x0540 , + 0x0571, 0x0541 , + 0x0572, 0x0542 , + 0x0573, 0x0543 , + 0x0574, 0x0544 , + 0x0575, 0x0545 , + 0x0576, 0x0546 , + 0x0577, 0x0547 , + 0x0578, 0x0548 , + 0x0579, 0x0549 , + 0x057A, 0x054A , + 0x057B, 0x054B , + 0x057C, 0x054C , + 0x057D, 0x054D , + 0x057E, 0x054E , + 0x057F, 0x054F , + 0x0580, 0x0550 , + 0x0581, 0x0551 , + 0x0582, 0x0552 , + 0x0583, 0x0553 , + 0x0584, 0x0554 , + 0x0585, 0x0555 , + 0x0586, 0x0556 , + 0x10D0, 0x10A0 , + 0x10D1, 0x10A1 , + 0x10D2, 0x10A2 , + 0x10D3, 0x10A3 , + 0x10D4, 0x10A4 , + 0x10D5, 0x10A5 , + 0x10D6, 0x10A6 , + 0x10D7, 0x10A7 , + 0x10D8, 0x10A8 , + 0x10D9, 0x10A9 , + 0x10DA, 0x10AA , + 0x10DB, 0x10AB , + 0x10DC, 0x10AC , + 0x10DD, 0x10AD , + 0x10DE, 0x10AE , + 0x10DF, 0x10AF , + 0x10E0, 0x10B0 , + 0x10E1, 0x10B1 , + 0x10E2, 0x10B2 , + 0x10E3, 0x10B3 , + 0x10E4, 0x10B4 , + 0x10E5, 0x10B5 , + 0x10E6, 0x10B6 , + 0x10E7, 0x10B7 , + 0x10E8, 0x10B8 , + 0x10E9, 0x10B9 , + 0x10EA, 0x10BA , + 0x10EB, 0x10BB , + 0x10EC, 0x10BC , + 0x10ED, 0x10BD , + 0x10EE, 0x10BE , + 0x10EF, 0x10BF , + 0x10F0, 0x10C0 , + 0x10F1, 0x10C1 , + 0x10F2, 0x10C2 , + 0x10F3, 0x10C3 , + 0x10F4, 0x10C4 , + 0x10F5, 0x10C5 , + 0x1E01, 0x1E00 , + 0x1E03, 0x1E02 , + 0x1E05, 0x1E04 , + 0x1E07, 0x1E06 , + 0x1E09, 0x1E08 , + 0x1E0B, 0x1E0A , + 0x1E0D, 0x1E0C , + 0x1E0F, 0x1E0E , + 0x1E11, 0x1E10 , + 0x1E13, 0x1E12 , + 0x1E15, 0x1E14 , + 0x1E17, 0x1E16 , + 0x1E19, 0x1E18 , + 0x1E1B, 0x1E1A , + 0x1E1D, 0x1E1C , + 0x1E1F, 0x1E1E , + 0x1E21, 0x1E20 , + 0x1E23, 0x1E22 , + 0x1E25, 0x1E24 , + 0x1E27, 0x1E26 , + 0x1E29, 0x1E28 , + 0x1E2B, 0x1E2A , + 0x1E2D, 0x1E2C , + 0x1E2F, 0x1E2E , + 0x1E31, 0x1E30 , + 0x1E33, 0x1E32 , + 0x1E35, 0x1E34 , + 0x1E37, 0x1E36 , + 0x1E39, 0x1E38 , + 0x1E3B, 0x1E3A , + 0x1E3D, 0x1E3C , + 0x1E3F, 0x1E3E , + 0x1E41, 0x1E40 , + 0x1E43, 0x1E42 , + 0x1E45, 0x1E44 , + 0x1E47, 0x1E46 , + 0x1E49, 0x1E48 , + 0x1E4B, 0x1E4A , + 0x1E4D, 0x1E4C , + 0x1E4F, 0x1E4E , + 0x1E51, 0x1E50 , + 0x1E53, 0x1E52 , + 0x1E55, 0x1E54 , + 0x1E57, 0x1E56 , + 0x1E59, 0x1E58 , + 0x1E5B, 0x1E5A , + 0x1E5D, 0x1E5C , + 0x1E5F, 0x1E5E , + 0x1E61, 0x1E60 , + 0x1E63, 0x1E62 , + 0x1E65, 0x1E64 , + 0x1E67, 0x1E66 , + 0x1E69, 0x1E68 , + 0x1E6B, 0x1E6A , + 0x1E6D, 0x1E6C , + 0x1E6F, 0x1E6E , + 0x1E71, 0x1E70 , + 0x1E73, 0x1E72 , + 0x1E75, 0x1E74 , + 0x1E77, 0x1E76 , + 0x1E79, 0x1E78 , + 0x1E7B, 0x1E7A , + 0x1E7D, 0x1E7C , + 0x1E7F, 0x1E7E , + 0x1E81, 0x1E80 , + 0x1E83, 0x1E82 , + 0x1E85, 0x1E84 , + 0x1E87, 0x1E86 , + 0x1E89, 0x1E88 , + 0x1E8B, 0x1E8A , + 0x1E8D, 0x1E8C , + 0x1E8F, 0x1E8E , + 0x1E91, 0x1E90 , + 0x1E93, 0x1E92 , + 0x1E95, 0x1E94 , + 0x1EA1, 0x1EA0 , + 0x1EA3, 0x1EA2 , + 0x1EA5, 0x1EA4 , + 0x1EA7, 0x1EA6 , + 0x1EA9, 0x1EA8 , + 0x1EAB, 0x1EAA , + 0x1EAD, 0x1EAC , + 0x1EAF, 0x1EAE , + 0x1EB1, 0x1EB0 , + 0x1EB3, 0x1EB2 , + 0x1EB5, 0x1EB4 , + 0x1EB7, 0x1EB6 , + 0x1EB9, 0x1EB8 , + 0x1EBB, 0x1EBA , + 0x1EBD, 0x1EBC , + 0x1EBF, 0x1EBE , + 0x1EC1, 0x1EC0 , + 0x1EC3, 0x1EC2 , + 0x1EC5, 0x1EC4 , + 0x1EC7, 0x1EC6 , + 0x1EC9, 0x1EC8 , + 0x1ECB, 0x1ECA , + 0x1ECD, 0x1ECC , + 0x1ECF, 0x1ECE , + 0x1ED1, 0x1ED0 , + 0x1ED3, 0x1ED2 , + 0x1ED5, 0x1ED4 , + 0x1ED7, 0x1ED6 , + 0x1ED9, 0x1ED8 , + 0x1EDB, 0x1EDA , + 0x1EDD, 0x1EDC , + 0x1EDF, 0x1EDE , + 0x1EE1, 0x1EE0 , + 0x1EE3, 0x1EE2 , + 0x1EE5, 0x1EE4 , + 0x1EE7, 0x1EE6 , + 0x1EE9, 0x1EE8 , + 0x1EEB, 0x1EEA , + 0x1EED, 0x1EEC , + 0x1EEF, 0x1EEE , + 0x1EF1, 0x1EF0 , + 0x1EF3, 0x1EF2 , + 0x1EF5, 0x1EF4 , + 0x1EF7, 0x1EF6 , + 0x1EF9, 0x1EF8 , + 0x1F00, 0x1F08 , + 0x1F01, 0x1F09 , + 0x1F02, 0x1F0A , + 0x1F03, 0x1F0B , + 0x1F04, 0x1F0C , + 0x1F05, 0x1F0D , + 0x1F06, 0x1F0E , + 0x1F07, 0x1F0F , + 0x1F10, 0x1F18 , + 0x1F11, 0x1F19 , + 0x1F12, 0x1F1A , + 0x1F13, 0x1F1B , + 0x1F14, 0x1F1C , + 0x1F15, 0x1F1D , + 0x1F20, 0x1F28 , + 0x1F21, 0x1F29 , + 0x1F22, 0x1F2A , + 0x1F23, 0x1F2B , + 0x1F24, 0x1F2C , + 0x1F25, 0x1F2D , + 0x1F26, 0x1F2E , + 0x1F27, 0x1F2F , + 0x1F30, 0x1F38 , + 0x1F31, 0x1F39 , + 0x1F32, 0x1F3A , + 0x1F33, 0x1F3B , + 0x1F34, 0x1F3C , + 0x1F35, 0x1F3D , + 0x1F36, 0x1F3E , + 0x1F37, 0x1F3F , + 0x1F40, 0x1F48 , + 0x1F41, 0x1F49 , + 0x1F42, 0x1F4A , + 0x1F43, 0x1F4B , + 0x1F44, 0x1F4C , + 0x1F45, 0x1F4D , + 0x1F51, 0x1F59 , + 0x1F53, 0x1F5B , + 0x1F55, 0x1F5D , + 0x1F57, 0x1F5F , + 0x1F60, 0x1F68 , + 0x1F61, 0x1F69 , + 0x1F62, 0x1F6A , + 0x1F63, 0x1F6B , + 0x1F64, 0x1F6C , + 0x1F65, 0x1F6D , + 0x1F66, 0x1F6E , + 0x1F67, 0x1F6F , + 0x1F80, 0x1F88 , + 0x1F81, 0x1F89 , + 0x1F82, 0x1F8A , + 0x1F83, 0x1F8B , + 0x1F84, 0x1F8C , + 0x1F85, 0x1F8D , + 0x1F86, 0x1F8E , + 0x1F87, 0x1F8F , + 0x1F90, 0x1F98 , + 0x1F91, 0x1F99 , + 0x1F92, 0x1F9A , + 0x1F93, 0x1F9B , + 0x1F94, 0x1F9C , + 0x1F95, 0x1F9D , + 0x1F96, 0x1F9E , + 0x1F97, 0x1F9F , + 0x1FA0, 0x1FA8 , + 0x1FA1, 0x1FA9 , + 0x1FA2, 0x1FAA , + 0x1FA3, 0x1FAB , + 0x1FA4, 0x1FAC , + 0x1FA5, 0x1FAD , + 0x1FA6, 0x1FAE , + 0x1FA7, 0x1FAF , + 0x1FB0, 0x1FB8 , + 0x1FB1, 0x1FB9 , + 0x1FD0, 0x1FD8 , + 0x1FD1, 0x1FD9 , + 0x1FE0, 0x1FE8 , + 0x1FE1, 0x1FE9 , + 0x24D0, 0x24B6 , + 0x24D1, 0x24B7 , + 0x24D2, 0x24B8 , + 0x24D3, 0x24B9 , + 0x24D4, 0x24BA , + 0x24D5, 0x24BB , + 0x24D6, 0x24BC , + 0x24D7, 0x24BD , + 0x24D8, 0x24BE , + 0x24D9, 0x24BF , + 0x24DA, 0x24C0 , + 0x24DB, 0x24C1 , + 0x24DC, 0x24C2 , + 0x24DD, 0x24C3 , + 0x24DE, 0x24C4 , + 0x24DF, 0x24C5 , + 0x24E0, 0x24C6 , + 0x24E1, 0x24C7 , + 0x24E2, 0x24C8 , + 0x24E3, 0x24C9 , + 0x24E4, 0x24CA , + 0x24E5, 0x24CB , + 0x24E6, 0x24CC , + 0x24E7, 0x24CD , + 0x24E8, 0x24CE , + 0x24E9, 0x24CF , + 0xFF41, 0xFF21 , + 0xFF42, 0xFF22 , + 0xFF43, 0xFF23 , + 0xFF44, 0xFF24 , + 0xFF45, 0xFF25 , + 0xFF46, 0xFF26 , + 0xFF47, 0xFF27 , + 0xFF48, 0xFF28 , + 0xFF49, 0xFF29 , + 0xFF4A, 0xFF2A , + 0xFF4B, 0xFF2B , + 0xFF4C, 0xFF2C , + 0xFF4D, 0xFF2D , + 0xFF4E, 0xFF2E , + 0xFF4F, 0xFF2F , + 0xFF50, 0xFF30 , + 0xFF51, 0xFF31 , + 0xFF52, 0xFF32 , + 0xFF53, 0xFF33 , + 0xFF54, 0xFF34 , + 0xFF55, 0xFF35 , + 0xFF56, 0xFF36 , + 0xFF57, 0xFF37 , + 0xFF58, 0xFF38 , + 0xFF59, 0xFF39 , + 0xFF5A, 0xFF3A +}; + + type Codepoint { + code = int32(0); + } + + int8 utf8_decode(char[] s, int16 i, Codepoint c) { + if (s[i] < 0x80) { + c.code = s[i]; + return 1; // 1 byte + } else if ((s[i] & 0xE0) == 0xC0) { + c.code = ((s[i] & 0x1F) << 6) | (s[1] & 0x3F); + return 2; // 2 bytes + } else if ((s[i] & 0xF0) == 0xE0) { + c.code = ((s[i] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); + return 3; // 3 bytes + } else if ((s[i] & 0xF8) == 0xF0) { + c.code = ((s[i] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); + return 4; // 4 bytes + } + return -1; + } + + int8 utf8_encode(int32 codepoint, char[] output) { + if (codepoint <= 0x7F) { + output[0] = codepoint & 0x7F; + return 1; // 1 byte + } else if (codepoint <= 0x7FF) { + output[0] = 0xC0 | ((codepoint >> 6) & 0x1F); + output[1] = 0x80 | (codepoint & 0x3F); + return 2; // 2 bytes + } else if (codepoint <= 0xFFFF) { + output[0] = 0xE0 | ((codepoint >> 12) & 0x0F); + output[1] = 0x80 | ((codepoint >> 6) & 0x3F); + output[2] = 0x80 | (codepoint & 0x3F); + return 3; // 3 bytes + } else if (codepoint <= 0x10FFFF) { + output[0] = 0xF0 | ((codepoint >> 18) & 0x07); + output[1] = 0x80 | ((codepoint >> 12) & 0x3F); + output[2] = 0x80 | ((codepoint >> 6) & 0x3F); + output[3] = 0x80 | (codepoint & 0x3F); + return 4; // 4 bytes + } + return -1; + } + + int32 to_uppercase(int32 codepoint) { + i = uint16(0); + while i < mapping.size { + if mapping[i + 1] == codepoint { + return mapping[i]; + } + i += 2; + } + + if (codepoint >= 0x61 and codepoint <= 0x7A) { + return codepoint & 0x5F; + } + return codepoint; + } + + int32 to_lowercase(int32 codepoint) { + i = uint16(0); + while i < mapping.size { + if mapping[i] == codepoint { + return mapping[i + 1]; + } + i += 2; + } + + if (codepoint >= 0x41 and codepoint <= 0x5A) { + return codepoint | 0x20; + } + return codepoint; + } + + void strcpy (char[] src, int16 s, char[] dst, int16 d, int16 len) { + i = 0; + while (i < len) { + dst[d + i] = src[s + i]; + i++; + } + } + + void utf8_string_to_uppercase(char[] str) { + p = int16 (0); + w = int16 (0); + output = {0:4}; + + while p < str.size { + codepoint = Codepoint(); + len = utf8_decode(str, p, codepoint); + if (len < 1) { + p++; + } else { + uppercase_codepoint = to_uppercase(codepoint.code); + out_len = utf8_encode(uppercase_codepoint, output); + + if (out_len > 0) { + strcpy(output, 0, str, w, out_len); + w += out_len; + } + + p += len; + } + + } + } + + void utf8_string_to_lowercase(char[] str) { + p = int16 (0); + w = int16 (0); + output = {0:4}; + + while p < str.size { + codepoint = Codepoint(); + len = utf8_decode(str, p, codepoint); + if (len < 1) { + p++; + } else { + lowercase_codepoint = to_lowercase(codepoint.code); + out_len = utf8_encode(lowercase_codepoint, output); + + if (out_len > 0) { + strcpy(output, 0, str, w, out_len); + w += out_len; + } + + p += len; + } + + } + } + int8 main() { - str_upper = "olá, mundo! áéíóú ç ñ abc"; - str_lower = "OLÁ, MUNDO! ÁÉÍÓÚ Ç Ñ ABC"; - upperutf8str(str_upper); - lowerutf8str(str_lower); + const l_str = "a"; + + utf8_string_to_uppercase(l_str); - if equalstr (str_upper, "OLÁ, MUNDO! ÁÉÍÓÚ Ç Ñ ABC") { + if equalstr (l_str, "A") { return 0; } else { return 1; From 6394da950687ae75caf13c6f1a2b3849f6270636 Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Mon, 30 Sep 2024 12:14:14 -0300 Subject: [PATCH 05/24] Add basic float support to atmega and implements a bitcast operator --- lib/avr5.S | 839 ++++++++++++++++++++++++++++++++++++++ lib/math/float.rob | 17 + src/BitCast.cpp | 9 + src/BitCast.h | 29 ++ src/FunctionAttributes.h | 1 + src/FunctionDecl.cpp | 4 + src/Header.h | 1 + src/Language.l | 1 + src/Language.y | 12 +- src/LanguageHeader.y | 2 +- src/LanguageUse.y | 1 + src/PropagateTypes.cpp | 16 + src/PropagateTypes.h | 7 +- src/Visitor.h | 2 + test/atmega328p/float.rob | 69 ++++ test/general/float.rob | 1 + 16 files changed, 1007 insertions(+), 4 deletions(-) create mode 100644 lib/math/float.rob create mode 100644 src/BitCast.cpp create mode 100644 src/BitCast.h create mode 100644 test/atmega328p/float.rob create mode 120000 test/general/float.rob diff --git a/lib/avr5.S b/lib/avr5.S index 2e1e9d5..52a11e2 100644 --- a/lib/avr5.S +++ b/lib/avr5.S @@ -349,3 +349,842 @@ DEFUN memset ret ENDF memset +/* + * The assembly code below implements float32 functions and was slight + * adapted from avrlibc/libm (https://github.com/avrdudes/avr-libc) + * by thborges, 29-Sep-2024. + */ + +/* Copyright (c) 2002 Michael Stumpf + Copyright (c) 2006 Dmitry Xmelkov + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +#define rB0 r18 +#define rB1 r19 +#define rB2 r20 +#define rB3 r21 +#define rA0 r22 +#define rA1 r23 +#define rA2 r24 +#define rA3 r25 +#define rBE r26 +#define rAE r27 + + +DEFUN __subsf3 + subi rB3, 0x80 ; complement sign bit of B +DEFUN __addsf3 + clr rAE + clr rBE + rcall __addsf3x + rjmp __fp_round +ENDF __subsf3 + + + + +DEFUN __fp_pscA + clr r0 + dec r0 + cp r1, rA0 + cpc r1, rA1 + cpc r1, rA2 + cpc r0, rA3 + ret +ENDF __fp_pscA + + +DEFUN __fp_pscB + clr r0 + dec r0 + cp r1, rB0 + cpc r1, rB1 + cpc r1, rB2 + cpc r0, rB3 + ret +ENDF __fp_pscB + + +DEFUN __fp_nan + ldi rA3, 0xFF + ldi rA2, 0xC0 + ret +ENDF __fp_nan + + +DEFUN __fp_inf + bld rA3, 7 ; sign + ori rA3, 0x7f + ldi rA2, 0x80 + ldi rA1, 0 + ldi rA0, 0 + ret +ENDF __fp_inf + + +__addsf3xexit: + rcall __fp_pscA + brcs .L_nan + rcall __fp_pscB + brcs .L_nan + brne .L_inf ; B is finite --> return A + cpi rA3, 255 + brne .L_infB ; A is finite --> return B + brtc .L_inf ; Inf + Inf with the same sign +.L_nan: + rjmp __fp_nan +.L_infB: + brtc .L_inf + com ZL +.L_inf: + bst ZL, 7 + rjmp __fp_inf + +DEFUN __addsf3x + mov ZL, rA3 ; save sign of A + rcall __fp_split3 + brcs __addsf3xexit + ; compare A and B + cp rAE, rBE + cpc rA0, rB0 + cpc rA1, rB1 + cpc rA2, rB2 + cpc rA3, rB3 + brlo 2f ; fabs(A) < fabs(B) + brne 4f ; fabs(A) > fabs(B) + brtc .L_add + rjmp __fp_zero ; A + (-A) = +0.0 + ; swap A and B +2: brtc 3f + com ZL ; update sign +3: mov r0, rAE + mov rAE, rBE + mov rBE, r0 + movw r0, rA0 + movw rA0, rB0 + movw rB0, r0 + movw r0, rA2 + movw rA2, rB2 + movw rB2, r0 + clr r1 +4: clr ZH + sub rB3, rA3 +5: breq 7f ; shift is not needed + cpi rB3, -7 + brsh 6f + cpi rB3, -32 + brlo .L_ret + cp r1, rBE + sbci ZH, 0 + mov rBE, rB0 + mov rB0, rB1 + mov rB1, rB2 + clr rB2 + subi rB3, -8 + rjmp 5b + +6: lsr rB2 + ror rB1 + ror rB0 + ror rBE + sbci ZH, 0 + inc rB3 + brne 6b + +7: + ; direction ? + brtc .L_add + ; A -= B + cp r1, ZH + sbc rAE, rBE + sbc rA0, rB0 + sbc rA1, rB1 + sbc rA2, rB2 + brmi .L_ret +8: subi rA3, 1 + breq 9f + lsl ZH + rol rAE + rol rA0 + rol rA1 + rol rA2 + brpl 8b + rjmp .L_ret + +.L_add: + add rAE, rBE + adc rA0, rB0 + adc rA1, rB1 + adc rA2, rB2 + brcc .L_ret + ror rA2 + ror rA1 + ror rA0 + ror rAE + ror ZH + cpi rA3, 254 + brlo 9f + rjmp .L_inf +9: inc rA3 +.L_ret: + lsl rA2 + brcs 1f + clr rA3 +1: lsl ZL ; sign + ror rA3 + ror rA2 + ret +ENDF __addsf3x + + +DEFUN __fp_zero + clt +DEFUN __fp_szero + clr rAE + clr rA0 + clr rA1 + wmov rA2, rA0 + bld rA3, 7 + ret +ENDF __fp_szero + + +DEFUN __fp_split3 + ; rA3[7] := sign(A) ^ sign(B) + sbrc rB3, 7 + subi rA3, 0x80 + ; split B + lsl rB2 + rol rB3 ; exponent + breq 4f + cpi rB3, 0xff ; C = 1, if rB3 != 0xff + breq 5f +1: ror rB2 ; restore rB2 and (possible) hidden bit +; __fp_splitA (float A); +DEFUN __fp_splitA + lsl rA2 +2: bst rA3, 7 + rol rA3 + breq 6f + cpi rA3, 0xff + breq 7f +3: ror rA2 + ret + + ; B is zero or subnormal +4: cp r1, rB0 + cpc r1, rB1 + cpc r1, rB2 ; C = 1, if B is not a zero + rol rB3 ; C = 0 + rjmp 1b + ; B is not a finite +5: lsr rB2 + rcall __fp_splitA + rjmp 8f + + ; A is zero or subnormal +6: cp r1, rA0 + cpc r1, rA1 + cpc r1, rA2 + rol rA3 + rjmp 3b + ; A is not a finite +7: lsr rA2 ; C = 0 + cpc rA1, r1 + cpc rA0, r1 +8: sec + ret +ENDF __fp_split3 + + +DEFUN __fixsfsi + rcall __fixunssfsi + set + cpse rAE, r1 ; error flag + rjmp __fp_szero ; return 0x80000000 + ret +ENDF __fixsfsi + + +DEFUN __fixunssfsi + rcall __fp_splitA + brcs .L_err + ; A is finite + subi rA3, 127 ; exponent field of 1.0 + brlo .L_zr + ; fabs(A) >= 1.0 + mov rAE, rA3 + clr rA3 + subi rAE, 23 + brlo 4f ; shift to right + breq .L_sign ; no shift + ; fabs(A) >= 0x0.800000p+25 To reduce code size we will not check + ; number of shifts. Instead we will check a MSB of result. +1: lsl rA0 + rol rA1 + rol rA2 + rol rA3 + brmi 2f ; next shift is impossible: data lost + dec rAE + brne 1b + rjmp .L_sign + +2: cpi rAE, 1 + breq .L_sign ; rAE: overflow for 'signed long' usage + +.L_err: rcall __fp_zero + ldi rAE, 1 ; error flag + ret + +.L_zr: rjmp __fp_zero ; return 0x00000000, clear rAE + + ; fabs(A) <= 0x0.ffffffp+23 + ; Shift A to right by 1 (rA3==-1) .. 23 (rA3==-23) positions. + +3: mov rA0, rA1 + mov rA1, rA2 + clr rA2 + subi rAE, -8 + breq .L_sign + +4: cpi rAE, -7 + brlt 3b ; quick shift is possible + +5: lsr rA2 + ror rA1 + ror rA0 + inc rAE + brne 5b + + ; restore the sign and return +.L_sign: + brtc 6f + com rA3 + com rA2 + com rA1 + neg rA0 + sbci rA1, -1 + sbci rA2, -1 + sbci rA3, -1 +6: ret + +ENDF __fixunssfsi + + +DEFUN __fp_round + ; is A finite ? + mov r0, rA3 + inc r0 + lsl r0 + brne 1f + tst rA2 + brmi 3f ; no, A is not a finite number + ; rounding +1: lsl rAE + brcc 3f + or rAE, ZH + brne 2f + sbrs rA0, 0 ; round to even + rjmp 3f +2: subi rA0, -1 + sbci rA1, -1 + sbci rA2, -1 + sbci rA3, -1 + +3: ret +ENDF __fp_round + +#define ret_lo r24 +DEFUN __cmpsf2 +DEFUN __eqsf2 +DEFUN __nesf2 +DEFUN __ltsf2 +DEFUN __lesf2 + rcall __fp_cmp + brcc 1f + ldi ret_lo, 1 +1: ret +ENDF __cmpsf2 + +DEFUN __fp_cmp + lsl rA3 + sbc r0, r0 ; r0 = (A < 0) ? -1 : 0 + lsl rB3 + sbc rBE, rBE ; rBE = (B < 0) ? -1 : 0 + ; isnan(A) ? + ldi ZL, 0x80 ; NaN: 0x{f/7}f800001..0x{f/7}fffffff + ldi ZH, 0xfe + cp r1, rA0 + cpc r1, rA1 + cpc ZL, rA2 + cpc ZH, rA3 + brlo 9f ; branch, if C == 1 + ; isnan(B) ? + cp r1, rB0 + cpc r1, rB1 + cpc ZL, rB2 + cpc ZH, rB3 + brlo 9f ; branch, if C == 1 + ; compare + sub rA0, rB0 + sbc rA1, rB1 + sbc rA2, rB2 + sbc rA3, rB3 ; C is set, if A < B + brne 1f + ; absolute values are equal, check signs + eor r0, rBE + breq 9f ; if branch, rA2 = 0, C = 0 + ; force -0.0 == +0.0 + or rB0, rB1 + or rB0, rB2 + or rB0, rB3 + brne 2f ; evaluate sign(B) + ret + ; view argument signes +1: eor r0, rBE ; C is not changed + brne 2f ; signs are different + sbci rBE, 1 ; rBE[0] = (A < B && A > 0) ? 0 : 1 +2: lsr rBE ; C = above result OR sign(B) + ; build return value, C is set, if A > B + ldi rA2, -1 + adc rA2, r1 + adc rA2, r1 ; C = 0 at any case +9: ret +ENDF __fp_cmp + + +DEFUN __unordsf2 + rcall __fp_cmp ; return C=1, if any of args is NaN + sbc r24, r24 + sbc r25, r25 + ret +ENDF __unordsf2 + + +DEFUN __mulsf3 + rcall __mulsf3x + rjmp __fp_round +ENDF __mulsf3 + + +__mulsf3x_exit: +0: rcall __fp_pscA + brcs 1f + rcall __fp_pscB + brcs 1f + and rA3, rB3 ; one of args is 0xff + breq 1f + rjmp __fp_inf ; nonzero * Inf --> Inf +1: rjmp __fp_nan ; 0 * Inf --> NaN +2: clr r1 ; after 'mul rA3,rB3' + rjmp __fp_szero + +DEFUN __mulsf3x + rcall __fp_split3 + brcs 0b + +DEFUN __mulsf3_pse ; post split entry + ; check zero + mul rA3, rB3 ; r1 would be clean + breq 2b + ; rB3.rA3 := rA3 + rB3 + add rA3, rB3 + ldi rB3, 0 + adc rB3, rB3 + + ; multiplication: rA2.rA1.rA0 * rB2.rB1.rB0 --> rA2.rA1.rA0.rAE.ZH.ZL + + ; ZH.ZL = rA0 * rB0 + mul rA0, rB0 + movw ZL, r0 + ; rAE.ZH += rA1 * rB0 + mul rA1, rB0 + clr rAE + add ZH, r0 + adc rAE, r1 + ; rBE.rAE.ZH = rAE.ZH + rA0 * rB1 + mul rA0, rB1 + clr rBE + add ZH, r0 + adc rAE, r1 + adc rBE, rBE + ; rA0.rBE.rAE = rBE.rAE + rA0 * rB2 + mul rA0, rB2 + clr rA0 + add rAE, r0 + adc rBE, r1 + adc rA0, rA0 + ; rA0.rBE.rAE += rA2 * rB0 + mul rA2, rB0 + clr rB0 + add rAE, r0 + adc rBE, r1 + adc rA0, rB0 + ; rA0.rBE.rAE += rA1 * rB1 + mul rA1, rB1 + add rAE, r0 + adc rBE, r1 + adc rA0, rB0 ; rB0 == 0 + ; rB0.rA0.rBE = rA0.rBE + rA2 * rB1 + mul rA2, rB1 + add rBE, r0 + adc rA0, r1 + adc rB0, rB0 ; rB0 was 0 + ; rB0.rA0.rBE += rA1 * rB2 + mul rA1, rB2 + clr rB1 + add rBE, r0 + adc rA0, r1 + adc rB0, rB1 + ; rB0.rA0 += rA2 * rB2 + mul rA2, rB2 + add rA0, r0 + adc rB0, r1 + ; move result: rA2.rA1.rA0.rAE.ZH.ZL = rB0.rA0.rBE.rAE.ZH.ZL + mov rA2, rB0 + mov rA1, rA0 + mov rA0, rBE + ; __zero_reg__ + clr r1 + + ; exponent -= 127 (Why not 126? For compare convenience.) + subi rA3, 0x7F ;lo8(127) + sbci rB3, 0x00 ;hi8(127) + brmi 13f ; denormalization is needed + breq 15f ; normalization is impossible + ; result exponent > min ==> normalization is possible +10: tst rA2 + brmi 11f ; mantissa is normal + ; mantissa <<= 1 + lsl ZL + rol ZH + rol rAE + rol rA0 + rol rA1 + rol rA2 + ; exponent -= 1 + subi rA3, 0x01 ;lo8(1) + sbci rB3, 0x00 ;hi8(1) + brne 10b + ; check to overflow +11: cpi rA3, 254 + cpc rB3, r1 + brlo 15f + rjmp __fp_inf + ; check lowest value of exponent to avoid long operation +12: rjmp __fp_szero +13: cpi rB3, 0xFF ;hi8(-24) ; here rB3 < 0 + brlt 12b + cpi rA3, 0XE8 ;lo8(-24) + brlt 12b + ; mantissa >>= -rA3 +14: lsr rA2 + ror rA1 + ror rA0 + ror rAE + ror ZH + ror ZL + subi rA3, -1 + brne 14b + ; for rounding +15: or ZH, ZL + ; pack + lsl rA2 + adc rA3, r1 ; restore exponent for normal values + lsr rA3 + ror rA2 + bld rA3, 7 ; sign + ret +ENDF __mulsf3x + + +DEFUN __gesf2 +DEFUN __gtsf2 + rcall __fp_cmp + brcc 1f + ldi ret_lo, -1 +1: ret +ENDF __gesf2 + + +DEFUN __divsf3 + rcall __divsf3x + rjmp __fp_round +ENDF __divsf3 + + +__divsf3x_exit: +0: rcall __fp_pscB + brcs .L_nan_div + rcall __fp_pscA + brcs .L_nan_div + brne .L_zr_div ; finite / Inf --> 0 +.L_infA: + cpi rB3, 255 + breq .L_nan_div ; Inf / Inf --> NaN +.L_inf_div: + rjmp __fp_inf +1: + cpse rB3, r1 ; 0/finite --> 0, 0/0 --> NaN +.L_zr_div: rjmp __fp_szero +.L_nan_div: rjmp __fp_nan + +DEFUN __divsf3x + rcall __fp_split3 + brcs 0b + +DEFUN __divsf3_pse ; post split entry + tst rA3 + breq 1b + tst rB3 + breq .L_inf_div ; finite / 0.0 --> Inf + + sub rA3, rB3 + sbc rB3, rB3 + +/* Prepare to division: + A: rAE.rA2.rA1.rA0 0x00000001..0x00FFFFFF + B: rBE.rB2.rB1.rB0 0x00000002..0x01FFFFFE + A < B + */ + clr rAE + clr rBE +2: cp rA0, rB0 + cpc rA1, rB1 + cpc rA2, rB2 + brlo 3f + subi rA3, 0xFF ;lo8(-1) + sbci rB3, 0xFF ;hi8(-1) + lsl rB0 + rol rB1 + rol rB2 + rol rBE + breq 2b +3: + rcall .L_div + mov r0, ZL + brmi 5f ; N is result of 'com ZL' from .L_div + +4: ldi ZL, 0x80 + rcall .L_div1 + subi rA3, 0x01 ;lo8(1) + sbci rB3, 0x00 ;hi8(1) + lsr ZL + rol r0 + brpl 4b + +5: rcall .L_div + mov ZH, ZL + rcall .L_div + + lsl rA0 + rol rA1 + rol rA2 + rol rAE + cp rB0, rA0 + cpc rB1, rA1 + cpc rB2, rA2 + cpc rBE, rAE + ldi rAE, 0x80 + breq 4f + sbc rAE, rAE + +4: mov rA2, r0 + wmov rA0, ZL + clr ZH + + ; exponent += 125 + subi rA3, 0x83 ;lo8(-125) + sbci rB3, 0xFF ;hi8(-125) + brmi 13f ; denormalization is needed + ; check to overflow +11: cpi rA3, 254 + cpc rB3, r1 + brlo 15f + rjmp __fp_inf + ; check lowest value of exponent to avoid long operation +12: rjmp __fp_szero +13: cpi rB3, 0xFF ;hi8(-24) ; here rB3 < 0 + brlt 12b + cpi rA3, 0xE8 ;lo8(-24) + brlt 12b + ; mantissa >>= -rA3 +14: lsr rA2 + ror rA1 + ror rA0 + ror rAE + ror ZH + subi rA3, -1 + brne 14b + ; pack +15: lsl rA2 + adc rA3, r1 ; restore exponent for normal values + lsr rA3 + ror rA2 + bld rA3, 7 + ret + +.L_div: + ldi ZL, 1 +.L_div1: + lsl rA0 + rol rA1 + rol rA2 + rol rAE + cp rA0, rB0 + cpc rA1, rB1 + cpc rA2, rB2 + cpc rAE, rBE + brcs 2f + sub rA0, rB0 + sbc rA1, rB1 + sbc rA2, rB2 + sbc rAE, rBE +2: rol ZL + brcc .L_div1 + com ZL + ret +ENDF __divsf3x + + +DEFUN __floatdisf + bst rA3, 7 ; sign + brtc 1f + rcall __fp_negdi +1: rjmp __fp_di2sf +ENDF __floatdisf + + +DEFUN __fp_negdi + com rA3 + com rA2 + com rA1 + com rA0 + com rB3 + com rB2 + com rB1 + neg rB0 + sbci rB1, -1 + sbci rB2, -1 + sbci rB3, -1 + sbci rA0, -1 + sbci rA1, -1 + sbci rA2, -1 + sbci rA3, -1 + ret +ENDF __fp_negdi + + +DEFUN __floatundisf + clt ; result sign + +DEFUN __fp_di2sf + mov ZH, rA3 + ldi rA3, 127 + 55 ; exponent for 00.80.00.00.00.00.00.00 + tst ZH + breq .L_tstA2 + +/* Shift to right is needed by 1..8 positions. + Optimization: accumulate an info about tail into rB2. */ + cp r1, rB0 + cpc r1, rB1 + cpc r1, rB2 + sbc rB2, rB2 + ; shift to right +1: inc rA3 ; exponent += 1 + lsr ZH + ror rA2 + ror rA1 + ror rA0 + ror rB3 + sbci rB2, 0 ; set rB2[7] if C was 1 + tst ZH + brne 1b + rjmp .L_round + + ; x == 0 +2: clr rA3 + ret + ; check: is fast shift possible? +.L_tstA2: + tst rA2 + brne 4f + ; fast shift to left +3: subi rA3, 8 + brpl 2b ; 127+55 - 7*8 --> 126 + or rA2, rA1 ; obtain Z flag + mov rA1, rA0 + mov rA0, rB3 + mov rB3, rB2 + mov rB2, rB1 + mov rB1, rB0 + ldi rB0, 0 + breq 3b ; Z is result of 'or rA2,rA1' + +/* rA2 is not 0. It is needed shift to left by 0..7 positions. + Optimization: rB2..rB0 are not shifted. Instead, save an info + about tail in rB2. */ +4: cp r1, rB0 + cpc r1, rB1 + cpc r1, rB2 + sbc rB2, rB2 + tst rA2 + brmi .L_round +5: dec rA3 ; exponent -= 1 + lsl rB2 + rol rB3 + rol rA0 + rol rA1 + rol rA2 + brpl 5b + +/* Round and pack. Now we have: + rA3 - mantissa + rA2.rA1.rA0.rB3 - fraction + rB2 - is negative if tail is not equal 0 */ +.L_round: + tst rB3 + brpl 7f + lsl rB2 + rol rB3 + brne 6f + sbrs rA0, 0 ; round to even + rjmp 7f +6: subi rA0, -1 + sbci rA1, -1 + sbci rA2, -1 + sbci rA3, -1 + ; pack +7: lsl rA2 + lsr rA3 + ror rA2 + bld rA3, 7 ; sign + ret +ENDF __floatundisf + + diff --git a/lib/math/float.rob b/lib/math/float.rob new file mode 100644 index 0000000..41eec4d --- /dev/null +++ b/lib/math/float.rob @@ -0,0 +1,17 @@ +/* + * Part of the Robotics Language Standard Library, under the + * Apache License v2.0. + */ + +const NAN = 0.0 / 0.0; +const INFINITY = 1.0 / 0.0; + +bool isnan(float x) { + u = bitcast(x, uint32); + return (u & 0x7fffffff) > 0x7f800000; +} + +bool isinf(float x) { + u = bitcast(x, uint32); + return (u & 0x7fffffff) == 0x7f800000; +} diff --git a/src/BitCast.cpp b/src/BitCast.cpp new file mode 100644 index 0000000..7813488 --- /dev/null +++ b/src/BitCast.cpp @@ -0,0 +1,9 @@ + +#include "BitCast.h" + +Value *BitCast::generate(FunctionImpl *func, BasicBlock *block, BasicBlock *allocblock) +{ + Value *v = value->generate(func, block, allocblock); + Type *dTy = buildTypes->llvmType(destTy); + return Builder->CreateBitCast(v, dTy); +} diff --git a/src/BitCast.h b/src/BitCast.h new file mode 100644 index 0000000..bd79566 --- /dev/null +++ b/src/BitCast.h @@ -0,0 +1,29 @@ +#pragma once + +#include "Node.h" +#include "Visitor.h" + +class BitCast: public Node { +private: + Node *value; + DataType destTy; + +public: + BitCast(Node *v, DataType dTy): Node(v->getLoc()), value(v), destTy(dTy) { + addChild(v); + } + + virtual DataType getDataType() override { + return destTy; + } + + virtual DataType getSourceType() { + return value->getDataType(); + } + + virtual Node* accept(Visitor& v) override { + return v.visit(*this); + } + + virtual Value *generate(FunctionImpl *func, BasicBlock *block, BasicBlock *allocblock) override; +}; diff --git a/src/FunctionAttributes.h b/src/FunctionAttributes.h index 8a203f8..ea7ad80 100644 --- a/src/FunctionAttributes.h +++ b/src/FunctionAttributes.h @@ -9,6 +9,7 @@ enum FunctionAttributeType { fa_naked, fa_signal, fa_debugonly, + fa_noopt, }; typedef pair FunctionAttribute; diff --git a/src/FunctionDecl.cpp b/src/FunctionDecl.cpp index 9dec694..0f55dbb 100644 --- a/src/FunctionDecl.cpp +++ b/src/FunctionDecl.cpp @@ -110,6 +110,10 @@ void FunctionBase::addFunctionAttributes(Function *func) { func->addFnAttr(Attribute::Naked); func->addFnAttr(Attribute::NoInline); break; + case fa_noopt: + func->addFnAttr(Attribute::OptimizeNone); + func->addFnAttr(Attribute::NoInline); + break; default: break; } diff --git a/src/Header.h b/src/Header.h index 07221a5..751916a 100644 --- a/src/Header.h +++ b/src/Header.h @@ -53,3 +53,4 @@ #include "MemCopy.h" #include "BackLLVM.h" #include "NamedConst.h" +#include "BitCast.h" diff --git a/src/Language.l b/src/Language.l index 195cf7e..259437e 100644 --- a/src/Language.l +++ b/src/Language.l @@ -51,6 +51,7 @@ EXP ([Ee][-+]?[0-9]+)? "naked" { return TOK_NAKED; } "signal" { return TOK_SIGNAL; } "debugonly" { return TOK_DEBUGONLY; } +"noopt" { return TOK_NOOPT; } "bind" { return TOK_BIND; } "to" { return TOK_TO; } diff --git a/src/Language.y b/src/Language.y index e342049..f6d1ee7 100644 --- a/src/Language.y +++ b/src/Language.y @@ -151,6 +151,7 @@ function_attribute | TOK_NAKED { $$ = new FunctionAttribute(fa_naked, ""); } | TOK_SIGNAL { $$ = new FunctionAttribute(fa_signal, ""); } | TOK_DEBUGONLY { $$ = new FunctionAttribute(fa_debugonly, ""); } + | TOK_NOOPT { $$ = new FunctionAttribute(fa_noopt, ""); } | TOK_SECTION TOK_IDENTIFIER[id] { $$ = new FunctionAttribute(fa_section, $id); } event : TOK_QUANDO TOK_INTEGER TOK_ESTA TOK_INTEGER '{' stmts '}'[ef] { @@ -464,7 +465,16 @@ unary : '-' factor { $$ = new BinaryOp($factor, '*', getNodeForIntConst(-1, @fac call_or_cast : ident_or_xident[id] '(' paramscall ')' { if (strncmp("copy", $id, 4) == 0 && $paramscall->getNumParams() == 1) $$ = new MemCopy($paramscall->getParamElement(0)); - else { + else if (strncmp("bitcast", $id, 7) == 0 && $paramscall->getNumParams() == 2) { + Node *nodeTy = $paramscall->getParamElement(1); + Load *load = dynamic_cast(nodeTy); + if (load && buildTypes->getType(load->getName()) != BuildTypes::undefinedType) { + DataType dt = buildTypes->getType(load->getName()); + $$ = new BitCast($paramscall->getParamElement(0), dt); + } else { + $$ = new FunctionCall($id, $paramscall, @id); + } + } else { $$ = new FunctionCall($id, $paramscall, @id); } $$->setLocation(@id); diff --git a/src/LanguageHeader.y b/src/LanguageHeader.y index 5156e8d..77b54be 100644 --- a/src/LanguageHeader.y +++ b/src/LanguageHeader.y @@ -35,7 +35,7 @@ %token TOK_QUANDO TOK_ESTA %token EQ_OP NE_OP GE_OP LE_OP GT_OP LT_OP TOK_LSHIFT TOK_RSHIFT -%token TOK_INLINE TOK_NOINLINE TOK_WEAK TOK_SECTION TOK_NAKED TOK_SIGNAL TOK_DEBUGONLY +%token TOK_INLINE TOK_NOINLINE TOK_WEAK TOK_SECTION TOK_NAKED TOK_SIGNAL TOK_DEBUGONLY TOK_NOOPT %union { char *ident; diff --git a/src/LanguageUse.y b/src/LanguageUse.y index 42aeed3..e56932a 100644 --- a/src/LanguageUse.y +++ b/src/LanguageUse.y @@ -159,6 +159,7 @@ function_attribute | TOK_NAKED { $$ = new FunctionAttribute(fa_naked, ""); } | TOK_SIGNAL { $$ = new FunctionAttribute(fa_signal, ""); } | TOK_DEBUGONLY { $$ = new FunctionAttribute(fa_debugonly, ""); } + | TOK_NOOPT { $$ = new FunctionAttribute(fa_noopt, ""); } | TOK_SECTION TOK_IDENTIFIER[id] { $$ = new FunctionAttribute(fa_section, $id); } qualifier : TOK_CONST { $$ = qconst; } diff --git a/src/PropagateTypes.cpp b/src/PropagateTypes.cpp index d456a75..e72de0c 100644 --- a/src/PropagateTypes.cpp +++ b/src/PropagateTypes.cpp @@ -536,3 +536,19 @@ Node* PropagateTypes::visit(MemCopy& n) { n.symbols = n.children()[0]->getSymbols(); return NULL; } + +Node* PropagateTypes::visit(BitCast& n) { + propagateChildren(n); + DataType dt = n.getDataType(); + int returnBitwidth = buildTypes->bitWidth(dt); + DataType st = n.getSourceType(); + int sourceBitwidth = buildTypes->bitWidth(st); + + if (returnBitwidth != sourceBitwidth) { + yyerrorcpp(string_format("Can not bitcast from '%s' to '%s'.", + buildTypes->name(st), + buildTypes->name(dt)), &n); + } + + return NULL; +} diff --git a/src/PropagateTypes.h b/src/PropagateTypes.h index 146b93d..0063f78 100644 --- a/src/PropagateTypes.h +++ b/src/PropagateTypes.h @@ -15,6 +15,7 @@ #include "Enum.h" #include "Load.h" #include "MemCopy.h" +#include "BitCast.h" class CoercionBase: public Node { protected: @@ -121,9 +122,9 @@ class FloatToInt: public CoercionBase { RobDbgInfo.emitLocation(this); Builder->SetInsertPoint(block); if (buildTypes->isUnsignedDataType(dt)) - return Builder->CreateFPToUI(v, buildTypes->llvmType(dt), "trunc"); + return Builder->CreateFPToUI(v, buildTypes->llvmType(dt), "fptoui"); else - return Builder->CreateFPToSI(v, buildTypes->llvmType(dt), "trunc"); + return Builder->CreateFPToSI(v, buildTypes->llvmType(dt), "fptosi"); } }; @@ -216,4 +217,6 @@ class PropagateTypes: public Visitor { virtual Node* visit(Return& n) override; virtual Node* visit(FunctionImpl& n) override; virtual Node* visit(FunctionCall& n) override; + + virtual Node* visit(BitCast& n) override; }; diff --git a/src/Visitor.h b/src/Visitor.h index 2dc7476..f27ed6c 100644 --- a/src/Visitor.h +++ b/src/Visitor.h @@ -36,6 +36,7 @@ class Variable; class NamedConst; class MemCopy; class Enum; +class BitCast; #define VISITOR_DECLAREP(T, P) \ virtual Node *visit(T& n) { return visit((P&)n); } \ @@ -87,6 +88,7 @@ class Visitor { VISITOR_DECLARE(MemCopy) VISITOR_DECLARE(Enum) VISITOR_DECLARE(UpdateArray) + VISITOR_DECLARE(BitCast) }; diff --git a/test/atmega328p/float.rob b/test/atmega328p/float.rob new file mode 100644 index 0000000..41e2189 --- /dev/null +++ b/test/atmega328p/float.rob @@ -0,0 +1,69 @@ + +/* Test case to check float support on atmega328p */ + +use math.float; + +a = 1.2; +b = 1.1; + +float sum() { + c = a + b; + return c; +} + +float sub() { + c = a - b; + return c; +} + +float mult() { + c = a * b; + return c; +} + +float div() { + c = a / b; + return c; +} + +const epsilon = 0.000001; + +int8 main() { + r = sum(); + if r - 2.3 >= epsilon { + return 1; + } + + r = sub(); + if r - 0.1 >= epsilon { + return 2; + } + + r = mult(); + if r - 1.32 >= epsilon { + return 3; + } + + r = div(); + if r - 1.090909 >= epsilon { + return 4; + } + + r = NAN; + if !isnan(r) { + return 5; + } + + r = INFINITY; + if !isinf(r) { + return 6; + } + + r = -INFINITY; + if !isinf(r) { + return 7; + } + + return 0; +} + diff --git a/test/general/float.rob b/test/general/float.rob new file mode 120000 index 0000000..ba4a261 --- /dev/null +++ b/test/general/float.rob @@ -0,0 +1 @@ +../atmega328p/float.rob \ No newline at end of file From afbdb43220816ab889d6d57ba32914ba79fba90b Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Mon, 30 Sep 2024 12:15:09 -0300 Subject: [PATCH 06/24] Fixes to build with LLVM19 --- src/BackLLVM.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/BackLLVM.cpp b/src/BackLLVM.cpp index a324152..a3884e4 100644 --- a/src/BackLLVM.cpp +++ b/src/BackLLVM.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -92,12 +93,18 @@ void setup_target_machine(char opt_level) { std::string defaultt = sys::getDefaultTargetTriple(); supportedTargets[0].triple = defaultt.c_str(); SubtargetFeatures Features; + + #if LLVM_VERSION_MAJOR < 19 StringMap HostFeatures; if (sys::getHostCPUFeatures(HostFeatures)) { + #else + auto HostFeatures = sys::getHostCPUFeatures(); { + #endif for (auto &F : HostFeatures) { Features.AddFeature(F.first(), F.second); } } + static string nativeFeatures = Features.getString(); supportedTargets[0].features = nativeFeatures.c_str(); From 9da62d25f0e6b502d46e6d93c5decbd653699cfd Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Thu, 3 Oct 2024 11:41:02 -0300 Subject: [PATCH 07/24] Added float_to_int32 and float_to_64 assembly support on atmega328p. --- lib/avr5.S | 163 ++++++++++++++++++++++++++++++++++++++ test/atmega328p/float.rob | 21 ++++- 2 files changed, 183 insertions(+), 1 deletion(-) diff --git a/lib/avr5.S b/lib/avr5.S index 52a11e2..34c4cd6 100644 --- a/lib/avr5.S +++ b/lib/avr5.S @@ -1188,3 +1188,166 @@ DEFUN __fp_di2sf ENDF __floatundisf +DEFUN __fixsfdi + ldi rAE, 62 + rcall .L_sf2di + brcc 1f + ldi rA3, 0x80 +1: ret + +DEFUN __fixunssfdi + ldi rAE, 63 + +.L_sf2di: + ; clear LSBytes + clr rB0 + clr rB1 + movw rB2, rB0 + ; split + rcall __fp_splitA + brcs .L_ovfl ; is not finite + + subi rA3, 127 ; 1.0 exponent field + brlo .L_zero ; too small + + cp rAE, rA3 + brlo .L_ovfl ; fabs(A) >= 2**64 (or 2**63) + ldi rAE, 63 + sub rAE, rA3 + /* Now rAE is, for example: + 63 - exponent was 127+0, shift >>55 is needed, + 0 - exponent was 127+63, shift <<8 is needed. */ + clr rA3 + subi rAE, 8 ; rAE= -8..+55 + brpl 3f + ; fabs(A) >= 1.0 * 2**56 Shift to left is needed. + /* Shift to 8 is not optimized specially as an exotic. */ +2: lsl rA0 + rol rA1 + rol rA2 + rol rA3 + inc rAE + brmi 2b + rjmp .L_sign2 + ; Shift to right is needed +3: /* Now rAE: + 55 - exponent was 127+0, shift >>55 is needed, + 1 - exponent was 127+54, shift >>1 is needed, + 0 - exponent was 127+55, no shift is needed. */ + subi rAE, 8 + brmi 5f + ; quick shift by 8 +4: mov rB0, rB1 + mov rB1, rB2 + mov rB2, rB3 + mov rB3, rA0 + mov rA0, rA1 + mov rA1, rA2 + clr rA2 + subi rAE, 8 + brpl 4b + +5: subi rAE, -8 ; rAE = 0..7 + breq .L_sign2 + ; shift to 1..7 positions +6: lsr rA2 + ror rA1 + ror rA0 + ror rB3 + ror rB2 + ror rB1 + ror rB0 + dec rAE + brne 6b +.L_sign2: + brtc 7f + rcall __fp_negdi +7: clc + ret + +.L_zero: + clc +.L_ovfl: ; overflow, C is set already + ldi rA0, 0 + ldi rA1, 0 + movw rA2, rA0 + ret +ENDF __fixsfdi + + +DEFUN __floatunsisf + clt + rjmp 1f + +DEFUN __floatsisf + bst rA3, 7 ; sign + brtc 1f + ; negate A + com rA3 + com rA2 + com rA1 + neg rA0 + sbci rA1, -1 + sbci rA2, -1 + sbci rA3, -1 +1: + tst rA3 + breq 4f + ; shift to right + mov ZH, rA3 + ldi rA3, 127 + 23 ; exponent + clr rAE +2: inc rA3 + lsr ZH + ror rA2 + ror rA1 + ror rA0 + ror rAE + cpse ZH, r1 + rjmp 2b + ; rounding + brpl .L_pack ; flags from 'ror rAE' + lsl rAE + brne 3f + sbrs rA0, 0 ; round to even + rjmp .L_pack +3: subi rA0, -1 + sbci rA1, -1 + sbci rA2, -1 + sbci rA3, -1 + rjmp .L_pack + +4: tst rA2 + breq 5f + ldi rA3, 127 + 23 + rjmp 8f + +5: tst rA1 + breq 6f + ldi rA3, 127 + 15 + mov rA2, rA1 + mov rA1, rA0 + rjmp 7f + +6: tst rA0 + breq 9f ; 0.0 + ldi rA3, 127 + 7 + mov rA2, rA0 + ldi rA1, 0 +7: + ldi rA0, 0 + brmi .L_pack ; flag from 'tst rA*' + ; shift to left by 1..7 positions +10: dec rA3 + lsl rA0 + rol rA1 + rol rA2 +8: brpl 10b + +.L_pack: + lsl rA2 + lsr rA3 + ror rA2 + bld rA3, 7 ; sign +9: ret +ENDF __floatunsisf diff --git a/test/atmega328p/float.rob b/test/atmega328p/float.rob index 41e2189..9516bd2 100644 --- a/test/atmega328p/float.rob +++ b/test/atmega328p/float.rob @@ -26,6 +26,14 @@ float div() { return c; } +int64 floattoi64(float x) { + return int64(x); +} + +int32 floattoi32(float x) { + return int32(x); +} + const epsilon = 0.000001; int8 main() { @@ -64,6 +72,17 @@ int8 main() { return 7; } - return 0; + r = div(); + s = floattoi64(r); + if s != 1 { + return 8; + } + + t = floattoi32(r); + if t != 1 { + return 9; + } + + return 0; } From bb54457a439016c3d3b1064f63d5715e7f234046 Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Sat, 19 Oct 2024 18:28:28 -0300 Subject: [PATCH 08/24] Fix declaration of string variable initialized by string constant and minor tweaks. --- .gitignore | 2 ++ src/FunctionDecl.cpp | 2 +- src/LoadArray.cpp | 1 + src/Scalar.cpp | 11 +++++++---- src/StringConst.cpp | 31 ++++++++++++++++++++++++++++--- src/StringConst.h | 5 +++++ test/general/byref-simple.rob | 24 ++++++++++++++++++++++++ test/general/strcpy.rob | 21 +++++++++++++++++++++ test/general/strlen.rob | 16 ++++++++++++++++ 9 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 test/general/byref-simple.rob create mode 100644 test/general/strcpy.rob create mode 100644 test/general/strlen.rob diff --git a/.gitignore b/.gitignore index 2ed40ef..268d16a 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,5 @@ test/atmega328p/out platformio/toolchain-robcmp/bin platformio/toolchain-robcmp/lib platformio/avr-gdb-build +Documentation +hack diff --git a/src/FunctionDecl.cpp b/src/FunctionDecl.cpp index 0f55dbb..7feaa43 100644 --- a/src/FunctionDecl.cpp +++ b/src/FunctionDecl.cpp @@ -92,7 +92,7 @@ void FunctionBase::addFunctionAttributes(Function *func) { for(auto &[attr, value] : attributes->getAttributes()) { switch (attr) { case fa_weak: - func->setLinkage(GlobalValue::ExternalWeakLinkage); + func->setLinkage(GlobalValue::WeakAnyLinkage); break; case fa_inline: func->addFnAttr(Attribute::AlwaysInline); diff --git a/src/LoadArray.cpp b/src/LoadArray.cpp index b450d79..05738d1 100644 --- a/src/LoadArray.cpp +++ b/src/LoadArray.cpp @@ -73,6 +73,7 @@ Value *LoadArray::generate(FunctionImpl *func, BasicBlock *block, BasicBlock *al alloc = Builder->CreateLoad(ty, alloc, symbol->hasQualifier(qvolatile), "deref"); } + Builder->SetInsertPoint(block); Value *zero = ConstantInt::get(Type::getInt8Ty(global_context), 0); Value *indexList[2] = {zero, indice}; Value *ptr = Builder->CreateGEP(symbol->getLLVMType(), alloc, ArrayRef(indexList), "gep"); diff --git a/src/Scalar.cpp b/src/Scalar.cpp index f42d3ac..9c4e1a3 100644 --- a/src/Scalar.cpp +++ b/src/Scalar.cpp @@ -178,10 +178,13 @@ Value *Scalar::generate(FunctionImpl *func, BasicBlock *block, BasicBlock *alloc nvalue = exprv; } - RobDbgInfo.emitLocation(this); - const DataLayout &DL = mainmodule->getDataLayout(); - Align align = DL.getABITypeAlign(nvalue->getType()); - return Builder->CreateAlignedStore(nvalue, alloc, align, symbol->hasQualifier(qvolatile)); + if (nvalue != alloc) { + RobDbgInfo.emitLocation(this); + const DataLayout &DL = mainmodule->getDataLayout(); + Align align = DL.getABITypeAlign(nvalue->getType()); + return Builder->CreateAlignedStore(nvalue, alloc, align, symbol->hasQualifier(qvolatile)); + } else + return nvalue; } } diff --git a/src/StringConst.cpp b/src/StringConst.cpp index 579a4b5..d037a51 100644 --- a/src/StringConst.cpp +++ b/src/StringConst.cpp @@ -1,5 +1,6 @@ #include "StringConst.h" +#include "BackLLVM.h" #include "NamedConst.h" StringConst::StringConst(const string& name, const string& str, location_t loc) : @@ -21,8 +22,32 @@ Value* StringConst::generate(FunctionImpl *func, BasicBlock *block, BasicBlock * constant, name); gv->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); gv->setAlignment(Align(1)); - Constant *zero = ConstantInt::get(Type::getInt32Ty(global_context), 0); - Constant *indices[] = {zero, zero}; - value = ConstantExpr::getInBoundsGetElementPtr(gv->getValueType(), gv, indices); + + // const a = "abcdef" + if (leftValue->hasQualifier(qconst)) { + Constant *zero = ConstantInt::get(Type::getInt32Ty(global_context), 0); + Constant *indices[] = {zero, zero}; + value = ConstantExpr::getInBoundsGetElementPtr(gv->getValueType(), gv, indices); + } else { + // a = "abcdef", alloc array and copy string const to it + Type* I = buildTypes->llvmType(tchar); + auto arrayType = ArrayType::get(I, str.size()); + + // alloc array + Builder->SetInsertPoint(allocblock); + auto alloc = Builder->CreateAlloca(arrayType, dataAddrSpace, 0, leftValue->getName()); + if (debug_info) { + RobDbgInfo.emitLocation(this); + RobDbgInfo.declareVar(leftValue, alloc, allocblock); + } + leftValue->setAlloca(alloc); + + // copy string to the new array + Builder->SetInsertPoint(block); + Builder->CreateMemCpy(alloc, Align(1), gv, Align(1), str.size()); + value = alloc; + + } + return value; } diff --git a/src/StringConst.h b/src/StringConst.h index 794544b..c8e97f5 100644 --- a/src/StringConst.h +++ b/src/StringConst.h @@ -8,6 +8,7 @@ class StringConst: public Array { protected: string str; Value *value = NULL; + Variable *leftValue = NULL; public: StringConst(const string& name, const string& str, location_t loc); @@ -34,4 +35,8 @@ class StringConst: public Array { virtual bool isConstExpr() override { return true; } + + void setLeftValue(Variable *symbol) override { + leftValue = symbol; + } }; diff --git a/test/general/byref-simple.rob b/test/general/byref-simple.rob new file mode 100644 index 0000000..708c169 --- /dev/null +++ b/test/general/byref-simple.rob @@ -0,0 +1,24 @@ + +mapping = { + 0x00E1, 0x00C1, + 0x00E9, 0x00C9 +}; + +type Integer { + codepoint = int32(0); +} + +void utf8_decode(Integer i) { + i.codepoint = 10; +} + +int8 main() { + cp = Integer(); + utf8_decode(cp); + if cp.codepoint != 10 { + return 1; + } + + return 0; +} + diff --git a/test/general/strcpy.rob b/test/general/strcpy.rob new file mode 100644 index 0000000..dfabb9c --- /dev/null +++ b/test/general/strcpy.rob @@ -0,0 +1,21 @@ +void strcpy(char[] src, int16 spos, char[] dst, int16 dpos, int16 len) { + i = 0; + while (i < len) { + dst[dpos + i] = src[spos + i]; + i++; + } +} + +int16 main(){ + a = "a noifas SDOINDAda"; + b = "B akjsad ADJNDAODA"; + strcpy(a, 0, b, 0, a.size); + i = 0; + while i < a.size { + if b[i] != a[i] { + return i; + } + i++; + } + return 0; +} diff --git a/test/general/strlen.rob b/test/general/strlen.rob new file mode 100644 index 0000000..d0917c4 --- /dev/null +++ b/test/general/strlen.rob @@ -0,0 +1,16 @@ + +const str = "abcd"; + +int8 strlen(char[] s) { + return s.size; +} + +int8 main() { + r = strlen(str); + if r == 4 { + return 0; + } else { + return 1; + } +} + From 42d228d81803e8bee33773cc30012ca4c55b9036 Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Wed, 30 Oct 2024 09:30:19 -0300 Subject: [PATCH 09/24] Fix build of function calls with string constants. --- src/StringConst.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/StringConst.cpp b/src/StringConst.cpp index d037a51..a340711 100644 --- a/src/StringConst.cpp +++ b/src/StringConst.cpp @@ -23,8 +23,8 @@ Value* StringConst::generate(FunctionImpl *func, BasicBlock *block, BasicBlock * gv->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); gv->setAlignment(Align(1)); - // const a = "abcdef" - if (leftValue->hasQualifier(qconst)) { + // const a = "abcdef" or a call to func("abc") + if (!leftValue || leftValue->hasQualifier(qconst)) { Constant *zero = ConstantInt::get(Type::getInt32Ty(global_context), 0); Constant *indices[] = {zero, zero}; value = ConstantExpr::getInBoundsGetElementPtr(gv->getValueType(), gv, indices); From f65b1c3fc55a976626f625db3a4cfe8533390b59 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Wed, 23 Oct 2024 15:06:30 -0300 Subject: [PATCH 10/24] last corrections str mai min --- test/atmega328p/Makefile | 3 +++ test/atmega328p/robcmp-simavr-debug | 2 +- test/atmega328p/timetest.sh | 34 +++++++++++++++++++++++++++++ test/general/string-upper.rob | 13 +++++++++-- 4 files changed, 49 insertions(+), 3 deletions(-) create mode 100755 test/atmega328p/timetest.sh diff --git a/test/atmega328p/Makefile b/test/atmega328p/Makefile index f171d3d..3b67fda 100644 --- a/test/atmega328p/Makefile +++ b/test/atmega328p/Makefile @@ -43,6 +43,9 @@ out/%.ll : %.rob ${DEPENDS} out/% : out/%.o ${LINK_DEPENDS} ld.lld ${LD_FLAGS} $^ -o $@ +%.time : %.rob ${DEPENDS} clean + @-./timetest.sh $< $(patsubst %.rob,out/%,$<) + test: ${ALL_TT} clean: diff --git a/test/atmega328p/robcmp-simavr-debug b/test/atmega328p/robcmp-simavr-debug index d508ef4..c9994e3 120000 --- a/test/atmega328p/robcmp-simavr-debug +++ b/test/atmega328p/robcmp-simavr-debug @@ -1 +1 @@ -../../platformio/toolchain-robcmp/bin/robcmp-simavr-debug \ No newline at end of file +../../build/robcmp-simavr-debug \ No newline at end of file diff --git a/test/atmega328p/timetest.sh b/test/atmega328p/timetest.sh new file mode 100755 index 0000000..26b8478 --- /dev/null +++ b/test/atmega328p/timetest.sh @@ -0,0 +1,34 @@ +#!/bin/bash +CMD="./robcmp-simavr-debug -c 16000000 -m atmega328p -f $2" + +GREEN="\033[0;32m" +RED="\033[0;31m" +NC="\033[0m" + +echo -n " $1 " +timer=0 +make -s $2 +REP=10 +if [ "$?" -eq 0 ]; then + if [ "$V" = "1" ]; then + ${CMD} + else + timeout 10s ${CMD} &> /dev/null + fi + STATUS=$? + if [ "${STATUS}" -eq 0 ]; then + + TIMEFORMAT="%U" # get only the User time + for i in $(seq 1 $REP); do + timer=$timer+$({ time $CMD &>/dev/null; } 2>&1) + done + timer=$(echo "${timer//,/.}") + avg=$(echo "scale=3;($timer)/$REP -q"| bc) + + echo -e \\r${GREEN}[PASS]\\t\\t${NC}\\t\\t\\t${avg} + else + echo -e \\r${RED}[FAILED] ${STATUS}\\t${NC} + fi +else + echo -e \\r${RED}[BUILD FAILED]\\t${NC} +fi \ No newline at end of file diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index f638a0a..bcf14dd 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -743,14 +743,18 @@ mapping = { return codepoint; } - void strcpy (char[] src, int16 s, char[] dst, int16 d, int16 len) { + void strcpy(char[] src, int16 spos, char[] dst, int16 dpos, int16 len) { i = 0; + if (spos + len > src.size) or (dpos + len > dst.size) { + return; + } while (i < len) { - dst[d + i] = src[s + i]; + dst[dpos + i] = src[spos + i]; i++; } } + void utf8_string_to_uppercase(char[] str) { p = int16 (0); w = int16 (0); @@ -803,6 +807,11 @@ mapping = { int8 main() { + const a = "a noifas SDOINDAda"; + const b = "B akjsad ADJNDAODA"; + + strcpy(a, 0, b, 0, 5); + const l_str = "a"; utf8_string_to_uppercase(l_str); From 332972b5d195c141bc97b7ff8ff8691280207c81 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Wed, 30 Oct 2024 09:59:27 -0300 Subject: [PATCH 11/24] mai min corrections --- test/general/string-upper.rob | 5 ----- 1 file changed, 5 deletions(-) diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index bcf14dd..f40fe7d 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -807,11 +807,6 @@ mapping = { int8 main() { - const a = "a noifas SDOINDAda"; - const b = "B akjsad ADJNDAODA"; - - strcpy(a, 0, b, 0, 5); - const l_str = "a"; utf8_string_to_uppercase(l_str); From c6ccabce75164691212af1e0e6c5939ceb6f5619 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Thu, 31 Oct 2024 17:15:57 -0300 Subject: [PATCH 12/24] test --- test/general/string-contains.rob | 4 ++-- test/general/string-upper.rob | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/general/string-contains.rob b/test/general/string-contains.rob index 9b66c73..98218a7 100644 --- a/test/general/string-contains.rob +++ b/test/general/string-contains.rob @@ -1,8 +1,8 @@ use string.contains; int8 main() { - r = containsstr("abcde", "cd"); - if r == 2 { + r = containsstr("exemplo de string", "string"); + if r == 11 { return 0; } else { return 1; diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index f40fe7d..97304c0 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -673,7 +673,7 @@ mapping = { code = int32(0); } - int8 utf8_decode(char[] s, int16 i, Codepoint c) { + int32 utf8_decode(char[] s, int16 i, Codepoint c) { if (s[i] < 0x80) { c.code = s[i]; return 1; // 1 byte @@ -690,7 +690,7 @@ mapping = { return -1; } - int8 utf8_encode(int32 codepoint, char[] output) { + int32 utf8_encode(int32 codepoint, char[] output) { if (codepoint <= 0x7F) { output[0] = codepoint & 0x7F; return 1; // 1 byte @@ -805,9 +805,9 @@ mapping = { } } -int8 main() { +int32 main() { - const l_str = "a"; + l_str = "á"; utf8_string_to_uppercase(l_str); From f9ba4b782cdd4ff9428fe932b316af463c545d73 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Thu, 14 Nov 2024 14:58:21 -0300 Subject: [PATCH 13/24] att --- lib/string/contains.rob | 4 ++-- test/atmega328p/bsscheck.rob | 3 +-- test/atmega328p/string-contains.rob | 17 +++++++++++++++ test/atmega328p/string-equal.rob | 15 +++++++++++++ test/atmega328p/string-utf8len.rob | 12 ++++++++++ test/general/a.rob | 1 + test/general/string-contains.rob | 11 ++++++++-- test/general/string-equal.rob | 9 ++++++-- test/general/string-upper.rob | 34 ++++++++++++++--------------- test/general/string-utf8len.rob | 4 ++-- 10 files changed, 83 insertions(+), 27 deletions(-) create mode 100644 test/atmega328p/string-contains.rob create mode 100644 test/atmega328p/string-equal.rob create mode 100644 test/atmega328p/string-utf8len.rob create mode 100644 test/general/a.rob diff --git a/lib/string/contains.rob b/lib/string/contains.rob index 6ba83a1..6984795 100644 --- a/lib/string/contains.rob +++ b/lib/string/contains.rob @@ -1,7 +1,7 @@ int16 containsstr(char[] str, char[] substr) { - i = int16 (0); + i = uint16 (0); while i < str.size { - j = int16 (0); + j = uint16 (0); while (str[i + j] == substr[j]) { j++; diff --git a/test/atmega328p/bsscheck.rob b/test/atmega328p/bsscheck.rob index 56f3e0f..f617e0e 100644 --- a/test/atmega328p/bsscheck.rob +++ b/test/atmega328p/bsscheck.rob @@ -28,5 +28,4 @@ int8 main() { return 2; } return 0; -} - +} \ No newline at end of file diff --git a/test/atmega328p/string-contains.rob b/test/atmega328p/string-contains.rob new file mode 100644 index 0000000..765084f --- /dev/null +++ b/test/atmega328p/string-contains.rob @@ -0,0 +1,17 @@ +use string.contains; + +const str1 = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKvEXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ"; + +const str2 = "䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑X"; + +const str3 = "ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑X䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟"; + +int8 main() { + r = containsstr(str1, str2); + s = containsstr(str1, str3); + if r != -1 and s == -1 { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/atmega328p/string-equal.rob b/test/atmega328p/string-equal.rob new file mode 100644 index 0000000..a71369d --- /dev/null +++ b/test/atmega328p/string-equal.rob @@ -0,0 +1,15 @@ +use string.equalstr; + +const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv"; + +const str_equal = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv"; + +const str_diff = "鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKvs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv"; + +int8 main() { + if equalstr(str, str_equal) and !equalstr(str, str_diff) { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/atmega328p/string-utf8len.rob b/test/atmega328p/string-utf8len.rob new file mode 100644 index 0000000..f2300c6 --- /dev/null +++ b/test/atmega328p/string-utf8len.rob @@ -0,0 +1,12 @@ +use string.utf8strlen; + +const str = "鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKvs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKvs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉw"; + +int8 main() { + r = utf8strlen(str); + if r == 830 { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/general/a.rob b/test/general/a.rob new file mode 100644 index 0000000..c45af10 --- /dev/null +++ b/test/general/a.rob @@ -0,0 +1 @@ +"Á" \ No newline at end of file diff --git a/test/general/string-contains.rob b/test/general/string-contains.rob index 98218a7..ff00981 100644 --- a/test/general/string-contains.rob +++ b/test/general/string-contains.rob @@ -1,8 +1,15 @@ use string.contains; +const str1 = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊"; + +const str2 = "/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮"; + +const str3 = "Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚"; + int8 main() { - r = containsstr("exemplo de string", "string"); - if r == 11 { + r = containsstr(str1, str2); + s = containsstr(str1, str3); + if r != -1 and s == -1 { return 0; } else { return 1; diff --git a/test/general/string-equal.rob b/test/general/string-equal.rob index c9e4efa..bda654d 100644 --- a/test/general/string-equal.rob +++ b/test/general/string-equal.rob @@ -1,8 +1,13 @@ use string.equalstr; -int8 main() { +const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬"; + +const str_equal = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬"; - if equalstr("abcd", "abcd") { +const str_diff = "㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7"; + +int8 main() { + if equalstr(str, str_equal) and !equalstr(str, str_diff) { return 0; } else { return 1; diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index 97304c0..4c3e097 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -670,10 +670,10 @@ mapping = { }; type Codepoint { - code = int32(0); + code = uint32(0); } - int32 utf8_decode(char[] s, int16 i, Codepoint c) { + int32 utf8_decode(char[] s, uint16 i, Codepoint c) { if (s[i] < 0x80) { c.code = s[i]; return 1; // 1 byte @@ -690,7 +690,7 @@ mapping = { return -1; } - int32 utf8_encode(int32 codepoint, char[] output) { + int32 utf8_encode(uint32 codepoint, char[] output) { if (codepoint <= 0x7F) { output[0] = codepoint & 0x7F; return 1; // 1 byte @@ -713,11 +713,11 @@ mapping = { return -1; } - int32 to_uppercase(int32 codepoint) { + int32 to_uppercase(uint32 codepoint) { i = uint16(0); while i < mapping.size { - if mapping[i + 1] == codepoint { - return mapping[i]; + if mapping[i] == codepoint { + return mapping[i + 1]; } i += 2; } @@ -728,11 +728,11 @@ mapping = { return codepoint; } - int32 to_lowercase(int32 codepoint) { + int32 to_lowercase(uint32 codepoint) { i = uint16(0); while i < mapping.size { - if mapping[i] == codepoint { - return mapping[i + 1]; + if mapping[i + 1] == codepoint { + return mapping[i]; } i += 2; } @@ -743,7 +743,7 @@ mapping = { return codepoint; } - void strcpy(char[] src, int16 spos, char[] dst, int16 dpos, int16 len) { + void strcpy(char[] src, uint16 spos, char[] dst, uint16 dpos, uint16 len) { i = 0; if (spos + len > src.size) or (dpos + len > dst.size) { return; @@ -756,8 +756,8 @@ mapping = { void utf8_string_to_uppercase(char[] str) { - p = int16 (0); - w = int16 (0); + p = uint16 (0); + w = uint16 (0); output = {0:4}; while p < str.size { @@ -774,15 +774,15 @@ mapping = { w += out_len; } - p += len; + p += len; } } } void utf8_string_to_lowercase(char[] str) { - p = int16 (0); - w = int16 (0); + p = uint16 (0); + w = uint16 (0); output = {0:4}; while p < str.size { @@ -807,11 +807,11 @@ mapping = { int32 main() { - l_str = "á"; + l_str = "áç"; utf8_string_to_uppercase(l_str); - if equalstr (l_str, "A") { + if equalstr (l_str, "ÁÇ") { return 0; } else { return 1; diff --git a/test/general/string-utf8len.rob b/test/general/string-utf8len.rob index ac69fe5..c8a9d2f 100644 --- a/test/general/string-utf8len.rob +++ b/test/general/string-utf8len.rob @@ -1,10 +1,10 @@ use string.utf8strlen; -const str = "a1éñअ中😂👍"; +const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊"; int8 main() { r = utf8strlen(str); - if r == 8 { + if r == 200 { return 0; } else { return 1; From 3f13a67e72410ea5e2f0750752126ef7d5c8922e Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Mon, 18 Nov 2024 10:51:53 -0300 Subject: [PATCH 14/24] . --- lib/string/contains.rob | 3 +-- lib/string/utf8strlen.rob | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/string/contains.rob b/lib/string/contains.rob index 6984795..b1d078e 100644 --- a/lib/string/contains.rob +++ b/lib/string/contains.rob @@ -1,5 +1,6 @@ int16 containsstr(char[] str, char[] substr) { i = uint16 (0); + while i < str.size { j = uint16 (0); @@ -10,9 +11,7 @@ int16 containsstr(char[] str, char[] substr) { if j == substr.size { return i; } - i++; } - return -1; } \ No newline at end of file diff --git a/lib/string/utf8strlen.rob b/lib/string/utf8strlen.rob index 9891dc4..bd355b0 100644 --- a/lib/string/utf8strlen.rob +++ b/lib/string/utf8strlen.rob @@ -1,6 +1,7 @@ int16 utf8strlen(char[] s) { length = int16 (0); i = int16 (0); + while i < s.size { if ((s[i] & 0xC0) != 0x80) { length++; From a31dae0e23e6741eaff60dc08264ffe69b1b36b3 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Thu, 28 Nov 2024 00:46:27 -0300 Subject: [PATCH 15/24] testes funcoes --- lib/string/equalstr.rob | 2 +- lib/string/upperstr.rob | 236 ++++---- test/atmega328p/Makefile | 18 +- test/atmega328p/string-contains.rob | 6 +- test/atmega328p/string-equal.rob | 6 +- test/atmega328p/string-upperstr.rob | 15 + test/atmega328p/string-utf8len.rob | 4 +- test/general/string-contains.rob | 6 +- test/general/string-equal.rob | 6 +- test/general/string-upper.rob | 810 +--------------------------- test/general/string-utf8len.rob | 4 +- 11 files changed, 168 insertions(+), 945 deletions(-) create mode 100644 test/atmega328p/string-upperstr.rob diff --git a/lib/string/equalstr.rob b/lib/string/equalstr.rob index 6483972..0f0278e 100644 --- a/lib/string/equalstr.rob +++ b/lib/string/equalstr.rob @@ -17,4 +17,4 @@ bool equalstr(char[] s1, char[] s2) { } else { return false; } -} +} \ No newline at end of file diff --git a/lib/string/upperstr.rob b/lib/string/upperstr.rob index fdb5c79..11b052c 100644 --- a/lib/string/upperstr.rob +++ b/lib/string/upperstr.rob @@ -669,134 +669,138 @@ mapping = { 0xFF5A, 0xFF3A }; -type Codepoint { - code = int32(0); -} - -int8 utf8_decode(char[] s, int16 i, Codepoint c) { - if (s[i] < 0x80) { - c.code = s[i]; - return 1; // 1 byte - } else if ((s[i] & 0xE0) == 0xC0) { - c.code = ((s[i] & 0x1F) << 6) | (s[1] & 0x3F); - return 2; // 2 bytes - } else if ((s[i] & 0xF0) == 0xE0) { - c.code = ((s[i] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); - return 3; // 3 bytes - } else if ((s[i] & 0xF8) == 0xF0) { - c.code = ((s[i] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); - return 4; // 4 bytes - } - return -1; -} - -int8 utf8_encode(int32 codepoint, char[] output) { - if (codepoint <= 0x7F) { - output[0] = codepoint & 0x7F; - return 1; // 1 byte - } else if (codepoint <= 0x7FF) { - output[0] = 0xC0 | ((codepoint >> 6) & 0x1F); - output[1] = 0x80 | (codepoint & 0x3F); - return 2; // 2 bytes - } else if (codepoint <= 0xFFFF) { - output[0] = 0xE0 | ((codepoint >> 12) & 0x0F); - output[1] = 0x80 | ((codepoint >> 6) & 0x3F); - output[2] = 0x80 | (codepoint & 0x3F); - return 3; // 3 bytes - } else if (codepoint <= 0x10FFFF) { - output[0] = 0xF0 | ((codepoint >> 18) & 0x07); - output[1] = 0x80 | ((codepoint >> 12) & 0x3F); - output[2] = 0x80 | ((codepoint >> 6) & 0x3F); - output[3] = 0x80 | (codepoint & 0x3F); - return 4; // 4 bytes + type Codepoint { + code = uint32(0); } - return -1; -} - -int32 to_uppercase(int32 codepoint) { - i = uint16(0); - while i < mapping.size { - if mapping[i + 1] == codepoint { - return mapping[i]; + + int32 utf8_decode(char[] s, uint16 i, Codepoint c) { + if (s[i] < 0x80) { + c.code = s[i]; + return 1; // 1 byte + } else if ((s[i] & 0xE0) == 0xC0) { + c.code = ((s[i] & 0x1F) << 6) | (s[1] & 0x3F); + return 2; // 2 bytes + } else if ((s[i] & 0xF0) == 0xE0) { + c.code = ((s[i] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); + return 3; // 3 bytes + } else if ((s[i] & 0xF8) == 0xF0) { + c.code = ((s[i] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); + return 4; // 4 bytes } - i += 2; + return -1; } - - if (codepoint >= 0x61 and codepoint <= 0x7A) { - return codepoint & 0x5F; + + int32 utf8_encode(uint32 codepoint, char[] output) { + if (codepoint <= 0x7F) { + output[0] = codepoint & 0x7F; + return 1; // 1 byte + } else if (codepoint <= 0x7FF) { + output[0] = 0xC0 | ((codepoint >> 6) & 0x1F); + output[1] = 0x80 | (codepoint & 0x3F); + return 2; // 2 bytes + } else if (codepoint <= 0xFFFF) { + output[0] = 0xE0 | ((codepoint >> 12) & 0x0F); + output[1] = 0x80 | ((codepoint >> 6) & 0x3F); + output[2] = 0x80 | (codepoint & 0x3F); + return 3; // 3 bytes + } else if (codepoint <= 0x10FFFF) { + output[0] = 0xF0 | ((codepoint >> 18) & 0x07); + output[1] = 0x80 | ((codepoint >> 12) & 0x3F); + output[2] = 0x80 | ((codepoint >> 6) & 0x3F); + output[3] = 0x80 | (codepoint & 0x3F); + return 4; // 4 bytes + } + return -1; } - return codepoint; -} - -int32 to_lowercase(int32 codepoint) { - i = uint16(0); - while i < mapping.size { - if mapping[i] == codepoint { - return mapping[i + 1]; + + int32 to_uppercase(uint32 codepoint) { + i = uint16(0); + while i < mapping.size { + if mapping[i] == codepoint { + return mapping[i + 1]; + } + i += 2; } - i += 2; + + if (codepoint >= 0x61 and codepoint <= 0x7A) { + return codepoint & 0x5F; + } + return codepoint; } - - if (codepoint >= 0x41 and codepoint <= 0x5A) { - return codepoint | 0x20; + + int32 to_lowercase(uint32 codepoint) { + i = uint16(0); + while i < mapping.size { + if mapping[i + 1] == codepoint { + return mapping[i]; + } + i += 2; + } + + if (codepoint >= 0x41 and codepoint <= 0x5A) { + return codepoint | 0x20; + } + return codepoint; } - return codepoint; -} - -void strcpy (char[] src, int16 s, char[] dst, int16 d, int16 len) { - i = 0; - while (i < len) { - dst[d + i] = src[s + i]; - i++; + + void strcpy(char[] src, uint16 spos, char[] dst, uint16 dpos, uint16 len) { + i = 0; + if (spos + len > src.size) or (dpos + len > dst.size) { + return; + } + while (i < len) { + dst[dpos + i] = src[spos + i]; + i++; + } } -} - -void utf8_string_to_uppercase(char[] str) { - p = int16 (0); - w = int16 (0); - output = {0:4}; - while p < str.size { - codepoint = Codepoint(); - len = utf8_decode(str, p, codepoint); - if (len < 1) { - p++; - } else { - uppercase_codepoint = to_uppercase(codepoint.code); - out_len = utf8_encode(uppercase_codepoint, output); - - if (out_len > 0) { - strcpy(output, 0, str, w, out_len); - w += out_len; + + void utf8_string_to_uppercase(char[] str) { + p = uint16 (0); + w = uint16 (0); + output = {0:4}; + + while p < str.size { + codepoint = Codepoint(); + len = utf8_decode(str, p, codepoint); + if (len < 1) { + p++; + } else { + uppercase_codepoint = to_uppercase(codepoint.code); + out_len = utf8_encode(uppercase_codepoint, output); + + if (out_len > 0) { + strcpy(output, 0, str, w, out_len); + w += out_len; + } + + p += len; } - - p += len; + } - } -} - -void utf8_string_to_lowercase(char[] str) { - p = int16 (0); - w = int16 (0); - output = {0:4}; - while p < str.size { - codepoint = Codepoint(); - len = utf8_decode(str, p, codepoint); - if (len < 1) { - p++; - } else { - lowercase_codepoint = to_lowercase(codepoint.code); - out_len = utf8_encode(lowercase_codepoint, output); - - if (out_len > 0) { - strcpy(output, 0, str, w, out_len); - w += out_len; + void utf8_string_to_lowercase(char[] str) { + p = uint16 (0); + w = uint16 (0); + output = {0:4}; + + while p < str.size { + codepoint = Codepoint(); + len = utf8_decode(str, p, codepoint); + if (len < 1) { + p++; + } else { + lowercase_codepoint = to_lowercase(codepoint.code); + out_len = utf8_encode(lowercase_codepoint, output); + + if (out_len > 0) { + strcpy(output, 0, str, w, out_len); + w += out_len; + } + + p += len; } - - p += len; + } - - } -} \ No newline at end of file + } \ No newline at end of file diff --git a/test/atmega328p/Makefile b/test/atmega328p/Makefile index 3b67fda..678ff67 100644 --- a/test/atmega328p/Makefile +++ b/test/atmega328p/Makefile @@ -1,6 +1,7 @@ ALL=$(patsubst %.rob,out/%,$(wildcard *.rob)) ALL_LL=$(patsubst %.rob,out/%.ll,$(wildcard *.rob)) ALL_TT=$(patsubst %.rob,%.tt,$(wildcard *.rob)) +ALL_TIME=$(patsubst %.rob,%.time,$(wildcard *.rob)) ALL_OO=$(patsubst %.rob,out/%.o,$(wildcard *.rob)) out/atmega328p.o ROBCMP=../../build/robcmp @@ -21,6 +22,8 @@ LINK_DEPENDS=out/atmega328p.o all: out test +time: out time + out: mkdir -p out @@ -40,14 +43,19 @@ out/%.ll : %.rob ${DEPENDS} %.tt : %.rob ${DEPENDS} @-./runtest.sh $< $(patsubst %.rob,out/%,$<) -out/% : out/%.o ${LINK_DEPENDS} - ld.lld ${LD_FLAGS} $^ -o $@ - %.time : %.rob ${DEPENDS} clean @-./timetest.sh $< $(patsubst %.rob,out/%,$<) +out/% : out/%.o ${LINK_DEPENDS} + ld.lld ${LD_FLAGS} $^ -o $@ + test: ${ALL_TT} -clean: - @rm -f ${ALL} ${ALL_LL} ${ALL_OO} +time: ${ALL_TIME} +all_time: + @echo "Medindo o tempo total de execução para todos os arquivos..." + @{ time make ${ALL_TIME}; } 2> total_time.log + +clean: + @rm -f ${ALL} ${ALL_LL} ${ALL_OO} ${ALL_TIME} total_time.log \ No newline at end of file diff --git a/test/atmega328p/string-contains.rob b/test/atmega328p/string-contains.rob index 765084f..40e6590 100644 --- a/test/atmega328p/string-contains.rob +++ b/test/atmega328p/string-contains.rob @@ -1,10 +1,10 @@ use string.contains; -const str1 = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKvEXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ"; +const str1 = "򐟎빉萦%ˍ켁̿Ǩ윊c升T{奀վuA񲁒𫾡𤃔򜄼􋉦괄񆔷ӌ>r󮤋ֆ۲𻍠ᚧ속腠ƒ󷼨񀐶񈪾ʴ󛐯mɁ姎-蓥񒡳^OC񉡎Łȵ́ꫢ؝񎯀𯏍є򬎧6􁜧Ǚ􂸫Æ񝽥DŽ흃򼵾ͥp񷰥񌕀y홋޹ӑqꥈ麧º겪𷣟󽨏񮆠Ҳߜ蟩̐󒉂m󽮁Ԏ粈#Aܳ𓖎k碽󶪩È೦繯˯󺶌ׂԠ:㮹>𸜝I񯙼V𙾌қ𷂯j𖪜٦Aॼ񩵜Ȯ怄᤟4񄥳肁睈)Ѿ又怾􉿿笚ǦO匯ؤĒ径lӪ񈦦񍿅ƣ꒥Yܐܩ>ꂛ߉򏆍ۗ/껠D䑥궖􌠬ՙ𓎪zb �롏|ʸh毕_š􅪃0փ򈔵񤁯ܡ歨򣍓򱤂ԛ񧞂댙ڞ#򯚭򽊤ĭעǃүK񷼝�e񙖰˵𤘖ق֩R𷄹Θx-껇ǹĻ񽀄靺O㊖Ĥ󙿗򗮡!ܒOLp񽿚ݰ񢛏$搜򯝠纱؟4ر� Ὧi󴢼啣򙤙瑉⤄񫝛񛎗UϘ󩧜݋󉏿񙥠ޔҴ󨮣޳ל򓁓d􍩶򡲵𥉐9Е󇆦󀨑2gڷ^󎽠𺹽ܨՋf酁ֲ🄒^񫨅)4L񆔜�⾎𑨂򡟸R쯐Ʃ󏅡4i䀠ݾ ܫ󷡚!컳䭾fX݃Ѝ)𑳛k􋫷J閇앳񑻻@nƝ󟧈򟏞򬁶𯘗񔳅ӧd򇾾ئ򱫪î׻9⿥m˒:ȞΆ텍Ⓐ򱭴䤁𒻯身摏c󤊋Т,׉߰淜Q켮L{ĭ˨󇿛㻒ș󪲑󔗩򀵃̂ŝCN򱢕἖­𚣿񉚘ô.弎Ь:*ܽ񴷎^󁒸􈥡)ፌ杻È[Ό󘵘ᆅ眔񟑤"; -const str2 = "䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑X"; +const str2 = "􂸫Æ񝽥DŽ흃򼵾ͥp񷰥񌕀y홋޹ӑqꥈ麧º겪𷣟󽨏񮆠Ҳߜ蟩̐󒉂m󽮁Ԏ粈#Aܳ𓖎k碽󶪩È೦繯˯󺶌ׂԠ:㮹>𸜝I񯙼V𙾌қ𷂯j𖪜٦Aॼ񩵜Ȯ怄᤟4񄥳肁睈)Ѿ又怾􉿿笚ǦO匯ؤĒ径lӪ񈦦񍿅ƣ꒥Yܐܩ>ꂛ߉򏆍ۗ/껠D䑥궖􌠬ՙ𓎪zb �롏|ʸh毕_š􅪃0փ򈔵񤁯ܡ歨򣍓򱤂ԛ񧞂댙ڞ#򯚭򽊤ĭעǃүK񷼝�e񙖰˵𤘖ق֩R𷄹Θx-껇ǹĻ񽀄靺O㊖Ĥ󙿗򗮡!ܒOLp񽿚ݰ񢛏$搜򯝠纱؟4ر� Ὧi󴢼啣򙤙瑉⤄񫝛񛎗UϘ󩧜݋󉏿񙥠ޔҴ󨮣޳ל"; -const str3 = "ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑X䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟"; +const str3 = "׾΁A?Ӥ󨨎Žr񮷤򩟴Zࢥ񸃞Σ퟽陊ޤ上櫄򼔄걜㟰żLޏu󍘧vۺ򣚃ӓ𞆟܀�􇶦IĽ栿u𮔏c􊙾𽻪퀊歲𦢠y󇎹ꉃӁ繻縠𷈶0򙤁𧭼=ԫ店򳜳͗Ȕ ƕ퇍蘛ラ𡭑 뢛4ږR첻/򇞆gI𘍎뢼􀑠8͕hȞ󝆬󷜇䯗ӹ󥺞𩏠p1ɍ𫔎*�عw٘ڞQ򝼄mr㛙唅x䞰䋝eF񲯫꿽ѭھ矩D磀Y[Pԫ򓚦ⱗ򔧕񲸤B֦툫񣼙􎺍MMl癔㨥󝰼󪰪򳓶𸰁VΈ،Y˕j׶꬇񉥵걇򓮡򘮖ᆧέ㯼ӷ􈗮󧖂򐳂BtN󞢊.䓉=󗍒ۤ𡱭�遦o񢣾؎Ьﶴ򏍋󗚇񈸝砅J񙍅恴뷀Ɠꤋ֡ٚя$"; int8 main() { r = containsstr(str1, str2); diff --git a/test/atmega328p/string-equal.rob b/test/atmega328p/string-equal.rob index a71369d..68c2b5e 100644 --- a/test/atmega328p/string-equal.rob +++ b/test/atmega328p/string-equal.rob @@ -1,10 +1,10 @@ use string.equalstr; -const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv"; +const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯"; -const str_equal = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv"; +const str_equal = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯"; -const str_diff = "鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKvs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv"; +const str_diff = "𴙗Ȉ􉏺ݤ歠šω9୆碻ノ쿵E΃f񟸠&𗌐Ҁϓ򀙷睆i๒ۯ荬ե}萒㽁ȐƤ 𚟙𷓂񂅘㯩펑Ƹ确ʺ󩰭ݍ𧗐ٷꑩ6Х줎Q͙󎕭龜𙛿ٹꑙ X𫄕@u񐑧蔥ⰬF鐸痳ݠچ&{𳕷j惛򐴇cPǀΌޮQ𷼦𷼦󸯃,vǁˆ𢨿􅵈᷐崎?]xŃ朇⻕%WļͬlƸЯ򾨝Aֶ轟촆󥆵偲󝓇А󸤍m䙡7񵶛󡶓򘑧仐񯺝RP𐊆s٠~j炃ٴ񦷕򎶩դm󸳲招Ljق䓩󑮤W⍛񇹆朚쿃렼υȧ՚⠑ᄒf}뢮𳜞򃀷씊Rꅻ޻̘鵢ϳ̓�`󉝰񵱹󨏰۝m󂶍x󆍈ٿ6ЁⒻْƧ`š䃭TOs:P󎨜򷳍ު㌁솃亍ﯯ)ᷰ’ǀĒȃЍ֎𖼚󡋁3L򭣰ߪ듻ݯ9f򰳫󳾾Ƞ!柎򿥊󐱮Y㒇𾙌ѷ͌ݬݦ˒ƒϢ㾔㠆䙡ρ깪ꖘ9򃔺论癛uӖ켬e۶ذ򮪬Vꥰ􏣠O중옝㌬㦥𓫑򶭟-񹋭ᰶψ4s䑎󀿚􋥶Ӳ_758쉓ܵʁ缂;âs輌毑{鷛 ӵ񒧴񝹾틢sև󂴫X񈙔ӓʾ<奠묷å򅛬ꥪݹإݾv҉⪐敢gʃ򣻳éx釻񹓚򷧶ӆ򧩸늿ᶃ򵔹˭ԑ勇Ǹܮ𻜯񞄴6ױ琧򙺓bʼn❪#q邔ನ霞ᤡ͆V􇅑ٺ񞡪𘃘򸆌z񒼋󕌙ʿ𭖎򗜽􍩒դ۱h𚠫*󂺆襗oײQ9ݓ퐅𝒪𷨺𹸷3ɹ񶌎֚߯ȍ񽫺𡉥7}󑞉ρ菱񹓚󿌶𜖷o̸򷧶ӆh󡹶􊲓맢0"; int8 main() { if equalstr(str, str_equal) and !equalstr(str, str_diff) { diff --git a/test/atmega328p/string-upperstr.rob b/test/atmega328p/string-upperstr.rob new file mode 100644 index 0000000..c93db9a --- /dev/null +++ b/test/atmega328p/string-upperstr.rob @@ -0,0 +1,15 @@ +use string.equalstr; +use string.upperstr; + +int32 main() { + + l_str = "aabbáçaabbáç"; + + utf8_string_to_uppercase(l_str); + + if equalstr (l_str, "AABBÁÇAABBÁÇ") { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/atmega328p/string-utf8len.rob b/test/atmega328p/string-utf8len.rob index f2300c6..f3eb5e4 100644 --- a/test/atmega328p/string-utf8len.rob +++ b/test/atmega328p/string-utf8len.rob @@ -1,10 +1,10 @@ use string.utf8strlen; -const str = "鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKvs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKvs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉw"; +const str = "Ԍ񪹅◣E憕K糈lغȶ픏G񞩑޸壴c񒠛Σ'Ϡڇ𖩢򼧽0澆hې񘃼؃2㭵fȼ돻쒢񗊧왏jĿԑ༯m垢2B覴󇹅S󤟎m2򲷸#烃󆨷쓃Īɑ뾀f򪍕[l𣖖󨜟Y&硨⇑͙𛢾􂶫 呫򟘫ǽ◓򨺗Wz^򽗛򔚽򭑃񓌑ӆW񙊰nݸ򧚱𭪬膌񹩔a%cᔥ𺓈ЭFʟ󯋬ҟ+>©󬔟񎎙񎎙͏᰷:뙉󪦝擛硰>nߘȷߐ񄷝蟐ʼnv쵮𵌐綊MgФ򑧳񎎙ݿ򭶝튠񳭘�ט축Æg㩗󵯊쫹Mԅ࣢ɒ»ⱖӳ򃑜ն𾲜򞭤Σ交ᄜ󼩠ד򦻬⿰쬦񼮜侶դߩŏz喧ф;�_͛弎ׯ߲OҐ@򠰼򷞞9񎑆𦺞𮨸Ȱ$.Ӧп񦡦|ʈ讥򒳛򬯚)񫟉sεTȗ𵐾3򈆠Ƭ񑨰ߪn3򀯛³ݘﯽs󳪖沄􎛒pй򣤍󖍾o=༂ړ񁢗󆿏J顯˶ᱣ󚃈􅯥򹯓ֽϊ征󪕅񼡪�B曡՟พ𒏚ӈs񎎙ۑR󬭵򧞑胂Ѥ𘘋𡢶ި+𻛹Ⴧѱƌ𶄼􃟨񪳭l򢩅t򦂲船𓧨񵞰񻛂⒤߀Ֆ剩򭐃򓝛쪑ޙմ߆ٱҀ﬉ϗ(񸠴o𾈺şi㥉lk`𱨶稯哫仇ǚƜtⲂỖbō𦪷睋󚼩ضF㟆拄౞8녘櫡өo2݈_捰򜼉슋�Y躘Y�*瑍ǃ󄑬񞊃G΢򼇉򨇓$B堁ʈȆᎰ̻󀏞􄞝𞞋򍐇Ŝˢɧ𗽢2힃Ǩ󱘅Ğͬ񓞥򣋱^߯󔛌ү-𠛛Ϻ0򋔑௯󓺣ᗣ𣦭95M򡹟􍎃ör蝗džЃ1񱠥藩󦛷Ꙧȶ󺇲1҅픸󃅭򉬻{犧 έț󤆯ꯨ񙾢X򟈜ཡس⵳ؕ?JժyJ(⋏܈󎴦ۥ农ߊʹ壛i󄻏󶮨䟊z逵ϳ񎎙轣󲾑y⮰VYφ񎎙⹁ίᜭર껔Ϳ❵૽䓮瘝pYeꤚ򐩼򥞢󲡞噲澘须󰜚c]cҺǙ󙁸󏾖ퟭ򘲱ͩ󆿳է0?񳤍󊟆񧖍𭷡򘹕୓;򬌆Ӽ搏:򅇚ٕ"; int8 main() { r = utf8strlen(str); - if r == 830 { + if r == 810 { return 0; } else { return 1; diff --git a/test/general/string-contains.rob b/test/general/string-contains.rob index ff00981..40e6590 100644 --- a/test/general/string-contains.rob +++ b/test/general/string-contains.rob @@ -1,10 +1,10 @@ use string.contains; -const str1 = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊"; +const str1 = "򐟎빉萦%ˍ켁̿Ǩ윊c升T{奀վuA񲁒𫾡𤃔򜄼􋉦괄񆔷ӌ>r󮤋ֆ۲𻍠ᚧ속腠ƒ󷼨񀐶񈪾ʴ󛐯mɁ姎-蓥񒡳^OC񉡎Łȵ́ꫢ؝񎯀𯏍є򬎧6􁜧Ǚ􂸫Æ񝽥DŽ흃򼵾ͥp񷰥񌕀y홋޹ӑqꥈ麧º겪𷣟󽨏񮆠Ҳߜ蟩̐󒉂m󽮁Ԏ粈#Aܳ𓖎k碽󶪩È೦繯˯󺶌ׂԠ:㮹>𸜝I񯙼V𙾌қ𷂯j𖪜٦Aॼ񩵜Ȯ怄᤟4񄥳肁睈)Ѿ又怾􉿿笚ǦO匯ؤĒ径lӪ񈦦񍿅ƣ꒥Yܐܩ>ꂛ߉򏆍ۗ/껠D䑥궖􌠬ՙ𓎪zb �롏|ʸh毕_š􅪃0փ򈔵񤁯ܡ歨򣍓򱤂ԛ񧞂댙ڞ#򯚭򽊤ĭעǃүK񷼝�e񙖰˵𤘖ق֩R𷄹Θx-껇ǹĻ񽀄靺O㊖Ĥ󙿗򗮡!ܒOLp񽿚ݰ񢛏$搜򯝠纱؟4ر� Ὧi󴢼啣򙤙瑉⤄񫝛񛎗UϘ󩧜݋󉏿񙥠ޔҴ󨮣޳ל򓁓d􍩶򡲵𥉐9Е󇆦󀨑2gڷ^󎽠𺹽ܨՋf酁ֲ🄒^񫨅)4L񆔜�⾎𑨂򡟸R쯐Ʃ󏅡4i䀠ݾ ܫ󷡚!컳䭾fX݃Ѝ)𑳛k􋫷J閇앳񑻻@nƝ󟧈򟏞򬁶𯘗񔳅ӧd򇾾ئ򱫪î׻9⿥m˒:ȞΆ텍Ⓐ򱭴䤁𒻯身摏c󤊋Т,׉߰淜Q켮L{ĭ˨󇿛㻒ș󪲑󔗩򀵃̂ŝCN򱢕἖­𚣿񉚘ô.弎Ь:*ܽ񴷎^󁒸􈥡)ፌ杻È[Ό󘵘ᆅ眔񟑤"; -const str2 = "/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮"; +const str2 = "􂸫Æ񝽥DŽ흃򼵾ͥp񷰥񌕀y홋޹ӑqꥈ麧º겪𷣟󽨏񮆠Ҳߜ蟩̐󒉂m󽮁Ԏ粈#Aܳ𓖎k碽󶪩È೦繯˯󺶌ׂԠ:㮹>𸜝I񯙼V𙾌қ𷂯j𖪜٦Aॼ񩵜Ȯ怄᤟4񄥳肁睈)Ѿ又怾􉿿笚ǦO匯ؤĒ径lӪ񈦦񍿅ƣ꒥Yܐܩ>ꂛ߉򏆍ۗ/껠D䑥궖􌠬ՙ𓎪zb �롏|ʸh毕_š􅪃0փ򈔵񤁯ܡ歨򣍓򱤂ԛ񧞂댙ڞ#򯚭򽊤ĭעǃүK񷼝�e񙖰˵𤘖ق֩R𷄹Θx-껇ǹĻ񽀄靺O㊖Ĥ󙿗򗮡!ܒOLp񽿚ݰ񢛏$搜򯝠纱؟4ر� Ὧi󴢼啣򙤙瑉⤄񫝛񛎗UϘ󩧜݋󉏿񙥠ޔҴ󨮣޳ל"; -const str3 = "Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚"; +const str3 = "׾΁A?Ӥ󨨎Žr񮷤򩟴Zࢥ񸃞Σ퟽陊ޤ上櫄򼔄걜㟰żLޏu󍘧vۺ򣚃ӓ𞆟܀�􇶦IĽ栿u𮔏c􊙾𽻪퀊歲𦢠y󇎹ꉃӁ繻縠𷈶0򙤁𧭼=ԫ店򳜳͗Ȕ ƕ퇍蘛ラ𡭑 뢛4ږR첻/򇞆gI𘍎뢼􀑠8͕hȞ󝆬󷜇䯗ӹ󥺞𩏠p1ɍ𫔎*�عw٘ڞQ򝼄mr㛙唅x䞰䋝eF񲯫꿽ѭھ矩D磀Y[Pԫ򓚦ⱗ򔧕񲸤B֦툫񣼙􎺍MMl癔㨥󝰼󪰪򳓶𸰁VΈ،Y˕j׶꬇񉥵걇򓮡򘮖ᆧέ㯼ӷ􈗮󧖂򐳂BtN󞢊.䓉=󗍒ۤ𡱭�遦o񢣾؎Ьﶴ򏍋󗚇񈸝砅J񙍅恴뷀Ɠꤋ֡ٚя$"; int8 main() { r = containsstr(str1, str2); diff --git a/test/general/string-equal.rob b/test/general/string-equal.rob index bda654d..68c2b5e 100644 --- a/test/general/string-equal.rob +++ b/test/general/string-equal.rob @@ -1,10 +1,10 @@ use string.equalstr; -const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬"; +const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯"; -const str_equal = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬"; +const str_equal = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯"; -const str_diff = "㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7"; +const str_diff = "𴙗Ȉ􉏺ݤ歠šω9୆碻ノ쿵E΃f񟸠&𗌐Ҁϓ򀙷睆i๒ۯ荬ե}萒㽁ȐƤ 𚟙𷓂񂅘㯩펑Ƹ确ʺ󩰭ݍ𧗐ٷꑩ6Х줎Q͙󎕭龜𙛿ٹꑙ X𫄕@u񐑧蔥ⰬF鐸痳ݠچ&{𳕷j惛򐴇cPǀΌޮQ𷼦𷼦󸯃,vǁˆ𢨿􅵈᷐崎?]xŃ朇⻕%WļͬlƸЯ򾨝Aֶ轟촆󥆵偲󝓇А󸤍m䙡7񵶛󡶓򘑧仐񯺝RP𐊆s٠~j炃ٴ񦷕򎶩դm󸳲招Ljق䓩󑮤W⍛񇹆朚쿃렼υȧ՚⠑ᄒf}뢮𳜞򃀷씊Rꅻ޻̘鵢ϳ̓�`󉝰񵱹󨏰۝m󂶍x󆍈ٿ6ЁⒻْƧ`š䃭TOs:P󎨜򷳍ު㌁솃亍ﯯ)ᷰ’ǀĒȃЍ֎𖼚󡋁3L򭣰ߪ듻ݯ9f򰳫󳾾Ƞ!柎򿥊󐱮Y㒇𾙌ѷ͌ݬݦ˒ƒϢ㾔㠆䙡ρ깪ꖘ9򃔺论癛uӖ켬e۶ذ򮪬Vꥰ􏣠O중옝㌬㦥𓫑򶭟-񹋭ᰶψ4s䑎󀿚􋥶Ӳ_758쉓ܵʁ缂;âs輌毑{鷛 ӵ񒧴񝹾틢sև󂴫X񈙔ӓʾ<奠묷å򅛬ꥪݹإݾv҉⪐敢gʃ򣻳éx釻񹓚򷧶ӆ򧩸늿ᶃ򵔹˭ԑ勇Ǹܮ𻜯񞄴6ױ琧򙺓bʼn❪#q邔ನ霞ᤡ͆V􇅑ٺ񞡪𘃘򸆌z񒼋󕌙ʿ𭖎򗜽􍩒դ۱h𚠫*󂺆襗oײQ9ݓ퐅𝒪𷨺𹸷3ɹ񶌎֚߯ȍ񽫺𡉥7}󑞉ρ菱񹓚󿌶𜖷o̸򷧶ӆh󡹶􊲓맢0"; int8 main() { if equalstr(str, str_equal) and !equalstr(str, str_diff) { diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index 4c3e097..c93db9a 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -1,817 +1,13 @@ use string.equalstr; - -mapping = { - 0x0061, 0x0041 , - 0x0062, 0x0042 , - 0x0063, 0x0043 , - 0x0064, 0x0044 , - 0x0065, 0x0045 , - 0x0066, 0x0046 , - 0x0067, 0x0047 , - 0x0068, 0x0048 , - 0x0069, 0x0049 , - 0x006A, 0x004A , - 0x006B, 0x004B , - 0x006C, 0x004C , - 0x006D, 0x004D , - 0x006E, 0x004E , - 0x006F, 0x004F , - 0x0070, 0x0050 , - 0x0071, 0x0051 , - 0x0072, 0x0052 , - 0x0073, 0x0053 , - 0x0074, 0x0054 , - 0x0075, 0x0055 , - 0x0076, 0x0056 , - 0x0077, 0x0057 , - 0x0078, 0x0058 , - 0x0079, 0x0059 , - 0x007A, 0x005A , - 0x00E0, 0x00C0 , - 0x00E1, 0x00C1 , - 0x00E2, 0x00C2 , - 0x00E3, 0x00C3 , - 0x00E4, 0x00C4 , - 0x00E5, 0x00C5 , - 0x00E6, 0x00C6 , - 0x00E7, 0x00C7 , - 0x00E8, 0x00C8 , - 0x00E9, 0x00C9 , - 0x00EA, 0x00CA , - 0x00EB, 0x00CB , - 0x00EC, 0x00CC , - 0x00ED, 0x00CD , - 0x00EE, 0x00CE , - 0x00EF, 0x00CF , - 0x00F0, 0x00D0 , - 0x00F1, 0x00D1 , - 0x00F2, 0x00D2 , - 0x00F3, 0x00D3 , - 0x00F4, 0x00D4 , - 0x00F5, 0x00D5 , - 0x00F6, 0x00D6 , - 0x00F8, 0x00D8 , - 0x00F9, 0x00D9 , - 0x00FA, 0x00DA , - 0x00FB, 0x00DB , - 0x00FC, 0x00DC , - 0x00FD, 0x00DD , - 0x00FE, 0x00DE , - 0x00FF, 0x0178 , - 0x0101, 0x0100 , - 0x0103, 0x0102 , - 0x0105, 0x0104 , - 0x0107, 0x0106 , - 0x0109, 0x0108 , - 0x010B, 0x010A , - 0x010D, 0x010C , - 0x010F, 0x010E , - 0x0111, 0x0110 , - 0x0113, 0x0112 , - 0x0115, 0x0114 , - 0x0117, 0x0116 , - 0x0119, 0x0118 , - 0x011B, 0x011A , - 0x011D, 0x011C , - 0x011F, 0x011E , - 0x0121, 0x0120 , - 0x0123, 0x0122 , - 0x0125, 0x0124 , - 0x0127, 0x0126 , - 0x0129, 0x0128 , - 0x012B, 0x012A , - 0x012D, 0x012C , - 0x012F, 0x012E , - 0x0131, 0x0049 , - 0x0133, 0x0132 , - 0x0135, 0x0134 , - 0x0137, 0x0136 , - 0x013A, 0x0139 , - 0x013C, 0x013B , - 0x013E, 0x013D , - 0x0140, 0x013F , - 0x0142, 0x0141 , - 0x0144, 0x0143 , - 0x0146, 0x0145 , - 0x0148, 0x0147 , - 0x014B, 0x014A , - 0x014D, 0x014C , - 0x014F, 0x014E , - 0x0151, 0x0150 , - 0x0153, 0x0152 , - 0x0155, 0x0154 , - 0x0157, 0x0156 , - 0x0159, 0x0158 , - 0x015B, 0x015A , - 0x015D, 0x015C , - 0x015F, 0x015E , - 0x0161, 0x0160 , - 0x0163, 0x0162 , - 0x0165, 0x0164 , - 0x0167, 0x0166 , - 0x0169, 0x0168 , - 0x016B, 0x016A , - 0x016D, 0x016C , - 0x016F, 0x016E , - 0x0171, 0x0170 , - 0x0173, 0x0172 , - 0x0175, 0x0174 , - 0x0177, 0x0176 , - 0x017A, 0x0179 , - 0x017C, 0x017B , - 0x017E, 0x017D , - 0x0183, 0x0182 , - 0x0185, 0x0184 , - 0x0188, 0x0187 , - 0x018C, 0x018B , - 0x0192, 0x0191 , - 0x0199, 0x0198 , - 0x01A1, 0x01A0 , - 0x01A3, 0x01A2 , - 0x01A5, 0x01A4 , - 0x01A8, 0x01A7 , - 0x01AD, 0x01AC , - 0x01B0, 0x01AF , - 0x01B4, 0x01B3 , - 0x01B6, 0x01B5 , - 0x01B9, 0x01B8 , - 0x01BD, 0x01BC , - 0x01C6, 0x01C4 , - 0x01C9, 0x01C7 , - 0x01CC, 0x01CA , - 0x01CE, 0x01CD , - 0x01D0, 0x01CF , - 0x01D2, 0x01D1 , - 0x01D4, 0x01D3 , - 0x01D6, 0x01D5 , - 0x01D8, 0x01D7 , - 0x01DA, 0x01D9 , - 0x01DC, 0x01DB , - 0x01DF, 0x01DE , - 0x01E1, 0x01E0 , - 0x01E3, 0x01E2 , - 0x01E5, 0x01E4 , - 0x01E7, 0x01E6 , - 0x01E9, 0x01E8 , - 0x01EB, 0x01EA , - 0x01ED, 0x01EC , - 0x01EF, 0x01EE , - 0x01F3, 0x01F1 , - 0x01F5, 0x01F4 , - 0x01FB, 0x01FA , - 0x01FD, 0x01FC , - 0x01FF, 0x01FE , - 0x0201, 0x0200 , - 0x0203, 0x0202 , - 0x0205, 0x0204 , - 0x0207, 0x0206 , - 0x0209, 0x0208 , - 0x020B, 0x020A , - 0x020D, 0x020C , - 0x020F, 0x020E , - 0x0211, 0x0210 , - 0x0213, 0x0212 , - 0x0215, 0x0214 , - 0x0217, 0x0216 , - 0x0253, 0x0181 , - 0x0254, 0x0186 , - 0x0257, 0x018A , - 0x0258, 0x018E , - 0x0259, 0x018F , - 0x025B, 0x0190 , - 0x0260, 0x0193 , - 0x0263, 0x0194 , - 0x0268, 0x0197 , - 0x0269, 0x0196 , - 0x026F, 0x019C , - 0x0272, 0x019D , - 0x0275, 0x019F , - 0x0283, 0x01A9 , - 0x0288, 0x01AE , - 0x028A, 0x01B1 , - 0x028B, 0x01B2 , - 0x0292, 0x01B7 , - 0x03AC, 0x0386 , - 0x03AD, 0x0388 , - 0x03AE, 0x0389 , - 0x03AF, 0x038A , - 0x03B1, 0x0391 , - 0x03B2, 0x0392 , - 0x03B3, 0x0393 , - 0x03B4, 0x0394 , - 0x03B5, 0x0395 , - 0x03B6, 0x0396 , - 0x03B7, 0x0397 , - 0x03B8, 0x0398 , - 0x03B9, 0x0399 , - 0x03BA, 0x039A , - 0x03BB, 0x039B , - 0x03BC, 0x039C , - 0x03BD, 0x039D , - 0x03BE, 0x039E , - 0x03BF, 0x039F , - 0x03C0, 0x03A0 , - 0x03C1, 0x03A1 , - 0x03C3, 0x03A3 , - 0x03C4, 0x03A4 , - 0x03C5, 0x03A5 , - 0x03C6, 0x03A6 , - 0x03C7, 0x03A7 , - 0x03C8, 0x03A8 , - 0x03C9, 0x03A9 , - 0x03CA, 0x03AA , - 0x03CB, 0x03AB , - 0x03CC, 0x038C , - 0x03CD, 0x038E , - 0x03CE, 0x038F , - 0x03E3, 0x03E2 , - 0x03E5, 0x03E4 , - 0x03E7, 0x03E6 , - 0x03E9, 0x03E8 , - 0x03EB, 0x03EA , - 0x03ED, 0x03EC , - 0x03EF, 0x03EE , - 0x0430, 0x0410 , - 0x0431, 0x0411 , - 0x0432, 0x0412 , - 0x0433, 0x0413 , - 0x0434, 0x0414 , - 0x0435, 0x0415 , - 0x0436, 0x0416 , - 0x0437, 0x0417 , - 0x0438, 0x0418 , - 0x0439, 0x0419 , - 0x043A, 0x041A , - 0x043B, 0x041B , - 0x043C, 0x041C , - 0x043D, 0x041D , - 0x043E, 0x041E , - 0x043F, 0x041F , - 0x0440, 0x0420 , - 0x0441, 0x0421 , - 0x0442, 0x0422 , - 0x0443, 0x0423 , - 0x0444, 0x0424 , - 0x0445, 0x0425 , - 0x0446, 0x0426 , - 0x0447, 0x0427 , - 0x0448, 0x0428 , - 0x0449, 0x0429 , - 0x044A, 0x042A , - 0x044B, 0x042B , - 0x044C, 0x042C , - 0x044D, 0x042D , - 0x044E, 0x042E , - 0x044F, 0x042F , - 0x0451, 0x0401 , - 0x0452, 0x0402 , - 0x0453, 0x0403 , - 0x0454, 0x0404 , - 0x0455, 0x0405 , - 0x0456, 0x0406 , - 0x0457, 0x0407 , - 0x0458, 0x0408 , - 0x0459, 0x0409 , - 0x045A, 0x040A , - 0x045B, 0x040B , - 0x045C, 0x040C , - 0x045E, 0x040E , - 0x045F, 0x040F , - 0x0461, 0x0460 , - 0x0463, 0x0462 , - 0x0465, 0x0464 , - 0x0467, 0x0466 , - 0x0469, 0x0468 , - 0x046B, 0x046A , - 0x046D, 0x046C , - 0x046F, 0x046E , - 0x0471, 0x0470 , - 0x0473, 0x0472 , - 0x0475, 0x0474 , - 0x0477, 0x0476 , - 0x0479, 0x0478 , - 0x047B, 0x047A , - 0x047D, 0x047C , - 0x047F, 0x047E , - 0x0481, 0x0480 , - 0x0491, 0x0490 , - 0x0493, 0x0492 , - 0x0495, 0x0494 , - 0x0497, 0x0496 , - 0x0499, 0x0498 , - 0x049B, 0x049A , - 0x049D, 0x049C , - 0x049F, 0x049E , - 0x04A1, 0x04A0 , - 0x04A3, 0x04A2 , - 0x04A5, 0x04A4 , - 0x04A7, 0x04A6 , - 0x04A9, 0x04A8 , - 0x04AB, 0x04AA , - 0x04AD, 0x04AC , - 0x04AF, 0x04AE , - 0x04B1, 0x04B0 , - 0x04B3, 0x04B2 , - 0x04B5, 0x04B4 , - 0x04B7, 0x04B6 , - 0x04B9, 0x04B8 , - 0x04BB, 0x04BA , - 0x04BD, 0x04BC , - 0x04BF, 0x04BE , - 0x04C2, 0x04C1 , - 0x04C4, 0x04C3 , - 0x04C8, 0x04C7 , - 0x04CC, 0x04CB , - 0x04D1, 0x04D0 , - 0x04D3, 0x04D2 , - 0x04D5, 0x04D4 , - 0x04D7, 0x04D6 , - 0x04D9, 0x04D8 , - 0x04DB, 0x04DA , - 0x04DD, 0x04DC , - 0x04DF, 0x04DE , - 0x04E1, 0x04E0 , - 0x04E3, 0x04E2 , - 0x04E5, 0x04E4 , - 0x04E7, 0x04E6 , - 0x04E9, 0x04E8 , - 0x04EB, 0x04EA , - 0x04EF, 0x04EE , - 0x04F1, 0x04F0 , - 0x04F3, 0x04F2 , - 0x04F5, 0x04F4 , - 0x04F9, 0x04F8 , - 0x0561, 0x0531 , - 0x0562, 0x0532 , - 0x0563, 0x0533 , - 0x0564, 0x0534 , - 0x0565, 0x0535 , - 0x0566, 0x0536 , - 0x0567, 0x0537 , - 0x0568, 0x0538 , - 0x0569, 0x0539 , - 0x056A, 0x053A , - 0x056B, 0x053B , - 0x056C, 0x053C , - 0x056D, 0x053D , - 0x056E, 0x053E , - 0x056F, 0x053F , - 0x0570, 0x0540 , - 0x0571, 0x0541 , - 0x0572, 0x0542 , - 0x0573, 0x0543 , - 0x0574, 0x0544 , - 0x0575, 0x0545 , - 0x0576, 0x0546 , - 0x0577, 0x0547 , - 0x0578, 0x0548 , - 0x0579, 0x0549 , - 0x057A, 0x054A , - 0x057B, 0x054B , - 0x057C, 0x054C , - 0x057D, 0x054D , - 0x057E, 0x054E , - 0x057F, 0x054F , - 0x0580, 0x0550 , - 0x0581, 0x0551 , - 0x0582, 0x0552 , - 0x0583, 0x0553 , - 0x0584, 0x0554 , - 0x0585, 0x0555 , - 0x0586, 0x0556 , - 0x10D0, 0x10A0 , - 0x10D1, 0x10A1 , - 0x10D2, 0x10A2 , - 0x10D3, 0x10A3 , - 0x10D4, 0x10A4 , - 0x10D5, 0x10A5 , - 0x10D6, 0x10A6 , - 0x10D7, 0x10A7 , - 0x10D8, 0x10A8 , - 0x10D9, 0x10A9 , - 0x10DA, 0x10AA , - 0x10DB, 0x10AB , - 0x10DC, 0x10AC , - 0x10DD, 0x10AD , - 0x10DE, 0x10AE , - 0x10DF, 0x10AF , - 0x10E0, 0x10B0 , - 0x10E1, 0x10B1 , - 0x10E2, 0x10B2 , - 0x10E3, 0x10B3 , - 0x10E4, 0x10B4 , - 0x10E5, 0x10B5 , - 0x10E6, 0x10B6 , - 0x10E7, 0x10B7 , - 0x10E8, 0x10B8 , - 0x10E9, 0x10B9 , - 0x10EA, 0x10BA , - 0x10EB, 0x10BB , - 0x10EC, 0x10BC , - 0x10ED, 0x10BD , - 0x10EE, 0x10BE , - 0x10EF, 0x10BF , - 0x10F0, 0x10C0 , - 0x10F1, 0x10C1 , - 0x10F2, 0x10C2 , - 0x10F3, 0x10C3 , - 0x10F4, 0x10C4 , - 0x10F5, 0x10C5 , - 0x1E01, 0x1E00 , - 0x1E03, 0x1E02 , - 0x1E05, 0x1E04 , - 0x1E07, 0x1E06 , - 0x1E09, 0x1E08 , - 0x1E0B, 0x1E0A , - 0x1E0D, 0x1E0C , - 0x1E0F, 0x1E0E , - 0x1E11, 0x1E10 , - 0x1E13, 0x1E12 , - 0x1E15, 0x1E14 , - 0x1E17, 0x1E16 , - 0x1E19, 0x1E18 , - 0x1E1B, 0x1E1A , - 0x1E1D, 0x1E1C , - 0x1E1F, 0x1E1E , - 0x1E21, 0x1E20 , - 0x1E23, 0x1E22 , - 0x1E25, 0x1E24 , - 0x1E27, 0x1E26 , - 0x1E29, 0x1E28 , - 0x1E2B, 0x1E2A , - 0x1E2D, 0x1E2C , - 0x1E2F, 0x1E2E , - 0x1E31, 0x1E30 , - 0x1E33, 0x1E32 , - 0x1E35, 0x1E34 , - 0x1E37, 0x1E36 , - 0x1E39, 0x1E38 , - 0x1E3B, 0x1E3A , - 0x1E3D, 0x1E3C , - 0x1E3F, 0x1E3E , - 0x1E41, 0x1E40 , - 0x1E43, 0x1E42 , - 0x1E45, 0x1E44 , - 0x1E47, 0x1E46 , - 0x1E49, 0x1E48 , - 0x1E4B, 0x1E4A , - 0x1E4D, 0x1E4C , - 0x1E4F, 0x1E4E , - 0x1E51, 0x1E50 , - 0x1E53, 0x1E52 , - 0x1E55, 0x1E54 , - 0x1E57, 0x1E56 , - 0x1E59, 0x1E58 , - 0x1E5B, 0x1E5A , - 0x1E5D, 0x1E5C , - 0x1E5F, 0x1E5E , - 0x1E61, 0x1E60 , - 0x1E63, 0x1E62 , - 0x1E65, 0x1E64 , - 0x1E67, 0x1E66 , - 0x1E69, 0x1E68 , - 0x1E6B, 0x1E6A , - 0x1E6D, 0x1E6C , - 0x1E6F, 0x1E6E , - 0x1E71, 0x1E70 , - 0x1E73, 0x1E72 , - 0x1E75, 0x1E74 , - 0x1E77, 0x1E76 , - 0x1E79, 0x1E78 , - 0x1E7B, 0x1E7A , - 0x1E7D, 0x1E7C , - 0x1E7F, 0x1E7E , - 0x1E81, 0x1E80 , - 0x1E83, 0x1E82 , - 0x1E85, 0x1E84 , - 0x1E87, 0x1E86 , - 0x1E89, 0x1E88 , - 0x1E8B, 0x1E8A , - 0x1E8D, 0x1E8C , - 0x1E8F, 0x1E8E , - 0x1E91, 0x1E90 , - 0x1E93, 0x1E92 , - 0x1E95, 0x1E94 , - 0x1EA1, 0x1EA0 , - 0x1EA3, 0x1EA2 , - 0x1EA5, 0x1EA4 , - 0x1EA7, 0x1EA6 , - 0x1EA9, 0x1EA8 , - 0x1EAB, 0x1EAA , - 0x1EAD, 0x1EAC , - 0x1EAF, 0x1EAE , - 0x1EB1, 0x1EB0 , - 0x1EB3, 0x1EB2 , - 0x1EB5, 0x1EB4 , - 0x1EB7, 0x1EB6 , - 0x1EB9, 0x1EB8 , - 0x1EBB, 0x1EBA , - 0x1EBD, 0x1EBC , - 0x1EBF, 0x1EBE , - 0x1EC1, 0x1EC0 , - 0x1EC3, 0x1EC2 , - 0x1EC5, 0x1EC4 , - 0x1EC7, 0x1EC6 , - 0x1EC9, 0x1EC8 , - 0x1ECB, 0x1ECA , - 0x1ECD, 0x1ECC , - 0x1ECF, 0x1ECE , - 0x1ED1, 0x1ED0 , - 0x1ED3, 0x1ED2 , - 0x1ED5, 0x1ED4 , - 0x1ED7, 0x1ED6 , - 0x1ED9, 0x1ED8 , - 0x1EDB, 0x1EDA , - 0x1EDD, 0x1EDC , - 0x1EDF, 0x1EDE , - 0x1EE1, 0x1EE0 , - 0x1EE3, 0x1EE2 , - 0x1EE5, 0x1EE4 , - 0x1EE7, 0x1EE6 , - 0x1EE9, 0x1EE8 , - 0x1EEB, 0x1EEA , - 0x1EED, 0x1EEC , - 0x1EEF, 0x1EEE , - 0x1EF1, 0x1EF0 , - 0x1EF3, 0x1EF2 , - 0x1EF5, 0x1EF4 , - 0x1EF7, 0x1EF6 , - 0x1EF9, 0x1EF8 , - 0x1F00, 0x1F08 , - 0x1F01, 0x1F09 , - 0x1F02, 0x1F0A , - 0x1F03, 0x1F0B , - 0x1F04, 0x1F0C , - 0x1F05, 0x1F0D , - 0x1F06, 0x1F0E , - 0x1F07, 0x1F0F , - 0x1F10, 0x1F18 , - 0x1F11, 0x1F19 , - 0x1F12, 0x1F1A , - 0x1F13, 0x1F1B , - 0x1F14, 0x1F1C , - 0x1F15, 0x1F1D , - 0x1F20, 0x1F28 , - 0x1F21, 0x1F29 , - 0x1F22, 0x1F2A , - 0x1F23, 0x1F2B , - 0x1F24, 0x1F2C , - 0x1F25, 0x1F2D , - 0x1F26, 0x1F2E , - 0x1F27, 0x1F2F , - 0x1F30, 0x1F38 , - 0x1F31, 0x1F39 , - 0x1F32, 0x1F3A , - 0x1F33, 0x1F3B , - 0x1F34, 0x1F3C , - 0x1F35, 0x1F3D , - 0x1F36, 0x1F3E , - 0x1F37, 0x1F3F , - 0x1F40, 0x1F48 , - 0x1F41, 0x1F49 , - 0x1F42, 0x1F4A , - 0x1F43, 0x1F4B , - 0x1F44, 0x1F4C , - 0x1F45, 0x1F4D , - 0x1F51, 0x1F59 , - 0x1F53, 0x1F5B , - 0x1F55, 0x1F5D , - 0x1F57, 0x1F5F , - 0x1F60, 0x1F68 , - 0x1F61, 0x1F69 , - 0x1F62, 0x1F6A , - 0x1F63, 0x1F6B , - 0x1F64, 0x1F6C , - 0x1F65, 0x1F6D , - 0x1F66, 0x1F6E , - 0x1F67, 0x1F6F , - 0x1F80, 0x1F88 , - 0x1F81, 0x1F89 , - 0x1F82, 0x1F8A , - 0x1F83, 0x1F8B , - 0x1F84, 0x1F8C , - 0x1F85, 0x1F8D , - 0x1F86, 0x1F8E , - 0x1F87, 0x1F8F , - 0x1F90, 0x1F98 , - 0x1F91, 0x1F99 , - 0x1F92, 0x1F9A , - 0x1F93, 0x1F9B , - 0x1F94, 0x1F9C , - 0x1F95, 0x1F9D , - 0x1F96, 0x1F9E , - 0x1F97, 0x1F9F , - 0x1FA0, 0x1FA8 , - 0x1FA1, 0x1FA9 , - 0x1FA2, 0x1FAA , - 0x1FA3, 0x1FAB , - 0x1FA4, 0x1FAC , - 0x1FA5, 0x1FAD , - 0x1FA6, 0x1FAE , - 0x1FA7, 0x1FAF , - 0x1FB0, 0x1FB8 , - 0x1FB1, 0x1FB9 , - 0x1FD0, 0x1FD8 , - 0x1FD1, 0x1FD9 , - 0x1FE0, 0x1FE8 , - 0x1FE1, 0x1FE9 , - 0x24D0, 0x24B6 , - 0x24D1, 0x24B7 , - 0x24D2, 0x24B8 , - 0x24D3, 0x24B9 , - 0x24D4, 0x24BA , - 0x24D5, 0x24BB , - 0x24D6, 0x24BC , - 0x24D7, 0x24BD , - 0x24D8, 0x24BE , - 0x24D9, 0x24BF , - 0x24DA, 0x24C0 , - 0x24DB, 0x24C1 , - 0x24DC, 0x24C2 , - 0x24DD, 0x24C3 , - 0x24DE, 0x24C4 , - 0x24DF, 0x24C5 , - 0x24E0, 0x24C6 , - 0x24E1, 0x24C7 , - 0x24E2, 0x24C8 , - 0x24E3, 0x24C9 , - 0x24E4, 0x24CA , - 0x24E5, 0x24CB , - 0x24E6, 0x24CC , - 0x24E7, 0x24CD , - 0x24E8, 0x24CE , - 0x24E9, 0x24CF , - 0xFF41, 0xFF21 , - 0xFF42, 0xFF22 , - 0xFF43, 0xFF23 , - 0xFF44, 0xFF24 , - 0xFF45, 0xFF25 , - 0xFF46, 0xFF26 , - 0xFF47, 0xFF27 , - 0xFF48, 0xFF28 , - 0xFF49, 0xFF29 , - 0xFF4A, 0xFF2A , - 0xFF4B, 0xFF2B , - 0xFF4C, 0xFF2C , - 0xFF4D, 0xFF2D , - 0xFF4E, 0xFF2E , - 0xFF4F, 0xFF2F , - 0xFF50, 0xFF30 , - 0xFF51, 0xFF31 , - 0xFF52, 0xFF32 , - 0xFF53, 0xFF33 , - 0xFF54, 0xFF34 , - 0xFF55, 0xFF35 , - 0xFF56, 0xFF36 , - 0xFF57, 0xFF37 , - 0xFF58, 0xFF38 , - 0xFF59, 0xFF39 , - 0xFF5A, 0xFF3A -}; - - type Codepoint { - code = uint32(0); - } - - int32 utf8_decode(char[] s, uint16 i, Codepoint c) { - if (s[i] < 0x80) { - c.code = s[i]; - return 1; // 1 byte - } else if ((s[i] & 0xE0) == 0xC0) { - c.code = ((s[i] & 0x1F) << 6) | (s[1] & 0x3F); - return 2; // 2 bytes - } else if ((s[i] & 0xF0) == 0xE0) { - c.code = ((s[i] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); - return 3; // 3 bytes - } else if ((s[i] & 0xF8) == 0xF0) { - c.code = ((s[i] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); - return 4; // 4 bytes - } - return -1; - } - - int32 utf8_encode(uint32 codepoint, char[] output) { - if (codepoint <= 0x7F) { - output[0] = codepoint & 0x7F; - return 1; // 1 byte - } else if (codepoint <= 0x7FF) { - output[0] = 0xC0 | ((codepoint >> 6) & 0x1F); - output[1] = 0x80 | (codepoint & 0x3F); - return 2; // 2 bytes - } else if (codepoint <= 0xFFFF) { - output[0] = 0xE0 | ((codepoint >> 12) & 0x0F); - output[1] = 0x80 | ((codepoint >> 6) & 0x3F); - output[2] = 0x80 | (codepoint & 0x3F); - return 3; // 3 bytes - } else if (codepoint <= 0x10FFFF) { - output[0] = 0xF0 | ((codepoint >> 18) & 0x07); - output[1] = 0x80 | ((codepoint >> 12) & 0x3F); - output[2] = 0x80 | ((codepoint >> 6) & 0x3F); - output[3] = 0x80 | (codepoint & 0x3F); - return 4; // 4 bytes - } - return -1; - } - - int32 to_uppercase(uint32 codepoint) { - i = uint16(0); - while i < mapping.size { - if mapping[i] == codepoint { - return mapping[i + 1]; - } - i += 2; - } - - if (codepoint >= 0x61 and codepoint <= 0x7A) { - return codepoint & 0x5F; - } - return codepoint; - } - - int32 to_lowercase(uint32 codepoint) { - i = uint16(0); - while i < mapping.size { - if mapping[i + 1] == codepoint { - return mapping[i]; - } - i += 2; - } - - if (codepoint >= 0x41 and codepoint <= 0x5A) { - return codepoint | 0x20; - } - return codepoint; - } - - void strcpy(char[] src, uint16 spos, char[] dst, uint16 dpos, uint16 len) { - i = 0; - if (spos + len > src.size) or (dpos + len > dst.size) { - return; - } - while (i < len) { - dst[dpos + i] = src[spos + i]; - i++; - } - } - - - void utf8_string_to_uppercase(char[] str) { - p = uint16 (0); - w = uint16 (0); - output = {0:4}; - - while p < str.size { - codepoint = Codepoint(); - len = utf8_decode(str, p, codepoint); - if (len < 1) { - p++; - } else { - uppercase_codepoint = to_uppercase(codepoint.code); - out_len = utf8_encode(uppercase_codepoint, output); - - if (out_len > 0) { - strcpy(output, 0, str, w, out_len); - w += out_len; - } - - p += len; - } - - } - } - - void utf8_string_to_lowercase(char[] str) { - p = uint16 (0); - w = uint16 (0); - output = {0:4}; - - while p < str.size { - codepoint = Codepoint(); - len = utf8_decode(str, p, codepoint); - if (len < 1) { - p++; - } else { - lowercase_codepoint = to_lowercase(codepoint.code); - out_len = utf8_encode(lowercase_codepoint, output); - - if (out_len > 0) { - strcpy(output, 0, str, w, out_len); - w += out_len; - } - - p += len; - } - - } - } +use string.upperstr; int32 main() { - l_str = "áç"; + l_str = "aabbáçaabbáç"; utf8_string_to_uppercase(l_str); - if equalstr (l_str, "ÁÇ") { + if equalstr (l_str, "AABBÁÇAABBÁÇ") { return 0; } else { return 1; diff --git a/test/general/string-utf8len.rob b/test/general/string-utf8len.rob index c8a9d2f..f3eb5e4 100644 --- a/test/general/string-utf8len.rob +++ b/test/general/string-utf8len.rob @@ -1,10 +1,10 @@ use string.utf8strlen; -const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊"; +const str = "Ԍ񪹅◣E憕K糈lغȶ픏G񞩑޸壴c񒠛Σ'Ϡڇ𖩢򼧽0澆hې񘃼؃2㭵fȼ돻쒢񗊧왏jĿԑ༯m垢2B覴󇹅S󤟎m2򲷸#烃󆨷쓃Īɑ뾀f򪍕[l𣖖󨜟Y&硨⇑͙𛢾􂶫 呫򟘫ǽ◓򨺗Wz^򽗛򔚽򭑃񓌑ӆW񙊰nݸ򧚱𭪬膌񹩔a%cᔥ𺓈ЭFʟ󯋬ҟ+>©󬔟񎎙񎎙͏᰷:뙉󪦝擛硰>nߘȷߐ񄷝蟐ʼnv쵮𵌐綊MgФ򑧳񎎙ݿ򭶝튠񳭘�ט축Æg㩗󵯊쫹Mԅ࣢ɒ»ⱖӳ򃑜ն𾲜򞭤Σ交ᄜ󼩠ד򦻬⿰쬦񼮜侶դߩŏz喧ф;�_͛弎ׯ߲OҐ@򠰼򷞞9񎑆𦺞𮨸Ȱ$.Ӧп񦡦|ʈ讥򒳛򬯚)񫟉sεTȗ𵐾3򈆠Ƭ񑨰ߪn3򀯛³ݘﯽs󳪖沄􎛒pй򣤍󖍾o=༂ړ񁢗󆿏J顯˶ᱣ󚃈􅯥򹯓ֽϊ征󪕅񼡪�B曡՟พ𒏚ӈs񎎙ۑR󬭵򧞑胂Ѥ𘘋𡢶ި+𻛹Ⴧѱƌ𶄼􃟨񪳭l򢩅t򦂲船𓧨񵞰񻛂⒤߀Ֆ剩򭐃򓝛쪑ޙմ߆ٱҀ﬉ϗ(񸠴o𾈺şi㥉lk`𱨶稯哫仇ǚƜtⲂỖbō𦪷睋󚼩ضF㟆拄౞8녘櫡өo2݈_捰򜼉슋�Y躘Y�*瑍ǃ󄑬񞊃G΢򼇉򨇓$B堁ʈȆᎰ̻󀏞􄞝𞞋򍐇Ŝˢɧ𗽢2힃Ǩ󱘅Ğͬ񓞥򣋱^߯󔛌ү-𠛛Ϻ0򋔑௯󓺣ᗣ𣦭95M򡹟􍎃ör蝗džЃ1񱠥藩󦛷Ꙧȶ󺇲1҅픸󃅭򉬻{犧 έț󤆯ꯨ񙾢X򟈜ཡس⵳ؕ?JժyJ(⋏܈󎴦ۥ农ߊʹ壛i󄻏󶮨䟊z逵ϳ񎎙轣󲾑y⮰VYφ񎎙⹁ίᜭર껔Ϳ❵૽䓮瘝pYeꤚ򐩼򥞢󲡞噲澘须󰜚c]cҺǙ󙁸󏾖ퟭ򘲱ͩ󆿳է0?񳤍󊟆񧖍𭷡򘹕୓;򬌆Ӽ搏:򅇚ٕ"; int8 main() { r = utf8strlen(str); - if r == 200 { + if r == 810 { return 0; } else { return 1; From c78d98adbd15521d18a28664c92259e3a625e7d9 Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Sat, 9 Nov 2024 15:46:59 -0300 Subject: [PATCH 16/24] Initial support to avr1284p; add test folder to stm32f1. --- lib/Makefile | 7 +- lib/atmega1284p.ld | 17 +++ lib/atmega1284p.rob | 147 ++++++++++++++++++++++++ src/BackLLVM.cpp | 1 + src/BackLLVM.h | 1 + test/atmega1284p/Makefile | 52 +++++++++ test/atmega1284p/bitstruct-field-i5.rob | 1 + test/atmega1284p/bsscheck.rob | 1 + test/atmega1284p/bssinjcheck.rob | 1 + test/atmega1284p/datacheck.rob | 1 + test/atmega1284p/float.rob | 1 + test/atmega1284p/globaldata.rob | 1 + test/atmega1284p/globals.rob | 1 + test/atmega1284p/itoa.rob | 1 + test/atmega1284p/memcpycheck.rob | 1 + test/atmega1284p/robcmp-simavr-debug | 1 + test/atmega1284p/run_avr | 1 + test/atmega1284p/runtest.sh | 1 + test/atmega1284p/runtrace.sh | 1 + test/atmega1284p/uart.rob | 1 + test/atmega1284p/uartdata.rob | 1 + test/stm32f1/Makefile | 54 +++++++++ test/stm32f1/blink.rob | 20 ++++ test/stm32f1/example.rob | 41 +++++++ test/stm32f1/runtest.sh | 27 +++++ test/stm32f1/uart.rob | 41 +++++++ 26 files changed, 422 insertions(+), 1 deletion(-) create mode 100644 lib/atmega1284p.ld create mode 100644 lib/atmega1284p.rob create mode 100644 test/atmega1284p/Makefile create mode 120000 test/atmega1284p/bitstruct-field-i5.rob create mode 120000 test/atmega1284p/bsscheck.rob create mode 120000 test/atmega1284p/bssinjcheck.rob create mode 120000 test/atmega1284p/datacheck.rob create mode 120000 test/atmega1284p/float.rob create mode 120000 test/atmega1284p/globaldata.rob create mode 120000 test/atmega1284p/globals.rob create mode 120000 test/atmega1284p/itoa.rob create mode 120000 test/atmega1284p/memcpycheck.rob create mode 120000 test/atmega1284p/robcmp-simavr-debug create mode 120000 test/atmega1284p/run_avr create mode 120000 test/atmega1284p/runtest.sh create mode 120000 test/atmega1284p/runtrace.sh create mode 120000 test/atmega1284p/uart.rob create mode 120000 test/atmega1284p/uartdata.rob create mode 100644 test/stm32f1/Makefile create mode 100644 test/stm32f1/blink.rob create mode 100644 test/stm32f1/example.rob create mode 100755 test/stm32f1/runtest.sh create mode 100644 test/stm32f1/uart.rob diff --git a/lib/Makefile b/lib/Makefile index a2a586d..6d2ff32 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,5 +1,5 @@ -GEN=avr5.o +GEN=avr5.o avr51.o all: ${GEN} @@ -8,5 +8,10 @@ avr5.o: avr5.S @#avr-gcc -mmcu=avr5 -O3 -c $< clang --target=avr -mmcu=avr5 -O3 -c $< +avr51.o: avr51.S + @#here we are interested in the fastest possible code, intead of size + @#avr-gcc -mmcu=avr5 -O3 -c $< + clang --target=avr -mmcu=avr51 -O3 -c $< + clean: rm -f ${GEN} diff --git a/lib/atmega1284p.ld b/lib/atmega1284p.ld new file mode 100644 index 0000000..1c114b9 --- /dev/null +++ b/lib/atmega1284p.ld @@ -0,0 +1,17 @@ +/* + * RobCmp linker script for atmega1284p + */ + +MEMORY +{ + text (rx) : ORIGIN = 0, LENGTH = 128K + data (rw!x) : ORIGIN = 0x800100, LENGTH = 16K + eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = 4K + fuse (rw!x) : ORIGIN = 0x820000, LENGTH = 1K + lock (rw!x) : ORIGIN = 0x830000, LENGTH = 1K + signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K + user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = 1K +} + +INCLUDE avr5.ld + diff --git a/lib/atmega1284p.rob b/lib/atmega1284p.rob new file mode 100644 index 0000000..7bab194 --- /dev/null +++ b/lib/atmega1284p.rob @@ -0,0 +1,147 @@ +/* + * Robcmp interruptions vector for atmega1284p + */ + +int8 main(); + +void __do_copy_data() naked { +asm " + ldi r17, hi8(__data_end) + ldi r26, lo8(__data_start) + ldi r27, hi8(__data_start) + ldi r30, lo8(__data_load_start) + ldi r31, hi8(__data_load_start) + rjmp __do_copy_data_start + __do_copy_data_loop: + lpm r0, Z+ + st X+, r0 + __do_copy_data_start: + cpi r26, lo8(__data_end) + cpc r27, r17 + brne __do_copy_data_loop + ret"; +} + +void __do_clear_bss() naked { +asm " + ldi r17, hi8(__bss_end) + ldi r26, lo8(__bss_start) + ldi r27, hi8(__bss_start) + rjmp __do_clear_bss_start + __do_clear_bss_loop: + st X+, r1 + __do_clear_bss_start: + cpi r26, lo8(__bss_end) + cpc r27, r17 + brne __do_clear_bss_loop + ret"; +} + +void __delay_us() naked { +asm " + ldi r18, 5 + __delay_ms_loop: + dec r18 + brne __delay_ms_loop + nop + ret"; +} + +/* Weak definitions for supported interruptions + */ + void irq_usart_rx() naked, weak, section __irqs { } + void irq_usart_tx() naked, weak, section __irqs { } + +/* Timer0 is used to provide milliseconds time readings + */ + const fcpu = 16E6; + const cycles_per_us = fcpu / 1E6; + const usec_per_ovf = (64 * 256) / cycles_per_us; + const millis_per_ovf = usec_per_ovf / 1000; + const millis_frac_per_ovf = uint16(usec_per_ovf % 1000); + timer0_millis = uint32(0); + timer0_fract = uint16(0); + + void irq_timer0_ovf() signal, weak, section __irqs { + timer0_millis += millis_per_ovf; + timer0_fract += millis_frac_per_ovf; + if (timer0_fract > 1000) { + timer0_fract -= 1000; + timer0_millis += 1; + } + } + + register int8 SREG at 0x5f; + + uint32 millis() { + sreg_bkp = SREG; + asm "cli"; + result = timer0_millis; + SREG = sreg_bkp; + return result; + } + +void __default_irq() naked, section __irqs { + asm "jmp __default_irq"; +} + +void __vectors() naked, section __isr { + + /* atmega1284p has 31 interruptions */ + asm "jmp __init"; + asm "jmp __default_irq"; // IRQ0 + asm "jmp __default_irq"; // IRQ1 + asm "jmp __default_irq"; // IRQ2 + asm "jmp __default_irq"; // PCINT0 + asm "jmp __default_irq"; // PCINT1 + asm "jmp __default_irq"; // PCINT2 + asm "jmp __default_irq"; // PCINT3 + asm "jmp __default_irq"; // Watchdog Timer + asm "jmp __default_irq"; // Timer2 Compare A + asm "jmp __default_irq"; // Timer2 Compare B + asm "jmp __default_irq"; // Timer2 Overflow + asm "jmp __default_irq"; // Timer1 Capture + asm "jmp __default_irq"; // Timer1 Compare A + asm "jmp __default_irq"; // Timer1 Compare B + asm "jmp __default_irq"; // Timer1 Overflow + asm "jmp __default_irq"; // Timer0 Compare A + asm "jmp __default_irq"; // Timer0 Compare B + asm "jmp irq_timer0_ovf"; // Timer0 Overflow + asm "jmp __default_irq"; // SPI Transfer Complete + asm "jmp irq_usart_rx"; // USART, RX Complete + asm "jmp __default_irq"; // USART, UDR Empty + asm "jmp irq_usart_tx"; // USART, TX Complete + asm "jmp __default_irq"; // Analog Comparator + asm "jmp __default_irq"; // ADC Conversion + asm "jmp __default_irq"; // EEPROM Ready + asm "jmp __default_irq"; // 2-wire Serial Interface (TWI) + asm "jmp __default_irq"; // Store Program Memory Ready + asm "jmp __default_irq"; // USART1 Rx Complete + asm "jmp __default_irq"; // USART1 Data Register Empty + asm "jmp __default_irq"; // USART1 Tx Complete + + asm "__init:"; + // clear r1 (zero reg) + asm "clr r1"; + // clear sreg + asm "out 0x3f, r1"; + // set stack at 0x40FF (0x100+16K-1) + asm "ldi r28, 0xFF"; + asm "ldi r29, 0x40"; + asm "out 0x3e, r29"; + asm "out 0x3d, r28"; + + // copy global vars init data + __do_copy_data(); + + // clear zeroed global vars + __do_clear_bss(); + + main(); + + // if main returns, disable interruptions and sleep. + // this is used to quit simavr in our tests + asm "cli"; + asm "sleep"; + } + diff --git a/src/BackLLVM.cpp b/src/BackLLVM.cpp index a3884e4..7f4007b 100644 --- a/src/BackLLVM.cpp +++ b/src/BackLLVM.cpp @@ -57,6 +57,7 @@ TargetInfo supportedTargets[__last_target] = { {rb_avr, "attiny85", "avr", "attiny85", "+avr25", tint16}, {rb_avr, "atmega328p", "avr", "atmega328p", "+avr5", tint16}, {rb_avr, "atmega32u4", "avr", "atmega32u4", "+avr5", tint16}, + {rb_avr, "atmega1284p", "avr", "atmega1284p", "+avr51", tint16}, {rb_arm, "stm32f1", "thumbv7m-none-eabi", "cortex-m3", "", tint32}, diff --git a/src/BackLLVM.h b/src/BackLLVM.h index f487106..610b1a3 100644 --- a/src/BackLLVM.h +++ b/src/BackLLVM.h @@ -28,6 +28,7 @@ enum SupportedTargets { st_attiny85, st_atmega328p, st_atmega32u4, + st_atmega1284p, // stm32 st_stm32f1, diff --git a/test/atmega1284p/Makefile b/test/atmega1284p/Makefile new file mode 100644 index 0000000..787aa4b --- /dev/null +++ b/test/atmega1284p/Makefile @@ -0,0 +1,52 @@ +ALL=$(patsubst %.rob,out/%,$(wildcard *.rob)) +ALL_LL=$(patsubst %.rob,out/%.ll,$(wildcard *.rob)) +ALL_TT=$(patsubst %.rob,%.tt,$(wildcard *.rob)) +ALL_OO=$(patsubst %.rob,out/%.o,$(wildcard *.rob)) out/atmega1284p.o + +ROBCMP=../../build/robcmp +INCLUDES=-I ../../lib + +ifndef OPT +#OPT=-g -O0 +OPT=-Oz +endif + +LD_FLAGS=-nostdlib -entry=main -L../../lib -Tatmega1284p.ld ../../lib/avr51.o +LD_FLAGS+=-Bstatic +LD_FLAGS+=--gc-sections +LD_FLAGS+=--lto=thin + +DEPENDS=${ROBCMP} Makefile +LINK_DEPENDS=out/atmega1284p.o + +all: out test + +out: + mkdir -p out + +out/atmega1284p.o : ../../lib/atmega1284p.rob ${DEPENDS} + ${ROBCMP} -a atmega1284p ${OPT} -o $@ $< + +out/atmega1284p.ll : ../../lib/atmega1284p.rob ${DEPENDS} + ${ROBCMP} -a atmega1284p ${OPT} $< > $@ + +.SECONDARY: +out/%.o : %.rob out/atmega1284p.o ${DEPENDS} + ${ROBCMP} -bdep -a atmega1284p ${OPT} ${INCLUDES} -o $@ $< + +out/%.ll : %.rob ${DEPENDS} + ${ROBCMP} -bdep -a atmega1284p ${OPT} ${INCLUDES} $< > $@ + +%.tt : %.rob ${DEPENDS} + @-./runtest.sh $< $(patsubst %.rob,out/%,$<) + +out/% : out/%.o ${LINK_DEPENDS} + # exchange here if ld.lld show relocation errors + ld.lld ${LD_FLAGS} $^ -o $@ + #avr-ld ${LD_FLAGS} $^ -o $@ + +test: ${ALL_TT} + +clean: + @rm -f ${ALL} ${ALL_LL} ${ALL_OO} + diff --git a/test/atmega1284p/bitstruct-field-i5.rob b/test/atmega1284p/bitstruct-field-i5.rob new file mode 120000 index 0000000..8246bd7 --- /dev/null +++ b/test/atmega1284p/bitstruct-field-i5.rob @@ -0,0 +1 @@ +../atmega328p/bitstruct-field-i5.rob \ No newline at end of file diff --git a/test/atmega1284p/bsscheck.rob b/test/atmega1284p/bsscheck.rob new file mode 120000 index 0000000..3fe20d6 --- /dev/null +++ b/test/atmega1284p/bsscheck.rob @@ -0,0 +1 @@ +../atmega328p/bsscheck.rob \ No newline at end of file diff --git a/test/atmega1284p/bssinjcheck.rob b/test/atmega1284p/bssinjcheck.rob new file mode 120000 index 0000000..18ae991 --- /dev/null +++ b/test/atmega1284p/bssinjcheck.rob @@ -0,0 +1 @@ +../atmega328p/bssinjcheck.rob \ No newline at end of file diff --git a/test/atmega1284p/datacheck.rob b/test/atmega1284p/datacheck.rob new file mode 120000 index 0000000..016886b --- /dev/null +++ b/test/atmega1284p/datacheck.rob @@ -0,0 +1 @@ +../atmega328p/datacheck.rob \ No newline at end of file diff --git a/test/atmega1284p/float.rob b/test/atmega1284p/float.rob new file mode 120000 index 0000000..ba4a261 --- /dev/null +++ b/test/atmega1284p/float.rob @@ -0,0 +1 @@ +../atmega328p/float.rob \ No newline at end of file diff --git a/test/atmega1284p/globaldata.rob b/test/atmega1284p/globaldata.rob new file mode 120000 index 0000000..58624a6 --- /dev/null +++ b/test/atmega1284p/globaldata.rob @@ -0,0 +1 @@ +../atmega328p/globaldata.rob \ No newline at end of file diff --git a/test/atmega1284p/globals.rob b/test/atmega1284p/globals.rob new file mode 120000 index 0000000..fc74855 --- /dev/null +++ b/test/atmega1284p/globals.rob @@ -0,0 +1 @@ +../atmega328p/globals.rob \ No newline at end of file diff --git a/test/atmega1284p/itoa.rob b/test/atmega1284p/itoa.rob new file mode 120000 index 0000000..89cdfe3 --- /dev/null +++ b/test/atmega1284p/itoa.rob @@ -0,0 +1 @@ +../atmega328p/itoa.rob \ No newline at end of file diff --git a/test/atmega1284p/memcpycheck.rob b/test/atmega1284p/memcpycheck.rob new file mode 120000 index 0000000..4d0b1d5 --- /dev/null +++ b/test/atmega1284p/memcpycheck.rob @@ -0,0 +1 @@ +../atmega328p/memcpycheck.rob \ No newline at end of file diff --git a/test/atmega1284p/robcmp-simavr-debug b/test/atmega1284p/robcmp-simavr-debug new file mode 120000 index 0000000..c9994e3 --- /dev/null +++ b/test/atmega1284p/robcmp-simavr-debug @@ -0,0 +1 @@ +../../build/robcmp-simavr-debug \ No newline at end of file diff --git a/test/atmega1284p/run_avr b/test/atmega1284p/run_avr new file mode 120000 index 0000000..1dc1d13 --- /dev/null +++ b/test/atmega1284p/run_avr @@ -0,0 +1 @@ +../../platformio/toolchain-robcmp/bin/run_avr \ No newline at end of file diff --git a/test/atmega1284p/runtest.sh b/test/atmega1284p/runtest.sh new file mode 120000 index 0000000..d72879e --- /dev/null +++ b/test/atmega1284p/runtest.sh @@ -0,0 +1 @@ +../atmega328p/runtest.sh \ No newline at end of file diff --git a/test/atmega1284p/runtrace.sh b/test/atmega1284p/runtrace.sh new file mode 120000 index 0000000..fc1aeb1 --- /dev/null +++ b/test/atmega1284p/runtrace.sh @@ -0,0 +1 @@ +../atmega328p/runtrace.sh \ No newline at end of file diff --git a/test/atmega1284p/uart.rob b/test/atmega1284p/uart.rob new file mode 120000 index 0000000..a97d855 --- /dev/null +++ b/test/atmega1284p/uart.rob @@ -0,0 +1 @@ +../atmega328p/uart.rob \ No newline at end of file diff --git a/test/atmega1284p/uartdata.rob b/test/atmega1284p/uartdata.rob new file mode 120000 index 0000000..60d70e6 --- /dev/null +++ b/test/atmega1284p/uartdata.rob @@ -0,0 +1 @@ +../atmega328p/uartdata.rob \ No newline at end of file diff --git a/test/stm32f1/Makefile b/test/stm32f1/Makefile new file mode 100644 index 0000000..6045c5b --- /dev/null +++ b/test/stm32f1/Makefile @@ -0,0 +1,54 @@ +ALL=$(patsubst %.rob,out/%,$(wildcard *.rob)) +ALL_LL=$(patsubst %.rob,out/%.ll,$(wildcard *.rob)) +ALL_TT=$(patsubst %.rob,%.tt,$(wildcard *.rob)) +ALL_OO=$(patsubst %.rob,out/%.o,$(wildcard *.rob)) out/stm32f1.o + +TOOL_OPEN_OCD_FOLDER=~/.platformio/packages/tool-openocd +ROBCMP=../../build/robcmp +INCLUDES=-I ../../lib + +ifndef OPT +#OPT=-g -O0 +OPT=-Oz +endif + +LD_FLAGS=-nostdlib -entry=main -L../../lib -Tstm32f1.ld +LD_FLAGS+=-Bstatic +LD_FLAGS+=--gc-sections +LD_FLAGS+=--lto=thin + +DEPENDS=${ROBCMP} Makefile +LINK_DEPENDS=out/stm32f1.o + +all: out test + +out: + mkdir -p out + +out/stm32f1.o : ../../lib/stm32f1.rob ${DEPENDS} + ${ROBCMP} -a stm32f1 ${OPT} -o $@ $< + +out/stm32f1.ll : ../../lib/stm32f1.rob ${DEPENDS} + ${ROBCMP} -a stm32f1 ${OPT} $< > $@ + +.SECONDARY: +out/%.o : %.rob out/stm32f1.o ${DEPENDS} + ${ROBCMP} -bdep -a stm32f1 ${OPT} ${INCLUDES} -o $@ $< + +out/%.ll : %.rob ${DEPENDS} + ${ROBCMP} -bdep -a stm32f1 ${OPT} ${INCLUDES} $< > $@ + +%.tt : %.rob ${DEPENDS} + @-./runtest.sh $< $(patsubst %.rob,out/%,$<) + +%.up : %.tt ${DEPENDS} + ${TOOL_OPEN_OCD_FOLDER}/bin/openocd -f ${TOOL_OPEN_OCD_FOLDER}/scripts/interface/stlink.cfg -f ${TOOL_OPEN_OCD_FOLDER}/scripts/target/stm32f1x.cfg -c "program $(patsubst %.tt,out/%,$<) reset exit" + +out/% : out/%.o ${LINK_DEPENDS} + ld.lld ${LD_FLAGS} $^ -o $@ + +test: ${ALL_TT} + +clean: + @rm -f ${ALL} ${ALL_LL} ${ALL_OO} + diff --git a/test/stm32f1/blink.rob b/test/stm32f1/blink.rob new file mode 100644 index 0000000..06ff3b1 --- /dev/null +++ b/test/stm32f1/blink.rob @@ -0,0 +1,20 @@ +/* + * Blinks the board default led + */ + +use intfs.ports; +use arch.stm32.stm32f1; + +int16 main() { + mmcu = stm32f1(); + led = mmcu.c13; + + led.mode(port_mode.output); + + loop { + led.set(true); + mmcu.wait_ms(500); + led.set(false); + mmcu.wait_ms(500); + } +} diff --git a/test/stm32f1/example.rob b/test/stm32f1/example.rob new file mode 100644 index 0000000..e02e4d2 --- /dev/null +++ b/test/stm32f1/example.rob @@ -0,0 +1,41 @@ + +use intfs.ports; +use arch.stm32.stm32f1; +use convert.itoa; + +void run_test(stm32f1 mmcu) { + mmcu.wait_ms(500); +} + +int16 main() { + mmcu = stm32f1(); + serial = mmcu.uart2; + serial.setup(9600); + serial.enable(); + + //led = mmcu.c13; + //led.mode(port_mode.output); + + loop { + start = mmcu.millis(); + + run_test(mmcu); + + time = mmcu.millis() - start; + + timestr = {'0': 10}; + itoa(time, 10, timestr); + + serial.write_array(timestr); + serial.write('\r'); + serial.write('\n'); + + /*led.set(true); + mmcu.wait_ms(500); + led.set(false); + mmcu.wait_ms(500);*/ + + } + return 0; +} + diff --git a/test/stm32f1/runtest.sh b/test/stm32f1/runtest.sh new file mode 100755 index 0000000..5676a41 --- /dev/null +++ b/test/stm32f1/runtest.sh @@ -0,0 +1,27 @@ +#!/bin/bash +#CMD="./robcmp-simavr-debug -c 16000000 -m atmega328p -f $2" +CMD="echo \"no simulator for stm32f1 yet.\"" + +GREEN="\033[0;32m" +RED="\033[0;31m" +NC="\033[0m" + +echo -n " $1 " +make -s $2 +if [ "$?" -eq 0 ]; then + if [ "$V" = "1" ]; then + ${CMD} + else + timeout 10s ${CMD} &> /dev/null + fi + STATUS=$? + #if [ "${STATUS}" -eq 0 ]; then + # echo -e \\r${GREEN}[PASS]\\t\\t${NC} + #else + # echo -e \\r${RED}[FAILED] ${STATUS}\\t${NC} + #fi + ${CMD} +else + echo -e \\r${RED}[BUILD FAILED]\\t${NC} +fi + diff --git a/test/stm32f1/uart.rob b/test/stm32f1/uart.rob new file mode 100644 index 0000000..1863f45 --- /dev/null +++ b/test/stm32f1/uart.rob @@ -0,0 +1,41 @@ + +use intfs.ports; +use arch.stm32.stm32f1; +use convert.itoa; + +void run_test() { + +} + +int16 main() { + mmcu = stm32f1(); + serial = mmcu.uart2; + serial.setup(9600); + serial.enable(); + + //led = mmcu.c13; + //led.mode(port_mode.output); + + loop { + start = mmcu.time(); + + run_test(); + + time = mmcu.time() - start; + + timestr = {'0': 10}; + itoa(time, 10, timestr); + + serial.write(timestr); + serial.write('\r'); + serial.write('\n'); + + /*led.set(true); + mmcu.wait_ms(500); + led.set(false); + mmcu.wait_ms(500);*/ + + } + return 0; +} + From dff880ce06da4ae77e746a43c4b75792a76a63bf Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Sat, 9 Nov 2024 15:49:46 -0300 Subject: [PATCH 17/24] Small fix when passing array as argument to function. When the array is not const. --- src/FunctionCall.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/FunctionCall.cpp b/src/FunctionCall.cpp index 5e766fa..a7fa4f6 100644 --- a/src/FunctionCall.cpp +++ b/src/FunctionCall.cpp @@ -132,8 +132,8 @@ Value *FunctionCall::generate(FunctionImpl *func, BasicBlock *block, BasicBlock for(const string& p: params) { Node *coerced; Value *value; - if (param->isConstExpr()) { - Node *size = param->findMember("size"); + Node *size = param->findMember("size"); + if (size) { coerced = PropagateTypes::coerceTo(size, tint32u); value = coerced->generate(func, block, allocblock); } else { From caa12fcf059035f2c10dce17aae77d390d717b54 Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Tue, 19 Nov 2024 17:02:20 -0300 Subject: [PATCH 18/24] Missing stm32 functions. --- lib/arch/stm32/stm32f1.rob | 115 ++++++++++++++++++++++++++++++--- lib/arch/stm32/stm32f1regs.rob | 63 ++++++++++++++++++ 2 files changed, 170 insertions(+), 8 deletions(-) diff --git a/lib/arch/stm32/stm32f1.rob b/lib/arch/stm32/stm32f1.rob index fd86b1c..0e3dfe2 100644 --- a/lib/arch/stm32/stm32f1.rob +++ b/lib/arch/stm32/stm32f1.rob @@ -16,6 +16,48 @@ type stm32f1 implements mcu { return; } + a2 implements digitalport { + void mode_input(PIN_MODE mode, INPUT_MODE cnf) inline { + GPIOA_CRL.mode2 = mode; + GPIOA_CRL.cnf2 = cnf; + } + void mode_output(PIN_MODE mode, OUTPUT_MODE cnf) inline { + GPIOA_CRL.mode2 = mode; + GPIOA_CRL.cnf2 = cnf; + } + void mode(port_mode m) { + APB2EN.iopa = true; + if (m == port_mode.input) { + mode_input(PIN_MODE.INPUT, INPUT_MODE.PULLUPDOWN); + } else { + mode_output(PIN_MODE.OUTPUT50MHz, OUTPUT_MODE.PUSHPULL); + } + } + void set(bool v) inline { GPIOA_ODR.odr2 = v; } + bool get() inline { return GPIOA_IDR.idr2; } + } + + a3 implements digitalport { + void mode_input(PIN_MODE mode, INPUT_MODE cnf) inline { + GPIOA_CRL.mode3 = mode; + GPIOA_CRL.cnf3 = cnf; + } + void mode_output(PIN_MODE mode, OUTPUT_MODE cnf) inline { + GPIOA_CRL.mode3 = mode; + GPIOA_CRL.cnf3 = cnf; + } + void mode(port_mode m) { + APB2EN.iopa = true; + if (m == port_mode.input) { + mode_input(PIN_MODE.INPUT, INPUT_MODE.PULLUPDOWN); + } else { + mode_output(PIN_MODE.OUTPUT50MHz, OUTPUT_MODE.PUSHPULL); + } + } + void set(bool v) inline { GPIOA_ODR.odr3 = v; } + bool get() inline { return GPIOA_IDR.idr3; } + } + c13 implements digitalport { void mode(port_mode m) { APB2EN.iopc = true; @@ -86,6 +128,14 @@ type stm32f1 implements mcu { } } + uint32 micros() { + return SYSTICK_VAL / (clock()/1E6); + } + + uint32 millis() { + return micros() / 1000; + } + spi implements databus { /* setup hardware SPI at: xx = MOSI @@ -100,20 +150,67 @@ type stm32f1 implements mcu { bool has_data() { return false; } bool start_transaction(uint16 address) { return true; } void end_transaction() { } + void async_read_to(interrupt_i8 i) {} databus_protocol get_protocol() { return databus_protocol.SPI; } } - uart0 implements databus { - void setup(uint32 baud) {} - void enable() {} - void disable() {} - void write(uint8 b) {} - void write_array(int8[] data) {} - uint8 read() { return 0; } - bool has_data() { return false; } + uart2 implements databus { + void setup(uint32 baud) { + APB1EN.usart2 = true; // enable usart2 clock + //AHBENR.sdio = true; // enable SDIO clock + APB2EN.afio = true; //? enable alternate function I/O clock + APB2EN.iopa = true; // port A clock + + // set ports a2 (output TX) and a3 (input RX) + a2.mode_output(PIN_MODE.OUTPUT2MHz, OUTPUT_MODE.APUSH_PULL); + a3.mode_input(PIN_MODE.INPUT, INPUT_MODE.FLOATING); + + // assuming reset configuration, that is 8 bits per byte, + // no parity checks, and 1 “stop bit”. + + // set baudrate + uartdiv = clock() / baud; + USART2_BRR.DIV_Fraction = uint4(uartdiv % 16); + USART2_BRR.DIV_Mantissa = uint12(uartdiv / 16); + } + + void async_read_to(interrupt_i8 i) {} + + void enable() { + USART2_CR1.RE = true; // receptor + USART2_CR1.TE = true; // transmiter + USART2_CR1.UE = true; // usart enable + } + + void disable() { + USART2_CR1.UE = false; + } + + void write(uint8 b) inline { + while !USART2_SR.TXE; + USART2_DR.DR = b; + } + + void write_array(int8[] data) { + i = 0u; + while i < data.size { + write(uint8(data[i])); + i++; + } + } + + uint8 read() { + while !USART2_SR.RXNE; + return uint8(USART2_DR.DR); + } + + bool has_data() { + return USART2_SR.RXNE; + } + bool start_transaction(uint16 address) { return true; } void end_transaction() {} @@ -158,6 +255,8 @@ type stm32f1 implements mcu { I2C1_CCR.ccr = uint12(((1.0/400000)/2) / (3.0/clock())); I2C1_TRISE = uint16(clock()/1E6*0.3+1); } + + void async_read_to(interrupt_i8 i) {} void enable() { I2C1_CR1.pe = true; diff --git a/lib/arch/stm32/stm32f1regs.rob b/lib/arch/stm32/stm32f1regs.rob index 8d9928b..261b2e6 100644 --- a/lib/arch/stm32/stm32f1regs.rob +++ b/lib/arch/stm32/stm32f1regs.rob @@ -438,3 +438,66 @@ register I2C_SR2_t I2C2_SR2 at 0x40005818; register I2C_CCR_t I2C2_CCR at 0x4000581C; // I2C 2 T RISE register register uint16 I2C2_TRISE at 0x40005820; + +/* + * USART types + */ + + type SR_t { + PE = false; // Parity error + FE = false; // Framing error + NE = false; // Noise error flag + ORE = false; // Overrun error + IDLE = false; // IDLE line detected + RXNE = false; // Read data register not empty + TC = false; // Transmission complete + TXE = false; // Transmit data register empty + LBD = false; // LIN break detection flag + CTS = false; // CTS flag + _res1 = uint16(0); // Reserved, 22 bits + _res2 = uint6(0); // + } + + type CR1_t { + SBK = false; // Send break + RWU = false; // Receiver wakeup + RE = false; // Receiver enable + TE = false; // Transmitter enable + IDLEIE = false; // IDLE interrupt enable + RXNEIE = false; // RXNE interrupt enable + TCIE = false; // Transmission complete interrupt enable + TXEIE = false; // TXE interrupt enable + PEIE = false; // PE interrupt enable + PS = false; // Parity selection + PCE = false; // Parity control enable + WAKE = false; // Wakeup method + M = false; // Word length + UE = false; // USART enable + _res1 = uint16(0); // Reserved, 18 bits + _res2 = uint2(0); // + } + + type DR_t { + DR = uint9(0); // Data value + _res1 = uint16(0); // Reserved, 23 bits + _res2 = uint7(0); // + } + + type BRR_t { + DIV_Fraction = uint4(0); // fraction of USARTDIV + DIV_Mantissa = uint12(0); // mantissa of USARTDIV + _res1 = uint16(0); // Reserved, 16 bits + } + + // Status register + register SR_t USART2_SR at 0x40004400; + + // Data register + register DR_t USART2_DR at 0x40004404; + + // Baud rate register + register BRR_t USART2_BRR at 0x40004408; + + // Control register 1 + register CR1_t USART2_CR1 at 0x4000440C; + From e4f6a45f64a1b1fea8ee23ebe7a2ed7b6a258e12 Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Thu, 28 Nov 2024 14:11:36 -0300 Subject: [PATCH 19/24] Fix function call passing array size. --- src/FunctionCall.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/FunctionCall.cpp b/src/FunctionCall.cpp index a7fa4f6..e4c7870 100644 --- a/src/FunctionCall.cpp +++ b/src/FunctionCall.cpp @@ -131,18 +131,20 @@ Value *FunctionCall::generate(FunctionImpl *func, BasicBlock *block, BasicBlock for(const string& p: params) { Node *coerced; - Value *value; + Value *value = NULL; Node *size = param->findMember("size"); if (size) { coerced = PropagateTypes::coerceTo(size, tint32u); value = coerced->generate(func, block, allocblock); - } else { + } + if (!value) { string pname = param->getName() + p; Load ld(Identifier(pname, param->getLoc())); ld.setScope(func); coerced = PropagateTypes::coerceTo(&ld, tint32u); value = coerced->generate(func, block, allocblock); } + assert(value != NULL && "must pass the array size."); args.push_back(value); dataTypes.push_back(coerced->getDataType()); } From 223cb5175b9a47ac2ffc83c7182dd5dfd34affae Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Wed, 4 Dec 2024 11:11:20 -0300 Subject: [PATCH 20/24] Basic float support to stm32f1, using pre-built libgcc. --- hack/avr/Makefile | 13 ++++++++----- hack/stm32/Makefile | 22 ++++++++++++---------- lib/Makefile | 5 ++++- lib/arm-eabi-libgcc.a | Bin 0 -> 1514234 bytes lib/arm-missing.c | 16 ++++++++++++++++ lib/avr51.S | 1 + lib/convert/itoa.rob | 7 +++++-- lib/stm32f1.rob | 2 +- platformio/platform/builder/main.py | 2 ++ test/atmega1284p/run_avr | 1 - test/debug/platformio.ini | 15 ++++++++++++++- test/stm32f1/Makefile | 2 +- 12 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 lib/arm-eabi-libgcc.a create mode 100644 lib/arm-missing.c create mode 120000 lib/avr51.S delete mode 120000 test/atmega1284p/run_avr diff --git a/hack/avr/Makefile b/hack/avr/Makefile index 67b6c56..195b50a 100644 --- a/hack/avr/Makefile +++ b/hack/avr/Makefile @@ -1,9 +1,9 @@ INCLUDES=-I/Users/thborges/.platformio/packages/toolchain-atmelavr/avr/include #AVRLIB=-L~/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/7.3.0/avr5 -lgcc -CC=/usr/local/robllvm/bin/clang -LLC=/usr/local/robllvm/bin/llc +CC=clang +LLC=llc CCPLAT=-target avr -mmcu=atmega328p -DF_CPU=16000000 -ROBCMP=../../robcmp +ROBCMP=../../build/robcmp AVRDUDECFG=-C /Users/thborges/.platformio/packages/tool-avrdude/avrdude.conf AVRDUDEPORT=`ls /dev/cu.usb*` @@ -36,10 +36,13 @@ all: ${ROBCMP} ${ALL} %.elf : %.o @#${CC} -v ${CCPLAT} ${AVRLIB} $< -o $@ @#avr-gcc -v -mmcu=atmega328p $< -o $@ - avr-ld -o $@ -Tdata=0x800100 $< + #avr-ld -o $@ -Tdata=0x800100 $< + ld.lld -o $@ -Tdata=0x800100 $< + %.hex : %.elf - avr-objcopy -Oihex $< $@ + #avr-objcopy -Oihex $< $@ + llvm-objcopy -Oihex $< $@ %.up: %.hex avrdude ${AVRDUDECFG} -v -V -c arduino -p m328p -U flash:w:$<:i -P ${AVRDUDEPORT} diff --git a/hack/stm32/Makefile b/hack/stm32/Makefile index 5e5e397..d37acf4 100644 --- a/hack/stm32/Makefile +++ b/hack/stm32/Makefile @@ -1,10 +1,11 @@ -#GCC=~/.platformio/packages/toolchain-gccarmnoneeabi/bin/arm-none-eabi-gcc -CC=/usr/local/robllvm/bin/clang -LLC=/usr/local/robllvm/bin/llc -OBJCOPY=/usr/local/robllvm/bin/llvm-objcopy +CC=~/.platformio/packages/toolchain-gccarmnoneeabi/bin/arm-none-eabi-gcc +#CC=/usr/local/opt/llvm/bin/clang +LLC=/usr/local/opt/llvm/bin/llc +OBJCOPY=/usr/local/opt/llvm/bin/llvm-objcopy INCLUDES= -CCPLAT=-target arm-none-eabi -mcpu=cortex-m3 -mthumb -ROBCMP=../../robcmp +#CCPLAT=-target arm-none-eabi -mcpu=cortex-m3 -mthumb +CCPLAT=-mcpu=cortex-m3 -mthumb +ROBCMP=../../build/robcmp USBPORT=`ls /dev/cu.usb*` @@ -15,10 +16,11 @@ ALL=${ALL_C} ${ALL_ROB} all: ${ROBCMP} ${ALL} %.c.ll: %.c - ${CC} ${CCPLAT} -Oz -S -emit-llvm ${INCLUDES} $< -o $@ + #${CC} ${CCPLAT} -Oz -S -emit-llvm ${INCLUDES} $< -o $@ + ${CC} ${CCPLAT} -Os -S -emit-llvm ${INCLUDES} $< -o $@ %.c.o: %.c - ${CC} ${CCPLAT} -Oz -c ${INCLUDES} $< -o $@ + ${CC} -v ${CCPLAT} -Os -c ${INCLUDES} $< -o $@ @@ -34,8 +36,8 @@ all: ${ROBCMP} ${ALL} ${LLC} $< -o $@ -filetype=asm %.elf : %.o - ${CC} -v ${CCPLAT} -nostdlib -Wl,-entry=main -Wl,-Tmemory.lld.ld $< -o $@ - @#${GCC} -mthumb -mcpu=cortex-m3 -nostdlib -Wl,-Tmemory.gcc.ld $< -o $@ + #${CC} ${CCPLAT} -nostdlib -Wl,-entry=main -Wl,-Tmemory.lld.ld $< -o $@ + ${CC} -mthumb -mcpu=cortex-m3 -nostdlib -Wl,-Tmemory.gcc.ld $< -o $@ %.bin : %.elf diff --git a/lib/Makefile b/lib/Makefile index 6d2ff32..47bf19a 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,5 +1,5 @@ -GEN=avr5.o avr51.o +GEN=avr5.o avr51.o cortex-m3-arm-missing.o all: ${GEN} @@ -13,5 +13,8 @@ avr51.o: avr51.S @#avr-gcc -mmcu=avr5 -O3 -c $< clang --target=avr -mmcu=avr51 -O3 -c $< +cortex-m3-arm-missing.o: arm-missing.c + clang --target=arm-none-eabi -mcpu=cortex-m3 -mthumb -O3 -c $< -o $@ + clean: rm -f ${GEN} diff --git a/lib/arm-eabi-libgcc.a b/lib/arm-eabi-libgcc.a new file mode 100644 index 0000000000000000000000000000000000000000..bed37c8400203af4303a6d31626e22dd1090a529 GIT binary patch literal 1514234 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%0D~2V*FYBhxrhXbSJ=$7OU~6Tp&5o;$6UTLyOM= zuL*|}EnbOo-Oyqk@Eqiy7U*-LMQMjiJDfDYu|9~lj~3{YV^PNW$cxP$Y3ef7I0k)R z*tm|O1^S%E;z0MOly;dbfU$P+do#PX3u>fYPz<^i^h+AP9>++r3m6n}qD5&JNV{Mt>;gF!`?F9& z#^(mjMlEr-zEAQ+$rlHmFP6Al>n6vd9E*cL7TvAyl4DVh#lato?$$2Ny`;qT8sH+` z8QCYk$d!hk3yXKH>sI`u-c<^fsf;&b?O_Gi75>s#V|ZhS&woanXLevuYxjw(#>nJD}_nhLG9{|Tq9CIAl1&)ayAGLBgy*NF9R zF}<`A2hT=yw?<6rLQ)qZKPKNDys@Zn2r2!zGNw-1dRk-ZC6%t$SxCJ+J@yfCtC!bc z+zsdXg>|T(0HGh};|A$P>g9URurCNFp_jX&d8rFYU1;!iA$M!5V z#?;LV;!ox^n&vfPg?Lu=1z01-cDRVG;HzT8+lFI11aOQJ@^SFh3ma|;Z<;_K7K!t+ z?eL26U-2JiLp*Z~PLyknt*peK=;L#WtuzA1O>AWs@S1Qq#a6gBy8w6sMBS}6+y*>I z9b3`AEGBgosjF}don~Fd)w&$1t4Lji{Fr=q@M0@ByIQXz$D$mILogP#;EI!smU^?$ zhNu^w{2Ho4WaCP2u9154NYx)r%@g&gPf>CNkEYHRg1E1c}=C?Dpy-{)#K8)fmU zyw>`g)+KpgiR^9tP4?GX%Ud(|f2YGY#`mAfbnm;1y1u2<&AU_kwfa_gEuaV|>AL?F z>z+a`@MWx7GkbW;1hzo{^%g=t4!&;TOSy$NO`s2jL|=*>o>e9gFKo(Blxy{+@Y}c4 z>79HjcLB$ZFXcJlHQ{jbrEtHU^MEHnwAboO;Xc~QeJOnP`g)zApu@Xcw`g?O(E6KE z6I;D~=n!A3s;iqf|A+!=9Km$BQqrNKj7&Pz*DATAL-+fvzN9mSK5>SJJCrd>r^n}g z>k*uJ-pW()wW*@#_F$Dr1nWN{$-X^hmW7-fpRTfyb$5`3>xMfG(#{hgWKuqE@Kp<0 zXcsTAuGz4|v(g~(!Z-woa;>tE`z*SVg&UBO8(Fvmcy452Dav&t3mNyYmxcNoEjKhc zx7htYke{PWKpz^s=x}kMp~LGRo42vUmvK#*GGjefY-PQ>sYCJK-Qmg5ul?`7@=|IYm*u>?y? z)0K|dCI>pM9qx3@HV6>(l#d%6E`p951%i?4Ln%?GwZkhm@)Ow*uT)$h73Es#_(>F$ zi|0-{?QY<>q2oURuL*~fPJ0*1bwkI`0neU}^>tTn=vex}r5~I$z_EVnV=|h3rOh>V zGZsq+=;x63m7`2pStI=%Bh|j@2OUcLYBcy^9E8@P-%0g-3pe)FaHqk-c*A4*Q9kam z7ldABXE#avDwSTQueEa{3#EOf4?;8L`IYVyrlEywWqUyp*E?5p8U z$83WDVdq%sxKSV&spwHF9oyj*hZuOl7GIP!?4!=a5M zHzSU$N01py?)^_0N7lX_LK>8D>5DrhMcb#*dXEMw4GgH2Eas$k&QE^3`AHI5J+Qj3a|Stvc-p@N?kR%Q*6?`kA-N zJv=oLrTO{H9@bjiuEsI=-+!Yzq3_@6#&>>7;>gmzQk2_PZCGA=(K3w&`uaI!92w)@ zDicPApF`if)EylTJdP~wD_a^|H{9b-g`g1u!p^bApJW_a?;-1&l@#-IXq|crwl`Mz@aRgGR)753#Ptkt&W%`)at;G20+OwA4z+jRL_)MGwh1vh92j z+E=dWSjLfM9GSF7zA^~&bnjTcq91YO68Gzocj%0u&)SdIT9=f+o4vQy+xA*^-kxuT zoz`28MVr%god)ZkivOeI*Q_ZS-fNG!Pq+X({y$$J7^xlqx5F#O|HOZo1@Xc>F+h}S z^^?!XpGXr<>oisZ$IUv8$AH&_BVZhMG*^Uj-K^7~AKzx323~zXV#Wicxw}boqZ(R$ zZLf{W+oMN`gJ`39FGXGp;5$!Onq%D^Xl|vXxkUfP$e_7?#D`1VuW{shEI=PQrxfi) zjLGw^w!V1!b9?estX0J7;#72(hfLCy?pSvRx?4Bg>5gp>AY@KHZt(Srx$g@Ff|2U4 zK5-I`=W* zf%@;u%WFEzd|HIp<9*jyJN~m-dfq|5vHBe>C1E zep30I-Pk`h(&vy6za1g=Pd{i*+COnlsZ(Amx^rXy40pPd_D`aJ{S?_h?&)rT`(Q}> z$JzcF?sO>apF}#m63VI@Kg4R_+4~`6%vIVyajAY9?VsD%uXZ1Eom=dFF5Me!l*t!8 zO36_?Q%-z(d{1hh7w7Q~tO@`|$tku?U%Pzu%=+aU z>Xn(bHT7bu0&mtXU$%b5(%aV7+`e3yS$5;KGi&PW*REQ&zJB>So98E$8RP5vj0yh{c?@3g??8``ZdO?7^jkcQ_-*cSg@quQ%=8J zA8euDb&`H1{q~X5spYTxnDX3y#1B5unP+S+2leON7d?fWT9ikjMW67txl_Db}wUf(scviidc*UkXSuTP1%zAYL3Sv80zf^j4J)XPKtG5HM z8HbZz&F|aJ0-gZT-ZOB+tbaG*!3_clsle0qY8j)JKAQNL;Mh1#F>2a)uKo5>M?B>^ zBG(yPWXZ}JvJH+0>7!v!NFPmV9nt-IWl6uMoPN1R*+ReTB>n1S8`F8Dk0zBa*pIc& z(#A7J789XS>$g(*UTG)v*Tzev>spPjX>UjyPw#UpT}vBJ?-#?ybFEj)wa+4;c=GW> z`Y*^47$+sruV4mYU*+Q_@r12z#p5%Ab&kCq-VETH<9Nh#<8P=1UNsKZmk0eEo33^>Qp+^7AKC45)?ktOK-cpM%VG7cYm z4cdtqr&d{F9?L`&c%(0J&ilj*^TYts5y9#&Oyf8_MvaWa>u**69b)>8$Khl2E93Cu zeF$2V^lNM5VbsVtycjP`hnRljarhYh$~e4uACi9co=D+i#i)^Sc%5#=XwmzO-ybu> zKm_e+Xr z;d3)3+5-4l#l@F$dz8|-m+})dfa;uYRV`FK9zpGFOHm)L`?~(9&w3tZgsg`@S1?1Q z^g|_I50B2biNb%8=2>%pQu^U|a7fT+$8+nN9Xq?tDo5<_tiD3GG5A_k%8jq^7S!3z z9Gd>Dg})ei3ed?#QLJ-l>hU1ynjH+Ecm!V3F8lFR*mtgJ*CqllX*Vv{B<J3Ol{O*}Vo_q$L(H@b8^@^hn0ZwFp84ma!H-RRO=Q|Qw1sJk;w z%e4`5ZG<1=l4JdpuZ^Hx7xVf%k45Q|q20&bHsX+Mk3!dS#3t%4bwjBe{$KXqH#Uyz z$`>sDk;KrF%p{tLoM@72S)Ng1hi=KTOzk+CrbScqS{j*=w9uPXo=B-FQ&=h?MRM0! z7!x6X=IJ3umLKxLyKC$U3xDtje-H=<2oQTsC(27^Gr+TV=hGMunB7@mW@PNH{PbpG zc!Fquzq)n0i?_SFF4bM#)v9xd%ldb^>Q>eH-E+@5_ns07Yt%QaM%)#@#t$qO(4ZiMFdJmp?QVF#yemh{x zRVKk!@yprmieJUABYrF4_SEsKw%mDd&r&#P-8jOkVf8A0Ig4HKtN3-qZzZ&zgkQDg z)Rs%lmP7M(IWmboNft-;?dJq`Q1Tr1S4@zwG9PCUqrFS31Ecdtvi41Pw%S!<4$Q{6 z~Ac@ z@fE}K$#vr5-~1K>=LnQS#wSq;KI<(gtQ!mK`xO+_Z61q&&fvex92w3xUqO+1K|CMN zZ_i8Eh3kGE`-S){NOt`DC=MJmhl2mYcb2cd68%mdOVupSyxilA(Qd_A5zjzmkOG+t zoK>RK4mc~07oP{9vyCy{ zgOIEju!FBsblHe7giG_9Yrhv1$7f@Ve17Dda$Q@Ojo?DmHA%YcGF zzB6x+e!S_Q9zHz!aqmBUalH8E&hdKv%ALXK%)c*T5q#tP`#oR##f|M;GTFFa#R<~c#+cxWHz(@_ ztP@AluZpu{Y>dV6+5IZ=`6xniUAte^-S*A~beY;akhRwNAsp*^`G$BxFlb_>)N>NZhOZamul~*y+hrUioLVEI9)EEszg!~?VZQmi*=_3+O3SHJsI&;Rj*r+WYQ`u=*UhK3ivb!ln(9F|L$&2m=O+8tZnh3W`NKgreu&j~}gl=j`$195z| z9w46|Ij3CL)&tMsLPOx&f|I&?x4_>2sMxEFi8I(^#8t6Z^;uAebAr7}#5ECn``o{Qam_RY>-1h} z=iaxCu4_DoXb{i7TlF04o}}j(dCfA`qJ0k0HwD}mU#a*ZN?4DQdEK@4PASTSb>S;U z*2z*r@lk~2y0)Gx;RHiqO44&v;BnD&)Nw3Hdd|mneeelkGay^fQ4crJbCt+zBGwM# zqcZ^|kJWqERAwF4zWk5HfuRq2@0`t{Yv3bq5;loBAACY`zcx0n;6MXxR-&&- z*i>JH`XYz{%6iLVuc198p0OlZ9BI-Qq4v<1&jsJ(v+W^xrL(LDqB>gI;{xQ7ZJ+3Y z=dd0nX&2QO(NGUmBC?6tQ+p^7FXp+9QZz2>WDjK=Yg;2XCwFRNtrX$mY8=+$_==I= z@b~2NQH12WcAu++3sDax^|_|Np8WDg6G@H z*eqo!(H_b;HhB+1f{_AtP##4OP6u)~P4aP{kX+ZsX1CizuGmz2NbMnF zUkDJu8@2s- z=$VhlQr?854Yu3eumS+5H5{K)W%)o_=@5A*WlJ{*FU#Nd*+XPm%2d+!-Nx*R~HWj*l{nbIr>s$mb%9W$;a* zFgFtmu}4`?$$1TI*c!ns^@+Y0ztl6-nTuIqzO2%7=f{j4Or$2Fca zqIQowYRKH(=abxnvn1L*8OI~vS?#w=b2$QtEEo zIte&)kEb@7Q;Va7XtU-ohp@reV#YBh@=cMF^+G6D;!hai!3c@W+4f5upKZU8&ySo> zu4`kglR34b^^^OxF&3LcIC%9Nh@&>C%kVG}KW#i`ocf?!=Zw4PvU0|8rhUd*+l=3x zaKTxEE;~6n{LM!>6+CG^lKKhMPe5IhqMyJ$KH6lPuYQ8(muIKdPhj`0@?yWZ`i7g$ z37mWTCF2+q+X2nG+An+vAbtbI57x{-YzDMZ`^6b!P3kgKR_&LJ<4oey z_DhQP%cbQx_c-UF;@yAu>OODK>)CzhH@|y3Yd$OScp81l_{z3WcbbK0QaQe9-O)ab zGNf%uF7a9U5e^=!|Gl~8MLhgqKIz%B&wpe2EVgE6=H_QEV;{zS;%A>nV0$Cu(k{=; z4X2s^_Y0_#+$V2~NkpYTyq|afX?8*%NVwoz;_LW*Wfwh@cRg^%kOUpN!{%} z+Y2}_DNI-j-`PNf+~cQ;U%t=Q;+OMNZT!wEegkP0IaT~N#IJK)R`J_<{Bq8#jo(GZ zui`hNZxi&d^W51(``z;w|KFzZtjwKd|9R-gJ$t@$-TM)G(RX^U54~lNvDg)({7Xy@cZ~{pwf2cMT<}U(NYnF8%5i@HOaHYm8av;8tucVn*fxW7R98Org-`XCVeC z>y*uC%Xb6YQGWu@L;562l~ZP>=EgX=PItu|h~ULK3Q9j*%gZM{rB>R_Qby?g~H;JfQq8_yNj8i&_7 zJTX97Pr=43U;M8%4livDm(BPKHyVe>!;i$_v88eN=&Pvc2(|HI{e{G@^E_s?@mg!+ z5x>@Zhbl$ycyMtwBY%hfo171tVvH*X|PFRPEnJRih9iEE9+YaG7Psu43Cio;VDo#%S1 zjhBLrSMm2(b&1B|8|xB{!>`jN8izNJBlzD;U+`{xtkpPt6~7vXSNujTlq4I^HD0G< zts_9M^q$PVR>t9h!@hct%Ttf zzj%(Vu<3-Q8_&pGf{o{lYqjyz#!Jt}Tby2;ttO^V`o`O# zqI+J=cTGdEF0W=@^3oR~ny5h>K6v<%NIc&~WJdhGW#^S456oS{LeZd1bKTCN8E3zx z9m|_TrTDIr@~fNyk4p~CjpU|(9Oo3`vmx2B_!n_t(i{r@3m?XH1sIlSykfXDc3vU! ztP?R@jmAeX%vte@VLk(qRmE^)3`;~_G28(RS0nNf40C3@VpuWECtxT^4@*=&bqqh4 zk8eC}NDo(|?-2}h7QAAZ&p`DspMvKlVOS#YNf=h&jQVEM_RUBHK1mkUH{%w6-;h43 zM&Kj*BnZLZQ!zaC&D75~%I^lY!Z#yPc*Srh?7GUN*$9R?8(#Z_d%QGq zZP9pFrq5{B%>O=o363#2-mc_Fsz2AA4?BpkZ|M8(X@1+C-b7@ki~Lq1F#=iWI^8-Ko(BIti@#cSi zxAeb!==T*57e4O0UAo!VU--E9pZxJJj=%K}^8@wzm40wK^Y2So;G^i@>;Hb=U-bT< z=WD+upEtngg3ptm`1ZH&d)Gd9NJ_-u^j#O`s&nA$xN ze6`Lm;bQk>9iM9V)b=%7WcN7ZQ|%tLd#D>zv3o9Do<6@cIVlmJq;WbU`wlw$p|6?F z@H!t^Y1Qkk=l|MTX@N~_vRi#!jpM4p!(LdJT?o?M?Z7?v;s-mqq}mx?{MMzV>2p{v zT{g>ES<~36=auk?NF~S>v5@4CJ_8;Xf7eUkTS0M&t+H<_WW>8Rw)z|n)b)3TSd*wv zGS-?K!{BYsYs@Fa*<$u_CN>XcO4cc3lr8Zw#Mw1z+dr;j7*3vWp8yKnOY<3r;~dTkK*(5-rnb&vNogm^1wA8*lq zMjYNsxYsC&{MmRbMVYWJe73)Vd_IbhT$i?0bj;8gPT-=~rtmu#yiupQ=rteLEr3@D zn*rH)qutX;uSp~)32$o8s69grP}W->#|hhh*ZF@VP5PHht2ysuVOn37?HFlm*`Ucf z+d8&!o$gSB)HSAHTL{DznaxIrdTiTgN}X@-N44e(>V)n_JHxzj@!(;hUc;eEp;T zpVqT&=(iI3JXW6C-v5K1qrc`*wXU^ucpu4jPPVb=^96(yr}ItptWno>E7n-|#QxQ?$pNca%PH2v z0BJJTnv0K?@*W>uHhEgJj5Dz#&}?MRf7k8t(Nkf7G!bV_$43uqeDpkgc*`cIYL@X9 z?Pmz~3cw!iW$~AnupT8IBiX)#Qn0uBPxy-1CF?v|Lh(_AN`l?cMt|hlVq{^@t&|};62E>Ju}U=Ez9kGmg6^F?>h(srRigho`byRtP01VA@!kR z&GYO&R&M-sVZzZwtUd1TJGfyws|{kMM-eN17O~RzKdG@&$w4Z3H2FretowX67$J%6 zQNT7|yVyJ@g&|xTk*KwK;`nSll8^R{kX+ZcdCIuZ5SWtu=2yVe>Ub%ifsov<9WQ0> zkw)>-Q(^MZBs{9kqc%_4HqYcU!{2-qBmI+PapW=gIc{$lV64*(7_YXs?|tvVz7PI( ze*VZ|@6)$_cmIyJdmfZMjcg$wfa})S4(py6+gZ4nX*-DbAS7)v+d;nOGEJKcfkF7@oyS+vabJmc-4D& z)BB$9eeielrPX&nGk@gIyib`vs2|z+05|5GWIBXoBjYIPJJV8iuUArH81{WFvPm)jKMew-vLth8q3QAHxl;bUY@Cjiv zAiEzrhXalJp(h=2s6GkxNe}~+^|Z!tpBQ)ZNgUdMzdAH2DmvjlZ_pd~acLD_KE8AO z*8C)w18>#FiFOz`1^+*V|D)RnzT5l5o;K?NY28d^m}7KXq+aVsj<7ANkpYTysABd9dQ5f3D#N z*HL&4)|=Dn?{&=c9vfr6T)}*~2J_{0nCC=C#XKGYNHO0C^AnSklWuyx+3{9ux3~B?9|JPG zu#o*cMAS1vqUQ?OL0us_=Sg7*m!d~(`!0@;dQ*PGQ;^T+N=R~D+rBH|N7R2w_T3rq zxailHz_)_Jdv2s(cj3AP@CacuAX~pu569bg6O(Pruh-vrTqB=vxB5_6_xgJB`EM+n zj?CESvfDCMMgMU$0;D>n+VLXnwr_P&VF5*y{&J z%)dCib$5QfiAl|`H++6$Ns>puc5HZhY3cICbIVIJixCk?T&?%L+31htD**-UL^EFL zv(cv!B_1Q$eYQA0_Qj$;4Dz}3vC80^LZPpRg&3f2v3(dfux}fRkkrraW4#B4XuneU zjOw45bk48WE%0* zC2W~&=k$_34Mj@U3!z+zzkqf}ltkui-4n-W_p4m(nC{MF2|LCWV=c(9cYig%-eKg| zDpuEt?8j?cy-`PerUlIz;OyD40V{k|mM-4*b- z^eeA}Zv`dEcUQu7eeem%{o49&9tRrv?!xIJiDUG2Y=(}_AOg)m%!9mQr6vnL=q-eDqYi^6TCHmHG~r5g-Na zKyjUWk> zDM+!FQ$JlB^XpY(rAHAfeHO9O_xEY6)QXiZYkobpN4Cx58ZYhc{CX3UnqN*qQFmuZJ<&j(JU*&2OpryZFLP`OD`nElw^5zut?QUoXHs7(O4J>t2i{kS)<%LTeGn?sdvgACI1`un-gW4xI4{Cd*X z@*T>00qcB~GG;0+rj7w|UXLE^Iryb<73pUf-`?$;S`dCEI!PM0epU5Gl=3)W|;>TRTZgK1@>X-{1b3q)YH|FBRWE=D5J(qj`u;$GR+DqGh$xAGzU3v4? zZvXqDVr_PT!p1QUnr9+_UGOhASZi0_JTK>VjONV?aAoT>SARiw=gmX^F${X{dwk#i z;uB94pD6nNyt;TR zVXq$?G5^GWVb2@x_L!&U&C{5t_?@`yTn-7e{myyw_EQyrlH2}Q>a_i9znAwuR`zq| zNqfuISJn$y=j-fr+_UTZSk5`~n#9?s^NzFZ=gSjpDbDx=47DZ)IBgjdm`U4~`T1wO zorgc@>q+v_4dV8?H3rJMC&oa#ARnF`lcvPkdacBr5i(tv+V9AgB0O9bKHGOdJ|9I$ zFn{maGH!U&IH<-!iGeiZpzitb-1}J94Zzp?vG(@8?}gd#4tqP02~V~f=OFnk?!Q}g z0qdTq3o@PyZ8E5^WZ7=YICl%3VZH(@DzKgU@zl2@DzLLVb3`S-eU&?@41Wr{0*ZT*7Z62KHvYo zhirF$H_uVmf5u*?U)^rp@4UxzFk>9H=3p+OVKZW5S~%uv_RVVWKd#@|-8q;s4qJ2I z>HN`9&ME($jHNo~zB}MPfAqHo)D>NDpEu|Y{P@mqes|~itx}lzj{eQ)92}096rxQz zx_#igy+7<}v+qGHYEu*1H`}CA!7|!f(f;1F?r0w@Vb)!U>(PD;x4($Ovv9q>Z$ffl zUGUDHHR~5HEze;iGKt6Jy`$VP?;U;KgP5Ybkuj&2XXb`$rfG9$dFI^m^Jgzyp1w5W z4d4B|?JuBCywA-jqys3?XCrMpzk|lP(IphpRs4v2^a1eqFVPyd*pC zT^t|lBfsJA$hVg(A@RDTB1*J=oEt6moa4|_&i<#-*psTgXiJ- zcz$lny<*klcVrK7B_yf4?elmI2PTCHOX1@iJ->8fvVD2)h<9eadm+qvSKHr8ceSlfl`7QiEf&46tE zN=zOTCM<=|=-08f<-L37cJA}ul@~PcT_A~h#acMk%1<0Owa-0N0LrE4IUSrb`^XsI;}P16UQ{) zo#wl%^mB-(&iO0RzjDlBGSXz8pn-hnyF=ef^90%bD%ZKSBOPq-ec)4wSS8suOyfL3 zV{OZKH<0gqcj#9s#`20W=X`gMx!W$+4dB<=F2_FVf9uzu85sZiNBuv2ppG50(=-vm zfA&$I+TQb`?E<-z+^zVqPGmYL3an=gGT)>GE){*{h@G5X5((Q$4?BY*L!Hs!(lRlf7! z0cQw^g0kGV5^S-avaUFD8#|qdGuJ$LOza&{a$eUrfo)K&&!E>tMu)~92x6o4a^gi} zqrZ=nJk8kX)7>2#<$Wak6Y!BRP?m8ReK&D9Jj$DhkP(I2yhw3;wm*S?HSn#V(6(mbb$Na}CdF|_1?(4+`?dAm91b+pcVU23Z5;i+ zF=eQe@logecn5>eK0qrZ>x92Dz*wgfyuAw_dVR$=Hofod`QJV>^gwB~_~!hP-ktDx z^?mvS6I6hlPkdOO>nRfJV{5q1RfV1@h13IP?B^6 z`(Qr!gyep09q}R#G|~~yx$|0#OHXl`jLVGY)l*#7_T5^AOXs|L2i*1LPfR0GM_(eR z?CxKEW@v1krra(2wxW@Vixcg^v2KmYvhInxG2{95cn?CNqYBu;S1r2nv@nEABL=m) zF^*2sWpL zAzT{qsKsU+pN&oOai5S}mvxEyHs*057i_NJcP{uIqzONbc9h<`o=h zgiX!8r(?fGcDU@MZ=>D0_dLzL7qp>lzv}AgO*W7z}pOm|#+73t8+eK{`({2~TVei^5YP%TtP&(Nzy5`H$c2V2KwA)3^AEhxw@$+@Mzv!AjO4~(k z7t?MRUGpocEUGM~E{l%&hg23-7E_l+$NW4hiz+6Iw6EJW7l^it+AgNuF1qHw zP+3%2Oj{ORb3Ujnsw}20i>|p3R2Eeh)0Rb@>#yT_@2at zTyS;N0P0<8Scsy>=_cSocJXEoK{I zf-B0CtQW9Oxe|=U=_ngxaeT$_d{_jO7hUE$SAV3*Z(Vx3`!+u?J~W=B&j#`IyA^A! zdm`5Gxyvl;vuGba4r`?VA=Q7X z(Z_Xt@CjivAX}d?$5kVJ77i6wKY@-F_9#Q0oBusA>Y9t7>2_ajnAz#Y>HTalvfS=x z*^Y5-_tUUr3PDS6{@rc6@0x32)0a1JJp7$j$BWMHCept2bYMS?aFFN<2K6(+<+8oImMb|zK~{Pq@}#aZk7?e$vDnLpRk^?Ucfs0 zUSi9{#bs<;CXTNdo)3$FT;n&cG1AjGtBWmj6?`tX496ny83^%NkZfBfDMotAF&E0n ze)sQFzG^D7&bQ$0KCJPZ^GmbS%Lw3rvaHvlefl`Om3R{o68W?7R*LX&RrqYYkAYy^6WIsTi;v-? zFoa7UBiS}j9G{Ix^3lE#lIz+wPq)WQPif8~wRu7zCuTZn^SI_L8ad$Z@A`>p2-f+# z`c}P%```C`?}NV^Dy_~R`Lo_n{ii=azT@p4zq*fpmOG#xulL36Teo@K7TSZAZXL(W zx+jjIS-6;KTZs1{B<*qmJNT+aAJC^8B_1Q$`XG+a)(7PCd4iDSy0$(zjSCHdXA25> zSZKR_1qF4R$0DE?@ZZG;_8RzBPtx>-yL)gw23#TWA&s8u`Fnb2W`T zcF;F8HTdnPkB;~B$QAh>_6F}l>hgv;v<`!q|F*a9eec1(5B_#&{>b6pPa6b2D0>>= z&&P?o6@RRIBK~HxjX&Olkl>(z9emA#zqo#ujlVd)Vt78e4*7i9z*4Sjcwr!QTN~*9Wf%TXRc&^ib?1OF!`=H+HJD;iTg_^yM^x$5|a<}S1);$r2&E-DA%?1;2B)VMGwA+bGhij*TLta2RY^< zT0d+CWb45>9B8BmH6NMgBNN%-vXg!Z*L-A$HZaF0yrGItxX&B(27c_V-ucb%?i{~0 zKgs35Ti)At`@bW^6BnOC8Qnhc-QFMev{?^G>t-s${?<0L8vd6zC&xFfJKBfdIol>7 zuJ4i!EV=zf6rP3mSYJ;}&rF}Yc=qD{3-D)~^$VAl=hi#77cb!FL2qyn#xtMgAPi?d z!(I%C-^nEftHCF3F3-#jFU`ELMh|dYP75tujTz@FsmNztk?I_8c zc^Es%pTx)d$ZvQao^LN#LX!Fwu^p}7E0Ox~?MwYev5srbhd&QiT=dU1{NOqYufclr ze7t{d%ROM#W32ZOS3;7y+xq8q9GDa)EQL?<0J-LUYZd0b-N$eJ`3ZyiMwq8;-0PU< zJvPRCxq|s}4d%=1Fuxt=Qq1EafE4qMFn_{5zh0BMzt(PV@pC?3YccCN_NZfoM8_4d zgL*>r&6C0qE=7mfKF&Bk>P-0!PeDGPDga;!eGG}8fj?cyz`TWTF01!Gsi=Yp}FxNfw5*bK!=3EIIAG=%vVr_V}I zBrf`F3a4?=XVhgb`pn05eeeolGay@^H6EjXVpQ|%X*@t=hs(~z17N>6<``;rzR23` z`_)e{oBe!VS@spUw)<)L3JPIc&xK%jqwT(Pe!TELmr zJr&82?akh&u}Uu9OFjJU;Sh&ND2FNcI4+_WLd5=O(zvBG$1K&;O}q~wxm(H}?@@G9 zNf^SVJSAH<#qrtrBcG2VB-eceJEHMY*Eu0m_?-*>h`nnleBZndugmvu>$)Ota1Zti z$^F{+Ydk09#OSGZ<=e}9EJyS01)^%>%r&0lIxgWfuHu5TtKcKnh%=TroH1rvz;U5C zoF$D*Xk)%Tjpv+4JV*2G1tM$Xt%SXPaK!wJ(`((GZx4D+^X;8)IQYD#6Q}+JyN`7P z5NU}&p-uVr)^7iM^(Sb)y`W*Y+x^`56P)wyxqmb171QZk7t^6Hfp%$}AAx!`Ykq`4 zFv5TJ{02if##?3G>-i1VI}H}6d8)u~07qXI{RYyvVLfHNfOX!Z_zh@(M2W{pw%;I* z&&C<~e4ZdAxvuRu=ze>~1Z?&_zHfi=i6@FrAZ^m)#eJB!ZW4y?D;5uO8v95KW2Z+E zJAD?h)A#pj>~uXAv!7>gmjD7w!Gw*)=OR2@jl*IbpN&QG5qCmzT^oy2xX=)ol6>ed zg2%xA+_+34i>HRn8gO~!Nj zJ|AY;D+XEi`YRdsg6+mJRetNSTl;1X->Jm>w`}J&@k3eVLfYg4)+xKvFFVPD5t25~ z?w7^!*}8yye&l>|U0WBp#&ec%E*D+!D)?MLe;%`3M)1e& zoa0Y(?A6RA$P515bL_eMAFi9mZ=L_4lHsz543|Wo$!>|Q#@PET+M{mOeXM(;Un1lA z^*Ut-`FM6hak}q0$eD{BG>;Rx=)P;APc4PeA^L@{Z=hgE?$gmU~6tGU2)4r#9IC1z(8cU>k^>iMc$PSmC^g}r3)!Tr7 z`nTrhD*Z5%SI=bCn+mh)ZN+^@V?sL&q=Ns{t@nCMJ>IjB=oCAr-c`sB`REg-7?F?bc22!9?2D2Sx!U|%aeN2xWBCowL%zLS z35nMw6;U|ep@c$uIa0qyIrZki>(cjo1$@_0cn#hsugm+l$5?ROoJ&r<*T6T4-wVk- ziVwVfIrWHlX4HEz%&1q}--}{i^Jp@UW_(UPBwkpDdA6V3fcfY<7EIZge<^|~$}9Qm zVSYk{I$VluYfimJm>+9rPQ9rlyN+|6y4A13y4Tm)l}RFH&8c_y-&J%S>v0C}!9};e z1ilp%wk3^p>n=1TK6r$rU9scKjmNH!x#!etI(Oy$rQG98=3)VqSsYVEc@q-7SHKR+ zmiSMe6ozmqa%acx;`rD%mEZ6b|tac%d{;G8b){zm)-1y(d9sk@D}q;@}?g5@X94cX`Zo!@JwGL_gH^Xhq9fi-vx z=rfMS+_)`t&tq*d`+4)S>@(i+##&?PIa-iG3{1 zn-{3~y!Nr2^X4_#$3jkt#4+XfKGqPF0c~U)QcZf57Jk>WUXDENW7YZ&82>B;t%Ug} zdUB)oOxtqgd5vuu`bfG}r?KwIIt_stP?mAV`w)_K${1x!;-7K3BJB8Q9G|VzTw^n? z@z2w!tBc>@D)?4V*tW3neuq$OA6;v5G)Eq!`R?O0-JK&3c+(tt z=QT%O0D(Y%b<}szt{i#WN;gOI9-q-1d3D?Uyu@ctIp@f0Ex>sLnUt{(%lci}^?ulUB6_q{zoyZ@=1 zqrF29lvayxA}f%GtU!CbJ-7ef9v`zSctYmi9xTST4}7op`#lqbzqqm88@;bc3+Hq+$SX0eFQtA^J`{tA^Lxl#v@+^kBfi#C*WH_ zp-yDsb$Ncj)wL!7%??I+efQ8#8hcivvU+>k^^6|l|MEwR@#!VoS+N^Czx z93SpU;($3gajuA?4TG3KFh)oE{%xPes3d=&&DVD>Rs2y=MpY71m2{+>yN+MQdkq`CEiHk9pGeH~$P z>&@-I0K3YpU%0e9x8BIo+J>*On zcl)Nmp~u~GnuiTorEgfxrODiSFKBK($Pi_X`2!ncK0db|k}q7q&x1$Je44anHMbt0 zNNqmN3A4NMUvO??o_sEte+4ICdyU8LHOi+skK-==&1>Mhj>2|@=j=z}`E6e*=jOWP z(|jF#llZ-m+^_MKo^;Nw_xK@q%nzB1R4_k)-gu||DRTc@2H!-yaIxyA^oAF|b!ln( z9F|L$&2m=OY9@H-_j7Goyn$!BE%Jax#%$Z?J@7nPhfid2V$x0js4Px)#z&czT96=+t$zV=fn!MU}e@sIr*0EV|}?P+3%2Oj{OR^B<@zsw}20 zi#pd|=laWBsZRU4UFZ61yQuAA+U=t2Jam;smBn;r5u+C;&7{<%u@TLFPkin6IKB#2 zn+J9n7ES<99c!y=$e^Ehtm(HdDWpXdkymc#25XMv zPn*_jt81GSYuW$aCEIr)(JyS%i4Do=7|q>5Ucrr>b2W}Hw^(x=UpunDXi^{h$+?eT zH4nd%V`q>Vf_AU1{(O`9;wAfycR)Q}?~B{FZVPfk@tu))tkd~;qWNN~k`z?WGv+#*4TZl++fXd40yBtgP*OwyU8o$`g@nOXH>7{8EZPmUF{hv8&JpXnJ|e) z>h{d4*QDHEhg#+rL>cIK-Gt@j&mZrs13pRil~ z#jJa>zj%2u>o^l%Enl9j7qHIPDe;*R9*mHA)wSQ;isQ3!Mm|4sKDn;#FXp%DhQOCJ z?%*_dT*e(-1>Xuv(zt`2xULJ%j)LzP&L@P;fK0dmKDtvTK$D2GrsFexn@x14@z{ew z)UI3c#=1M;t(-uNxN#&|OUnk2mG_)Z<)Nu5L8lFoM?*!G(MO_D5* z>}#%%wYHl3K2{K%$#QH)`Zo|a?PKvFfY`^{ZB~Q-(s#0LndCl}Nnn$VvxClKV6K_U ztg~g-)NcTP@p2HH$uib-yjiVI<2Y&;tR;@4K4pS4iCAmao_Vl$^U(MM<4JzHJlHeS zXdSbRH??PK@kV>b1#b@aOfc{u32$o8s6CUqJrgD&N|ME9?HSL{yFIgTksabJxA|(% z)VBGwX9|HOWBy??pbgtIVS**aS>L*Ezpfv77=CLve8yZv$MRD?lYPariZeW?Zj8;e z1ZQFLD8*UYI9pVln8f@BHR>caGos#w3>mZ`JAm+R{Rw z!pi9Of$#SIu&2#qVPrIwsYxFqfsN-XZ;~np%RY>PV!T?2>wh2{SaSPID6~6ykM-@J z>6z(s7tbzV+<(D4d)91RxU@Wnjp!`r#S11*If%xZ{@uY(Y|I~Vd1h{SY379`Z@4_Y zBv9kd^31vA=Q%p+(u_Ae`n6-j(@RU2FP>XonpwnUoaqbTrIWy@Vg}IZ+4k_vGXHL*cf(p$Tk9iM*tTQOKXf$NI=`u>0tDSy*Io?D zgfP5}( z!5fkKHEIi%a6Xr|;8pOgp%D8lacw~v*ZnGv3(5W3ZNUv3XwVi+v@yROA_lcOpRy`M zJ<+Y>URn2g7>;V}S=d=jIL_LIoVV>0N{q>hJ@K^k{ICZnEg z8!0va#g?#Tn;3{voNUMO(FTu>jUb;(Jhbih3{pZcVRzEli01oPThyLez*Ke3Z&%~T z>IQq}!AN5uZGr7ONSLQSG1;#CcK!LDt2m2%5Lw5W^r(~5tOYj{mYkoUm%Ens>`+O9kIJ|W-KI5X-67oR+ zZ<^n(;b7Am<6Z3;#wW#(Kz!UlX-Ry>IlrCzSnq2_@m9uq^V@T4x7D6OyPx?Sck0Kg zombJKyj!$qobmuQn|tL-&T~o9o|#7bxC5m(qyA#)+n|bS&+s9DT9iwY_KX|On$K_7 zulenaJ(G33Mdy(S_6m?Wc2%TbRl<6dc#LHG4@$w_>ObM@Mtf#=^)`ZM!A;vw=U~q` z;Z5T+8lNHdhEP(oXEeVZA&fRH-F!fpt9Fss(LPqy&&=o14L)P)Jt5IucAKA&uN&h! zpK<(dv3p(!&YK6V^Bd$nk0j=)Db64icHb&DIMe)gL8FkqKGXbme9*bYndY|(aK?Yl zV2xuUlk*&Cemg#A8*AM#uE(YCm^iLS^V^-*_$LuyY$q90%Iz}B6bjoBmel9~r7h_4{B|eWnBQ(H?|Fb0HNRbeyPVp6C)$|buB2Gg{B{Ie zZn5T^->$j%TxlTRbEg&;vY*>d>^R~<)(co?-%rLqF`gDB=@;5#pW^szoaH1wcVf~t zx81(x#?SYTzq@5J0c!(zf!&%PnRTyc14i>BFLps*JKl#-9M&`sgn2^tn3IIK!3oW4 zr+Mu}FLBwyxB+Y#x11!+=Ybekzk%kp3mQzjkCl^n@rg<2ymn36GFx+R%S=Zt*pH?@SME7{L$r}L(2=c@SVd=}U+gv7om$+l+_=1sw#al@O= zo6>nx^d$_Tq%?2p#AN&O+NnLGdF|L-c4chl!Jy{mUtGJN=*K!W(WV@d_iG#!Iajit z+fIGPwR(*?S6YL$_T;wf8~1i=ZadmEn%l0PZYyD@&jTSzZ0HeeN5|H7d2T!OBQ>|3 z&h0Ql&i+wHV>Io{ZKpPk=C%ujz8hmSyA51}|95ZGv?sTnm-`rv=C-4t+BoZm7>x_g z67sH~f906lZeMe;(4=n;vH#kwW6fCi=&mETle61O&AbK3DacVpkGz>0?yXTv1+tu&`y@C2L5|Ko-;&1uI6om-q~PP;bY zOmo`h8fTi*F2EW8HKWs*hbq}$pgHaMoNb+!n>h-a)9$>+J&6G0FY9RB(>15vff3)( z)Zn+DK04mhBbF2IVQ(-$+}x4p{ni|+40m%UeV73s{chTN?6z(s7tbzV+<(D4d)91RxU@Wnjpx6yeD=cS>GK>p!+ds>8|Jeck@+Ezi64l}4DS>}D17d><@^F=&g^zzLQWJe$xE`^fjGVc;FaI-cjVj4m5`)M}V!$R|EJ`Vpce?W&yBiM+_6OW5b+1QBV%Wb>grd)OtIiDv5TPE{36KoMb zvToyywnvoWa2CgB<19b6jH6C#I+xvluDR?Gy@oxLdAu=JDHMmdk}!nJIK0L2*?1$L zk0K=3W#2Fwd+KD~hk{fNOSxaW51Ek5ZcKC8X>M+j9WKSDqG**-rcl~u&$KC*-8;9p z7IKa%={JarbB2M<;d!TW?t}V4dx__~_z%0=ADXj?cDby1{qg zqSF%Npqj((e8T~zH4bTw&Cr$?++o$bfzp!LOq+7psVzev)^ZS>(b!DY4@6n+23uw~ zD;m<>+cNFRVK=$)3E~9zuf)~+DE)qBYmFBVIgYL%uRUwcN^DoYh zN$g)~9=qTHrjIktW5)-bTbyYgyEfrW^VsDYXPU<@z#0EFqtiJ4DmnJ4dF=R{ZJpK) zK5&=5W1_!6^Vn(ZlK=p9++WbpV!ly<7>2J|GfxRCEqOm*=rV{(nV-DJL#I|O=VGKF?CsV%!8(~sIr*4 zERIb&_0?4tRTfj1Ma`w9K1=igNwl3hIK~P6MYp^o+AeCln0mYDm}^R9QDrf8Su{ib z6MefXizrr$2Q*dKhd-nNnET6q_dHVbkJ}OquJl>*x`Z&CmaIaAkX|VBDiZWqc_-wsKJ|9I$ zuKNgfMDyB>;RMX_vjv4bEX-~76%@1u^H>Blh5yW7CM4J8GCC)G1=}n<2Mf=~^V>Ou zeEhJ0{X%j+8*e9Z;FvIBDSYPj;{$%0pFn-8p?pv_qOw@V_7n8pfITcZIsn;}rhT1cbeG=urqxOtr{)}dQ#z{UbK7(#; z^I7-gHh(z?gl4&aMcY|O)(hA{8HJxHpgj7FcZc`Rh3G5Whn46vcFYaZZ2#)Ys@I!@ zwR?Ze!Ez7?%`(>5PZWy78snBx64|r;#c_Py*uQeYTEaKDCPq)WhE@*L&xhAMNE@53zRfgfL4z4M#j-8p{i8+67tC0dK`2bd(+5AXF~7v+nYrPbPY`lv zdFI^m^PE+CX~r8K{o1kN>7}L17tbv(%`D+`b7DV$zb7Bp9}2hS4NYJ>O5`Oyj6(h-KGsKmgH?~`+sl=Zq<*x&qV;mm%d%&v4_|G46B_yf4Js#(E9GDa)EQPN! zPuelZ+My>7I%9sPX~gPc-rL>#tY99G=T9iBcR)Q}?~B{FZd)f4J8>+lxaT{m%C9_C z>;%~M1^@Y5-`b{Z@GQLNdhNiTas~Zp3aT6B+NPk4rXY|TwgEv~fP@LGYcD4A z^ZdPhKf{aPiu)94C)xtmOGvP0w*}01!DmNY@L37g?6%;joG4t9mt?mEaeQ`LKt7kY z;EhQA8np#WIG;;f@GAJ$P>6k&xVE5->wXo-h2(ziw%`U1G-wM>v@yqB?qdgwn&U1I z*CPIlymCiQ@@}1ISB|^2+sAXC6Jl{%bKDVIxy4$$a@_Sb_GMCk-^+757B$BmVOE2) z5$yAMASB8G=@At6>q;o3C!q-0zfH=ybs9V_{l}}|TR~xenI*3OxD(ec;J6Sr1G4*% z3G)?Cv@yqBpU&-AT3*x~cY&PRdaZ=LesIM6i^E%&=eRqeIqrtfH*{pwI5h9xe@R~i z+r_B=G9qFXzdhSg@`L*NcuLcr>qyS&h}Y!5bcjBN!xAfpg2AoXXNuECzR{nd-hCw zbXxEDyM2>e8)J?3TetcSSoeA{t!M-rw#+m|D$7{oeF%xn7qEkP60Al0NaW=)l8v=E zJ{xPf(P^6B?!4ME1}nsj8A4#T%UDdIw9S@r&Tr>FCgPfD2r6SD_^k$=*Fhgv_H*26 zyI(v0h;yiR8+Zo)MbFuOgM@kNCq|uf+_{fA9i_Z`a@0j^TUlR-Cc!4mi{Nc6d(t z#aY|(+x2Sa80a)oLTG-wntoO{_=_JDfMQ9^k~Z!)Xit8--tnRSPv$;0 zqxtP9qqa?xAFOG9JMCi;0j9m~XdkP6`Rz(cK4bPPyVaM)x+nXxG`}5Xz8l;90xKTU zUH7q^^V>BSoAGw!-DjNr+;-wWqDaX)WsI_w=h%!3&JtrY&bjTH#94wJ!}r>)`iyl? z)@RwzYbV&k?I_Op5J0V)pZ3h~Hy`yK#!WZppYygdt6gnQqpjw4g8%n^-?4m=H>%?~ zt3ED1k8bc8xahRRaXp&X?!5X8DDfHa8Mx-PJ22v$Q}_RXghE{ zQoly+z&w8E(hgh$-x><9!4lUFOyRmN`Rvxf*PtC3YgazI()QBLcZM4KFb8nI-RfIm z-RogEI)AUM`RwqNavLicYgazI(pF%tn0KscKD%6F%{iZ4bAHTc29Dn>B73CWr{%WL zy|34T=^X0E#0!^xC*OTe{Fr0TIqeP{aP}R&X&z+7mgHREzuYo<^SQobAN9ZWvn@m8 z4~&2PqyC@Piy`b3;9>duC{J(i|3S~wzuwN>-P*t8eI)lUgJ~X_#$oi`h)q?%z43L6 zpW`Ujqa>KJ=P$~=qnuLxfG4S$!L z{+DyEyXI^i^(zo-i_?@X#ad3WW~Nl7K0ZqQ3dEY`yJK6ETfL_F?#}D@C?de_(n#g4h>yKBy#S-X9I?&mK8 zYeAq??V0YgXIg_b6DUp2$KpN?P;*Pd54~q;-PfmqGtGGi-C*mqoaB~-PHRujyS{O6 zx8}T~?_gPT-qpcd3Hy8$A@RlAvCuBhc?Y~{&O7xT7%8V6(pld@dve}+7-QYz=Y1@i z=DefS+x@I=h=o3A;2QkDd*6Wxh9=uH&G`;IjIr*4_ke!6=={Z~pN=u_ZXIvNx+jk} z!>1`UzhsWFraAAlj}}D;#qrtwt8VaP@firo{o1jaggjgr*Xf!cs5zVsX3C>VFjYkcSlcfW;WzPqp3F(USVgt)Hx z?#y_(Xui9-{pCtCP_AtTG~b;FP`DIK+wH(a44>T&kk6$Z=<RGcPQ8!{zBEmBrL$(J`l%wu>r@ zsmr2c&MB2emBrL$(J?2J%A(3*>awUgi!{a^I%DW#5x)|5l~JZp+UC=7%vq%EqPB~v zw~MDHCK-TDnwO`tsIr*8EV|{qQCU=3OkWn=^1`Srsw}22i<&b<=kvlq0d?MXam$&a z?V`4e>9>n+IYm?!RTk5iMdR#NJ6hw>9oNy0IXARj)OIoTcF{2}h03DJV(PN!n7ct` zQDrf8S#->Apt7j4n7SB{2dGn2t6 z9Y1lL&PZ{@H#9Z)?Wd29_w>k&LdK5v2JL&;)O*Yw0jkW89>grhwVqt(om;rLu#o9I zSd=p%SubD*Uu9o-ATBqmJvTOvk2yxFQsa59IaEjRBhH20g2KA744`}k1$C>;wLOh( zm$|lA!MB3KbFlDyJik5Hb|!m z+kxlbivhPgx#VEn;l*z`Pi4D2GdEnGIk)^g-`u5{R?j~dT%lHh%yC&jp}Z)@_%y26 z*(k=s>Fnw2u`M~r7`|$!7^})DWi~H*ES#pFjIn*q|9p#n({5?uBED#sWvoTN zeIvTf)@LOGBtp_Rvipps2oG0o zGMMkf%s;k4Yy)_teje24zp-o##f6Kr)0uAXqjx9kh4B8=e!+tXp9Pn8d!OVZ2-7R1 zkFmV_2o@D%#fY3zR&!&&xazS3?!N9d)4^Nk>pu2T|69jDzVa`}Z+`IN@tc3Oc>LzC z=MUffFMGcJQU6cpk9cp}`GM)H68bz=p4#63gPxALdt#fvj6f(T%YH4kfkM*$ z7O;czC3a3!p2#b*XSe%te8tFb_gmYWL58$EDqW34ALkN$vhF zT(H>@Eb3R0}Cf3ms3nq!Xdk$vvp zK6u3df1SPK`8kh?E+Z(Kah!=hVLfG??Kxkk=rsBPq9kp+t<&Q8Y@O!nS9lT^a?xq0 zQ8^c#b`^XsI*sFd3XvO@`?Ymi<8LIR|LB;%yxIPv=jZ;Lk_#7?5flZfPRprI)BNn` zH#VqEzoC+v-@q|Hd(-`^-n{p(5E#vPn=gGT)>GEmw_u+_`&WD_ReiPL{*`0y`KEE! zpLd)gI10*g-%7B>ddj-utW|c536Lh`8XDPO^bIA?1$vbYpfwk$Z`|9h<2y0Fa~T0p zP?qr)jZMVit;Cy%ka^{`-^?pTc(^Kjw%>q!K8lcB*Y<^v;RG&zgDITI#cx2Lfs5b3 z$8`%*IV`amkgeBF;=r-+7#G4PG0;=`?Etl9LiwO$6YldsoAeczRyh;2b_`6k zow>(jptD(@3!3Hlr>n0xjrgY@VwDSN%k4J5v9EYS=YodMu$kB=`vVE%3}!FtTu{&M zSGmSxx_iF$#4|b<)PO8?jOkp^++s}Uf<}Am&5h+5bkS!z7qkXzB|JADMJUcsP(o*| zQ+@(pDu-oUpRw_nxe1*Mx-_hQf>4eqL(!I}jO{5D+RQA(0A)R$m?!KP*EuwrFA8s= zO3}G7ZuU#I=f+4|%R7|y0@f*?osM^Qz5UWIjOBYS=O^U-~*t=YsM%+gQs@|54|HYFv~60MUNxWL)%=&IJwLLo;o@TmMSu zg7QJzZGLY0S2`E8O*qrJpt;6b7$DWTpaI;PvSpmccj{cw;6dAZt%SXPaK!wJi-C6c zTu}H8bS|jcGNGJz)|NS;b3r5RO*8h4Lkx6L=YrPSGOqqBS6^{9=YpPap9|XLoNI4& z4I@2sJ?DBc>+?Z%&UNjag!CEnd|5pm*(; z>+U%VC!W#ypwZ|HU0)KY#3LJ zJ$BGJ|Lq$_QLp=6PVtRjeC8jwjNW{%?`K>5Y>={!)K2TJTw*3-#zb3(rfDqzMk^%$tm z0}Y?UE2LL;-H0yoW!;JN&YOI2U>lI>0?djf%0kR7Hc{WGyq#OIAh-< z(T>r1puuytah8vH3g|!TJka3%^ItPqa~eaZ-vq6TwcPX{bsngWoeohJkTm2 z159oXbTQjWHyb9~^U$PE!<&@#0@itdIuDdjdm=sXYfRlXR{TQ?8% zFDr9EIRmtDezxuS@hF2`(=*fOE_yw?d9o+Ie9YTCxaHUv~cxl)%*~T0D@j`KU8xw|bDNpo| zuuXeFa2dx}1dsfNry!rtm5}7RcN_C8<2){Q%#Xn5V#n-3W&N;jTu9w*JBIU8Lc(|U!sY4nOJh3kQyvVKsoOC+?=yJX zcDwIt%akCz#6nUYvoqjvY4=|OpG&*XcuXOvx%np;vfKS6|CP@BtUko_v8MAr`LuJ3 zHJ$evfUOyvvG0*+$LPGz;5pkkbB%wxj^#OxtGMX2tKf6dX*(TtTH{>P=s)Vb&*1&@ zUo%*9@`LNV&)`|xSj$cSQRjW?Sn05}p$!uCSkl)ug~E1(C3U}ne*Y6sxw$sqt$(HS zKKY#OHa|E0E1mbr*WXm%$_-~a?~~6tw>Z;zpM3olYQ~mv8po;gK7(g%GZys-x4^(We~ei>NHBET%4tj&mwh7F8Bg zmqnd(pyPBhGET?!TT|LDYP*ppZ~#5u3wZ;d0rlGpG)Z_pd~@$p-KF?#1Wzq`XS@YYt`{~b_|*Zbo3t=qgE z;q%~P2xWBpz;}Cp*wg0xhJBG*a6VoCy8L0)Y<7mN&)a12ZwcxyJ9!^}ARAb6`%5T% zJY27zHzY{rc=p1jGe3#s3x?&wpdtq$FFsu&{vNa}M($CZljJ(I66v^BMMH z=T0seKp9^AR-6m}^32?D%@8E+EYF-Q7vS%_^c>2oN|gc$2m6qJ^8r)P`E8`Xbjs?A}{G-6!ItWu|Dz} ztOj`%_i`m9sb3M>(fYj{sUP3I)Nd5)xaNHLb8ikSE^~@r0pE2LUW4`K`FQ`_mV3ae z#~dU78COD*y4!P#Uc-S&VZu`QjNqIYpD>}Vw&4ATiuYFGJxJ80c&`e!$hG3VG2UJ0 zC$vJp|4)kdR^fe7^?McTTvNQ8=aHn}UFU$b0`LE;;{9&%K4s4LzT?;FLt&dF2TQu@N3wk=)fNQ%}2#I3;ncdz561Kmj|+C*#a*KC#{Y2t3g-^>KXs{zh~RJo#M4z?Z={ zg~Ix>#EpT!fn(cHgrt79EWQVZdVNwE1MfOVx)r)deMx3c2H#cFz9fuPP~9WauePN; ziKH>HryS>@w*v3#OKKtBF;YSCE>f;|mnV^kcgMN@t-!nblI|YwwYH_=U1Xd~>EGVV z;}Glh)9wCzBHlHhg4&iLaEKYPZ@H_zw&j?6K7}XtJLgl_VQ$FEr{L}GeYToU0Ty(r zQBH*&cotdBsX)7s#gMdmW~*L~g-;7Bmi(P>ZPVw#v+$nlja}GNu4GmyN7F2ntuzZ| zlV-v6K`|je$g_ZdJa6xo?B-cu{e+=4&F8(j9dQ-UW zSGW?A)ZNxeYdA0|Ojrt^@iC3L=UHfZJMg#K4&Z(8-L|eB2+}WTJ5Wd7wH;{O4mjsu zXni{{s{Mghw*x_125kql9jKY7ozx$2&dbpHcHpqK1I@Mr>pfNF3qiUDZ3na+*l;_b z`5JUijo6A@cG6enoUftfI!S$1Y&u(PqfYajLA(@B4fR!3eKKmJCfKO1c^q2a4ydoH z_3c2A-a*>|KG={%-)cM1xE*lL@6h^oKz&t^)#myGH8!gD2c!Yec3@qME6G=-c^}k9 z6`jdtCv8;cybmqcN%I;<4Rz8mmXw2ykEgKGL6k2r9fbBx@hpV|XZLd7^iSkwv6TDW z=y(d}d=M>f2X1LQfcM6}X)D_Sj;K&yRTUV53vCA)+o-PJAV1Xlc0g^^6xsofsL*ym z+kp-D2VC<9hgt%cJx}(0Ta6rYr z$M@|oKJi5HiK6d6UfhRyKKrre`}>N;g9i@ye(U?D>Z_s%wA@CWR-F_=D_E$FYMw?? z{KPrmMC<#e>Z?kj9pH!xwNa}rfwlvV?SN|@iq^LS>Z@wL9jLWYwH>H70$9^_z_A_B z{1j@VhR7jiI%1|D)}h}F{{3``kmFMZm&J|x!%J!KlPyZaPNOO^3QkX=Z_q}>G{2@eeZdD|M~r) z@%bY?kM+Jg@gF^J{)o5t*Xp&4XKx zeWLeM{X2Soujey;J9{4J`E1YUdv{lBEN7^;S=`g_eR!vOgn0ng|Dtc*o8s}lb@?aP zpN+>Qn}IoNA9{_nNqJV*yGv}6{XC{J6Gv07(^N8|3gye1u*ui_0JPLEd5H97Z+Id9d z_=@5Au-09`X&KFrNeJHjhO>FX6vS&WJa`w}QfR zu<(35znwGUD6YE)`-S9w?U=?D95^OSSPEa|^-oR))5Vjq8Mu>x&SY%cHunw1B{>NMQc@LFV-}%g6 z-M@M8uRrt##&7mqc>3n%-s3k1=I$RndUH!(&zBZI^fqsP|E+(xb>Hz@cZ$I2==_nd z-R$duW_^BmeBeFr%m2-XUf=)wesTQJIJu}}2i{)&@XnuXdY9Xt4@BcPhVP&L=4Oq~ z9mDe#dI2j>ZQu31E#Ke#7n}Y~|JA;K+xvr_|6=ghfBCCl{<~k?*zP@j-=9`DM(;aP z-59&CTiXQQvrC&$&Ul-^`w$Xr7O(^2UTG6v7lv@jV>_E-vX9dGopqo=kIYo>Li%DHQsQS%?A3y4`QQfqmOhgyej7zwtdV z)XS3@={E+E$0S)C+2<~cuUN8ZY`Xa)TTz#|ejx9&)AAa9p4A?|o37Ghgkqh~C+=gan@J{U(gjaehi~M*SvgpVjI= z+Gj4fbg|Ev!XOEkhc?g`doIB~qjfg(!PB4EK6w1*C+1+E{Z~hC?tJ7~*lI^_ZZcL{ ze|;;>e+ZUZ8Ftzu%dpe_pZERoFE+N*0=^_W?FwYS#!mZJRcq|&`;J#P?h!kU_w1sx z%NcJQcppNdI}6wWcvN)u8^RDSd5mP+X>okE&L$uAtdLyS*4ejkAs3y!6?`r_n|%Nm zolU=`OWQyfeS*#oqHjrUgW74+-tf7_#a71)M83Eb8>xVGyxxjzM|C6lc#LGrb{rpN z7Jb|K;79mJJ{MUmgKr8YZ9DDJ$M+vHu{85PNft-Ua8W1!{;TF;ReT1zz)7%*h&FSgiBeN zS6^#)#qkyKL-`HQK|Y@=A<1>^ekJ|v?Dr*&2bl$rOTY4E@U5T>goW4T`R#t?UR-w% z_6tef?SADM9H`r`JQz&ot3WTwj#Hn4`V``1@dku&n+PJ7ak3Z}`+fA_KJ_W!xwUeP zE_Iqy+m9e{mfL>bhY;nDR6wDON!wq-dXz-|Y@b^x%7k^{v)g|1`6xniUAyh?TA#wf z$JD2Qm)jA%A-Jn}t74BBE1~!(LiZlt9^aTxq3QW5-rnu+AN#2Pt>YhG`IqB2KX~!@ z&7`Sp+be+sL|_X_oFpPlj&u>2Cr)7$%h&~x~kfgI9$#_&|PqO z73XomY^|CUx%OhLUQuHit$;#Bw_(Hqvi&oV)05w_P)x({*-R z>Gl>s$wuQi;BK|iSa+9pKkM@sX|D)L`&+;czEbhmMd!kj*Szjpe_b4(-4`UE&l80t z*R^f55-#M@7d(UWxby|-*K_F$?!t8+l*(Z#_iNi|&*4Cljpi~>s@ZwM-fH7H*pP!T7O*hxSzlv0^1@9P7w__q=AWnaZrQy}VU#@9S@`-Tvi}muQ1=&_uWP z4Ow@W_CM=$5-D>+(he7}gRfTlhGW7IE=30IzF{0+F+87~hJ3zkU@6zN`-b$3vwlf& zvNCvF+W#McZv};RCkwC3^V^u)gX`|Wej&ME8*`^|;FvIBDSVGUQEcmYU1Cn>05jq7 z?1IiotnF`=Ae%mlP#oU6cD(Kr``bERw}Q9+#=eiOc;MZt-&l7i{ibsgYvRo%JUbsn z=-$KIfsKvV-QV1t#9$m&bxtBs*LeKZy+0=rdQRsg*5Gaefb;)<_TD}?uIsuJeE1*< zfglOnN<_sfZ8r%!h((dzKsV5sk;e@Z1gVHJC`&crY?Ki|H6?JCvOoe%CmzdSMM0Xy7s_~%d3niO3$qxd;BWWBUFNrRk6a;@Q zd}i`y7@oQsHE5NhS1AEYJU*P`ac}+bqi4(Q-K!Eq`<~ki* z1>QU0^WJ;T#4o??&1l+#XJ}>KOZr@<%6rv%ZxwmZuI@0#Tsaxf#jn(RY0R3~_08M< zX~&=6aC%0UwqX8^w&465UCXm1_Kb6$#7&$danB6q-uQc&d!x&kBeAPIN1}^YYwiu! z3aMHyk9omIXAqcV_Tb7@A6q~^lsAY3;7%ZqW{u3 zKwTsL7xh&TL=TyIHw@3zyTm&hxS+Ia>fI}7$VTt}1lO|ByR09v(Yr4L&qnXQ4ZH}w ztM!FiU+7XgNM&96qJlPHMZR@5mCC!rxO$UpWHXte9MW40t6>9*|D`tI)Es7?e{^p4 zbkge$)ds9>1MUv!De^Gk1NdK+^CgDyUY+xjI=8Nzb4NYftZ@$ByN$gyJEir8roC0b zyGvma2(!1EzTWUbqu#JVeD=m|%4bQh-4hxo&C7Ng+mzwr*N`uQz;guCuL;9zVLq#@ z-3#F}?N`!%CGsA9_|@)L+E>We&i4$V#d_xw^egv{vT|>wcs9>9tBu8bx3RI3Ubn~R z5D1g~MM3b_VX{9A&y@YdOJNa^cK6^wurH~3^L>WFS<6tam2D`${Z&T!ZC2~{z(cLa zZ-v_VtPSM1B1BkJ{ZKc)MYHNR-n*54)4ILZkl0GYL8?+my7Q zo0aEy?^ZmQ@R~h7hk)32X&j*4DDi|bLGagMHf0!|spE*33S3j#HEqhK9SdS)pmv^W z2+wIeLE{PJ0rKLi#}h_!YadVe6}7k6H+oj*5o|$wYY0+)8P+78@Db%Vm)~ZST@$47 zyK4QGf-%__um#1oG;+~p( z1xTNSG!}k#(G8Q>4ua69sT(GPNZ1yp`Mz>i6<-BW(7 zw$)aVA1mkb4C6-@PPj1HeeU3q@wPUR0F-I{SeD^6Z^zJ&-Q$(q*f!X8aq)&T@&32b zOH_>Nlih{OH>+Ocy+`{@rNqzO8I=E`pVD|Xes0l=$FLm)p$k(lhT)ldk$9=V1*Kh6 zFFuThZ1mz&xR#AxdNAlCNb9Emei_HM zVG#(UMGK#)a-O~rT5Oolq&AxK$Rm$`_H5Z`E+xLUPHnVmek_6kcMCIO9mbCqK9gN- zUEMYsVi<QW#za|C9gl62z;ee|aoem$9DxN;do#)~{4HgT{>c^g{SgeI)gf z$b00))%KD0Wi#2l9|_|sI;Y1zZdP+Xy?*p3b-aA>jd#C!l$kxIF5tcZpSM}OS1 zAr6-=EM^YfG>+Ny2R#qG1^*hn4zI`SoAzZt+U>(}0l9aR@7P}z!goW#B-Tj2%h~hY zCGTd8ep%X=o3A-L8FjdKG&swIX=?`K4$PlC#JIzO=8ikq<+Fkp6JEQwUiqx#I|1?p z!Q{nB(47r0K8^p{@Z!tBv*AUK^<~40GvT~g2qv^f@uJ2ZH0}_l7cPTlw_y?RL~->v zi(!4U`?4^|%GTK0#T~w7QNPE)bF;=Bc<)wmhlJPfQN9X@98Ti^=}c^~F+uRxLW8C) z7KWGcuP2uwUP^YbmUd0~-@I{$?7(`&9lm8z!`Bi#H=FDlBIUVi|EK=ALpB#H?hs>6 ziMKp~SHu75zIJIxacQ*O>v?4bpYI2S*7F5@p?=7|d+7@uY;IqO&tatt6F%P_pF==& zQW^*N`9&8#EC~MEBaP~~L>Qi_3yEjr3o*xlaw94(@hos`e4$r?w}7R~U--Pdz8ROG z4(`Ko0eN0CF7Y%@)Q(GJ^Ks%5>Ie`eR zl@`~47OiT!lopj1*MJr)=LUpxS8GltrA4L1HK0YSx+bMXrNuR%MXQ<~rA4L1HK0YS zx)!BHrNuR%MV)s^=aY5A)QnMk(|~(X>k?LzST_4hqi7Mi7Q>qNbNBI+b9*0klomm4 zUf@$+-D&+q@m z_q^FLdhjyB#+OXtT(j00^4_CsE2gJTpHBApl6(#U`qP9o7Jh1}t$2tB1K^QCb!|l$ zo>^N#yj0+N(ym!&cnl5M)K<*lS~j&6F9Oe|wjzgicL(lIp4Y6cn8t}(wG{y#w8|ka z4B3w2LqrLqESc13p~p*!|JPj;qdHKfksUqfWME+OPOC zWZd=3@4xrMmFLMA!t*yPZ}Q%4coV}QC3+mBLVyN^N76V(5)j@z6~N)9M;_I@8HQ)_ zCh=0dkPp(X$(u81$c8tc!*y(U^EKev@FvHBvEj{m;6?DJRZexiyy+}{?Y55Y1553X zI(N1I?UU}z7!ym*WapK(!7W$(nKJrcz382B`d_-}9qYmS2-BOSi)Q6b-n$KNVyGnL zO}s0RaT!{OH?4BaM+)|O^RQ=(SLn^Ve|&wb^D$@fjoaSZvAO%ZH=M5VrMAZoE^Tg~ zSn4{pqx;CxmX5Yh%-(P|Z@%{WkFIaU{BIfX>FCU%&n$Jcfr}sCJKlBGx%>Ap;?hsA zWyVLwi3LsT&V+OGQ=6`E-${X^@gEQGz3(sm(B$p0@)vfTr?9<$`yJ=EJhS-=o4(lj zY{wt9f2r+XcE9---}>gCf8+9Y=it^)FYkM9Ty|hk)qK zG!Br5MPI)x2>x35+Z?ka4A0cp#5)$arnI{U$AV);{|F7)=<814+30K9$Ts@=GVpBl z_4~k!(APSjj^=K;lnzo^mpsCNUuTu;U#N2|i{iVN2A#W{#em(Is>g23;k`Ahj^Mr9 z=!n^=fkf*FK8JwF>NF0JrbS0g3xdDqIfAJp!thKTLA(?%;DfYl>WF3?%Ob#+R&@^} zBldFxAC0gZX*HgB=in{dyC;@zIR(4%e>k$VbI*OSA&)F=@~p?s+SX(0W3V7gupjrF zh5h(nucgL+V`cl%#f!2Z=kblJ?8kq#Y$YDtI zu4yMegob*76E)`93~+38!3)4!z!Ej)SqAO)0Z%}l*VF|ioT#M>z<>ETxs>(tANs}@ zox3()``RsSSC6%m_sD}D2ln70!s7e<_RY$Fymu@9OZXfl%74}RZx#4&I8Od(VbI=B zd&Lt574dyf|9u_YSKKVz7d7YB&L-wP-n$j=C43$dK8JwlpfnEf6HAQbh#>fD@AFs3 zNW$O$VT6+b3? zE)qV6fbc~c2S93New-8pf6a3Q(-xg{k1qcRp2?5IOD&^?@*{0M8-AR}wQTtD72w(M zV-fAz@Z%itYV%_*n~gF5gT^H^E2H#iaXSqkI%Tn_G_GbWXCV(|J%gUJ5Nt69eH$O>AuMWOV>UWoRP6Q4j=S=KLK7n z$azSPH1|9td=4vJnDBW>sDA`RC#7)!V!ok%P_1@(ET{`-a1%DV@Hza?Mi;&YJR4nj z1nt`B!g=6@=)yvrxPIaecNb9TZ2bJ@P9<;5Uw9h|(jY7iogZd|yQoB2^oxAI$ zi|2N;M(ZOt{@sptzjBiM)%u~wy^Qy>3#(@Jk9hCVI$<{P^^-x_7p4=A1-=obR zCpj`?J;ujF?e1Hvh}WY|a)>Fv)=EdBNGcJ}-~H=ORVrCY`(mbwp2EZu%^ z*MYkZxRsJ^Zm#=|s!GX&_pnlOA2Z#5Dw*y(j7rHJhnx%uwpy|JzMf3xatKD&+XPI}Gc(|8U6 z;nOq@fb`3{`xQa(*E~lsb$1w^DIbV8$qV=(?V7s#XK1JwI8przy}+~4-9_Ln;CfO0 z3s-<=BOf}!s}b@+YbLd3(xq~c)cV#;J~(PMS63mo8Znhk*XYMRzyGC+Zd3){T)Xeh zalZ%eBFvxb!?|YF3A}e3oiLs7Iw(GefXL=F4v>aB{1aiZ5>qFH;h8$28Dc8I_riBU zFmvB6Vk&D`Bl-2){$__%NZ#3l3dtj=kh~8Sl1C~kBt5IKYJ82#5nk>oSm$Of&EtoA1_;N1n~h{z<B=Il%SS zCcBl%ue>+^sZHMr)dEGnpOAl-mP?>)<#zG z-VwaJ6c&Ln-aBf^d#7+A8{S*H+Q@u9R(^1d@uPl%cLJ!eIcF|xzO(n*d$;|=*8NKd z_rJ6CBL_OJp6*0t@@qaXz9!X?Gq2UEkIcB2^nSQKy1nOo$209;XgkvFjuAS#^?mi7;K-rDvnZMSvoY`eYf*V^uE-{svh zkOB}q*6G~188`)-D|nVRSkQCeen-W)DW0Xae1(p(H202mz{}{xCa=opv*O!?*H8w( zneb2Ae@3xcOV|&Byj3%%8HUF;0=ykI)X+LFq#tn8dOMaf^|x1TC{3-b1tM0p7cn9!PjSC7(k;gW9Oxrl;PH0wM6m z>Nx>v*VKKJXs8!RQ9cm!6>WT=mw~r{CCUe4A8#M<1mt;5A7}kDk8aAd6_8 zv-Py0nsS%t5#7u_d41mb5Bs|=F6@8rJKl_x)jFdm@GKj@W~7w(n#w}pdx*SF;~42t z^u(zE4mX8XO&=)?FBA9=|4+OWH++zG_h3I5E2A8?(G$<%e>QsJHQ?Fk3HB@R_V0}= zd0tab%;Q8YJrUqdyPC=&dz4p8L-|6Ui^=!;s`!p&1IfMNm2)&y88HSg^ zpXEQi4)Idl@Il%&`Ew3`>IF`e9k&1+8~(fmJmN;#ag3eV@aK8pMewIxy=C5hY~0Ie z6HvjQPCvM^*6anoQYq28!^S=%K7qq|INye zymuRZOnQwapF=?SB8>z5?81+eg5a+`lBo8p!tgTqpZtfHAYKZKfV6A!V+nt<;m3Jg z$c7(Z0iF#%7SXN^KT=*q@S|OgW!}EVa*x+RQNfR>vFvjC{_?ibrOx&-nK{VIi|?we zrra|Aan@4qnF0U)z05kx9-)2*NMjUxpcY0x!kTWrJ`m)e(qc#dG|iZHwkaOFSzAMsM$ z@Il%&b;Wx6Y<+TbSj)YeF%=u1&5l3qYn!ilH&bCFR>xG}y%o)viZ}Z>$FK6dH;s2D zeNI@7cUJdBFy3jyoAbbnvg2%cQ~SlVUyS;x7t3n*i|xw}4aLb*E!3GW;l=iPu6=FW z{-x1fi|@^!n^^k6gI>?rO}}T1vq1LXS;OM&{W#aG{yp#A#%4=;og<$^Ky0Tp4$w3Z zo9$si@Yg&?Fm1LlJkw?)UWym+LE1HKwn;QZUWxMWp9YSNfB!P@7O-^rOBgS%LcT;H z8z)b7I_Hz+2CJCtUsYF*gJMSHB`;D%PPCw^uXme|lWu}IxJj0LUqW5v0hJ(#L zPXnLBiZ2shBe`CB(}pikfd+f=o}={Uv%s;@o38?I0ZWwLJdAexfF~d_#f)`4jT5!} zseReuY^$5nIhc=O(`u|kV;!^`sfSiS)-jxq73)}S|H_Sdxc=3H z>R+9F>O{$}5AK_D9(m;P&z>!JDwZ(LOtNdY==%tWpOeM`+Aiu}d2c4njtlFvg02`| zr})S9o4J+ZAGPZ#gYl2Oc;t-`|KM}j`B}=JlmSBHr1%mR8$YXg;~&F?Sn-cl=_}ZL z&DqJg$GxKx^QblMOpq7vz;`&rn8$(Uj(PAotawptE33wZI%>&_lVD)lno%*2Q|{>)hNHJY_>mSS6ivHsI<5Sv}jdJsI;iGxCXRnRX3-!sI<5Sv}jc`rnIQE zxCXSSbxc~v1n=96qj{yL?(Uk+=@IZqSc&yDi@U&8%2xzvV{T7A=0tb#ZHvq0~M}f&t#d{~@uy70o0s75^G#27Xz2QAP7y$2c zSC8ishG*6@5ib?Ep0sO@=TbyNHZ>Fv<61W3Mmz_+1uRkHM%;mR`vUhT&ufkwaTF(N zjvFzM$;9!^>gKh@OKr+);I)L0ous^0U3D+oZe(UQ76RNXlys;k8^G z-?~umoWr{=Eq;BIH~LWz^l{j@ojlj9b|mlJ%8pF<7)N{#0kP-OI6&J;?8u@Z_-nDN z%y9w3@Ju_BcquFb((WD{2+m(OhK6kH$VvRq#*U;7X=6vG(5{Ug`4I3z?8v;v4>W!N za&!4e*6R{K7|0B3{2=(|Dc3qG=8j$dO8inhFA_=iH@k8O?C$#DR&qb#;}xl$)et*t zMB@kRz-zO~9(zc6tr5JI&8}tq;A@LlHq{zuC}=VYY87)NO`Rxyfzpo zexSLWn#)NGn!fw0kJ&nq&BgJp>y2eyT6EeqZj89`+3C{*_@3G)TIns?_KDiYvKrAR z`f+?W0s626vrjZUmX$4!ddy+Fv-vC|3KR+~p6iKn zrCDt(-n*5Jb#^xKycUd*$aWgfNBWYuad7;694^Pg%(!tFUMBD#{-1a$ZulVWnsMVI zZi2ceY7EC?z_E!NKMOpYxbaT3Yr|_tfmb_joQ;?3GhjbQC+C_5ROI?NyE-;|y)-N5 z`*h=v&B}AUcRQXdC7$PkzNXNA8qdd1D?C@kb`ZSJUY+w(3?gA$@JyZ~UJ8qVv}^Jl z=WMazxk+5ehUds{HawR?yEZ&`40yG9ZXhEWb2j=-eH-;{$OEMH)%R@%VvTE1udQ`y zQEe^wHB@cBj6L`ZkU8Z3f+Fv5;e=y;Xl5TT1(F&}pM}Y*ljs+4k8KA%AUR zT8-$l>GRwf_ZPR}g1v7un2ps(S~stKT5Cq8w2rM6 zc`Y9+zq-ztowI9x@#`I0$A-Aw^l7bQtKzpJtg@7AnR!1Fn>YJLZDV$mxXfzzjoR3e z;W4|x;W#b_1NCRrpJ|*wlZ%-Tlkr`j$?kIpkBqmq zEnB2*PJe}c`l5HLBG>=YyIZtBlyNMiplKbOQx(gy^=WKlS&iruwaN1jk7eaz<-*jP zTkUkVd~P*(P3zbgFEH(_jbF#+Rfbx}>gvt)+||*kb!={aHF!?z*lO`y5eHK|;X_zo zP4m{V<;%UDP;Db1Ze6JpXXtCZ8{ev1K9q>-BBswQiKY%@lbx$>ZUOjl=tt?KHM2Q)IjVtsCXr ziBmV4k2jufy}r%v_D-#1EBiKy=Q*uotJZHR2pk*z7GB4eAJH*7bUby+Y3eQl*TD>p z680yt&{pQsINxR{*8IKo+FF>8ZBq075lGfLwyHR?ZJ$jM%tBu>YCNGT>;@; z`#QFvSo0It&ugD9DzAapw2rM6c`erb%Z03rED#;D`-;c-75NCou9oi~olSZTo5Tz# zzhyg(ZGO)6jvw5Eo3PPojTqz8MyDOY{nZ|Ca46Q?()H@J_VFuQ9*E#I#$=myd{5rH zMQnUF>Gf+#j*B<3{TORJUF{RqK2hp9>Xp?W+jDqr=a$yE0mmDJFQa+>8PGFrHi3;F zHyDmNw{)GpOpp39Nv~ZK|Ajmt+i7f*FVvUeTUnM7W_&K(ml!~CAlBewuWI6Jdv#NIEHmz>5}$?24yw%*ZTB>4#&)csk?qn`$6f?X#E<= z{{#2W*vkG!^o7<}zcw5z2d3_M58vIPeW5PD>AZ)n$!~>tc|LXKd3KCDyR?SQ&GUqg z(;Bu~JXgfQ6i@gdaSU_3!RD=DD-6b&lSlh&w7;ft{WXProUt$Kx3{*af8*I(QxtDW zuB%CMU;TReH#Rx`;Wcc9Vd;gjsb8))FUHY68`xP|!$w(S_K!Bh_#8I8b`-(E+Bs;2 zH62SgYP><}@Mg_F*KYNtVF(T z^qTrK>eG<-8k2)IG7xKAjymUsdP8&2n1fc*+O=vMYvbpjjpWvHT<165)!H?e*R*!6 z%AaWgUK@%tu5-P$YlkE1X{f(9xIa_U+O=w(W*awX-rBX1Ladm0o%W+-doq{sCZNq} ze|me*HYb={*aEd{C9Pen=Cuv4(*`rK=F8T&fyNCQ7B|4u?HV@-X4x_x+VHv8N?Nmie?0-oIu`n*Qd3&Qb`S*5%sD6mDHTAJcFo*Q+x(tMTq{wvYl9h` zOImB!TnZN+;5ukkm#{yHrQu_E4rb!zztlND!5i;tZl~KfqqS?G?ho$M*vkII)vgU@ zW97iqn@jzM)~tt$7xwoi0D^E++ovO{yJ z2eY|2bMI(BjrP;fw{J*(=U{dyR?eCFHHgzlq{Wk8A7I`!$bOx7jc?D4Y1#JCucu#Q zliMF!vo@G5#F>|--kP;8?W>`kHAPy}I-2G2`uIMY!OpVbwQxIYAl~@7b?P=}ch~ss z5q?cesP0&YvRJua-4e(Eezh6I6T_S+9@plF#T^=Squ0gR)*HT8uSj znflS{M>o!o&JSvhpvpy&hq7KLxtNcWr&I4(442;hv~#ZirHkiME7yo~%%x@>Gn@Br zF$d7})alcSu3OS^ud3@PQgH10$gn=p&m(*Yi;VHb{qQ=9{BW$X=?5jU5IvsbE8fj) z%JBxAey7{H#hG6`(A|FJ(9dtq%pAJZ*53Jti|>DTXG9&-PW-!Bd5`yQ#d`^#7lO|r zKs$tx#==i5basRX10b|$jyV^GXV&KuFBQ0+w7Un#ZoyLY&mBcWtXJQHg*aSTbM;9q zxVIUsTsVban=$9U0=xw*yapFukJo3L@~qf&_MqK9ZulV2Yx3SCPSl*|ZZJO*r*5RM zD!ljPb*Bj4+jRJ%x8+>y!TpDgU;nE(*Q~t9d$;1f*<|ZI<-JDm-cUA9TylB#*J!=> zJx>r+=sjn5=EC{KS)_^CG*?>gW9Oxt+(H!g2?4sJcfRkQLapT~+vOUdR@>LdZ`3ql$TNkMeRB({U# zkxBKKtdl_`Yztl{uuYUnES_z}z2&i&P5t;3E_0B5WIbZLu)!;9^(?VbOCKO0ggl4 zta6|CZYB3IbWxJWQc3dI4n+{Jjofdbe5o{Vx7ZJWK|F?5A(HothO zO?eH2gv~0iWgwSC=2OnvjuFeFk(I%l5dh*GVTbqsaQ`t-97$I3q`lr!z4ZLF7S+E_RH`!C)^FKcytE9ld7 z<9#%%?B~5($$rc;0n|kMHNkH}pPG=y!cQyltRl99;C=S$cvdlpgl)kyZ7t%Zun0)I zW<2XKE@0!=OyWW|@vH^laiPxR!ghImv%e>Wc5TM2I|jVke$8;KJe$IRWaUKj+{|ibJntXQz4e|b>;>ac7*zg_W%?ntf_^uD_+VI`OzzgBKm^nqO!grgM z@7($Hrl-!LgB75Bx2*g4K3ah9h9xqGGNi~lq{5Ir-+dRn4ye#~ULWf&w~w{sYI^g| zarUQ@3*G+KY%Lv_axdfk?83_LTRrUdt&VOz(9C_Sd>%W!h|X0&lKHcbH|T@tr!@9S z2BH^_34*`&NTgaXhT)ldk$AblHKkosFV3MM8@>1(u4SVaUjv?vUZg&@(TnGS7orzO z;^h8m|El({k_SlZrf+l^$F^Y+5Z?O`4hVnp+*K^K`&SED3`bjrsG8M!^S9Wq%>oxPSHX+vgX1H-AX`ec%g~l;0p(`-|P@(D%a%yO!_!nbjJ*YS~|e zK1g8^2=lXTW&b2DWaDSk$F}jaQ?Q}>H_O9iee?V5aN+t)gcYuWJK^T4yw zb^Uli8@>zgYaJPg6H~6g&u4!RYw9u=Dy!<==%}o!GkG!i4f^qJ4th0p`!_;O9iPXF zKNDV4$LA0bK1t&Mc~JQCVL|ZMJV!A3GYrqRH;s1!2;)V~>t||YU*e{ATCu1QiQS0a&)US9i zvLYv^*tK%458rRI`a!&RD?2OUb#+4HBzf6RW1F8-_^iN_0q{O`HJ^pynS4gPRN#8j zuE}TjpdreEC_C#IaBS?XXMwkXrORK~F0XIqGwejWeK;;4&uhjX=%?K;NLUNrzQK`L z^Gz1Ak|`I>XD@h-RPb5*_?3hT*R-zg1NW^KL02}sMjy$B*Pa8O z4X@pSc5Qf#zE4eF%Vl&vP4#I&ZOihPB63}Pnp`GkUX5hEMa%t{_)uofbGO#jmHip5 zt8)n?gI|wS++C-LRm$6Rf5U7oTc2hUSFw@*l>IjHKZTpM$zu-f>%o*{;-xUDAv&L- zKAxLE|Efe0dhm>4eLOtZto9b~-OAoNoBWzOK8t|Rei{eJBjVo_1;JnQ9Knnu6y2lC zKZ4hSJQp*Es6L+S=s_iGr&m#@JeT}>I_0_Qn8GUPxsf>Y*VNy)+V1zQc3$lq-#MP{ zj9*XZ_p2Ukp?bPmef$wb>z_E` z>>d5g{d=e8=FXfves=D}EUsn^9|b1$6zf?C?B5Lf+hID9F|{Cwt}}IF7@nyUiMN`4 ztIy$jHg@Q1z_YPK>#nEEWixT|{4~c~bG*rWy;#in^JN^{hDAVl&x}7`1;Raogtg%9 z%Vo=>huHZ<_2s|OCvvoJb!s^lF`f82AJUybm<|{d1b;2`W$J)1JW~e{FBQ0^w7Un# z$OA?HoNfMF3HUZT;LE_X(E)vUK$|+B(EPVtHr_bF17gud$NygRUcS-q)7$wW?f0S0 zm3V$*AC`d7eHsV&StSk;l;yD;~ymZ1|0~nGL_O z@5hGULTf8>*&*pUwb65GbE(Zm9_Yo=0Gq22EBCn^wT_nkmpwsHA^VHl@7rEndgH^+ zU0oOFKYZ*uGn*5 z4>)t+f8O79@yq)Q7k7=n{-aD+Z;g5G?g-pBpLPHCp7R~gw127X({FOiD-6HuWOo!!6Lh5Ec6TBe(?u>Y2` z-gy@4n_IrN<-pR>4(AiIH=MTX*Lufq54Bx`dU6PjjMH{K)D7cxbn6lR@&iqsm^yya zY1_q{7{2>{XLI+K`)_IgaObUUztVPF$IiCf+kUO>&h}m2Z2~C(!DF4yjhlf}ptayx z(jGf=mZ1Yjwk_{s%fuHd@{l^v6GPe|7N5n6R})^VSMVOq{gtOpV~@`$yh>gOg1jY@ zSHtj3UL_un2}rvng&?oaqanWUC_PCYwBgmafVY4p%6?^x(1uqRfEU86vBoXd*oMY7 z$OEMH)sJlq#G5C4^?WHm%AvlL^VrF!PDq}2-<?5<%=Tu61Jzr23imXn9 zRw4e%I^r0%gTQkHQ%8j1Q6I>E_&?(Dn1Hlv>WC)xrQ*#YzAAhP8*WTv9HeI}+if=4 zb+*cv)%vpj7{_3|`Niw3|MOxTEnojvn$r5e7Oejp)Oo_iE{v6Ay1F@~Vqc+%?!Mn>$M)3X)*z-{|Ab`cr7Xo5PzKG3Rw@JJd5NCFb$4vR~e z`YjC4u>j`hgvj~Lo-eE!T*W^or$$MdVChrk1#S8c#?V5V=s3q@B<2p8a@p<6c=*51t zYr}h!z^l!Bxr}H!o7~yLuvFPc+p6C~n}7%Wl{5~J6huEhEC~MEBa><# z4Z|~elz6$oHKkpXM`;_{=tuIM4Ub*|o(+#uHrVj!v%m}C(SbNQjM@jReZb@a()#N6 z0q1g}0j%`J>iJQAltcX}3qLCHbx?hvO#zYDX&itEEbECd|H!oE!tgTw^`xC<@S|+% zpytE%M7*(-SBE#R-^^)@gY;}?!zF*NP36sMy?GcsS0`_lvuJJfrrL07!%;6b$c7t< zlmD%>sI=HPTFhtT%+aN^sI=HXS{#g1yREdSwAese%xlc=?&Bxt_C6YK&^*m&TK$+` zKGry|Di>8QHc&3cnnzh_QE9Ppv^W%Neqp6WrNsu)VyroLl@^s28%T>fzpU0`xZSSo z&n0jz^&s3YVVT6z_*#siSbd@@7ga7cP%dg8pvpx^Jx?CWdY$B=_5ms_CWID;voiC5 z=0?PsAVy=|s~_tg9@PG5?ROE~EbH~r(Zl7+aFvTH7uT562bMn5;oQ~!w-eXTIWvbQmM--c z7u&Bo{Xf4pbEs{w{mPT>ai{;6->)?X2y1Hv2C&hrwe7t3=$ebuCr_VF_B@=mYFE>E zHpa}QW|np1L6Eq*Sql}0XVyXyFBP~T`Ga8A%&zB{n7h4Oa)0G{ZRZyV@a17Uz7&lT zUDsY~yqDC^ZXVbT&iwqM@FwN}nQ?hD<5ckG;eWu;RflYNljDLnD{tD3X@2@7XO8E% z4oRIOw-BH~;gK|sksgINPX%zeDYR(pX#~7GfoPeI|^>zd-{gc@psoeY;W(U-+%juCO-#dJHPAx?Y-wa zpXvAlX5RX(?l=G39a3iN5r1oJ>v;JXaGO;x^Eqv7W{xzIWZvg<2nY|RaR4f(te0O9 z1b@wQ1XC}+;2vH65j;~b6Yt0}nmc|dclTgnKSU7=f%ai9)?2Xf-ndYwei938h8e6} z_z8Y(^fKp1wb9Ej1J6b;zYV+yz5I|3?`vE|<0_oO;6MB$@lxFILE7De{h*%M2>#nz@aETUJJ54r>1%`JOV3L~#51G*+sflW zojy6Myje95LJRTcm)#$(I@WXF(q{N_n>=5xb2GfM>s!U2n>oa>Kqr(O+*}wgc^IM+T{DnzPq2&Uc+ z!!z|Z@i<1DfV6As?dxcWHgA-F*8@Bo|Lz{(E#P`lao4wiXXD?o&?3sevylzz->H8` z9w4o+wtu%TSIEX0-=Z*JKL_!P;1fVaoYCq3?nNinmMZSA9$UJ{MfZNV-K?^o_iiKm zIR#3RV|&5xAu>3PXX9rT*By0W*@h*L(B9dAqIo z4V~P|Z_B*LH(A7z!XmH%`7IY`j78ON9wn>_zoFw=`K{&nZ75FNPGP{lzu+ZL*@oDY zQ}493t!z`$UT9XElJ{<9Q=-E-$vnsB5D;CH#sPj>u_?y{!C!lyz1pS>!^`;Blgkh< zB|BJ4yQWRav88!`QSpQlaBOVKF9UA@OO#F7hj#mbCm_#j+LXs|BE+VQHE);36EvPc z9w4o+emr3$v$pYs3y3E;?Z`G-F;B1?&)TfApZ9Jh`_T!UWZAFrglc}PKb|l$u(t68 zm)|;--%g)Ai;i98w^s9SMh4@>6YBGCI_^X+Z5tNnrHi*C^NBJvEEk^oyjgV|@7+qr zm6FYKd=3HeGtxLfn_m4J@6GUC5bXV%k$jw(g8Db=-!#gQmBtf4KR5gN#s6vlFaA2pKKp0jzh>1Hy!U8bF`f8& z<9jFseF)PPGlJl+MRuCGHDP!e{7?SFOAs%`4IiXkGZr?7KlK79Di*c?9Gh6!CEyV^ zDi(GW?b_tloCjX5SXh8RwcZ%-o6zapxany6h;FH^VJ*vwjQT+RD0;N2bZ-rnl-M%d$-XM zNv}2La|np6PU8SSzr^6D1;Jl?q*0w?6ozN|Zp2Fkt|{&A!LeZ8`YAMI zSAn;HrORK~F0XIqbuhQdCa&@{@b1U|1+eQvfG;1k<4gN~FX~M|1z&2dF==(P`z`r; zY~w1kQ#uZS$(yI}{!&;3!gzB7#8uX?*4WWnV<9Mi?TImOXD#D8^JvmWZ=>rx(fKNT z4gulOG!F2+ir&5;2>x2$x!E5QhG)tK;54y{&!c+IJpiLtX~2Yzy$8@Sd5+ zaTPehzD>c~mm7&ScR?X%Uu*oT*GPp8>Ga=nt)sggV~gI*pg+9*4;OFV^*;K`nN1bd zKYk~kp;`Sn-n)%HNP7Ko3eO=BrVkzx1b;2GX6l15JX0SKFBQ0^v}^itti|XBUR3}1 z9B^#>xEF!9fF;V0%c0#q;0eg{nmjm-6Se#}@ZiYW=I3j@|J-9|rXHP}K6zH_kE{B; ziy-8b5Hr?c{MNMf{`pKcE5-g;YrVhsvFph(Vf@ufziIt(EArdGTIT03k7uLx$F7dk z`r|5|8-u(`d1BA~4byQ=TYsF-FSRq3tRwki9sA7hRx@64pn&6X%*Ww!nM0vb_>si_GT`5P6)&0e)hMH6IZKf9-w# z>OSHyJTtaHyj0+t((WD{3-%EoMME~Rg;V&SO>E&Sz_W=h>_NMIf%}u^HDe2tI8igU zkk1s>HnyO($mQ6=Y_jVjdjfPNbf3mC(wOjDF@VEOp+7U07lvo@8}U+D1f*S)-_WJ!j_RUBUrSU_&^tcw}2(8f0ef2Zr};Xy_-Dw6i(FgfdV{fS$}Mw z<4`MqJ(wq3&Rx%RTz%y|XX5AI4$hR-izEN|ov6HrjXw|hY~pK=b3%Mr3xA}sO%P>5XFNv4pg?x~9O}=dU{PhR5_IUXlCv9AS*^^p(TwQ;73Lh*b9}Vj; z-kgCDu+f>%;TkqNbIr#Ec<^4!+GG1MbqZc5L`58fa~*e%f8(~F?r_piaGvANiKRb( zdUUDNm>+AVYk7XGo^fx6tV?HQcC4TJvtw~4bc{K%+^Mq0wgR_V?PflwjoqB|8f5152?#HyaRBUB*3T~qg1_cDf~lXw z@J#(oyd&-vydP=T)X(3ulmS1(Wo%?XAFgL(H(vmrjoths;6>QYT7#@L$S#qCRMw>r zIq1XL)J)V{gB*;jlzq5f_2EvG{G5uuIp>i_g0Xk_a8t>yWl|rmI^KEMQb$DAAj5~V z<4gPgt}7HaT7wMxMJx;VePBOs4KjSVg!5+5_Liqj<8es>5?`Uu6$Fnws_nNhJkx$7 zUMg@wY1g#hHi8dl!<(x!-|^RP`u9JK zC{cYPJ;1Z^?bdw0;|H|{*-_ulC35o2`s4>^2jk?b7Y6P7%ozg#RKyyc{;q2s+m~yQ zZ}$IVxdOQd$YK5Cci>#J#`$>fHo73`^~Zb;0g=gR9N=dbU2s$o{Iy2{)w&=I&(sCP zO9iee?V7saAvDwryeM5T0~{M&@B;7_uypwg+vWAmoRtjP?Za^ad0w-Byo3|A;(Yt^ z*?g@0{M8r(pr_1#ov*w%|Ec%UFRo(%uqJsn@ioaQAvCOo7t+`!-3bpq6u{x8(4=XP zh2doa|Kb0Mm*R#G(yqya$IuXYB#H;;fMdghF9Oeo2XkoGh6kBL6T*YTYn!L9V*q%0 z`rtRMNv_HnE`sh;SOmiOt%>vWN3wBh(sWK_AqB{Ip$6|zFdj+SYh`C@O>z~_jp5y; zyjSY}%3C&d9Aox2Imo=^nVI*Vh-y6sQ=R_|EHW!J7!m>JW{Zi z|A%YVcUGDTEy?tWo8+RO8dg#=BOPf*Uv8AK!6SFs*&dzJE z|L8iZJkDV}=)Y`Zg~!3AqbDYoF5P;|6{+dyxk8*LT^#4`u8Z?~{_fkUaUOFmyTK=~ z&$s{Y`@1gwFZ-8p{2zW;of~uy4OSn#+@M>}Z+fQl3mso<|5Dq(?0)l`ZfVDXtrN?e zsQ2)Wj-ueBS#3hQoS;(T>!j!9<6#}*-;)YIcBMiO z-cB&rBPbK*ac=+iNSSbWBgh0kYqXzON_>qrpF==+GmQh}1Buau@w&={NSReF3p)T0eL0Bp`CEyMo=cS<-H?6 z`A%y5y$BoO_d!FgA`keiHu50pb>UCrIRwJw!7GB`uSI8?@*oT^ga65YcnRVi<%SQ^ zu4yCu9sbk{oG2TC7q_tym;<(e>qXfJmw;zuBm4|_5jKKdUHGtlu4b`@JZK-^I)3+$ zuXp|5JAQY+)A!qu1q1ExZP~xnx%I%(rk+2$(YE918%~E?OAx3G|Lvuo4oHIE`}jC3 z!+#GLKfRV2AMrhe*KXYWRM*8n!|x{7W^huF5TlR~F6MjR|8ayY_+7l`v7l}68L{%k*C><5@Dg*-!k@&DhH& zJz=H?dltU#d*5IBVGp<_EVfPBsvXNZxb>*GvZGte{awxMzw%ja?1QAw!>#h5q4GfI z;a2|@l4AY*SLCCQ#Ho#_cYHIa|1>nkhp#!iySJn7q+E@=wf(?S@1yPQ&Rty>7vGyd z_wKiQ$E7mY)G6E-$YG;dW1PHq8y%7K+IT*PK$s6XEeQTvENe5y8HQ)ZIEj}ETvOWJ zgJZ$@v(|Hr>b}7J$@7{%WZ3v-`|^X?Sal*p_BP{N-py3x$p-kcr-Cm#!IuZxJAJ`Ja*+I?k|6kNk5sDr2*dD9{Yku9^1;-f)K9&@jmj5z9ym6Agx><*0+ud+ z;q&tPW}PK#dHZl&K%UpspU>e$tv*8N&wRW(6Z>)GU-oXMLVvcocJ0d-+fq)dxIcRS z?_2R;&B}MYcPqY2c&$C3Lx6NhNMqsW6}~&ng8}e9eKp^O;hB6#yj0+N(yqyON6?TB z-%aCMHhf3^wBfscv}?n64+AfR?}oM3MCbn|iGxI3;Cem!=Ai=$35;#14^>W@pbwSo z8sJ(sQX2G3nid^F85{(mdyQ>`>4;n=R&1lrxhlQb#)lYltQp&AL(I|n#LwJ_BfTib z7lVCR+!vreZ&tgF_ikmk%_f^C`5XdbKbbsP5(Ix8#*<-qY(xITOAs%`4IiXk({7u_ zpL&547!I zAiQVlk*h!m@|56}P5X!J>id-zl@`~47Om>al@^s2*MJtS>Y0@ml@`~47OiS&l@^s2 z*MJtamQ!1$>voHgy^*7ga8boc{CWID;)OS%@Ob9I&)OS%@Oa?6uWz=_3T1)~hmUAN>9Dm?}y-)7T=CcEt z;o%I6z4IAbk^}AlMA=McD2FNAvYC+q&+VSo#Quu@lQ7=zuJ9o%H2Bp)rsq081=S!ruTKu*4Fzv=VR-A-MQ#EfAA^C znZIb(2L#ZB%h=Bv`~Sk&zYqIth3}+RZBbvzdE}9)6H~`eKJwV3Ps}`iqGI<{VE2i$r6a+6t3|(ySp9d4z4jrMT%>DG=8Uc6yI>(U5o^`Vz}bWiBo&4 zx?6d$bmI8g#~*p@%+wPnoV}x;xqt7}+}xRy$Is54n8g*X;lBeW-wp4X!0!^QcVN7V z@KG$m@y5Dv-zgkp%@6-iJZ^u?-xn&F!F~{kOSlUQ@uTo~Kk^@JI=o&#H++!$%V0lv zfBm>WzJInsijw;q#Wvb3-&UOQT;9fi*#;M0kJsn6JOehJmvFQHnj1dIy_D~Q zf`ql;1>}!aE`Ous&mULFAC9iy`#R@-bLG!Jom2Vae>>7Zg5=M%${&xHgeS|4?td@g zGnGG)^2e%vBb&|n14>2PKbNWN0`<|fe+a#Q>RCYB{@3sP*xBvbLOlUn=s#A-B97`$ zi-^C@#sA}7XWnrxVHktIkCaJA&{mRdq9X3k1EErHufx?~a*q0@+9skN7obeym~jH! z|D^0-&Hdjr_J0feY?bdQ%0?PkwwFqE+Dn|`&ef%~m$qY@_7d$P+Dm<0!(O7k??$m^ zlI^Af?vd|KfOZGLw412+`8+(&_bqmbX*Zq6xgZEdm~tx&&$OF}$94tSE+K=3HcSx< zVG{R8`r!SoWH-Hx^R~6&*MZA6xUgMbpW7m%vFW^p2mCkO@IjvUL)Z`E&EWnX5G1Sx zFJL!W)%w70@&|T^mRk#G6JYpl6W9OX0Z(qF{!flm3Ar@d`+Aozw+dfPjZa+vzeXv| zJRi=R1<&)}R`%VBXe`NcYS}-Kx6jwZ??j4OhFWrJ*YatX4zk96nD15uUX)ylBa2Q| z`)-_K&!v0HBG+ewEF#ZP7VY60vM9+ih&*4!A|O0&%Ag+5a|%dNGH6aNS8zQW8T1zL-o_FogE-!$jqi33?k_?HX^ofW?1JJv`Ukm` zp@gkTER45s3Dbv{ac)({r+9GOs>W;e;s{Tb&|$q@~?btQx}HenYxg8 zHo9;F#4)Yv`Wh2QcW;lkfmO2$g!f zHuib5#t|s5s7p1D;MpAFGoSYK&aB&vyoG~hIfwG9cHD%F< zxken}POcG0;C*Wx0WSey%Ah&#aQRoL!jwV8vynj?A&y`pgS4(l>xyXmP!5`L^~*R` zPaI)ierO<0El0g^gaY!RHn~|)(_ifzchddkjHoY;dfSYq7tsHAGgEjyHC}M@q0W8E z)Pw9p5@6rV==R<}>^$G`jOIgm{Zy2#d@rjRM>ty}kia<|B_FC;bs^uA0Qrny#?)=| zp-y>!FaL^;Gj(AYo~a9ox2JqH&j;de1`B0D5es2G;|P=P9e6+TydT1@_$WLRmJbE_ zlZ#Wo(>VF_KZeVnn<{_2uWM(E9|7{3$sc4ysr*^ywJ^D&@~3v69^_9xPR-V8#4!th z>RCX``B0`U^e3UR$jgU%+s%jS0iOlucL~}=hjA|HHc=7x=z(YrZ_g$^P;VUb7@A_M zd{0p}(g)3ls%bAFBZ@XgFpl|a+(+!-<6PsTeu8Tl^|xZ3)I4(9Oni3&UH*n?H`(Sx z&C7-SwNQj9x5DsDyNP&v{A+O~cAaTAt!ErFD68dpO}i;99}047I8J?EHZyEp$MTfd zp&gMA1rIHYY^StW$KvHfU95;`I_cimO&LX+79b5JHGV1g$aO7wL| z2#;L`;swQ(WYS^05RDgjR6!f+H-$j3=Ke7(q!qrWTK0NSMy+nVV9M2{8ZYqPzu2|& z_zpo3J~nOm`5+Ru1<$nMiMJt%yPV^Y{q)LgRgi2kcv2Y;ZL1i+wSWe-{$5uJ@r***Vg+u z-#fFKj$yB>yeD~1=bVB&@)I(hE^&;5>&W|^Y56a8GbT9&o z$fmbflubv`-bRii?BWacf%KP^9jv+kFO2>Buuq=gdx?k})GM3Zv7s2_VXVN-DS&M1 z=RRZ;c`E6$iE&N7Cjs&{!IVwxr%K^C&-2}e$);yxIfYY z?{6j9bOGmWWYgaP?`7a#88RXKK`-=D@TGTsGD>rJj#`EQSSxuX% zDm$w5n426W{@gCKM}IEEHEbs8|D@YYyhpw#0opn}lC5%w{@|b3u@= zZOWxEJkw?(o{h~^#QpUGH_B#u1voY~)7!w~5@j=8!UNjaOh<8l5jK;K38iB~f#N*= z0=bl-gsn*|jn0h<*za~@LNy?^umFv?99y7%G-C@KBdYMa7h$0NP7D6YB8Kd~6czWR zoKyQ9F9ASVxrX+;J6@F9?`prh#D^cT3(UMJo7jTQma?D<5Tt|DDF8sh5J$2q_W8;&w6Cjn4N4|&Dg^8u#vWv`(J8VOcGIGt`ua`s2^Jx zg=O2sK}$V&lvZT zTxqiHWh~pc;X|9hHtqMTIKG^_vux+@%MTag)Bt9)8O)wXh@OApc`sN}5r4np=22}P z-{EFX&2y}%UC!>z_((aEYRi4H$DD;L?ub!WFk;k|*PXYSt1z>oy-uBjSiuWiQM!|=?QJMnB{?m65aWkpoX{YBu|#N59NytlDL#oRC80VjbcAkS;c zBIZ#%AV^pX-oAVx6RQTa&b~n2!WBP5`>f z3hN7mTpEa18(Lo+f#0@%x%9T=Ppz0crE-aH+XL!Mz7I-2t{X0wkUiCdc2q9mB>>KQ ztMadCA=6$8!!zwA;_WG4&C8A8ZUzf&nIaa#dgdrhx_99H$n%=^(h72EFjnp7D%8Mi zH*%*~BbU@u-{cKQ3wGNCzp^drE*E-l1H7(_LqGuVI&(b##vuKFvrtajwNtB zjpYc!H1@U_5d;}e3Q+`!C9D|N9K(yyID$tF!8iinOXK4RQ{_0qPPEsIV`=a`33U1! zW*kBLfosPR>hA|08Hf|t)ch#Tk0Os!&aHla)JQH)OskOd)1xf%qh9lZB<1|5ZruHW zMdz;0YtV7;{Fj+ai!+D*d*{Q~|7pjq7u!D;&(Jlj!@?082z zDxy2Izd9=N(UvU{!53*N`X6n(ov!9(kefsptc=H;} zop@@_*;|^L6E-<>;?&;KiQ{J<=S815;p`p#%>8?(=H||vJbrfW#H@E`cE8jKym!X4 z2<(I6a|p=Org4CHlDl_I5d1aI5q=#D`}d>pGQg4lVACDPHpLAeq+OCiu&?W3{E2+B z1q*Swu)R-WL7OvJxxic_o7|w6fVY5!*WkkI@%kno7SQf)92by#H|^6?IB~xqVJ&$3 z@*_iW;(4pdhx0Y~kjGk`52uw6-M(a@QIakBI>ikiHXt7s;>52CIe(Zl3w_A`CqRWh zEG|0z9oL-Q9q+t7Gjr&G^AS%Q?v^7f@n8xUYgS#zd$-YrvkB)xK8JwtLK+A7sYS;< zBnbZ6BZF#P7>1YeuP2uwUP^YbmUc~Dcnl3uS4HWxUJeM^^UH@i~YE0v+^SE-G&!S3Fk#V zhk)=z8VC5vg%=+d1b^+3Lp3jk;hDThyj0+t(yqyilW53>7oWzpYg1XR)Rs81}$Bk7~YD4eX z%Dl*VKbqAp<-ObRqQ)w!d2!>%DzX`kRcNdNA|e5?itIqVSVevPNF8@pW>r*XRIIEI zHok3!q>6;cu2UphA0&pH#y(?h61xuTA2M?)!tl&E#m2YIvblJ1iq+ylFQa0a2cu&Y zt-ymxk5Qz2{^Lq{(0dv6_vL1XV#O#1{pn9E`f@LL9TF9Nxs}-z;J|Vw#mYL6<9Ri! zPsDqV_K9XsCp|uKhevYmZy5g_4d8IoBZ2Dv+b}#+2NEyE3;7`Jn*FyAp`l*jMCDS< z0LP~P_66WAU|~)n7q-jm--1Q-JvN;T+O_GwEdj4~|82GqFFvtaI?&6bSk{5uUzrD6 zK?f#1E|DV9`5?TI#y-faOqXHyrP`sPJUF6p35`pTt;k0NuGc4rVjvqUE-_?Z?{UR@ zIKv)0eZ%RzU-o7Psdi(i)#AFo)iT)PaJ#|P0*rmZ#uI;1TXWve|092;BhHQ?FU zYDdtnjjc8hyxO+fz+kL+#VYgWyz-`nA5}V?^f-p{X0;!+3cQ(*700NvPSWY8-b7`{ zu5aDeJ654FcgeApau53;vzj%Y!F!L6XOt2j&){J zT^k$rJn%wn*n-A7G}Zx9E7Lvce|=&dgPAz74jpGj29Q|Y@ghhI0zwCA93WkE_$P9L z;IDa(V8)cg@F>f1tr_=E_#vK+Tr2@^63b?Pp&p>zHTz*MbuZ<6T6LTu~~V% zgk=)T8rX{?aeSA0#{=tF9+$8862}8;|M1WLV4|G8;~wk5bGPoeeA81&&mr%__Yt6s zB&4yBhQ-g)cr)LMis(e@-KPf;6?e-R$k=2+wfx2`&rj3 zA1URLxBDwHU=Q{f+b_CD;mbi0G2S1QEBG{UZ2A*k2A)knYyIQ$<%Tp?p|J{*vDi{v zuTQKZSBMv@Sfv`Hj2o%wEJrEa{pwtD>IZ=qs4+@>oFXM318b4XX>5~zB~GEXnfH?H zZL@qPUYugJc+ibf1bC49%7aOdQKUTba(|Tvy_b=L0J4cug!@PNfmkt$)v9&RAVNV7 z^r92kTbch_pw>O{@rht=a2Wp`4e%&8sUHbuPE;6P2DtJc{*QPmZulVWnm*A(_){-% zqI{wm;Mn*?F92@=OH}S@2JPDLUwEy1J{K=Ov06INt#uFRK&^HE?Ck7R(&G{-(4>Iy zLK+7^hH8iUFNW`e5W^15Yg|I(5~LZS9j@0WE|DLO6_*&Y*9UKT4_C9+owY(=+p&LX zv|Z}m4>(?>`@1XF2=(DTZIl`zK1+1$x|H}>1)oD8Oh+^#ry?VbVlC~Ob{caQZ0xjW zaSaMkD+VT8O&VUF_i3<1SBP+);IG#$g z_U~Gb1(Wz#hW77P^J4w|yF-JqVj05&DGw&Q&mBB6-qt4CmUei5*%qfd{+@TLrtP}b zt#cRabz* zAP5DS@y0MbwjuxFb%bm__Ruk zN{bDo#eq0JozkMxVgqS$P<+f*uHPfiHET?n z_Z}UuI(wP}jNb~}b_`^&lWRJyduKoQ#N5n>uK4VJMq+ec5UKS$8a5+coq9+ZQ@ls(QcpI9M*F0W^NA0I<6hB8XlI}l^83|=CcEt;o%Gi zRLy5-nGCoI5ZO#-h{G2vp9uwcFTDe!e(<~Vz4MF}pP?gF`D~e1`6gR{&*J4bs6HcE zl;H#M84A*s&svSo3R#(*#!jD!_KWT#eZf<%m3^csCmmH=!EvFQ)pq2)Tj?}(b|#tE z*zYGG8a#~y{G?(#2FGY6uJ^gCZO1S?({?0YiWl-h+BI#*A{w%>9UsPZY;4EpfM;Vn z-hp=e7ab3vrQw>JCn!|+J6 zxYmqZhIlr#SOVT87RnJWh~`d@)7~Clly`lE%!BEP%9tw?6k%Uyj&KMn;`2J z@M8+`=2}rdhGbEO58%g4b8@jH+g4)N@F8W})IVYIHdFtE;bm~`7UQ!KsXS7BM%$yK zVy=ZsYT$XHJdf2r5T9whz|GBUEj}B`#Od=aWHnx}60cdt3#LzNyr7ELHh#QdWI$%# zv(af9FVJ{F9ocRS}|TQ zqWJ}D9xo_qyr5dAZTxsaHmmssI(`AQy5z8N9h5#L>`!88cs;^!b}&wUfyS;hcGbAp zRW=`|4_;|eX|aK{IIQCUs*Z*VPJ)geiPM*>a#7`C6HKRbJNnv+>6uPxi)w8uAoe0X3uUZ1DxwbiKg)-D=I1s1ba~1rV zqQ(x+&T8zS74uyNbK;?_Nlik}%JvoGkIE4KG;EAD z9g8hwoZI2Sp*Vfkb=M>)pUoycW+1#pUXyL*GrRGmL+2tH9xTM^kFVEuL~uaIZl8ti zs4;`8x`d4%3(x5sm?e!FP=Bp|%pf-qFW*40qw@`FjotpO#g_MDN=c6wh)t#T72kjd zbozo>e|8X}q91F1PW=FvtzX%QL8t&$`A{pJ}|HCHZW4EprUI#x-7m z+_{p*3#xgo1>yxGnq#2x0(v6rA1}yfIwn$IvIKH!GyvYE_K4n(W8 zsI=HPS{y3Rh)Z&eqQ!c1$u70EdTjXg$`hFZq}L~-g|V-&*_t;g!5al#y!k_EaF*%Aoi45 z^HU5WVO#Jrfo-A`v81pFNV|J*;1(=J|HK$Bz_|MsEX3i$TJ}$3fgLx4l?#*jz1!P# zf2CcngX8xuV4n-G!G+i3_1R|7E==K%HhS$L;N6e^3P`*AhKFL+B52G&V+LWgcp1dC zO$ZEYp)u2!xr%elBM=b0eTY>_hM2|-$mbmu?{oQ$dT(x}F>CmZY-IlQl*SA)cvnJ$ ze6t(hml-ZwO>4qu8Z$UKt9;giz6=UI$zVQ2#=!HU{i1!D%bvih@MZ3Qzw`BpU(Wxx ziKTa*o>+Qoc4FzxnFC9|-S#{0cm7!||7ItJoey_ny?=Y>m)efJxt)ia)z{&3*yz1d z!uc`9kKhA!IU$XOpIz+#hj=gm9!WTk>Fb2ynR<_S^lJp9UDMYop&|MrQNGSRaBO^? zSAe&GCCb++qFozbXAXF^eVt*QA3|$EL21kO9(g9{cbBj~iKX%L<_yQm8>x2;fQjn} zLPW&4HvZVtr%#?mC#jAbxJ>^b^%fWpcQ{sFjPe?74AK6i5bkewbw1@K<%Ermbrv0^ z%4@C0Ys)>KbbBIwo^qB@w9iv(i~|QVDzIN5Y%E+-akKg|ymu=;Lq}z?J{-f6WlX>*J03Aop&@%ER-13WM>+IFRa%Xg+(vyP1mE zg5!=ly>cIEOW2R-Buz4}(T5fYMezI96XDX<;bdSOE4h<(l?YyV_TnMJLfRU*tSUtL(L@0Ao%MrUnUIC^ks;b!XhB;nth<_neW*rH;1)6uc_C<^F2ofBobf~pHp8( zeHrpVV|g|^)F0x9r)ni!GiLVpY7*=)Mfb;L#>ajYTA$DM+)57~eM@C}B!t0D3 zXszgDXQm!y>|k1JMd1@QW9-0&-$G*tg^Z3zs`=Ay^hx4QT(3+1bRjdimazl)Ga5U9 z+)sMFsQNPv@Mj8{e7x8}o&HSA*NeiRnbNv!)4tm9{!GCgs*~L^E=1=}OHWR8U+4>- z!mh~a{QTmTEe~|9oOeKZ+N}B0y!Yt*Y4|b;=QY)74bf?ZII#om2i1PihV_FMvhi|Y zvh~S*tp)XBSXv8O9mCr2x%?z17I&tQpsXMnvYeC&U(6d?#TE%NEpwkL*V&NJ$(6~Y4;syh2 zI$o~R^0lC_ue27lO6G5T`)XidE%P~@mahe+ACv6bG|F@V*-qmCyVb>Wc#%i;h`vd%@wV+jct%%o~@?Np~D}26TYC#JFdF=ze`}oPZ zy^lK1-r3JRF*kJ_>$x-DdRn&TPCPZ|>@7{rsV~z&UuHPocpK7-^TBdov=)^8GP7C> z3dwHfnKeTU%O;QiC=9TgwV;K85#gS-=mXVSP>_JZ>GLJP^|@>)mqRR zI;|OEbT&FIJa#ZRD4b)Z)3g@U^=a#m9n5MiXbpZV;#dlcKoVmIHvAS|3p%J{;%Y6Z zOWqRa<$8T;K?jG{GIpS~puRsdmFyZdt($2?-OOMiUhF`uvgkNnt?{Qhid1XQ?*V@% z;d~~x4V8gxr?E|a(7}TM`X52yIf6OoKp37GqucoYOfC~EZcwK`bD-;MTYATDACDTd zjs1zuS`TX17YctS;ryoK;#TXm6a-3r{!DH_G?h*KK=V4aFSK!ep}BZ@Fj@}^J3}lF z*Q~&P-1!P;b#73+I@8W-hQ81~?~}W~Vpp0uXW@OJxmY8^`KQctr=nmHaac5FElq2Yfhay?MFxJLET(Btp{yIot7_ikH!r& zhnh|ZeUSC(2hGPE6Sq$Ls^#lJVP9!IXbaj``FyOt8J!!{jm^kUFgC}iUGx~8^kcLh z)Qrt-d_N{X9A~Tztq1iuY^7MZZ6B!CgI4=8MZDgW_ln(L>2cUN^`OhWn(E7_FGC_< zKVN1jnp@$R z*K+atX6lR4X+3C3>p^Siv}TAM*yyzIKG30|So6cxnLn*_gUZ~XC9Mao!EZ$zOJNa6 zV(h?%-@@xbhjd(Atp|0 z{!GI8Ol%wK0NGCa`k;dc0rWqDKwUx5deE>j+lB{Y#SI1|Lm@hM`X%q>SIiCi7h6V` zj&|79gl@-oYu1`j-g|WZ0eqT-^IR{P$A>VU8xsV79maEEc&2V6UMg@+Y1ixzJ&cBU ze_OB+hYQDM_#_s{gBh$`DB<^Rf14}0KdyuMbYI5)0v29_3$MrP--1Qt3pSlT{L#jz zIR?Di<0KB}BU%)xJy-(ktakFz<(U9Kq}Z9fLte`!1>vbP_l=eV_}#;}X>ennJrazD#&t z=g5Hef$AKgAhmKo3Vn-Ue|!o1lUO$U3weOFZuZAt#h~{QCbull=V8%;;{NIN{d2+vR)@zEU53Iv?w$v>-C|#m33SfpP}0_5o@ipvcGdiRlasYF(h}XrVz_uM;iiHP)@PC^RVRb)v=LShaJ5 zQUMe_2FL{_t2<74oHdSZb!qWHSNoNT>*t)ALzmjxH-CNc{qOEXg-;IB97T` z=ESMJr4z@`KK=-<`osxm@91al-#axocjn~rvvVhAaW!lBC@}f?SXV&EVc|Uq&}Jm0 zu@Fzj{yV~h0q{tmdTh}!ybS&;|KVkbm*R#G((WGYv&Nz5A7>2>>mH(Nd`rN5ex8?9fZ>tCIIZXFa zA2h4(OSJ70@svwP2I<_aBOtn zG_GZ%`<@5h|KHx%z(-Y`dEYxT$xJ?&jEXiW=p;cM62VCb5L&kkNx0xw!H-(I>Lwu> zm`H$_4-0PlnhGlJYKzv^5A3eC?!KtB1`2((i*HcTYSnh);=ZVLm))%m1owRt#gbB& zdH?@=&zaoZWSB`KkdS+RzjL4aob%lC{hV{2=X~5$#=ZdJO=aw>2HntO-^|kC>_01; zmHOQCHN*)sfcHY%Ui`x4p2gik$JO1=Y!_ysu^>2be&a&^K}acV?p4%7@B6e#N#>(0 z|FO!GOnZtvSvT5wl6jFv@%U$xf{?DYfk0NeWKe&&4c%wesoeh#ux zrXwn3Bh{9TOu7l&s%6VYL6iZy&A7P&Z~i#e|GyRMSTJ^V6Q#l7?6D~u;eSsmva>sO zIg`so*(md|I{#wYQ=EU{hON=fbIgl0avqci2l9xVe}yE0fb^rW{%a_tyY@dMot5WE z=kF(r|KrHYbE*FKq#9wRGXLV-i`FA-qA|~pgr_q9O8DQCxutO~;uI{|{HttE>iUSi zMxhRniIjri_R4J^e&J@%85L>K;Ld)T=%9O_yQ2GAHMkSU7$;aN2xDKg-17lZfF^)wA8+r%U-`lbBpr|dFJG--i0Tz|cpnX>56lwfX$>JOCRXnVv5t$dqnYn0ze^+Ae;yoI zy>c#9DG3BLs(!G3ArW0rgeQX`onIn=GF~g+@qb)QUo!nd9cWU~FFXjkRP+n{_i-wG zcO&SA)-TMOW#3n3>le`6bUu>s%^9A4VPs=K+csxrc8B7i9@-uQ^nI!PrI9@b zn0SHwFb>9m;q40_p}gb7+Nh&>h+lRRP}mXd>zg6E_0p8`A;75 zhbcvT-W9^T+0c)Ma}%y(%K2Fc?`9+Etn;oAi2No(8Sh1KGoQs6yYkNLVVzg*|GQsu zd1sGNr~~93W979_Qwp#jRdsgeX~CU53q>x}S7M6?pNle=|5TLwd}H19QhnXEJgZ_X zue&losq!ZmUPm*3GB46dKFNavn}OuJ>m`AJMiUv#pNZ(K{7Je}Q(K zvf=E(88QFi+}_|*vxE1=Wy=Bw94Gu|pPNNpTjye@KL5=b)*Z=Z@s*_HvQj(de=q}N zCHvfLi&9m!d{t|eX?-YCZ=ahTg7+4|%?~S0qOp(rKvR)}A_yoIIq1Zlo1IfKtUFsq zcy3n7Yujd@n@xE>YM+}0zgWk^YPk7frAfq-kra8d4FRRXlkK3}2upn@Z6bLvgm_cg z6V5&BL+d8yl**MaTQ@PBON&0=JBm=naU<7D^WcJNi|gIYIx-T|kH)GOPegYSXraSv z)IY+5bg8t(I?z?arVE>>E$)W@1XyWg`mFm?J3(-XBm$Il7tftDdoCNHFiFo4jqpw( z>Lv!Cnzd!4=19GLZWis*Iu?ur*=X*t_NvDJl$l&MdfZ_00kY99=iqfBvmS!|%vjX} zGVLkq0l8#5s@H^=7ir{s9voPua!sgA5(sEi_u#Q95uKISNar_&DdXiBW?r)mAtE2# z+_0pf<$UQcV9jIQ^}tgZ>o$OHBW$vHS1#gBW!^d(G1FVe_%p9cq4tK>KH{E4(il@I2(M08eu zBb}cC2_xgR@>?Y$N`>EUL^!GN+r6Mmh2JJ4-cjDY*Ew0HU+a=>SdkxlJgC!5J zt$+S&uw}D`bw9}nYYeNesq9f5Cu=~X{v2#B+MhJCPtJn_y1DpR zaD^lgkbX2)y+9&5>sUZKKLZd(#(NQP^W5uXuED0VAEyolkzg#CGpse(5$;j7&%q8@ z`?1f#f{&~`7lNA~R+>aSH+J`^mdzd3+K@xS^b)@{IBZNA@@17+UH;g^Iau+HoqL`027UMWA_~F+|uFb_H12)t!p3; z93Nf7++qE1c%*m!m`}lGBTwV{JRasqr{e59h%Fqg!0R5RwD}(vQZfUkK^0 z{SQeu{$!oG!`tIM!gW-|b?kK=*6UbZ*J0XIT-RykLh3}&kJkIOB!7`Zc7KB*wSVexB7H-v+N=`N8X{@La-sB*Akfrj2^Zc+Qq@Z25-c z$#Icy&=zNzgzaQ)am43&y#41{ljMcdp)1K1Yt9kUFWo2HZk#nFtIG`(x z&%G8&0s-kqW1V{?qO;DuNatq&!pL~7b1%+qQki>25Kbz4Y90pNMp%!qiFhx7cvIO^ zQw_Qy*HOWH@!vS4u%~9kXIZo5er@d9ZrjwM-wuJwHRqcPk9&_Ebx!yj@Is{Kv!_5yXO``E|%${W}4i?WeZR|_NleS*M)=MOk zjdp`cCP+pBgb1XYl+UuFEylb26CoQxFJYWz)ny~qmW`TfYFiB1s0KARn%9MLMcX2f zeR3Y&+2-WB5M>#&k?ql{n@B`wou7>Z*{FEVaMp$5r-PF3eQP%gf57>=3g{+`KfvyC zF6v1BFW7OS7i_LUqaDq>XX^zAuMd3=dck7zCE&^CVIy6Wt?<0$_Gy#sHCbc48};W~ zvrPk8qVXH)Ho#n7YpUxvAQRM zX-{!a#Hc^#YU>>a^WQ~iD%7(KpWS?^dM^VouXXH8x{LlE`YqNdMm8CZp zWuH`d?ijMqO!KAQNyj|tMdCMEUt)rI9_HRp&5f&$$){ zXU176g*7f)=V0p`$OFeo=P+~DuyhV1lzY5F?s3?1&wzhBU=B9g&%D}l&vB7^W)5pF z_z2}5`@gTIJGChH)Qs+RR(s87Fwgl@)HNJS?wNZ6bq!AY>}yTSviQCt`|K;`a^q0f zP#V9k!IpWN*RE`-S*pxvZfP=LM836z*R&`z>S|hSnddmlJf$<`m2D}s#j;s)VJP`p z&u)xOFay?ll!D8=IDLSfZpI&7-%u;Mm(;$bDn*`-wnF^bH9z^i2;Ac^R@Z)*_LTHt zb))}0Y=E^ZjMPiz0cW+#y#Tz!-E52|G59=eB0B5XKsvuEKpC%9AI7y6>ImGhq@m?m zR_k3P--O$ASZQSX2<1PN=(h!SBW$wsu$SP&RQBMsfG)w>Yw4_E+>1~aUnok>kH0fA zXXVH2;C67N%NY&sG&}D*XBw!b^o;-vnJM{CXqeO@&_{1YIJ2EgO!`aOC{z>E~BtkGOI^VC5Tb z@T>DBx6Q99^6RMof9z0vlP7r6=2sMiC<{XCnW|&(>#SfgCc45TUFRL)eE0MCcWeOp z8>{0d)1D$fj{5Vq%!@RM#?M6aSnf^mz)HSNL}wj8N#}=^M#gI$KgaNVcUFlMDZ!J; z_|abfwRIun0nQaa_kSuC2WOQI=Ps0y&*i-RbGZSsm(YsXbGa19j#2-wS$i%wm|s5! z*=yG9;jCSaoL^14k^!=ptt&x)JPcjQs6W$d^Xu{9SM#Oj$>w@x@yjog>o#A5eg?*> z+w^d)!F0IJ;gC})SvmK%p;AIgRJ_HYDplV z(JTh*FB8#OZENR0@s@|uIHI@EZXjr>Y;I$p-A zo`Y#mQO_~z|ED`qRtTWfH{{_R%__cryvRhuSNhSgeX>8LRy_yl{IJrR_N_X(!Ld)1&zzp4kts7Wc-!h|C!8v?eH*ivQ17)T1S~2@P zgxwY~9&?^?lJrz%vxlLlvd3t9j6R-YbeUYPw);i9Up%?};@sdc_C?wKqTMeZ$9{3{ z%wgO=VYfxQEgsLdIBOVsSGz6RZSi=v#kgAEo-f+-#gjZ=9L~N!yI-{X#pBm6;-~V% zI5TgzMY}B?&$c+z)^*$KE@Es3IElJ$T>fM07wxtqJAC0B`N&Vy> z{-o?w{^Tk9`N1s5?#kr{vz@ySC; zdV=p~kf&Ra7#RNNop)~c8}3Z)H%=w3AHkawH*_$Mq+)(}9w-k`8XsSbN~%?+wkTCq z%U88lHPqGLx^i`0RV3Wd7;b_i@Vfe$AmzX0Gm(Jdoabu_H_RCH8#y}Gg_pK2ufm@g zSB8}t^RK>gMomjgQ~lD`mT)tZm8v-pgv=k$jMMPU4)ZDv<#L*HU|Dt{Segg%kq3~L z-;<8-=L=kxd>wGJAuUZ2Ea{WcF+K7dyebTDsB=Y3vpIc_;Um@$<6y1I^v%aR;%o%a z4exJA)HA(@VH760ZO`yi;GK&hoP^4 zazm_!B|rPuXl%lc^L!>#A8B0Zscu|||C&a=j(1=6Rlt-ED{m8*hIyAb-_1D7hF1Es zjM%nL_Ps1;APxOSmbT%-e!*;bR`)D8kcvL!d$w!Yj)>0!F53d}O5m(x=9Re8x~it3 ze)+0!-SlOxt7@BZGDYtpYQpH#t6H1FHFc%v8wC1|ruvq!38#0N#k*`!zcCeY@mz3# z5OqtwAYLYLriu6>fe-6w%;(t0u!Hph*3{KCFPqsvVMsP#m=)iUp1kkKHWCx>J3J_zlg-nzoCtLu z76njyf)0TV)vnEHLN)0o4^I}KY}e-Tiv+Tst?fDy9os9yYUH;xq)Vk8)`6}XmV8K? zs2%QxUnZ0IM^;EFVN*gwZrf&&C5#qyTj!F zW;)gSL!$srR5R3N1lF~AoM(MYBile897u;gOgD-8xzW@ga(*BU(@taU58r~@Q2pWZ z@HlUWMgiFEP;WIx+n2mRr{VO6BWZ^X~?5$h@98`x#RLk908UIZJf-zESt+!`-y~{> z4XbNfn(LdF2_0h6b~slq+$LX7@fl1py4O>d#S7pBwM1i|0gL8T)FDntp)GbEt1Y&! zinqq`*%n0soS@ctDv!@ODYV6ZPS6&y%vv|z*O^%WC#V^o(&O_;2Jcf)b$I^*r}UzY(DkYnOOiQsu`Zr{ozQ~_m+ppc{?-;z;1_PZa0$ta3t-p zVZ66PqX6u7c#_*8mRZO5{7@9YiE4ESiuTHK*Dy}6~Pc7?pO#qg^VepR|3zMBZk`&Ae>?_U{B_p6w5EZ_5xL{_g8 zmWKDln2l_Q)^pd1=z{oIe#3A`=jV$sGG5+S!S%$DaK8c{@&1!!_p4kFnpEz!*Z{hX zu*vRM$wj;+pp!|v zcsj0Lpd3QA_T1ez>G^W)a_x+Yo1%mW?Vcwi<=q}f#yJ(;8P3ysy*Y@n;Hvi*cmH78 zrQLUbeR20gg$QYRdUr;;yF1f;UANmgB|52BbzRo0q^52j^m2h+1|T;S=rW&uJjt$*9QNh!K1nltT7zdfxtH)qoOjC0ld z-r{>4_iWqJo9Wu!>rZ2hTY3w#-N@4gM_eCYcqIF?!iw_lY)59LucB>RTKfz8d%k-q za=8e(J*{_A&abo=wWr@#dncv8+UxgBJCc4h^N6SKH|G_ijK9+D@fMf;C~!pmcp75PuLvFbEX3Fu_pUDAv?o4T z-5m|C?%owN!l^?!%yg>7%;9&skotQ9J*vmk?Q&#vr#YLuR`*PB!F5fAR&(|nA;gh> z;Su%IClJ>p&4ZN9st6#y1>G(uLMT@9ZtGHZtZR2@%Kb`#b5ZQ@ua7$0Z|ZaXN$JpA zAN-UDvNVTAzg=-ZKRlh<%b%>zS6t^6Dm_Z*~&(N7jA(quw*szYX2s ze5v!b6y41X*T}s|R!5-~W^Iz#w z@?Y*^+>C?fb_3|V%-1gnJS1RDbY4>5BJYl%9xw)@Dvob@vnLGb+pb05T<)E^KI2Z$ zUGBTnH>BO;`WyW=!ppp6j-O_FrCdJ5Gk!M}znhG3=X+h>QRjPo3%#zmAMaAL z`bk~nz3{8VcM^{RXJ07sJr;bg1^=xD-)F&pC-4(H=E_k68G+%LYIIo!&R&vr!oHH_ z=D=G%-oJ`>mJ@N_nbrW@FslB&xRVY}s$OTeSm-xc=vlV%d-+DlyBisPze!Ur7l;Hp zEyv3#BPGj*3@scEn<@HH##PgxN8eI^tC?u9tDb`XPl=j|^tyN85CrR#@LvFz;bOjj z6;Pi~VKB}`xo|$Ugb+CEjd+8=Sr5cH?$iHXfj=zp#{|Av;9CU#oWOSq{565UDe%1l z|E<9H3;ZL2A8UR$^gW%c>uOr?Z;#LMF1?}d>)emBkcMrOhVxtVoXdsDmS4D$M@i>_ z<-LZ)C3jDjFL0xwA59S~>7{ofx*%xyjZBgsAB2EQ!!T$rft6tsuLj*Az6c}pQ3l+c zkEzJVYrAUsX4~rfH=ygG{DBm@`Y>0-Aj87+__a=8j%vg5r$)rE*0_ zMUPTZ0GnG$8LsAMxZ!uP+8g`gM%?k+sVNt_4`#Sr2luqp`94%`ndHHpzyBHg(Smha zTCYb5R%S$Fhu@FAyggtWn{a1|R9u0Q^f7hd7 zd=I#z4p`UaN+7!T5X{Im5JV>O| z8S(9S&+XFE_iS=2y^EBLcX%gqLFDW1jCamB_WMF`>2OAzTb-4;C^4lY17$?mxWlDQ&^-GJ8w%=|*5ql0n(BXe zp(o(!oYvq+xrAfsniBYbsF9;Fci>N*L2X(??C^iY0#oRsbU;>En5Hf6QL=yXY16ly zTf9@gpym8JXScLJ*q@`k)0f@$PG9cE^>}w|+1;n?%G+1au=r3<(+b3R+h>RDavk z)3l)W@WKt7AZJ{9hgMrxtQG0$*|pHE^*vAe+n!>Yj>dk`>&cninb*KNoETFs_H<-i z;MQ_GGA~d9ozWk!(0Y6-Ln%Zks=r9vwNTlbabcM@0cpfc`|e-#x^w=}S*GP7FW-zg z^%N)_p@znVi+f_1^z3+J#UILyH4x8(3v>bH;|VZV<&FduIr7wP+E*59lZBh8+G zOY?O49tk2nZyr?wA4fC%YukHXhyc%xrC)Tob1w20JG>|s-2TCe7pw26nWRmrQ}Tm5 z|Ei01P*MMCB&+U!Kkuy1)L0*?=0GjD(WX5CXXiAHxh{+`=SKPGi}F|VV~4-2yT24E z-0Iu@<_aZ0yUw?BW*26=9jxDVku$ccsMB23wriSu@4xL=dz_whk4MRRKBv(6t^@5r zg;fsTp_E6!JDbj~=66bgZ^!y}=ax)Od2kY9KN@pB>}vPDaLh0sK`4$4gks#~YlPw2 zQrYL4t~{8j8R0M#rNb!ae_rvEPjkL?M%|fHzOcouc@vcM^}9~rmz{Uk=9`g@cVflb zS(~3*xaN7+rn8=|*E}evG?soeBajxo;1QO17HZ)4(Tu5Qpr}s|^mv@g_xAKD8=vo0a+ID=+8h@zh;9eIz0c9+Dt)E_l2T?)UQm0q zGIsdJ*c}T>_fEsN*Ho@6f3QRGtNz8^i#(nlhbN;)g|wI9d9GK@`C_#ApPxfaXLlAv z&~IM$PY8QiXK<_Xs8ZMv{e>RW#x@Lw@3~4ddsQb>xU(y$r9H)(S+h06pP@^TivKrV zd-_~$p3+}*ISWpAq&@JHzRAH&T^`}ja2-)45bD{Ev~KDmp4+*3>mJ;!{>bFT-ETL& z8%^uIUR7th?pJztwE4m1zx!|3Gpc6vmP%lGr>FGxt_jHBJAMAP*x`dm+ZKG<`OM9a zm4DpHRvP;(C(og`bp>s;P*d_^hyQfc?f!=R=b<$G)#EcwP%dLz?Ts*x@JiR4DmIIx>1yw+CM+fsdk{3vPsL?)YE-g1%`2 zV*Ali*QUVIR}N&9ru&<_n6lS9UHRytJU`BT6WGG{;Rrf)H=J;o+1r;yuj^;7Coy%&YpMZ+GknM zvBUL8y&}(d9Sv${UzUSZd>eT->V&1z@|mmDt!=55r8w`<1(|9g^lJ#cP@9kNuEsZMUHWiQ@V(!w1^55nQSja0qkYd$ z({{JJrlsqAeq~XbGedC}RYe{CO16)0D@A|o^c5c7TNL?iy3+fHw)`!AO?^PUK+jph z<`wFr=|`Nsr?`o0B@`X%++1t)yNdt4F12WJ_vzY0+pdkK6}{b=e$b5; z?9X{?Z_bR+$D7)o)0B%tJs-3^y&`AE)3u?GceOpIw>gK=$HvpKqf@vLD*^$s}LVqe%JL?y5aZH`DAo z_^P^j#p12FMf~6|m9rzRnd{2u_qmYET&+LNZCxKv@)gee!#AJJnKADVYo9HQbhp1wD>uOLv$drIeExP^C+Gq2(xJsTDrTEuf1?WYJ zs?)?s{ZQ9)y}q2nNX5HR_vT)oCreM8>L~AVn9^4mQ8!)XK7UWn4A^#MJ2oeRCV{ z$*2Ej0jd8d-i}9m`_pYbfIq!uTiZ@d=;^)-@R@mKZGKFSiI)PBZjHe26>y_~j|upi zfcpf@#zdRn2LPY(ZfkoCu>Dz2TO;PrbZ-%Gjey?-+%nJEmJL6%o`<+Jr{jh42MzOG z4O`(2tjip%`B~vrUf%u6tG|5h^KJ#;@y6_d`N9L7vU#a`` zr%(E^J@C5aw@Ll3;Gljq>!_u(rFkDfl^S!x?yp$s)J=>I- zo^9*w0rZ#Z^nSR}u+23A4#<0jH|lEgPAtTx{ES=yBz)ProzmF4x`84SH>Cc3ht6%`MMzlIqwtB83AI)QsF}t}S)R_sKI@k5PI29DC z$xz>CUb7^ZQubw-tY_-?%x3VvRMK^QU_VW|u6sBW4%M*yel}n$EO}7s4>#i7FsdFu zc~atw@$y4h@~EUQizmaNCqEiS)%AG`fL|}@n*o0aoIJ_ze*pLtaMlg+cEFziXImxy z65v+g-?!s-8iO*sAUH-$(42TVB7xS@X3Y@8@XuCLt! zdX^vcqZb2j6?i^y4ft9UeiLwM{CH_K;XdH&EckaV_|q2rWeeVA!KpKphT%`K-~|?Z zmIc2A_zSQyf0yI^Mc8VD#r!VEdmhS@{6PHMz-Ixk6!`anuQmB^2Yw%L0G<97yxb3* z{RqFO?)Znm*|!n@FW~=f!v7oiG$e+78T}{1Pa5WLnhEy<|Dpx|iUqF&{w>rG`yz(d zV)AEr?6;*M-rv>@o!Kue{%>1w{1YXv1k<(L&EbY+(2Z8DUbd_`+%mIRfik-}T+>t= zsakO9wN))#kr!%dg(3PU5DJX(9{ygu&-|57gvkoyG~nDRhiH$ zp+{9^Rq^bqmep0LL}R5vq(p}MwJWc@K0&zjs!(c{u15M~E%w*o%J9nC#t*w$$sz$(0US5_+u|h~=wrb1VLxWlb&Is#Z5uT^(+TG_C$dJl=}c zD;pcaEua?xSB8n2VioS!U42az5*eo>j@lm>PdPT1v^3S!%II5-Rw_1_fVOr`jow(R zR@SuCMufxC@bY>z?uKy9s@6u~R$J51fQA!Z(-^L8F*QF%yJR(~Ooeex&8^`oqqv85 zx73hMj}|dRC_}UpNo{Tm%0~1PjtlX>FhUIM4--zqTplnJ9UI4M2jC@ySY!whVxDsy zU?vp!HxtfKlr@AGE6QDjK}Fe1SfVK1gfk(BpwG%I#qZbz{5c`qZ$uwNx|<1svri-b zFNBvU%DL!2Gx1}eMl1(r&Qp~42tx=5`hG&l=eoNe{bJ^PtU&=f$`$43#L=<8M_7z8 z9K#{gcQfGvMfnaP()n{jO;KJF(2s=$<|jx9y6XrR;yVFvC0vB^B1HcGkr46xLb$(2 z2>Sg3K8*aIi}*JnKg&3Qf+R$uIDLfJmzDUnXEkKqN(XUn1c3 z0#*wc5wKCfH3GH?xIw^;0zNF@;{t9LuwB6C1l%RyYXU|Eq+I7XU(BhHuc-nL5CUiV z=zpWYBLZ&_IOmV_e_Y^ z{TB)U27xyUe1pL675I|^-z@N50^cq0sKECKe4oI7CveJzjPH=ZeMkfGiG;9zfln29 zNZ^$MuM>Dg;ExOZNrATuoO2h3w@cu=1XP(1M!e{>sQDn1N@EDIDt!VzvG~={&H=u8xBRbyI2ziw=y7#=3@@ zh%N|PeuE;^O(HsUSEOsa!$imSD&v#+_!8XET__<~nu~H3Wgj5(f$mM8&oUohftBCl zRmldyXEG7MWq6n2-5g%_Btu`s@EDFPmmBboGHC?RjRyinDr>T3pxcN*vhfwVDm^?O zAmfx}j92Bg(-q|tlY>mVbxn3B1gsVOKp08afZt{618<7=dzJ)CgSg%aCi$A|Mi#7T zO*Vri(_5z}^D;ZP@!^pMc#8`yy;7?7zeIGOm3H1NJo7JlJB``LI{P*1+BZ z`)%0!VV{8A3i~2#C+xq&>S45hrhXgte%L2qw=&$v;Rbs@>=UrM+eezRWBLJQ$@BxU z^PtCdPCt;XsQQY@2YsP^r?>OF<4W@k^{h$adU_zu{K=?2p=&`iGwWI=$@aqv9?GPm zOBoo(K#aN*@(^9Ys=6%3=48g{4z|+`Wi?CzlsprTDS|T1gfGQAX=q4)8{k|WGw{E| z`+O7Lf%i*I_Lxm70XpKBlElLR7J|F;PUWV}PjZ2GrDxSKzz7?`B^Cv=z6)74gyE$$(uvVjf* zM6!4&+Cbq>eqxobgk&}-PLpJW^rs>WnuRG#U(2w>rqj~L0eb&?5(qzDhd>e9a*`N8#=b`34Tz8O0j`7yHPXHZI07SAMl4HDe z?z7Jn7Q>Wi5#BjBki&H%x}ZVR2%sC%q1fU^hDT_cn&=4Ux^B2LjZ7c;(mH4G!Q(8` zhcZ0toM8z93E_KbBwb_E^yb#aM(8S1+s8GtxGd#4!zISNF@E-j`?wsp-S&LNZ9m@X z%qx$mU-E6QXgVV@af;e>wxhDzQSIBA>&3sDBkC6&aB)->E*b+}ZAYT6tiS zmW|yh+&7XY_Imep>3c9L(y-Hm>#BFQbM^dJv3Bg=PhEI5jlOq%ol-ENH#=jJ zb~pFvY@8r=48*oMH@W6ir(e+)r(&+1ah^c(OOX->5oKWkzC%d)={wlgHp!B@a_OrmZqDs$a&h14VQMG_6JG+u8n-t$KabI*B z*7jqEzZRS7a8+#oR9XBqVwkG_Xj?zc6P*(eDT{NlCr0(OcD-D&_|WZ3ojq>n+4GeG z)$IVbsH6N)TY3K%^A0V2_O7m116M_V8Td=2pwGFhs6P5ypf&nB_9xtiy#=wu=f)gP zduJCr9iOwJ>|$YEu)h7KQk{3`KYp67hw#i%v=|3y zoW2ruW<|H7PTPQ<8Wuc`24tx zX{g3o#C6j}#=5EWW1L(oDmTs}U=`G*ht2Pp4t8toqiL9)m*7zDoxI+CXZl@fce^$? z@6lI>gON<{WUdW!ic7;Z7XrrDxhuW?#aPv*u7!qqVb_E;;B^Qg?#{e%ZftdDUfBm* z-I;f@`}~VQB<9%pcpWY4nJj;zSNWvyS*Z<@2xV?*`61_M5c+SG*0ip7u2p z1;?`G7W{tz|2iz|nRD##S^R%&!G8vP3hID$P5M^>F9puJCH?`RG>q>M>{sE>I;Q_b z6iGdB)*gzpFQ@6-fj-_j%Oy}VRF+0=OOJ>xrUe(;v*tEJ4 z3o}9~{?&@|s%1^9S7NmU#~{`W)U4~8_MsL;xO~DXnFu7VSr@Uz)#E0-UrR4OTGmv< z1p+~WsIGsOD|r^c6dLiX!wuzFOA@Oe zCeLe;Q|YOpY%_DPmP?4rcvIjX5uSnm3FS`zvj~Bg6M}A;fYcEa?-P*oB+{Qt2>K8q z{J$yS!velZ2)c=EBcS^-Atp+?E`1W#9f^z1$*gncJdcwvwh5_oCiDxOeH3xMuYyjE z-9RBGZb9K*Dsc99qzehi{)p#B7$tR&q$f^#;#UZKiNJ3Zc(uSc2>f1wZx;9#f$tLd zZh`L=_-_T?BXIHs?c9D$-OwzVEU^Y>-@gVW9Y;&Ea*KS>EJX-x4Fd>76U?) z(v5X~pNNii#&1}BG^7(vNXKRR*mr_1uG`!VxY8BZD^Qm3|@6wZkzR?_jNja!L;p z&ou*S)WagF71+CiXwCFnw=ry6YY6M4#zA;`sQ?3gZiZ1E)nj?}h?d(Iwc49}G!6}%du|Rd+nx&It z)6VFORG+bC$>dm3QR^2vA&+c1SdG&DQl7S=HFh|JU9-;0q8bO%Tr`Dq>^EW#P11Ko z)h&5&o32wGto{$gbF4D~X4x^vB0Dzjz+2~ zlZ}1UZ^neg66lVqTKdz(z7tb*S>VlB<|g$~e~+p>T8_Pmt+yC-t`Xer)oj zpGHft_nqxI}KD))~1K}W+pKm~;~#P@Ap`Ri91n~`tQ zFn`Mi(qQ-NO_>NdOUez*yCIM0dtI?F)7WPz`*W6wRbB}&a2S@;zXF=lQ0Wa_riYK+ zj)(<*7lGg;$_K2&exvIBHIl9PVN;P0WH}jOq$||D<-xL!`8~5o`GECGyd3a;Sk@yG|SfR_SiJrQ3IxD~jRKOO-7mI-HgJ75i?>SNH)C5rFOW+-`N zi;2L8_m?gBdltOcf*-cv)Qw8R@Xod1Gk_m}Wjmp~QDO1t9uaByz1&|`Yuww?6t1bO zYHbKFEiNgeq@m-@0$++*H};)j^B6aV)m7bE)6g0=NCr4neWSi5Qbp<^Je9_pCIr*a zTvt;SL2Tis`21dM`0AGi7G6C-xG_!j&2oUrd4RCdAC6ftF!oFhxgiYlkN76O0m+0L zV$<^4+N#EIQ}b#ZEw67`TXm~NXc{E{3@OnV=dUv%4@^aU5ME1&iyK}d#6??zPFxtRaA5rY0MLeY6}-p~0KA?ucqUW9%VWMgNaLieD6Wdeo-WFP9l zgWt#H2H>Rvze4yg5qO=zBLaU|;ExG>r@(g!e4oI7CvdV7r8 zm&PStta3vTmBe!6{21Ab&yTI^0_J@L42rZgMX;=ADOMz+W8Lx_nWRK?^9;JU+(5cT z;#&YceS}uIq0N*JOuggzu*waUNNA-@yeT}Z+z>^08{yA#Vg6WtgjTs>13XfZ8=hkT z$P33Lu#6s_50F!FS$23;oW=|I4a)c4;X#M8G7M z8!j;#(SY?0&fXh$L=Px+u8Xi9u{WrnXYSj2AmW^&RF`PE+7r)ne(A(p;|q^Zat4X5 z+4`T8ot1Uv1)+*QSN4Gj>6B^R`srwcQlFFJOf~MfiIqM7ctqLidx2-wUXMLqZJgOw zI(*w*k$cM>Z=>U?-d$Z8d9b{!qrCc@t&Ygw;O3#1vATkl6d0BvlTLV}fZr65^vKZrSLHX1W2){BUGNe^7kskkMAQ}b8x@jYfBA3@ zVm3qRO#Nm8NazK?sR?D-4E~-R({Fgjfc=0pZ2xm40!aMJ7JPvPza02YuqeLs*&>ug92BZG_0;wRtgYa*^EuTVzaUwmj&f=Y*got z^>8ybq*nT%>^l^`+G}JhW zAxLqc17dsPIK*&?2Lv7xc%{JgI)FdhBk9M=IQ2M^Dve9LSjVXlI!U%2WG~LoEH~>o zwMTp}fo#!5a3HX5Kh#;FHE7ldU$$i9K$p~(&!r?_8qE!?HSC%UnYQ&FUE Kg(L!$bpIb->T1gX literal 0 HcmV?d00001 diff --git a/lib/arm-missing.c b/lib/arm-missing.c new file mode 100644 index 0000000..93f3ef8 --- /dev/null +++ b/lib/arm-missing.c @@ -0,0 +1,16 @@ + +void abort (void) { + while(1); +} + +void *memcpy(void *dst, const void *src, unsigned int len) +{ + const char *s = src; + char *d = dst; + + while (len--) + *d++ = *s++; + + return dst; +} + diff --git a/lib/avr51.S b/lib/avr51.S new file mode 120000 index 0000000..79240b8 --- /dev/null +++ b/lib/avr51.S @@ -0,0 +1 @@ +avr5.S \ No newline at end of file diff --git a/lib/convert/itoa.rob b/lib/convert/itoa.rob index 6ea4a9a..6d63373 100644 --- a/lib/convert/itoa.rob +++ b/lib/convert/itoa.rob @@ -7,10 +7,10 @@ use math.abs; const itoa_chars = "0123456789abcdef"; -void itoa(int16 value, int8 base, char[] result) { +uint16 itoa(int16 value, int8 base, char[] result) { if base < 2 or base > 16 { result[0] = 0; - return; + return 0; } negative = value < 0; @@ -34,6 +34,7 @@ void itoa(int16 value, int8 base, char[] result) { } result[i] = 0; + ret = i; // reverse result j = 0; @@ -45,4 +46,6 @@ void itoa(int16 value, int8 base, char[] result) { j++; i--; } + + return ret; } diff --git a/lib/stm32f1.rob b/lib/stm32f1.rob index 710a90f..e72dafc 100644 --- a/lib/stm32f1.rob +++ b/lib/stm32f1.rob @@ -161,7 +161,7 @@ void __isr_reset() { __do_copy_data(); __system_clock_config(); - main(); + ret = main(); __error_handler(); } diff --git a/platformio/platform/builder/main.py b/platformio/platform/builder/main.py index 0f6150b..05fa252 100644 --- a/platformio/platform/builder/main.py +++ b/platformio/platform/builder/main.py @@ -51,6 +51,8 @@ def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621 if mcu.startswith("stm32f1"): ldflags.append("-Tstm32f1.ld") + ldflags.append(join(stdlib_folder, "arm-eabi-libgcc.a")) + ldflags.append(join(stdlib_folder, "cortex-m3-arm-missing.o")) auxsources += Glob(join(stdlib_folder, "stm32f1.rob")) elif mcu == "atmega328p": ldflags.append("-Tatmega328p.ld") diff --git a/test/atmega1284p/run_avr b/test/atmega1284p/run_avr deleted file mode 120000 index 1dc1d13..0000000 --- a/test/atmega1284p/run_avr +++ /dev/null @@ -1 +0,0 @@ -../../platformio/toolchain-robcmp/bin/run_avr \ No newline at end of file diff --git a/test/debug/platformio.ini b/test/debug/platformio.ini index 26e80a0..f39b390 100644 --- a/test/debug/platformio.ini +++ b/test/debug/platformio.ini @@ -14,4 +14,17 @@ debug_tool = robcmp-ssd1306 [env:native] board = native build_type = debug -upload_protocol = none \ No newline at end of file +upload_protocol = none + +[stm32] +platform = robcmp +board = stm32f1 +upload_protocol = stlink +#board_hardware_spec = specs/stm32.spec + +[env:stm32-release] +extends = stm32 + +[env:stm32-debug] +extends = stm32 +build_type = debug \ No newline at end of file diff --git a/test/stm32f1/Makefile b/test/stm32f1/Makefile index 6045c5b..53c5eb4 100644 --- a/test/stm32f1/Makefile +++ b/test/stm32f1/Makefile @@ -18,7 +18,7 @@ LD_FLAGS+=--gc-sections LD_FLAGS+=--lto=thin DEPENDS=${ROBCMP} Makefile -LINK_DEPENDS=out/stm32f1.o +LINK_DEPENDS=out/stm32f1.o ../../lib/cortex-m3-arm-missing.o ../../lib/arm-eabi-libgcc.a all: out test From 9bb4e9bf452b1a64a2a72bc0426fa6e604d7e52b Mon Sep 17 00:00:00 2001 From: Thiago Borges de Oliveira Date: Wed, 4 Dec 2024 16:32:47 -0300 Subject: [PATCH 21/24] Add stm32f1 test sample with uart. --- test/stm32f1/coseno.rob | 94 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 test/stm32f1/coseno.rob diff --git a/test/stm32f1/coseno.rob b/test/stm32f1/coseno.rob new file mode 100644 index 0000000..ba7bbca --- /dev/null +++ b/test/stm32f1/coseno.rob @@ -0,0 +1,94 @@ + +use intfs.ports; +use arch.stm32.stm32f1; +use convert.itoa; + +use math.abs; +use math.fconsts; +use math.trigonometric; + +precision_digits=1E6; + +values={ + 1.000000,0.999962,0.999848,0.999657,0.999391,0.999048,0.998630,0.998135,0.997564,0.996917,0.996195,0.995396,0.994522,0.993572,0.992546,0.991445,0.990268,0.989016,0.987688,0.986286, + 0.984808,0.983255,0.981627,0.979925,0.978148,0.976296,0.974370,0.972370,0.970296,0.968148,0.965926,0.963630,0.961262,0.958820,0.956305,0.953717,0.951057,0.948324,0.945519,0.942641, + 0.939693,0.936672,0.933580,0.930418,0.927184,0.923880,0.920505,0.917060,0.913545,0.909961,0.906308,0.902585,0.898794,0.894934,0.891007,0.887011,0.882948,0.878817,0.874620,0.870356, + 0.866025,0.861629,0.857167,0.852640,0.848048,0.843391,0.838671,0.833886,0.829038,0.824126,0.819152,0.814116,0.809017,0.803857,0.798636,0.793353,0.788011,0.782608,0.777146,0.771625, + 0.766044,0.760406,0.754710,0.748956,0.743145,0.737277,0.731354,0.725374,0.719340,0.713250,0.707107,0.700909,0.694658,0.688355,0.681998,0.675590,0.669131,0.662620,0.656059,0.649448, + 0.642788,0.636078,0.629320,0.622515,0.615662,0.608761,0.601815,0.594823,0.587785,0.580703,0.573576,0.566406,0.559193,0.551937,0.544639,0.537300,0.529919,0.522498,0.515038,0.507538, + 0.500000,0.492424,0.484810,0.477159,0.469472,0.461749,0.453991,0.446198,0.438371,0.430511,0.422618,0.414693,0.406737,0.398749,0.390731,0.382683,0.374607,0.366501,0.358368,0.350207, + 0.342020,0.333807,0.325568,0.317305,0.309017,0.300706,0.292372,0.284015,0.275637,0.267238,0.258819,0.250380,0.241922,0.233445,0.224951,0.216440,0.207912,0.199368,0.190809,0.182236, + 0.173648,0.165048,0.156434,0.147809,0.139173,0.130526,0.121869,0.113203,0.104528,0.095846,0.087156,0.078459,0.069757,0.061049,0.052336,0.043619,0.034899,0.026177,0.017452,0.008727, + -0.000000,-0.008727,-0.017452,-0.026177,-0.034899,-0.043619,-0.052336,-0.061049,-0.069756,-0.078459,-0.087156,-0.095846,-0.104529,-0.113203,-0.121869,-0.130526,-0.139173,-0.147809,-0.156434,-0.165048, + -0.173648,-0.182235,-0.190809,-0.199368,-0.207912,-0.216440,-0.224951,-0.233445,-0.241922,-0.250380,-0.258819,-0.267238,-0.275637,-0.284015,-0.292372,-0.300706,-0.309017,-0.317305,-0.325568,-0.333807, + -0.342020,-0.350207,-0.358368,-0.366501,-0.374607,-0.382683,-0.390731,-0.398749,-0.406737,-0.414693,-0.422618,-0.430511,-0.438371,-0.446198,-0.453991,-0.461749,-0.469472,-0.477159,-0.484810,-0.492424, + -0.500000,-0.507538,-0.515038,-0.522498,-0.529919,-0.537300,-0.544639,-0.551937,-0.559193,-0.566406,-0.573576,-0.580703,-0.587785,-0.594823,-0.601815,-0.608761,-0.615661,-0.622515,-0.629320,-0.636078, + -0.642788,-0.649448,-0.656059,-0.662620,-0.669131,-0.675590,-0.681998,-0.688354,-0.694658,-0.700909,-0.707107,-0.713250,-0.719340,-0.725374,-0.731354,-0.737277,-0.743145,-0.748956,-0.754710,-0.760406, + -0.766044,-0.771625,-0.777146,-0.782608,-0.788011,-0.793353,-0.798635,-0.803857,-0.809017,-0.814116,-0.819152,-0.824126,-0.829038,-0.833886,-0.838671,-0.843391,-0.848048,-0.852640,-0.857167,-0.861629, + -0.866025,-0.870356,-0.874620,-0.878817,-0.882948,-0.887011,-0.891006,-0.894934,-0.898794,-0.902585,-0.906308,-0.909961,-0.913545,-0.917060,-0.920505,-0.923880,-0.927184,-0.930418,-0.933580,-0.936672, + -0.939693,-0.942642,-0.945519,-0.948324,-0.951056,-0.953717,-0.956305,-0.958820,-0.961262,-0.963630,-0.965926,-0.968148,-0.970296,-0.972370,-0.974370,-0.976296,-0.978148,-0.979925,-0.981627,-0.983255, + -0.984808,-0.986286,-0.987688,-0.989016,-0.990268,-0.991445,-0.992546,-0.993572,-0.994522,-0.995396,-0.996195,-0.996917,-0.997564,-0.998135,-0.998630,-0.999048,-0.999391,-0.999657,-0.999848,-0.999962, + -1.000000,-0.999962,-0.999848,-0.999657,-0.999391,-0.999048,-0.998630,-0.998135,-0.997564,-0.996917,-0.996195,-0.995396,-0.994522,-0.993572,-0.992546,-0.991445,-0.990268,-0.989016,-0.987688,-0.986286, + -0.984808,-0.983255,-0.981627,-0.979925,-0.978148,-0.976296,-0.974370,-0.972370,-0.970296,-0.968148,-0.965926,-0.963630,-0.961262,-0.958820,-0.956305,-0.953717,-0.951057,-0.948324,-0.945519,-0.942641, + -0.939693 + }; + + +int16 run_test(stm32f1 mmcu) { + + degress=float(0.0); + value=int32(0); + result=int32(0); + i = int32(0); + while degress <= 200.0 { + value=int32(values[i]*precision_digits); + result=int32(Cos((float(degress) * FM_PI) / 180.0,18)*precision_digits); + if (abs32(value-result)>10) { + if i!=0 { + return int16(i); + } else { + return 1; + } + } + i=i+1; + degress+=0.5; + } + return 0; +} + +int16 main() { + mmcu = stm32f1(); + serial = mmcu.uart2; + serial.setup(9600); + serial.enable(); + + //led = mmcu.c13; + //led.mode(port_mode.output); + + loop { + start = mmcu.millis(); + + ret = run_test(mmcu); + + // millis is counting downwards, thus start - current + time = start - mmcu.millis(); + + timestr = {'0': 10}; + chars = itoa(time, 10, timestr); + + if ret != 0 { + serial.write_array("FAIL"); + } else { + timestr[chars] = ' '; + timestr[chars+1] = 'm'; + timestr[chars+2] = 's'; + timestr[chars+3] = ' '; + serial.write_array(timestr); + } + serial.write('\r'); + serial.write('\n'); + + } + return 0; +} + From 677bd57535608422c42f7b587a77c4be8202e990 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Thu, 28 Nov 2024 14:14:56 -0300 Subject: [PATCH 22/24] att --- test/atmega328p/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/atmega328p/Makefile b/test/atmega328p/Makefile index 678ff67..b7de220 100644 --- a/test/atmega328p/Makefile +++ b/test/atmega328p/Makefile @@ -9,7 +9,7 @@ INCLUDES=-I ../../lib ifndef OPT #OPT=-g -O0 -OPT=-Oz +OPT=-Os endif LD_FLAGS=-nostdlib -entry=main -L../../lib -Tatmega328p.ld ../../lib/avr5.o From c9d38ef5c8cea243c7d203f9fab65b79c5bcf1e5 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Thu, 28 Nov 2024 14:15:50 -0300 Subject: [PATCH 23/24] att --- test/general/string-upper.rob | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index c93db9a..775c134 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -3,11 +3,11 @@ use string.upperstr; int32 main() { - l_str = "aabbáçaabbáç"; + l_str = "abçd"; utf8_string_to_uppercase(l_str); - if equalstr (l_str, "AABBÁÇAABBÁÇ") { + if equalstr (l_str, "ABÇD") { return 0; } else { return 1; From c14944cd27436800d5486d8a691468d78cdefa42 Mon Sep 17 00:00:00 2001 From: Gabriel Krishna Date: Tue, 10 Dec 2024 15:39:35 -0300 Subject: [PATCH 24/24] correcoes nas funcoes uppercase e lowercase alem da adicao dos testes para atmega1284p para validacao --- lib/Makefile | 8 ++--- lib/string/{contains.rob => containsstr.rob} | 0 lib/string/equalstr.rob | 6 ++-- lib/string/{utf8strlen.rob => lenstr.rob} | 2 +- .../{upperstr.rob => upperlowerstr.rob} | 19 ++++++---- test/atmega1284p/Makefile | 11 ++++++ test/atmega1284p/mapping_file_001.rob | 15 ++++++++ test/atmega1284p/mapping_file_002.rob | 15 ++++++++ test/atmega1284p/mapping_file_003.rob | 15 ++++++++ test/atmega1284p/mapping_file_004.rob | 15 ++++++++ test/atmega1284p/mapping_file_005.rob | 15 ++++++++ test/atmega1284p/mapping_file_006.rob | 15 ++++++++ test/atmega1284p/mapping_file_007.rob | 15 ++++++++ test/atmega1284p/mapping_file_008.rob | 15 ++++++++ test/atmega1284p/mapping_file_009.rob | 15 ++++++++ test/atmega1284p/mapping_file_010.rob | 15 ++++++++ test/atmega1284p/mapping_file_011.rob | 15 ++++++++ test/atmega1284p/mapping_file_012.rob | 15 ++++++++ test/atmega1284p/mapping_file_013.rob | 15 ++++++++ test/atmega1284p/mapping_file_014.rob | 15 ++++++++ test/atmega1284p/mapping_file_015.rob | 15 ++++++++ test/atmega1284p/mapping_file_016.rob | 15 ++++++++ test/atmega1284p/mapping_file_017.rob | 15 ++++++++ test/atmega1284p/mapping_file_018.rob | 15 ++++++++ test/atmega1284p/mapping_file_019.rob | 15 ++++++++ test/atmega1284p/mapping_file_020.rob | 15 ++++++++ test/atmega1284p/mapping_file_021.rob | 15 ++++++++ test/atmega1284p/mapping_file_022.rob | 15 ++++++++ test/atmega1284p/mapping_file_023.rob | 15 ++++++++ test/atmega1284p/mapping_file_024.rob | 15 ++++++++ test/atmega1284p/mapping_file_025.rob | 15 ++++++++ test/atmega1284p/mapping_file_026.rob | 15 ++++++++ test/atmega1284p/mapping_file_027.rob | 15 ++++++++ test/atmega1284p/mapping_file_028.rob | 15 ++++++++ test/atmega1284p/mapping_file_029.rob | 15 ++++++++ test/atmega1284p/mapping_file_030.rob | 15 ++++++++ test/atmega1284p/mapping_file_031.rob | 15 ++++++++ test/atmega1284p/mapping_file_032.rob | 15 ++++++++ test/atmega1284p/mapping_file_033.rob | 15 ++++++++ test/atmega1284p/mapping_file_034.rob | 15 ++++++++ test/atmega1284p/mapping_file_035.rob | 15 ++++++++ test/atmega1284p/mapping_file_036.rob | 15 ++++++++ test/atmega1284p/mapping_file_037.rob | 15 ++++++++ test/atmega1284p/mapping_file_038.rob | 15 ++++++++ test/atmega1284p/mapping_file_039.rob | 15 ++++++++ test/atmega1284p/mapping_file_040.rob | 15 ++++++++ test/atmega1284p/mapping_file_041.rob | 15 ++++++++ test/atmega1284p/mapping_file_042.rob | 15 ++++++++ test/atmega1284p/mapping_file_043.rob | 15 ++++++++ test/atmega1284p/mapping_file_044.rob | 15 ++++++++ test/atmega1284p/mapping_file_045.rob | 15 ++++++++ test/atmega1284p/mapping_file_046.rob | 15 ++++++++ test/atmega1284p/mapping_file_047.rob | 15 ++++++++ test/atmega1284p/mapping_file_048.rob | 15 ++++++++ test/atmega1284p/mapping_file_049.rob | 15 ++++++++ test/atmega1284p/mapping_file_050.rob | 15 ++++++++ test/atmega1284p/mapping_file_051.rob | 15 ++++++++ test/atmega1284p/mapping_file_052.rob | 15 ++++++++ test/atmega1284p/mapping_file_053.rob | 15 ++++++++ test/atmega1284p/mapping_file_054.rob | 15 ++++++++ test/atmega1284p/mapping_file_055.rob | 15 ++++++++ test/atmega1284p/mapping_file_056.rob | 15 ++++++++ test/atmega1284p/mapping_file_057.rob | 15 ++++++++ test/atmega1284p/mapping_file_058.rob | 15 ++++++++ test/atmega1284p/mapping_file_059.rob | 15 ++++++++ test/atmega1284p/mapping_file_060.rob | 15 ++++++++ test/atmega1284p/mapping_file_061.rob | 15 ++++++++ test/atmega1284p/mapping_file_062.rob | 15 ++++++++ test/atmega1284p/mapping_file_063.rob | 15 ++++++++ test/atmega1284p/mapping_file_064.rob | 15 ++++++++ test/atmega1284p/mapping_file_065.rob | 15 ++++++++ test/atmega1284p/mapping_file_066.rob | 15 ++++++++ test/atmega1284p/mapping_file_067.rob | 15 ++++++++ test/atmega1284p/mapping_file_068.rob | 15 ++++++++ test/atmega1284p/mapping_file_069.rob | 15 ++++++++ test/atmega1284p/mapping_file_070.rob | 15 ++++++++ test/atmega1284p/mapping_file_071.rob | 15 ++++++++ test/atmega1284p/mapping_file_072.rob | 15 ++++++++ test/atmega1284p/mapping_file_073.rob | 15 ++++++++ test/atmega1284p/mapping_file_074.rob | 15 ++++++++ test/atmega1284p/mapping_file_075.rob | 15 ++++++++ test/atmega1284p/mapping_file_076.rob | 15 ++++++++ test/atmega1284p/mapping_file_077.rob | 15 ++++++++ test/atmega1284p/mapping_file_078.rob | 15 ++++++++ test/atmega1284p/mapping_file_079.rob | 15 ++++++++ test/atmega1284p/mapping_file_080.rob | 15 ++++++++ test/atmega1284p/mapping_file_081.rob | 15 ++++++++ test/atmega1284p/mapping_file_082.rob | 15 ++++++++ test/atmega1284p/mapping_file_083.rob | 15 ++++++++ test/atmega1284p/mapping_file_084.rob | 15 ++++++++ test/atmega1284p/mapping_file_085.rob | 15 ++++++++ test/atmega1284p/mapping_file_086.rob | 15 ++++++++ test/atmega1284p/mapping_file_087.rob | 15 ++++++++ test/atmega1284p/mapping_file_088.rob | 15 ++++++++ test/atmega1284p/mapping_file_089.rob | 15 ++++++++ test/atmega1284p/mapping_file_090.rob | 15 ++++++++ test/atmega1284p/mapping_file_091.rob | 15 ++++++++ test/atmega1284p/mapping_file_092.rob | 15 ++++++++ test/atmega1284p/mapping_file_093.rob | 15 ++++++++ test/atmega1284p/mapping_file_094.rob | 15 ++++++++ test/atmega1284p/mapping_file_095.rob | 15 ++++++++ test/atmega1284p/mapping_file_096.rob | 15 ++++++++ test/atmega1284p/mapping_file_097.rob | 15 ++++++++ test/atmega1284p/mapping_file_098.rob | 15 ++++++++ test/atmega1284p/mapping_file_099.rob | 15 ++++++++ test/atmega1284p/mapping_file_100.rob | 15 ++++++++ test/atmega1284p/mapping_file_101.rob | 15 ++++++++ test/atmega1284p/mapping_file_102.rob | 15 ++++++++ test/atmega1284p/mapping_file_103.rob | 15 ++++++++ test/atmega1284p/mapping_file_104.rob | 15 ++++++++ test/atmega1284p/mapping_file_105.rob | 15 ++++++++ test/atmega1284p/mapping_file_106.rob | 15 ++++++++ test/atmega1284p/mapping_file_107.rob | 15 ++++++++ test/atmega1284p/mapping_file_108.rob | 15 ++++++++ test/atmega1284p/mapping_file_109.rob | 15 ++++++++ test/atmega1284p/mapping_file_110.rob | 15 ++++++++ test/atmega1284p/mapping_file_111.rob | 15 ++++++++ test/atmega1284p/mapping_file_112.rob | 15 ++++++++ test/atmega1284p/mapping_file_113.rob | 15 ++++++++ test/atmega1284p/mapping_file_114.rob | 15 ++++++++ test/atmega1284p/mapping_file_115.rob | 15 ++++++++ test/atmega1284p/mapping_file_116.rob | 15 ++++++++ test/atmega1284p/mapping_file_117.rob | 15 ++++++++ test/atmega1284p/mapping_file_118.rob | 15 ++++++++ test/atmega1284p/mapping_file_119.rob | 15 ++++++++ test/atmega1284p/mapping_file_120.rob | 15 ++++++++ test/atmega1284p/mapping_file_121.rob | 15 ++++++++ test/atmega1284p/mapping_file_122.rob | 15 ++++++++ test/atmega1284p/mapping_file_123.rob | 15 ++++++++ test/atmega1284p/mapping_file_124.rob | 15 ++++++++ test/atmega1284p/mapping_file_125.rob | 15 ++++++++ test/atmega1284p/mapping_file_126.rob | 15 ++++++++ test/atmega1284p/mapping_file_127.rob | 15 ++++++++ test/atmega1284p/mapping_file_128.rob | 15 ++++++++ test/atmega1284p/mapping_file_129.rob | 15 ++++++++ test/atmega1284p/mapping_file_130.rob | 15 ++++++++ test/atmega1284p/mapping_file_131.rob | 15 ++++++++ test/atmega1284p/mapping_file_132.rob | 15 ++++++++ test/atmega1284p/mapping_file_133.rob | 15 ++++++++ test/atmega1284p/mapping_file_134.rob | 15 ++++++++ test/atmega1284p/mapping_file_135.rob | 15 ++++++++ test/atmega1284p/mapping_file_136.rob | 15 ++++++++ test/atmega1284p/mapping_file_137.rob | 15 ++++++++ test/atmega1284p/mapping_file_138.rob | 15 ++++++++ test/atmega1284p/mapping_file_139.rob | 15 ++++++++ test/atmega1284p/mapping_file_140.rob | 15 ++++++++ test/atmega1284p/mapping_file_141.rob | 15 ++++++++ test/atmega1284p/mapping_file_142.rob | 15 ++++++++ test/atmega1284p/mapping_file_143.rob | 15 ++++++++ test/atmega1284p/mapping_file_144.rob | 15 ++++++++ test/atmega1284p/mapping_file_145.rob | 15 ++++++++ test/atmega1284p/mapping_file_146.rob | 15 ++++++++ test/atmega1284p/mapping_file_147.rob | 15 ++++++++ test/atmega1284p/mapping_file_148.rob | 15 ++++++++ test/atmega1284p/mapping_file_149.rob | 15 ++++++++ test/atmega1284p/mapping_file_150.rob | 15 ++++++++ test/atmega1284p/mapping_file_151.rob | 15 ++++++++ test/atmega1284p/mapping_file_152.rob | 15 ++++++++ test/atmega1284p/mapping_file_153.rob | 15 ++++++++ test/atmega1284p/mapping_file_154.rob | 15 ++++++++ test/atmega1284p/mapping_file_155.rob | 15 ++++++++ test/atmega1284p/mapping_file_156.rob | 15 ++++++++ test/atmega1284p/mapping_file_157.rob | 15 ++++++++ test/atmega1284p/mapping_file_158.rob | 15 ++++++++ test/atmega1284p/mapping_file_159.rob | 15 ++++++++ test/atmega1284p/mapping_file_160.rob | 15 ++++++++ test/atmega1284p/mapping_file_161.rob | 15 ++++++++ test/atmega1284p/mapping_file_162.rob | 15 ++++++++ test/atmega1284p/mapping_file_163.rob | 15 ++++++++ test/atmega1284p/mapping_file_164.rob | 15 ++++++++ test/atmega1284p/mapping_file_165.rob | 15 ++++++++ test/atmega1284p/mapping_file_166.rob | 15 ++++++++ test/atmega1284p/mapping_file_167.rob | 15 ++++++++ test/atmega1284p/mapping_file_168.rob | 15 ++++++++ test/atmega1284p/mapping_file_169.rob | 15 ++++++++ test/atmega1284p/mapping_file_170.rob | 15 ++++++++ test/atmega1284p/mapping_file_171.rob | 15 ++++++++ test/atmega1284p/mapping_file_172.rob | 15 ++++++++ test/atmega1284p/mapping_file_173.rob | 15 ++++++++ test/atmega1284p/mapping_file_174.rob | 15 ++++++++ test/atmega1284p/mapping_file_175.rob | 15 ++++++++ test/atmega1284p/mapping_file_176.rob | 15 ++++++++ test/atmega1284p/mapping_file_177.rob | 15 ++++++++ test/atmega1284p/mapping_file_178.rob | 15 ++++++++ test/atmega1284p/mapping_file_179.rob | 15 ++++++++ test/atmega1284p/mapping_file_180.rob | 15 ++++++++ test/atmega1284p/mapping_file_181.rob | 15 ++++++++ test/atmega1284p/mapping_file_182.rob | 15 ++++++++ test/atmega1284p/mapping_file_183.rob | 15 ++++++++ test/atmega1284p/mapping_file_184.rob | 15 ++++++++ test/atmega1284p/mapping_file_185.rob | 15 ++++++++ test/atmega1284p/mapping_file_186.rob | 15 ++++++++ test/atmega1284p/mapping_file_187.rob | 15 ++++++++ test/atmega1284p/mapping_file_188.rob | 15 ++++++++ test/atmega1284p/mapping_file_189.rob | 15 ++++++++ test/atmega1284p/mapping_file_190.rob | 15 ++++++++ test/atmega1284p/mapping_file_191.rob | 15 ++++++++ test/atmega1284p/mapping_file_192.rob | 15 ++++++++ test/atmega1284p/mapping_file_193.rob | 15 ++++++++ test/atmega1284p/mapping_file_194.rob | 15 ++++++++ test/atmega1284p/mapping_file_195.rob | 15 ++++++++ test/atmega1284p/mapping_file_196.rob | 15 ++++++++ test/atmega1284p/mapping_file_197.rob | 15 ++++++++ test/atmega1284p/mapping_file_198.rob | 15 ++++++++ test/atmega1284p/mapping_file_199.rob | 15 ++++++++ test/atmega1284p/mapping_file_200.rob | 15 ++++++++ test/atmega1284p/mapping_file_201.rob | 15 ++++++++ test/atmega1284p/mapping_file_202.rob | 15 ++++++++ test/atmega1284p/mapping_file_203.rob | 15 ++++++++ test/atmega1284p/mapping_file_204.rob | 15 ++++++++ test/atmega1284p/mapping_file_205.rob | 15 ++++++++ test/atmega1284p/mapping_file_206.rob | 15 ++++++++ test/atmega1284p/mapping_file_207.rob | 15 ++++++++ test/atmega1284p/mapping_file_208.rob | 15 ++++++++ test/atmega1284p/mapping_file_209.rob | 15 ++++++++ test/atmega1284p/mapping_file_210.rob | 15 ++++++++ test/atmega1284p/mapping_file_211.rob | 15 ++++++++ test/atmega1284p/mapping_file_212.rob | 15 ++++++++ test/atmega1284p/mapping_file_213.rob | 15 ++++++++ test/atmega1284p/mapping_file_214.rob | 15 ++++++++ test/atmega1284p/mapping_file_215.rob | 15 ++++++++ test/atmega1284p/mapping_file_216.rob | 15 ++++++++ test/atmega1284p/mapping_file_217.rob | 15 ++++++++ test/atmega1284p/mapping_file_218.rob | 15 ++++++++ test/atmega1284p/mapping_file_219.rob | 15 ++++++++ test/atmega1284p/mapping_file_220.rob | 15 ++++++++ test/atmega1284p/mapping_file_221.rob | 15 ++++++++ test/atmega1284p/mapping_file_222.rob | 15 ++++++++ test/atmega1284p/out/string-len | Bin 0 -> 12712 bytes test/atmega1284p/runtest.sh | 26 +++++++++++++- test/atmega1284p/runtestold.sh | 1 + test/atmega1284p/runtrace.sh | 3 +- test/atmega1284p/runtraceold.sh | 1 + test/atmega1284p/string-contains.rob | 17 +++++++++ test/atmega1284p/string-equal.rob | 15 ++++++++ .../string-len.rob} | 8 ++--- test/atmega1284p/timetest.sh | 34 ++++++++++++++++++ test/atmega328p/Makefile | 8 ++--- test/atmega328p/string-contains.rob | 2 +- .../string-len.rob} | 4 +-- test/atmega328p/string-upperstr.rob | 15 -------- test/debug/platformio.ini | 2 +- test/general/a.rob | 1 - test/general/string-equal.rob | 6 ++-- test/general/string-len.rob | 12 +++++++ test/general/string-upper.rob | 18 +++++----- 246 files changed, 3491 insertions(+), 58 deletions(-) rename lib/string/{contains.rob => containsstr.rob} (100%) rename lib/string/{utf8strlen.rob => lenstr.rob} (86%) rename lib/string/{upperstr.rob => upperlowerstr.rob} (95%) create mode 100644 test/atmega1284p/mapping_file_001.rob create mode 100644 test/atmega1284p/mapping_file_002.rob create mode 100644 test/atmega1284p/mapping_file_003.rob create mode 100644 test/atmega1284p/mapping_file_004.rob create mode 100644 test/atmega1284p/mapping_file_005.rob create mode 100644 test/atmega1284p/mapping_file_006.rob create mode 100644 test/atmega1284p/mapping_file_007.rob create mode 100644 test/atmega1284p/mapping_file_008.rob create mode 100644 test/atmega1284p/mapping_file_009.rob create mode 100644 test/atmega1284p/mapping_file_010.rob create mode 100644 test/atmega1284p/mapping_file_011.rob create mode 100644 test/atmega1284p/mapping_file_012.rob create mode 100644 test/atmega1284p/mapping_file_013.rob create mode 100644 test/atmega1284p/mapping_file_014.rob create mode 100644 test/atmega1284p/mapping_file_015.rob create mode 100644 test/atmega1284p/mapping_file_016.rob create mode 100644 test/atmega1284p/mapping_file_017.rob create mode 100644 test/atmega1284p/mapping_file_018.rob create mode 100644 test/atmega1284p/mapping_file_019.rob create mode 100644 test/atmega1284p/mapping_file_020.rob create mode 100644 test/atmega1284p/mapping_file_021.rob create mode 100644 test/atmega1284p/mapping_file_022.rob create mode 100644 test/atmega1284p/mapping_file_023.rob create mode 100644 test/atmega1284p/mapping_file_024.rob create mode 100644 test/atmega1284p/mapping_file_025.rob create mode 100644 test/atmega1284p/mapping_file_026.rob create mode 100644 test/atmega1284p/mapping_file_027.rob create mode 100644 test/atmega1284p/mapping_file_028.rob create mode 100644 test/atmega1284p/mapping_file_029.rob create mode 100644 test/atmega1284p/mapping_file_030.rob create mode 100644 test/atmega1284p/mapping_file_031.rob create mode 100644 test/atmega1284p/mapping_file_032.rob create mode 100644 test/atmega1284p/mapping_file_033.rob create mode 100644 test/atmega1284p/mapping_file_034.rob create mode 100644 test/atmega1284p/mapping_file_035.rob create mode 100644 test/atmega1284p/mapping_file_036.rob create mode 100644 test/atmega1284p/mapping_file_037.rob create mode 100644 test/atmega1284p/mapping_file_038.rob create mode 100644 test/atmega1284p/mapping_file_039.rob create mode 100644 test/atmega1284p/mapping_file_040.rob create mode 100644 test/atmega1284p/mapping_file_041.rob create mode 100644 test/atmega1284p/mapping_file_042.rob create mode 100644 test/atmega1284p/mapping_file_043.rob create mode 100644 test/atmega1284p/mapping_file_044.rob create mode 100644 test/atmega1284p/mapping_file_045.rob create mode 100644 test/atmega1284p/mapping_file_046.rob create mode 100644 test/atmega1284p/mapping_file_047.rob create mode 100644 test/atmega1284p/mapping_file_048.rob create mode 100644 test/atmega1284p/mapping_file_049.rob create mode 100644 test/atmega1284p/mapping_file_050.rob create mode 100644 test/atmega1284p/mapping_file_051.rob create mode 100644 test/atmega1284p/mapping_file_052.rob create mode 100644 test/atmega1284p/mapping_file_053.rob create mode 100644 test/atmega1284p/mapping_file_054.rob create mode 100644 test/atmega1284p/mapping_file_055.rob create mode 100644 test/atmega1284p/mapping_file_056.rob create mode 100644 test/atmega1284p/mapping_file_057.rob create mode 100644 test/atmega1284p/mapping_file_058.rob create mode 100644 test/atmega1284p/mapping_file_059.rob create mode 100644 test/atmega1284p/mapping_file_060.rob create mode 100644 test/atmega1284p/mapping_file_061.rob create mode 100644 test/atmega1284p/mapping_file_062.rob create mode 100644 test/atmega1284p/mapping_file_063.rob create mode 100644 test/atmega1284p/mapping_file_064.rob create mode 100644 test/atmega1284p/mapping_file_065.rob create mode 100644 test/atmega1284p/mapping_file_066.rob create mode 100644 test/atmega1284p/mapping_file_067.rob create mode 100644 test/atmega1284p/mapping_file_068.rob create mode 100644 test/atmega1284p/mapping_file_069.rob create mode 100644 test/atmega1284p/mapping_file_070.rob create mode 100644 test/atmega1284p/mapping_file_071.rob create mode 100644 test/atmega1284p/mapping_file_072.rob create mode 100644 test/atmega1284p/mapping_file_073.rob create mode 100644 test/atmega1284p/mapping_file_074.rob create mode 100644 test/atmega1284p/mapping_file_075.rob create mode 100644 test/atmega1284p/mapping_file_076.rob create mode 100644 test/atmega1284p/mapping_file_077.rob create mode 100644 test/atmega1284p/mapping_file_078.rob create mode 100644 test/atmega1284p/mapping_file_079.rob create mode 100644 test/atmega1284p/mapping_file_080.rob create mode 100644 test/atmega1284p/mapping_file_081.rob create mode 100644 test/atmega1284p/mapping_file_082.rob create mode 100644 test/atmega1284p/mapping_file_083.rob create mode 100644 test/atmega1284p/mapping_file_084.rob create mode 100644 test/atmega1284p/mapping_file_085.rob create mode 100644 test/atmega1284p/mapping_file_086.rob create mode 100644 test/atmega1284p/mapping_file_087.rob create mode 100644 test/atmega1284p/mapping_file_088.rob create mode 100644 test/atmega1284p/mapping_file_089.rob create mode 100644 test/atmega1284p/mapping_file_090.rob create mode 100644 test/atmega1284p/mapping_file_091.rob create mode 100644 test/atmega1284p/mapping_file_092.rob create mode 100644 test/atmega1284p/mapping_file_093.rob create mode 100644 test/atmega1284p/mapping_file_094.rob create mode 100644 test/atmega1284p/mapping_file_095.rob create mode 100644 test/atmega1284p/mapping_file_096.rob create mode 100644 test/atmega1284p/mapping_file_097.rob create mode 100644 test/atmega1284p/mapping_file_098.rob create mode 100644 test/atmega1284p/mapping_file_099.rob create mode 100644 test/atmega1284p/mapping_file_100.rob create mode 100644 test/atmega1284p/mapping_file_101.rob create mode 100644 test/atmega1284p/mapping_file_102.rob create mode 100644 test/atmega1284p/mapping_file_103.rob create mode 100644 test/atmega1284p/mapping_file_104.rob create mode 100644 test/atmega1284p/mapping_file_105.rob create mode 100644 test/atmega1284p/mapping_file_106.rob create mode 100644 test/atmega1284p/mapping_file_107.rob create mode 100644 test/atmega1284p/mapping_file_108.rob create mode 100644 test/atmega1284p/mapping_file_109.rob create mode 100644 test/atmega1284p/mapping_file_110.rob create mode 100644 test/atmega1284p/mapping_file_111.rob create mode 100644 test/atmega1284p/mapping_file_112.rob create mode 100644 test/atmega1284p/mapping_file_113.rob create mode 100644 test/atmega1284p/mapping_file_114.rob create mode 100644 test/atmega1284p/mapping_file_115.rob create mode 100644 test/atmega1284p/mapping_file_116.rob create mode 100644 test/atmega1284p/mapping_file_117.rob create mode 100644 test/atmega1284p/mapping_file_118.rob create mode 100644 test/atmega1284p/mapping_file_119.rob create mode 100644 test/atmega1284p/mapping_file_120.rob create mode 100644 test/atmega1284p/mapping_file_121.rob create mode 100644 test/atmega1284p/mapping_file_122.rob create mode 100644 test/atmega1284p/mapping_file_123.rob create mode 100644 test/atmega1284p/mapping_file_124.rob create mode 100644 test/atmega1284p/mapping_file_125.rob create mode 100644 test/atmega1284p/mapping_file_126.rob create mode 100644 test/atmega1284p/mapping_file_127.rob create mode 100644 test/atmega1284p/mapping_file_128.rob create mode 100644 test/atmega1284p/mapping_file_129.rob create mode 100644 test/atmega1284p/mapping_file_130.rob create mode 100644 test/atmega1284p/mapping_file_131.rob create mode 100644 test/atmega1284p/mapping_file_132.rob create mode 100644 test/atmega1284p/mapping_file_133.rob create mode 100644 test/atmega1284p/mapping_file_134.rob create mode 100644 test/atmega1284p/mapping_file_135.rob create mode 100644 test/atmega1284p/mapping_file_136.rob create mode 100644 test/atmega1284p/mapping_file_137.rob create mode 100644 test/atmega1284p/mapping_file_138.rob create mode 100644 test/atmega1284p/mapping_file_139.rob create mode 100644 test/atmega1284p/mapping_file_140.rob create mode 100644 test/atmega1284p/mapping_file_141.rob create mode 100644 test/atmega1284p/mapping_file_142.rob create mode 100644 test/atmega1284p/mapping_file_143.rob create mode 100644 test/atmega1284p/mapping_file_144.rob create mode 100644 test/atmega1284p/mapping_file_145.rob create mode 100644 test/atmega1284p/mapping_file_146.rob create mode 100644 test/atmega1284p/mapping_file_147.rob create mode 100644 test/atmega1284p/mapping_file_148.rob create mode 100644 test/atmega1284p/mapping_file_149.rob create mode 100644 test/atmega1284p/mapping_file_150.rob create mode 100644 test/atmega1284p/mapping_file_151.rob create mode 100644 test/atmega1284p/mapping_file_152.rob create mode 100644 test/atmega1284p/mapping_file_153.rob create mode 100644 test/atmega1284p/mapping_file_154.rob create mode 100644 test/atmega1284p/mapping_file_155.rob create mode 100644 test/atmega1284p/mapping_file_156.rob create mode 100644 test/atmega1284p/mapping_file_157.rob create mode 100644 test/atmega1284p/mapping_file_158.rob create mode 100644 test/atmega1284p/mapping_file_159.rob create mode 100644 test/atmega1284p/mapping_file_160.rob create mode 100644 test/atmega1284p/mapping_file_161.rob create mode 100644 test/atmega1284p/mapping_file_162.rob create mode 100644 test/atmega1284p/mapping_file_163.rob create mode 100644 test/atmega1284p/mapping_file_164.rob create mode 100644 test/atmega1284p/mapping_file_165.rob create mode 100644 test/atmega1284p/mapping_file_166.rob create mode 100644 test/atmega1284p/mapping_file_167.rob create mode 100644 test/atmega1284p/mapping_file_168.rob create mode 100644 test/atmega1284p/mapping_file_169.rob create mode 100644 test/atmega1284p/mapping_file_170.rob create mode 100644 test/atmega1284p/mapping_file_171.rob create mode 100644 test/atmega1284p/mapping_file_172.rob create mode 100644 test/atmega1284p/mapping_file_173.rob create mode 100644 test/atmega1284p/mapping_file_174.rob create mode 100644 test/atmega1284p/mapping_file_175.rob create mode 100644 test/atmega1284p/mapping_file_176.rob create mode 100644 test/atmega1284p/mapping_file_177.rob create mode 100644 test/atmega1284p/mapping_file_178.rob create mode 100644 test/atmega1284p/mapping_file_179.rob create mode 100644 test/atmega1284p/mapping_file_180.rob create mode 100644 test/atmega1284p/mapping_file_181.rob create mode 100644 test/atmega1284p/mapping_file_182.rob create mode 100644 test/atmega1284p/mapping_file_183.rob create mode 100644 test/atmega1284p/mapping_file_184.rob create mode 100644 test/atmega1284p/mapping_file_185.rob create mode 100644 test/atmega1284p/mapping_file_186.rob create mode 100644 test/atmega1284p/mapping_file_187.rob create mode 100644 test/atmega1284p/mapping_file_188.rob create mode 100644 test/atmega1284p/mapping_file_189.rob create mode 100644 test/atmega1284p/mapping_file_190.rob create mode 100644 test/atmega1284p/mapping_file_191.rob create mode 100644 test/atmega1284p/mapping_file_192.rob create mode 100644 test/atmega1284p/mapping_file_193.rob create mode 100644 test/atmega1284p/mapping_file_194.rob create mode 100644 test/atmega1284p/mapping_file_195.rob create mode 100644 test/atmega1284p/mapping_file_196.rob create mode 100644 test/atmega1284p/mapping_file_197.rob create mode 100644 test/atmega1284p/mapping_file_198.rob create mode 100644 test/atmega1284p/mapping_file_199.rob create mode 100644 test/atmega1284p/mapping_file_200.rob create mode 100644 test/atmega1284p/mapping_file_201.rob create mode 100644 test/atmega1284p/mapping_file_202.rob create mode 100644 test/atmega1284p/mapping_file_203.rob create mode 100644 test/atmega1284p/mapping_file_204.rob create mode 100644 test/atmega1284p/mapping_file_205.rob create mode 100644 test/atmega1284p/mapping_file_206.rob create mode 100644 test/atmega1284p/mapping_file_207.rob create mode 100644 test/atmega1284p/mapping_file_208.rob create mode 100644 test/atmega1284p/mapping_file_209.rob create mode 100644 test/atmega1284p/mapping_file_210.rob create mode 100644 test/atmega1284p/mapping_file_211.rob create mode 100644 test/atmega1284p/mapping_file_212.rob create mode 100644 test/atmega1284p/mapping_file_213.rob create mode 100644 test/atmega1284p/mapping_file_214.rob create mode 100644 test/atmega1284p/mapping_file_215.rob create mode 100644 test/atmega1284p/mapping_file_216.rob create mode 100644 test/atmega1284p/mapping_file_217.rob create mode 100644 test/atmega1284p/mapping_file_218.rob create mode 100644 test/atmega1284p/mapping_file_219.rob create mode 100644 test/atmega1284p/mapping_file_220.rob create mode 100644 test/atmega1284p/mapping_file_221.rob create mode 100644 test/atmega1284p/mapping_file_222.rob create mode 100755 test/atmega1284p/out/string-len mode change 120000 => 100755 test/atmega1284p/runtest.sh create mode 120000 test/atmega1284p/runtestold.sh mode change 120000 => 100755 test/atmega1284p/runtrace.sh create mode 120000 test/atmega1284p/runtraceold.sh create mode 100644 test/atmega1284p/string-contains.rob create mode 100644 test/atmega1284p/string-equal.rob rename test/{atmega328p/string-utf8len.rob => atmega1284p/string-len.rob} (79%) create mode 100755 test/atmega1284p/timetest.sh rename test/{general/string-utf8len.rob => atmega328p/string-len.rob} (97%) delete mode 100644 test/atmega328p/string-upperstr.rob delete mode 100644 test/general/a.rob create mode 100644 test/general/string-len.rob diff --git a/lib/Makefile b/lib/Makefile index 47bf19a..ce47e4a 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -5,13 +5,13 @@ all: ${GEN} avr5.o: avr5.S @#here we are interested in the fastest possible code, intead of size - @#avr-gcc -mmcu=avr5 -O3 -c $< - clang --target=avr -mmcu=avr5 -O3 -c $< + avr-gcc -mmcu=avr5 -O3 -c $< + @#clang --target=avr -mmcu=avr5 -O3 -c $< avr51.o: avr51.S @#here we are interested in the fastest possible code, intead of size - @#avr-gcc -mmcu=avr5 -O3 -c $< - clang --target=avr -mmcu=avr51 -O3 -c $< + avr-gcc -mmcu=avr51 -O3 -c $< + @#clang --target=avr -mmcu=avr51 -O3 -c $< cortex-m3-arm-missing.o: arm-missing.c clang --target=arm-none-eabi -mcpu=cortex-m3 -mthumb -O3 -c $< -o $@ diff --git a/lib/string/contains.rob b/lib/string/containsstr.rob similarity index 100% rename from lib/string/contains.rob rename to lib/string/containsstr.rob diff --git a/lib/string/equalstr.rob b/lib/string/equalstr.rob index 0f0278e..9b27140 100644 --- a/lib/string/equalstr.rob +++ b/lib/string/equalstr.rob @@ -1,4 +1,4 @@ -use string.utf8strlen; +use string.lenstr; bool equalstr(char[] s1, char[] s2) { @@ -10,8 +10,8 @@ bool equalstr(char[] s1, char[] s2) { i++; } - str1 = utf8strlen(s1); - str2 = utf8strlen(s2); + str1 = lenstr(s1); + str2 = lenstr(s2); if str1 == str2 { return true; } else { diff --git a/lib/string/utf8strlen.rob b/lib/string/lenstr.rob similarity index 86% rename from lib/string/utf8strlen.rob rename to lib/string/lenstr.rob index bd355b0..926dd56 100644 --- a/lib/string/utf8strlen.rob +++ b/lib/string/lenstr.rob @@ -1,4 +1,4 @@ -int16 utf8strlen(char[] s) { +int16 lenstr(char[] s) { length = int16 (0); i = int16 (0); diff --git a/lib/string/upperstr.rob b/lib/string/upperlowerstr.rob similarity index 95% rename from lib/string/upperstr.rob rename to lib/string/upperlowerstr.rob index 11b052c..880afca 100644 --- a/lib/string/upperstr.rob +++ b/lib/string/upperlowerstr.rob @@ -82,7 +82,14 @@ mapping = { 0x012B, 0x012A , 0x012D, 0x012C , 0x012F, 0x012E , - 0x0131, 0x0049 , + /* + 0x0131, 0x0049 , Characters "ı", "I". First character is the latin character "i" + whithout the dot named "LATIN SMALL LETTER DOTLESS I" a two byte UTF-8 character. This + character has no specific uppercase variant, so the conventional one byte "I" LATIN + CAPITAL LETTER I, was placed in the mapping as the uppercase variant. The lowercase + character "ı" can be converted normaly to uppercase "I", but the uppercase "I" can't be + converted to lowercase because it conflicts with the "i" and "I" characters mapped in line 12. + */ 0x0133, 0x0132 , 0x0135, 0x0134 , 0x0137, 0x0136 , @@ -678,13 +685,13 @@ mapping = { c.code = s[i]; return 1; // 1 byte } else if ((s[i] & 0xE0) == 0xC0) { - c.code = ((s[i] & 0x1F) << 6) | (s[1] & 0x3F); + c.code = ((s[i] & 0x1F) << 6) | (s[i+1] & 0x3F); return 2; // 2 bytes } else if ((s[i] & 0xF0) == 0xE0) { - c.code = ((s[i] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F); + c.code = ((s[i] & 0x0F) << 12) | ((s[i+1] & 0x3F) << 6) | (s[i+2] & 0x3F); return 3; // 3 bytes } else if ((s[i] & 0xF8) == 0xF0) { - c.code = ((s[i] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F); + c.code = ((s[i] & 0x07) << 18) | ((s[i+1] & 0x3F) << 12) | ((s[i+2] & 0x3F) << 6) | (s[i+3] & 0x3F); return 4; // 4 bytes } return -1; @@ -755,7 +762,7 @@ mapping = { } - void utf8_string_to_uppercase(char[] str) { + void strtouppercase(char[] str) { p = uint16 (0); w = uint16 (0); output = {0:4}; @@ -780,7 +787,7 @@ mapping = { } } - void utf8_string_to_lowercase(char[] str) { + void strtolowercase(char[] str) { p = uint16 (0); w = uint16 (0); output = {0:4}; diff --git a/test/atmega1284p/Makefile b/test/atmega1284p/Makefile index 787aa4b..84a2645 100644 --- a/test/atmega1284p/Makefile +++ b/test/atmega1284p/Makefile @@ -1,6 +1,7 @@ ALL=$(patsubst %.rob,out/%,$(wildcard *.rob)) ALL_LL=$(patsubst %.rob,out/%.ll,$(wildcard *.rob)) ALL_TT=$(patsubst %.rob,%.tt,$(wildcard *.rob)) +ALL_TIME=$(patsubst %.rob,%.time,$(wildcard *.rob)) ALL_OO=$(patsubst %.rob,out/%.o,$(wildcard *.rob)) out/atmega1284p.o ROBCMP=../../build/robcmp @@ -21,6 +22,8 @@ LINK_DEPENDS=out/atmega1284p.o all: out test +time: out time + out: mkdir -p out @@ -40,6 +43,9 @@ out/%.ll : %.rob ${DEPENDS} %.tt : %.rob ${DEPENDS} @-./runtest.sh $< $(patsubst %.rob,out/%,$<) +%.time : %.rob ${DEPENDS} clean + @-./timetest.sh $< $(patsubst %.rob,out/%,$<) + out/% : out/%.o ${LINK_DEPENDS} # exchange here if ld.lld show relocation errors ld.lld ${LD_FLAGS} $^ -o $@ @@ -47,6 +53,11 @@ out/% : out/%.o ${LINK_DEPENDS} test: ${ALL_TT} +time: ${ALL_TIME} + +size: + avr-size out/*.o + clean: @rm -f ${ALL} ${ALL_LL} ${ALL_OO} diff --git a/test/atmega1284p/mapping_file_001.rob b/test/atmega1284p/mapping_file_001.rob new file mode 100644 index 0000000..6472a10 --- /dev/null +++ b/test/atmega1284p/mapping_file_001.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "aώḹ"; + ou_str = "AΏḸ"; + l_str = "aώḹ"; + u_str = "AΏḸ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/atmega1284p/mapping_file_002.rob b/test/atmega1284p/mapping_file_002.rob new file mode 100644 index 0000000..e33ea56 --- /dev/null +++ b/test/atmega1284p/mapping_file_002.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "bϣḻ"; + ou_str = "BϢḺ"; + l_str = "bϣḻ"; + u_str = "BϢḺ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_003.rob b/test/atmega1284p/mapping_file_003.rob new file mode 100644 index 0000000..241af12 --- /dev/null +++ b/test/atmega1284p/mapping_file_003.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "cϥḽ"; + ou_str = "CϤḼ"; + l_str = "cϥḽ"; + u_str = "CϤḼ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_004.rob b/test/atmega1284p/mapping_file_004.rob new file mode 100644 index 0000000..bdb1506 --- /dev/null +++ b/test/atmega1284p/mapping_file_004.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "dϧḿ"; + ou_str = "DϦḾ"; + l_str = "dϧḿ"; + u_str = "DϦḾ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_005.rob b/test/atmega1284p/mapping_file_005.rob new file mode 100644 index 0000000..b49e4a0 --- /dev/null +++ b/test/atmega1284p/mapping_file_005.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "eϩṁ"; + ou_str = "EϨṀ"; + l_str = "eϩṁ"; + u_str = "EϨṀ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_006.rob b/test/atmega1284p/mapping_file_006.rob new file mode 100644 index 0000000..e38f467 --- /dev/null +++ b/test/atmega1284p/mapping_file_006.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "fϫṃ"; + ou_str = "FϪṂ"; + l_str = "fϫṃ"; + u_str = "FϪṂ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_007.rob b/test/atmega1284p/mapping_file_007.rob new file mode 100644 index 0000000..8ed0965 --- /dev/null +++ b/test/atmega1284p/mapping_file_007.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "gϭṅ"; + ou_str = "GϬṄ"; + l_str = "gϭṅ"; + u_str = "GϬṄ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_008.rob b/test/atmega1284p/mapping_file_008.rob new file mode 100644 index 0000000..2e6cbab --- /dev/null +++ b/test/atmega1284p/mapping_file_008.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "hϯṇ"; + ou_str = "HϮṆ"; + l_str = "hϯṇ"; + u_str = "HϮṆ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_009.rob b/test/atmega1284p/mapping_file_009.rob new file mode 100644 index 0000000..e587d16 --- /dev/null +++ b/test/atmega1284p/mapping_file_009.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "iаṉ"; + ou_str = "IАṈ"; + l_str = "iаṉ"; + u_str = "IАṈ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_010.rob b/test/atmega1284p/mapping_file_010.rob new file mode 100644 index 0000000..6757647 --- /dev/null +++ b/test/atmega1284p/mapping_file_010.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "jбṋ"; + ou_str = "JБṊ"; + l_str = "jбṋ"; + u_str = "JБṊ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_011.rob b/test/atmega1284p/mapping_file_011.rob new file mode 100644 index 0000000..90fa418 --- /dev/null +++ b/test/atmega1284p/mapping_file_011.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "kвṍ"; + ou_str = "KВṌ"; + l_str = "kвṍ"; + u_str = "KВṌ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_012.rob b/test/atmega1284p/mapping_file_012.rob new file mode 100644 index 0000000..1eee446 --- /dev/null +++ b/test/atmega1284p/mapping_file_012.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "lгṏ"; + ou_str = "LГṎ"; + l_str = "lгṏ"; + u_str = "LГṎ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_013.rob b/test/atmega1284p/mapping_file_013.rob new file mode 100644 index 0000000..b323694 --- /dev/null +++ b/test/atmega1284p/mapping_file_013.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "mдṑ"; + ou_str = "MДṐ"; + l_str = "mдṑ"; + u_str = "MДṐ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_014.rob b/test/atmega1284p/mapping_file_014.rob new file mode 100644 index 0000000..e9507c4 --- /dev/null +++ b/test/atmega1284p/mapping_file_014.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "nеṓ"; + ou_str = "NЕṒ"; + l_str = "nеṓ"; + u_str = "NЕṒ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_015.rob b/test/atmega1284p/mapping_file_015.rob new file mode 100644 index 0000000..49296f0 --- /dev/null +++ b/test/atmega1284p/mapping_file_015.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "oжṕ"; + ou_str = "OЖṔ"; + l_str = "oжṕ"; + u_str = "OЖṔ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_016.rob b/test/atmega1284p/mapping_file_016.rob new file mode 100644 index 0000000..f3a6526 --- /dev/null +++ b/test/atmega1284p/mapping_file_016.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "pзṗ"; + ou_str = "PЗṖ"; + l_str = "pзṗ"; + u_str = "PЗṖ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_017.rob b/test/atmega1284p/mapping_file_017.rob new file mode 100644 index 0000000..a6f0db6 --- /dev/null +++ b/test/atmega1284p/mapping_file_017.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "qиṙ"; + ou_str = "QИṘ"; + l_str = "qиṙ"; + u_str = "QИṘ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_018.rob b/test/atmega1284p/mapping_file_018.rob new file mode 100644 index 0000000..a81618e --- /dev/null +++ b/test/atmega1284p/mapping_file_018.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "rйṛ"; + ou_str = "RЙṚ"; + l_str = "rйṛ"; + u_str = "RЙṚ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_019.rob b/test/atmega1284p/mapping_file_019.rob new file mode 100644 index 0000000..cac18ec --- /dev/null +++ b/test/atmega1284p/mapping_file_019.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "sкṝ"; + ou_str = "SКṜ"; + l_str = "sкṝ"; + u_str = "SКṜ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_020.rob b/test/atmega1284p/mapping_file_020.rob new file mode 100644 index 0000000..6268d2c --- /dev/null +++ b/test/atmega1284p/mapping_file_020.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "tлṟ"; + ou_str = "TЛṞ"; + l_str = "tлṟ"; + u_str = "TЛṞ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_021.rob b/test/atmega1284p/mapping_file_021.rob new file mode 100644 index 0000000..ac6cc00 --- /dev/null +++ b/test/atmega1284p/mapping_file_021.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "uмṡ"; + ou_str = "UМṠ"; + l_str = "uмṡ"; + u_str = "UМṠ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_022.rob b/test/atmega1284p/mapping_file_022.rob new file mode 100644 index 0000000..1d5d1ed --- /dev/null +++ b/test/atmega1284p/mapping_file_022.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "vнṣ"; + ou_str = "VНṢ"; + l_str = "vнṣ"; + u_str = "VНṢ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_023.rob b/test/atmega1284p/mapping_file_023.rob new file mode 100644 index 0000000..ca07151 --- /dev/null +++ b/test/atmega1284p/mapping_file_023.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "wоṥ"; + ou_str = "WОṤ"; + l_str = "wоṥ"; + u_str = "WОṤ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_024.rob b/test/atmega1284p/mapping_file_024.rob new file mode 100644 index 0000000..f43732f --- /dev/null +++ b/test/atmega1284p/mapping_file_024.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "xпṧ"; + ou_str = "XПṦ"; + l_str = "xпṧ"; + u_str = "XПṦ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_025.rob b/test/atmega1284p/mapping_file_025.rob new file mode 100644 index 0000000..6244286 --- /dev/null +++ b/test/atmega1284p/mapping_file_025.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "yрṩ"; + ou_str = "YРṨ"; + l_str = "yрṩ"; + u_str = "YРṨ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_026.rob b/test/atmega1284p/mapping_file_026.rob new file mode 100644 index 0000000..ab6395c --- /dev/null +++ b/test/atmega1284p/mapping_file_026.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "zсṫ"; + ou_str = "ZСṪ"; + l_str = "zсṫ"; + u_str = "ZСṪ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_027.rob b/test/atmega1284p/mapping_file_027.rob new file mode 100644 index 0000000..739fac0 --- /dev/null +++ b/test/atmega1284p/mapping_file_027.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "àтṭ"; + ou_str = "ÀТṬ"; + l_str = "àтṭ"; + u_str = "ÀТṬ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_028.rob b/test/atmega1284p/mapping_file_028.rob new file mode 100644 index 0000000..f52b0a2 --- /dev/null +++ b/test/atmega1284p/mapping_file_028.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "áуṯ"; + ou_str = "ÁУṮ"; + l_str = "áуṯ"; + u_str = "ÁУṮ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_029.rob b/test/atmega1284p/mapping_file_029.rob new file mode 100644 index 0000000..e73b241 --- /dev/null +++ b/test/atmega1284p/mapping_file_029.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "âфṱ"; + ou_str = "ÂФṰ"; + l_str = "âфṱ"; + u_str = "ÂФṰ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_030.rob b/test/atmega1284p/mapping_file_030.rob new file mode 100644 index 0000000..159021d --- /dev/null +++ b/test/atmega1284p/mapping_file_030.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ãхṳ"; + ou_str = "ÃХṲ"; + l_str = "ãхṳ"; + u_str = "ÃХṲ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_031.rob b/test/atmega1284p/mapping_file_031.rob new file mode 100644 index 0000000..8930a59 --- /dev/null +++ b/test/atmega1284p/mapping_file_031.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "äцṵ"; + ou_str = "ÄЦṴ"; + l_str = "äцṵ"; + u_str = "ÄЦṴ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_032.rob b/test/atmega1284p/mapping_file_032.rob new file mode 100644 index 0000000..e224e1a --- /dev/null +++ b/test/atmega1284p/mapping_file_032.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "åчṷ"; + ou_str = "ÅЧṶ"; + l_str = "åчṷ"; + u_str = "ÅЧṶ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_033.rob b/test/atmega1284p/mapping_file_033.rob new file mode 100644 index 0000000..9f5cab2 --- /dev/null +++ b/test/atmega1284p/mapping_file_033.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "æшṹ"; + ou_str = "ÆШṸ"; + l_str = "æшṹ"; + u_str = "ÆШṸ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_034.rob b/test/atmega1284p/mapping_file_034.rob new file mode 100644 index 0000000..05f8e14 --- /dev/null +++ b/test/atmega1284p/mapping_file_034.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "çщṻ"; + ou_str = "ÇЩṺ"; + l_str = "çщṻ"; + u_str = "ÇЩṺ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_035.rob b/test/atmega1284p/mapping_file_035.rob new file mode 100644 index 0000000..3ca1dad --- /dev/null +++ b/test/atmega1284p/mapping_file_035.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "èъṽ"; + ou_str = "ÈЪṼ"; + l_str = "èъṽ"; + u_str = "ÈЪṼ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_036.rob b/test/atmega1284p/mapping_file_036.rob new file mode 100644 index 0000000..9eec332 --- /dev/null +++ b/test/atmega1284p/mapping_file_036.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "éыṿ"; + ou_str = "ÉЫṾ"; + l_str = "éыṿ"; + u_str = "ÉЫṾ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_037.rob b/test/atmega1284p/mapping_file_037.rob new file mode 100644 index 0000000..2328864 --- /dev/null +++ b/test/atmega1284p/mapping_file_037.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "êьẁ"; + ou_str = "ÊЬẀ"; + l_str = "êьẁ"; + u_str = "ÊЬẀ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_038.rob b/test/atmega1284p/mapping_file_038.rob new file mode 100644 index 0000000..3a0babe --- /dev/null +++ b/test/atmega1284p/mapping_file_038.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ëэẃ"; + ou_str = "ËЭẂ"; + l_str = "ëэẃ"; + u_str = "ËЭẂ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_039.rob b/test/atmega1284p/mapping_file_039.rob new file mode 100644 index 0000000..91fbb93 --- /dev/null +++ b/test/atmega1284p/mapping_file_039.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ìюẅ"; + ou_str = "ÌЮẄ"; + l_str = "ìюẅ"; + u_str = "ÌЮẄ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_040.rob b/test/atmega1284p/mapping_file_040.rob new file mode 100644 index 0000000..7bff3bd --- /dev/null +++ b/test/atmega1284p/mapping_file_040.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "íяẇ"; + ou_str = "ÍЯẆ"; + l_str = "íяẇ"; + u_str = "ÍЯẆ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_041.rob b/test/atmega1284p/mapping_file_041.rob new file mode 100644 index 0000000..df00d6e --- /dev/null +++ b/test/atmega1284p/mapping_file_041.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "îёẉ"; + ou_str = "ÎЁẈ"; + l_str = "îёẉ"; + u_str = "ÎЁẈ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_042.rob b/test/atmega1284p/mapping_file_042.rob new file mode 100644 index 0000000..82c8ba3 --- /dev/null +++ b/test/atmega1284p/mapping_file_042.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ïђẋ"; + ou_str = "ÏЂẊ"; + l_str = "ïђẋ"; + u_str = "ÏЂẊ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_043.rob b/test/atmega1284p/mapping_file_043.rob new file mode 100644 index 0000000..e5257a4 --- /dev/null +++ b/test/atmega1284p/mapping_file_043.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ðѓẍ"; + ou_str = "ÐЃẌ"; + l_str = "ðѓẍ"; + u_str = "ÐЃẌ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_044.rob b/test/atmega1284p/mapping_file_044.rob new file mode 100644 index 0000000..bbe8412 --- /dev/null +++ b/test/atmega1284p/mapping_file_044.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ñєẏ"; + ou_str = "ÑЄẎ"; + l_str = "ñєẏ"; + u_str = "ÑЄẎ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_045.rob b/test/atmega1284p/mapping_file_045.rob new file mode 100644 index 0000000..d8084cc --- /dev/null +++ b/test/atmega1284p/mapping_file_045.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "òѕẑ"; + ou_str = "ÒЅẐ"; + l_str = "òѕẑ"; + u_str = "ÒЅẐ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_046.rob b/test/atmega1284p/mapping_file_046.rob new file mode 100644 index 0000000..2370cc6 --- /dev/null +++ b/test/atmega1284p/mapping_file_046.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "óіẓ"; + ou_str = "ÓІẒ"; + l_str = "óіẓ"; + u_str = "ÓІẒ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_047.rob b/test/atmega1284p/mapping_file_047.rob new file mode 100644 index 0000000..67529a2 --- /dev/null +++ b/test/atmega1284p/mapping_file_047.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ôїẕ"; + ou_str = "ÔЇẔ"; + l_str = "ôїẕ"; + u_str = "ÔЇẔ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_048.rob b/test/atmega1284p/mapping_file_048.rob new file mode 100644 index 0000000..6bbbe92 --- /dev/null +++ b/test/atmega1284p/mapping_file_048.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "õјạ"; + ou_str = "ÕЈẠ"; + l_str = "õјạ"; + u_str = "ÕЈẠ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_049.rob b/test/atmega1284p/mapping_file_049.rob new file mode 100644 index 0000000..8f5f338 --- /dev/null +++ b/test/atmega1284p/mapping_file_049.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "öљả"; + ou_str = "ÖЉẢ"; + l_str = "öљả"; + u_str = "ÖЉẢ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_050.rob b/test/atmega1284p/mapping_file_050.rob new file mode 100644 index 0000000..c718088 --- /dev/null +++ b/test/atmega1284p/mapping_file_050.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "øњấ"; + ou_str = "ØЊẤ"; + l_str = "øњấ"; + u_str = "ØЊẤ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_051.rob b/test/atmega1284p/mapping_file_051.rob new file mode 100644 index 0000000..dbf2fe4 --- /dev/null +++ b/test/atmega1284p/mapping_file_051.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ùћầ"; + ou_str = "ÙЋẦ"; + l_str = "ùћầ"; + u_str = "ÙЋẦ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_052.rob b/test/atmega1284p/mapping_file_052.rob new file mode 100644 index 0000000..d7f87e1 --- /dev/null +++ b/test/atmega1284p/mapping_file_052.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "úќẩ"; + ou_str = "ÚЌẨ"; + l_str = "úќẩ"; + u_str = "ÚЌẨ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_053.rob b/test/atmega1284p/mapping_file_053.rob new file mode 100644 index 0000000..9532248 --- /dev/null +++ b/test/atmega1284p/mapping_file_053.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ûўẫ"; + ou_str = "ÛЎẪ"; + l_str = "ûўẫ"; + u_str = "ÛЎẪ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_054.rob b/test/atmega1284p/mapping_file_054.rob new file mode 100644 index 0000000..308534b --- /dev/null +++ b/test/atmega1284p/mapping_file_054.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "üџậ"; + ou_str = "ÜЏẬ"; + l_str = "üџậ"; + u_str = "ÜЏẬ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_055.rob b/test/atmega1284p/mapping_file_055.rob new file mode 100644 index 0000000..112949a --- /dev/null +++ b/test/atmega1284p/mapping_file_055.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ýѡắ"; + ou_str = "ÝѠẮ"; + l_str = "ýѡắ"; + u_str = "ÝѠẮ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_056.rob b/test/atmega1284p/mapping_file_056.rob new file mode 100644 index 0000000..3c8e12f --- /dev/null +++ b/test/atmega1284p/mapping_file_056.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "þѣằ"; + ou_str = "ÞѢẰ"; + l_str = "þѣằ"; + u_str = "ÞѢẰ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_057.rob b/test/atmega1284p/mapping_file_057.rob new file mode 100644 index 0000000..5e56592 --- /dev/null +++ b/test/atmega1284p/mapping_file_057.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ÿѥẳ"; + ou_str = "ŸѤẲ"; + l_str = "ÿѥẳ"; + u_str = "ŸѤẲ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_058.rob b/test/atmega1284p/mapping_file_058.rob new file mode 100644 index 0000000..f67ce13 --- /dev/null +++ b/test/atmega1284p/mapping_file_058.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "āѧẵ"; + ou_str = "ĀѦẴ"; + l_str = "āѧẵ"; + u_str = "ĀѦẴ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_059.rob b/test/atmega1284p/mapping_file_059.rob new file mode 100644 index 0000000..edc1f4d --- /dev/null +++ b/test/atmega1284p/mapping_file_059.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ăѩặ"; + ou_str = "ĂѨẶ"; + l_str = "ăѩặ"; + u_str = "ĂѨẶ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_060.rob b/test/atmega1284p/mapping_file_060.rob new file mode 100644 index 0000000..13232f7 --- /dev/null +++ b/test/atmega1284p/mapping_file_060.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ąѫẹ"; + ou_str = "ĄѪẸ"; + l_str = "ąѫẹ"; + u_str = "ĄѪẸ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_061.rob b/test/atmega1284p/mapping_file_061.rob new file mode 100644 index 0000000..af1edf7 --- /dev/null +++ b/test/atmega1284p/mapping_file_061.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ćѭẻ"; + ou_str = "ĆѬẺ"; + l_str = "ćѭẻ"; + u_str = "ĆѬẺ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_062.rob b/test/atmega1284p/mapping_file_062.rob new file mode 100644 index 0000000..7da0d39 --- /dev/null +++ b/test/atmega1284p/mapping_file_062.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ĉѯẽ"; + ou_str = "ĈѮẼ"; + l_str = "ĉѯẽ"; + u_str = "ĈѮẼ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_063.rob b/test/atmega1284p/mapping_file_063.rob new file mode 100644 index 0000000..56cb9f8 --- /dev/null +++ b/test/atmega1284p/mapping_file_063.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ċѱế"; + ou_str = "ĊѰẾ"; + l_str = "ċѱế"; + u_str = "ĊѰẾ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_064.rob b/test/atmega1284p/mapping_file_064.rob new file mode 100644 index 0000000..aac29f8 --- /dev/null +++ b/test/atmega1284p/mapping_file_064.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "čѳề"; + ou_str = "ČѲỀ"; + l_str = "čѳề"; + u_str = "ČѲỀ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_065.rob b/test/atmega1284p/mapping_file_065.rob new file mode 100644 index 0000000..852459b --- /dev/null +++ b/test/atmega1284p/mapping_file_065.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ďѵể"; + ou_str = "ĎѴỂ"; + l_str = "ďѵể"; + u_str = "ĎѴỂ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_066.rob b/test/atmega1284p/mapping_file_066.rob new file mode 100644 index 0000000..2029afe --- /dev/null +++ b/test/atmega1284p/mapping_file_066.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "đѷễ"; + ou_str = "ĐѶỄ"; + l_str = "đѷễ"; + u_str = "ĐѶỄ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_067.rob b/test/atmega1284p/mapping_file_067.rob new file mode 100644 index 0000000..a491f92 --- /dev/null +++ b/test/atmega1284p/mapping_file_067.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ēѹệ"; + ou_str = "ĒѸỆ"; + l_str = "ēѹệ"; + u_str = "ĒѸỆ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_068.rob b/test/atmega1284p/mapping_file_068.rob new file mode 100644 index 0000000..5b7a5b4 --- /dev/null +++ b/test/atmega1284p/mapping_file_068.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ĕѻỉ"; + ou_str = "ĔѺỈ"; + l_str = "ĕѻỉ"; + u_str = "ĔѺỈ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_069.rob b/test/atmega1284p/mapping_file_069.rob new file mode 100644 index 0000000..e60aa34 --- /dev/null +++ b/test/atmega1284p/mapping_file_069.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ėѽị"; + ou_str = "ĖѼỊ"; + l_str = "ėѽị"; + u_str = "ĖѼỊ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_070.rob b/test/atmega1284p/mapping_file_070.rob new file mode 100644 index 0000000..7e53085 --- /dev/null +++ b/test/atmega1284p/mapping_file_070.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ęѿọ"; + ou_str = "ĘѾỌ"; + l_str = "ęѿọ"; + u_str = "ĘѾỌ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_071.rob b/test/atmega1284p/mapping_file_071.rob new file mode 100644 index 0000000..4597adc --- /dev/null +++ b/test/atmega1284p/mapping_file_071.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ěҁỏ"; + ou_str = "ĚҀỎ"; + l_str = "ěҁỏ"; + u_str = "ĚҀỎ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_072.rob b/test/atmega1284p/mapping_file_072.rob new file mode 100644 index 0000000..894ee4b --- /dev/null +++ b/test/atmega1284p/mapping_file_072.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ĝґố"; + ou_str = "ĜҐỐ"; + l_str = "ĝґố"; + u_str = "ĜҐỐ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_073.rob b/test/atmega1284p/mapping_file_073.rob new file mode 100644 index 0000000..86e536d --- /dev/null +++ b/test/atmega1284p/mapping_file_073.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ğғồ"; + ou_str = "ĞҒỒ"; + l_str = "ğғồ"; + u_str = "ĞҒỒ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_074.rob b/test/atmega1284p/mapping_file_074.rob new file mode 100644 index 0000000..027c84a --- /dev/null +++ b/test/atmega1284p/mapping_file_074.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ġҕổ"; + ou_str = "ĠҔỔ"; + l_str = "ġҕổ"; + u_str = "ĠҔỔ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_075.rob b/test/atmega1284p/mapping_file_075.rob new file mode 100644 index 0000000..dd60d93 --- /dev/null +++ b/test/atmega1284p/mapping_file_075.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ģҗỗ"; + ou_str = "ĢҖỖ"; + l_str = "ģҗỗ"; + u_str = "ĢҖỖ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_076.rob b/test/atmega1284p/mapping_file_076.rob new file mode 100644 index 0000000..f1984e9 --- /dev/null +++ b/test/atmega1284p/mapping_file_076.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ĥҙộ"; + ou_str = "ĤҘỘ"; + l_str = "ĥҙộ"; + u_str = "ĤҘỘ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_077.rob b/test/atmega1284p/mapping_file_077.rob new file mode 100644 index 0000000..04d9ca2 --- /dev/null +++ b/test/atmega1284p/mapping_file_077.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ħқớ"; + ou_str = "ĦҚỚ"; + l_str = "ħқớ"; + u_str = "ĦҚỚ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_078.rob b/test/atmega1284p/mapping_file_078.rob new file mode 100644 index 0000000..50da832 --- /dev/null +++ b/test/atmega1284p/mapping_file_078.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ĩҝờ"; + ou_str = "ĨҜỜ"; + l_str = "ĩҝờ"; + u_str = "ĨҜỜ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_079.rob b/test/atmega1284p/mapping_file_079.rob new file mode 100644 index 0000000..232bb94 --- /dev/null +++ b/test/atmega1284p/mapping_file_079.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "īҟở"; + ou_str = "ĪҞỞ"; + l_str = "īҟở"; + u_str = "ĪҞỞ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_080.rob b/test/atmega1284p/mapping_file_080.rob new file mode 100644 index 0000000..78f5182 --- /dev/null +++ b/test/atmega1284p/mapping_file_080.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ĭҡỡ"; + ou_str = "ĬҠỠ"; + l_str = "ĭҡỡ"; + u_str = "ĬҠỠ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_081.rob b/test/atmega1284p/mapping_file_081.rob new file mode 100644 index 0000000..5f81ea6 --- /dev/null +++ b/test/atmega1284p/mapping_file_081.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "įңợ"; + ou_str = "ĮҢỢ"; + l_str = "įңợ"; + u_str = "ĮҢỢ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_082.rob b/test/atmega1284p/mapping_file_082.rob new file mode 100644 index 0000000..d125136 --- /dev/null +++ b/test/atmega1284p/mapping_file_082.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ıҥụ"; + ou_str = "IҤỤ"; + l_str = "ıҥụ"; + u_str = "IҤỤ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_083.rob b/test/atmega1284p/mapping_file_083.rob new file mode 100644 index 0000000..35913b6 --- /dev/null +++ b/test/atmega1284p/mapping_file_083.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ijҧủ"; + ou_str = "IJҦỦ"; + l_str = "ijҧủ"; + u_str = "IJҦỦ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_084.rob b/test/atmega1284p/mapping_file_084.rob new file mode 100644 index 0000000..c235866 --- /dev/null +++ b/test/atmega1284p/mapping_file_084.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ĵҩứ"; + ou_str = "ĴҨỨ"; + l_str = "ĵҩứ"; + u_str = "ĴҨỨ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_085.rob b/test/atmega1284p/mapping_file_085.rob new file mode 100644 index 0000000..9edafb5 --- /dev/null +++ b/test/atmega1284p/mapping_file_085.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ķҫừ"; + ou_str = "ĶҪỪ"; + l_str = "ķҫừ"; + u_str = "ĶҪỪ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_086.rob b/test/atmega1284p/mapping_file_086.rob new file mode 100644 index 0000000..a4269e7 --- /dev/null +++ b/test/atmega1284p/mapping_file_086.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ĺҭử"; + ou_str = "ĹҬỬ"; + l_str = "ĺҭử"; + u_str = "ĹҬỬ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_087.rob b/test/atmega1284p/mapping_file_087.rob new file mode 100644 index 0000000..863cae2 --- /dev/null +++ b/test/atmega1284p/mapping_file_087.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ļүữ"; + ou_str = "ĻҮỮ"; + l_str = "ļүữ"; + u_str = "ĻҮỮ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_088.rob b/test/atmega1284p/mapping_file_088.rob new file mode 100644 index 0000000..436cf4c --- /dev/null +++ b/test/atmega1284p/mapping_file_088.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ľұự"; + ou_str = "ĽҰỰ"; + l_str = "ľұự"; + u_str = "ĽҰỰ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_089.rob b/test/atmega1284p/mapping_file_089.rob new file mode 100644 index 0000000..8c4f128 --- /dev/null +++ b/test/atmega1284p/mapping_file_089.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŀҳỳ"; + ou_str = "ĿҲỲ"; + l_str = "ŀҳỳ"; + u_str = "ĿҲỲ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_090.rob b/test/atmega1284p/mapping_file_090.rob new file mode 100644 index 0000000..461cd45 --- /dev/null +++ b/test/atmega1284p/mapping_file_090.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "łҵỵ"; + ou_str = "ŁҴỴ"; + l_str = "łҵỵ"; + u_str = "ŁҴỴ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_091.rob b/test/atmega1284p/mapping_file_091.rob new file mode 100644 index 0000000..7315ba7 --- /dev/null +++ b/test/atmega1284p/mapping_file_091.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ńҷỷ"; + ou_str = "ŃҶỶ"; + l_str = "ńҷỷ"; + u_str = "ŃҶỶ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_092.rob b/test/atmega1284p/mapping_file_092.rob new file mode 100644 index 0000000..bfab0ab --- /dev/null +++ b/test/atmega1284p/mapping_file_092.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ņҹỹ"; + ou_str = "ŅҸỸ"; + l_str = "ņҹỹ"; + u_str = "ŅҸỸ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_093.rob b/test/atmega1284p/mapping_file_093.rob new file mode 100644 index 0000000..4acdcbd --- /dev/null +++ b/test/atmega1284p/mapping_file_093.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ňһἀ"; + ou_str = "ŇҺἈ"; + l_str = "ňһἀ"; + u_str = "ŇҺἈ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_094.rob b/test/atmega1284p/mapping_file_094.rob new file mode 100644 index 0000000..a4b920b --- /dev/null +++ b/test/atmega1284p/mapping_file_094.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŋҽἁ"; + ou_str = "ŊҼἉ"; + l_str = "ŋҽἁ"; + u_str = "ŊҼἉ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_095.rob b/test/atmega1284p/mapping_file_095.rob new file mode 100644 index 0000000..6bbe5fa --- /dev/null +++ b/test/atmega1284p/mapping_file_095.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ōҿἂ"; + ou_str = "ŌҾἊ"; + l_str = "ōҿἂ"; + u_str = "ŌҾἊ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_096.rob b/test/atmega1284p/mapping_file_096.rob new file mode 100644 index 0000000..0b2945f --- /dev/null +++ b/test/atmega1284p/mapping_file_096.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŏӂἃ"; + ou_str = "ŎӁἋ"; + l_str = "ŏӂἃ"; + u_str = "ŎӁἋ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_097.rob b/test/atmega1284p/mapping_file_097.rob new file mode 100644 index 0000000..bd30fc7 --- /dev/null +++ b/test/atmega1284p/mapping_file_097.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "őӄἄ"; + ou_str = "ŐӃἌ"; + l_str = "őӄἄ"; + u_str = "ŐӃἌ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_098.rob b/test/atmega1284p/mapping_file_098.rob new file mode 100644 index 0000000..10bc314 --- /dev/null +++ b/test/atmega1284p/mapping_file_098.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "œӈἅ"; + ou_str = "ŒӇἍ"; + l_str = "œӈἅ"; + u_str = "ŒӇἍ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_099.rob b/test/atmega1284p/mapping_file_099.rob new file mode 100644 index 0000000..db92340 --- /dev/null +++ b/test/atmega1284p/mapping_file_099.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŕӌἆ"; + ou_str = "ŔӋἎ"; + l_str = "ŕӌἆ"; + u_str = "ŔӋἎ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_100.rob b/test/atmega1284p/mapping_file_100.rob new file mode 100644 index 0000000..d7477d3 --- /dev/null +++ b/test/atmega1284p/mapping_file_100.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŗӑἇ"; + ou_str = "ŖӐἏ"; + l_str = "ŗӑἇ"; + u_str = "ŖӐἏ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_101.rob b/test/atmega1284p/mapping_file_101.rob new file mode 100644 index 0000000..9181f01 --- /dev/null +++ b/test/atmega1284p/mapping_file_101.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "řӓἐ"; + ou_str = "ŘӒἘ"; + l_str = "řӓἐ"; + u_str = "ŘӒἘ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_102.rob b/test/atmega1284p/mapping_file_102.rob new file mode 100644 index 0000000..8ae9d34 --- /dev/null +++ b/test/atmega1284p/mapping_file_102.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "śӕἑ"; + ou_str = "ŚӔἙ"; + l_str = "śӕἑ"; + u_str = "ŚӔἙ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_103.rob b/test/atmega1284p/mapping_file_103.rob new file mode 100644 index 0000000..2f03b09 --- /dev/null +++ b/test/atmega1284p/mapping_file_103.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŝӗἒ"; + ou_str = "ŜӖἚ"; + l_str = "ŝӗἒ"; + u_str = "ŜӖἚ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_104.rob b/test/atmega1284p/mapping_file_104.rob new file mode 100644 index 0000000..2d2d38c --- /dev/null +++ b/test/atmega1284p/mapping_file_104.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "şәἓ"; + ou_str = "ŞӘἛ"; + l_str = "şәἓ"; + u_str = "ŞӘἛ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_105.rob b/test/atmega1284p/mapping_file_105.rob new file mode 100644 index 0000000..8c22cdc --- /dev/null +++ b/test/atmega1284p/mapping_file_105.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "šӛἔ"; + ou_str = "ŠӚἜ"; + l_str = "šӛἔ"; + u_str = "ŠӚἜ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_106.rob b/test/atmega1284p/mapping_file_106.rob new file mode 100644 index 0000000..b329183 --- /dev/null +++ b/test/atmega1284p/mapping_file_106.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ţӝἕ"; + ou_str = "ŢӜἝ"; + l_str = "ţӝἕ"; + u_str = "ŢӜἝ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_107.rob b/test/atmega1284p/mapping_file_107.rob new file mode 100644 index 0000000..0942780 --- /dev/null +++ b/test/atmega1284p/mapping_file_107.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ťӟἠ"; + ou_str = "ŤӞἨ"; + l_str = "ťӟἠ"; + u_str = "ŤӞἨ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_108.rob b/test/atmega1284p/mapping_file_108.rob new file mode 100644 index 0000000..49633ac --- /dev/null +++ b/test/atmega1284p/mapping_file_108.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŧӡἡ"; + ou_str = "ŦӠἩ"; + l_str = "ŧӡἡ"; + u_str = "ŦӠἩ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_109.rob b/test/atmega1284p/mapping_file_109.rob new file mode 100644 index 0000000..1482a87 --- /dev/null +++ b/test/atmega1284p/mapping_file_109.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ũӣἢ"; + ou_str = "ŨӢἪ"; + l_str = "ũӣἢ"; + u_str = "ŨӢἪ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_110.rob b/test/atmega1284p/mapping_file_110.rob new file mode 100644 index 0000000..96c7f2a --- /dev/null +++ b/test/atmega1284p/mapping_file_110.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ūӥἣ"; + ou_str = "ŪӤἫ"; + l_str = "ūӥἣ"; + u_str = "ŪӤἫ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_111.rob b/test/atmega1284p/mapping_file_111.rob new file mode 100644 index 0000000..3090a75 --- /dev/null +++ b/test/atmega1284p/mapping_file_111.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŭӧἤ"; + ou_str = "ŬӦἬ"; + l_str = "ŭӧἤ"; + u_str = "ŬӦἬ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_112.rob b/test/atmega1284p/mapping_file_112.rob new file mode 100644 index 0000000..5f6fe3f --- /dev/null +++ b/test/atmega1284p/mapping_file_112.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ůөἥ"; + ou_str = "ŮӨἭ"; + l_str = "ůөἥ"; + u_str = "ŮӨἭ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_113.rob b/test/atmega1284p/mapping_file_113.rob new file mode 100644 index 0000000..66d95d0 --- /dev/null +++ b/test/atmega1284p/mapping_file_113.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "űӫἦ"; + ou_str = "ŰӪἮ"; + l_str = "űӫἦ"; + u_str = "ŰӪἮ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_114.rob b/test/atmega1284p/mapping_file_114.rob new file mode 100644 index 0000000..f320481 --- /dev/null +++ b/test/atmega1284p/mapping_file_114.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ųӯἧ"; + ou_str = "ŲӮἯ"; + l_str = "ųӯἧ"; + u_str = "ŲӮἯ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_115.rob b/test/atmega1284p/mapping_file_115.rob new file mode 100644 index 0000000..11a7b14 --- /dev/null +++ b/test/atmega1284p/mapping_file_115.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŵӱἰ"; + ou_str = "ŴӰἸ"; + l_str = "ŵӱἰ"; + u_str = "ŴӰἸ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_116.rob b/test/atmega1284p/mapping_file_116.rob new file mode 100644 index 0000000..8935837 --- /dev/null +++ b/test/atmega1284p/mapping_file_116.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ŷӳἱ"; + ou_str = "ŶӲἹ"; + l_str = "ŷӳἱ"; + u_str = "ŶӲἹ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_117.rob b/test/atmega1284p/mapping_file_117.rob new file mode 100644 index 0000000..dac79a6 --- /dev/null +++ b/test/atmega1284p/mapping_file_117.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "źӵἲ"; + ou_str = "ŹӴἺ"; + l_str = "źӵἲ"; + u_str = "ŹӴἺ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_118.rob b/test/atmega1284p/mapping_file_118.rob new file mode 100644 index 0000000..dc229f3 --- /dev/null +++ b/test/atmega1284p/mapping_file_118.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "żӹἳ"; + ou_str = "ŻӸἻ"; + l_str = "żӹἳ"; + u_str = "ŻӸἻ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_119.rob b/test/atmega1284p/mapping_file_119.rob new file mode 100644 index 0000000..9290b7a --- /dev/null +++ b/test/atmega1284p/mapping_file_119.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "žաἴ"; + ou_str = "ŽԱἼ"; + l_str = "žաἴ"; + u_str = "ŽԱἼ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_120.rob b/test/atmega1284p/mapping_file_120.rob new file mode 100644 index 0000000..87868ba --- /dev/null +++ b/test/atmega1284p/mapping_file_120.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƃբἵ"; + ou_str = "ƂԲἽ"; + l_str = "ƃբἵ"; + u_str = "ƂԲἽ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_121.rob b/test/atmega1284p/mapping_file_121.rob new file mode 100644 index 0000000..6983f64 --- /dev/null +++ b/test/atmega1284p/mapping_file_121.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƅգἶ"; + ou_str = "ƄԳἾ"; + l_str = "ƅգἶ"; + u_str = "ƄԳἾ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_122.rob b/test/atmega1284p/mapping_file_122.rob new file mode 100644 index 0000000..89496c8 --- /dev/null +++ b/test/atmega1284p/mapping_file_122.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƈդἷ"; + ou_str = "ƇԴἿ"; + l_str = "ƈդἷ"; + u_str = "ƇԴἿ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_123.rob b/test/atmega1284p/mapping_file_123.rob new file mode 100644 index 0000000..2b13b99 --- /dev/null +++ b/test/atmega1284p/mapping_file_123.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƌեὀ"; + ou_str = "ƋԵὈ"; + l_str = "ƌեὀ"; + u_str = "ƋԵὈ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_124.rob b/test/atmega1284p/mapping_file_124.rob new file mode 100644 index 0000000..c0d7c2c --- /dev/null +++ b/test/atmega1284p/mapping_file_124.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƒզὁ"; + ou_str = "ƑԶὉ"; + l_str = "ƒզὁ"; + u_str = "ƑԶὉ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_125.rob b/test/atmega1284p/mapping_file_125.rob new file mode 100644 index 0000000..af634fa --- /dev/null +++ b/test/atmega1284p/mapping_file_125.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƙէὂ"; + ou_str = "ƘԷὊ"; + l_str = "ƙէὂ"; + u_str = "ƘԷὊ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_126.rob b/test/atmega1284p/mapping_file_126.rob new file mode 100644 index 0000000..6e510ab --- /dev/null +++ b/test/atmega1284p/mapping_file_126.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ơըὃ"; + ou_str = "ƠԸὋ"; + l_str = "ơըὃ"; + u_str = "ƠԸὋ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_127.rob b/test/atmega1284p/mapping_file_127.rob new file mode 100644 index 0000000..2b37cb5 --- /dev/null +++ b/test/atmega1284p/mapping_file_127.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƣթὄ"; + ou_str = "ƢԹὌ"; + l_str = "ƣթὄ"; + u_str = "ƢԹὌ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_128.rob b/test/atmega1284p/mapping_file_128.rob new file mode 100644 index 0000000..ce83763 --- /dev/null +++ b/test/atmega1284p/mapping_file_128.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƥժὅ"; + ou_str = "ƤԺὍ"; + l_str = "ƥժὅ"; + u_str = "ƤԺὍ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_129.rob b/test/atmega1284p/mapping_file_129.rob new file mode 100644 index 0000000..0dcba87 --- /dev/null +++ b/test/atmega1284p/mapping_file_129.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƨիὑ"; + ou_str = "ƧԻὙ"; + l_str = "ƨիὑ"; + u_str = "ƧԻὙ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_130.rob b/test/atmega1284p/mapping_file_130.rob new file mode 100644 index 0000000..ab36981 --- /dev/null +++ b/test/atmega1284p/mapping_file_130.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƭլὓ"; + ou_str = "ƬԼὛ"; + l_str = "ƭլὓ"; + u_str = "ƬԼὛ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_131.rob b/test/atmega1284p/mapping_file_131.rob new file mode 100644 index 0000000..9fa009f --- /dev/null +++ b/test/atmega1284p/mapping_file_131.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ưխὕ"; + ou_str = "ƯԽὝ"; + l_str = "ưխὕ"; + u_str = "ƯԽὝ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_132.rob b/test/atmega1284p/mapping_file_132.rob new file mode 100644 index 0000000..49f5803 --- /dev/null +++ b/test/atmega1284p/mapping_file_132.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƴծὗ"; + ou_str = "ƳԾὟ"; + l_str = "ƴծὗ"; + u_str = "ƳԾὟ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_133.rob b/test/atmega1284p/mapping_file_133.rob new file mode 100644 index 0000000..f8dccc3 --- /dev/null +++ b/test/atmega1284p/mapping_file_133.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƶկὠ"; + ou_str = "ƵԿὨ"; + l_str = "ƶկὠ"; + u_str = "ƵԿὨ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_134.rob b/test/atmega1284p/mapping_file_134.rob new file mode 100644 index 0000000..f1ae76a --- /dev/null +++ b/test/atmega1284p/mapping_file_134.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƹհὡ"; + ou_str = "ƸՀὩ"; + l_str = "ƹհὡ"; + u_str = "ƸՀὩ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_135.rob b/test/atmega1284p/mapping_file_135.rob new file mode 100644 index 0000000..52c1844 --- /dev/null +++ b/test/atmega1284p/mapping_file_135.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ƽձὢ"; + ou_str = "ƼՁὪ"; + l_str = "ƽձὢ"; + u_str = "ƼՁὪ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_136.rob b/test/atmega1284p/mapping_file_136.rob new file mode 100644 index 0000000..553a2c1 --- /dev/null +++ b/test/atmega1284p/mapping_file_136.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "džղὣ"; + ou_str = "DŽՂὫ"; + l_str = "džղὣ"; + u_str = "DŽՂὫ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_137.rob b/test/atmega1284p/mapping_file_137.rob new file mode 100644 index 0000000..87ba92c --- /dev/null +++ b/test/atmega1284p/mapping_file_137.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ljճὤ"; + ou_str = "LJՃὬ"; + l_str = "ljճὤ"; + u_str = "LJՃὬ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_138.rob b/test/atmega1284p/mapping_file_138.rob new file mode 100644 index 0000000..680d1e8 --- /dev/null +++ b/test/atmega1284p/mapping_file_138.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "njմὥ"; + ou_str = "NJՄὭ"; + l_str = "njմὥ"; + u_str = "NJՄὭ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_139.rob b/test/atmega1284p/mapping_file_139.rob new file mode 100644 index 0000000..1b03e45 --- /dev/null +++ b/test/atmega1284p/mapping_file_139.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǎյὦ"; + ou_str = "ǍՅὮ"; + l_str = "ǎյὦ"; + u_str = "ǍՅὮ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_140.rob b/test/atmega1284p/mapping_file_140.rob new file mode 100644 index 0000000..94cc5fc --- /dev/null +++ b/test/atmega1284p/mapping_file_140.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǐնὧ"; + ou_str = "ǏՆὯ"; + l_str = "ǐնὧ"; + u_str = "ǏՆὯ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_141.rob b/test/atmega1284p/mapping_file_141.rob new file mode 100644 index 0000000..76194a6 --- /dev/null +++ b/test/atmega1284p/mapping_file_141.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǒշᾀ"; + ou_str = "ǑՇᾈ"; + l_str = "ǒշᾀ"; + u_str = "ǑՇᾈ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_142.rob b/test/atmega1284p/mapping_file_142.rob new file mode 100644 index 0000000..82637d6 --- /dev/null +++ b/test/atmega1284p/mapping_file_142.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǔոᾁ"; + ou_str = "ǓՈᾉ"; + l_str = "ǔոᾁ"; + u_str = "ǓՈᾉ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_143.rob b/test/atmega1284p/mapping_file_143.rob new file mode 100644 index 0000000..bbc0bd1 --- /dev/null +++ b/test/atmega1284p/mapping_file_143.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǖչᾂ"; + ou_str = "ǕՉᾊ"; + l_str = "ǖչᾂ"; + u_str = "ǕՉᾊ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_144.rob b/test/atmega1284p/mapping_file_144.rob new file mode 100644 index 0000000..c8646a1 --- /dev/null +++ b/test/atmega1284p/mapping_file_144.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǘպᾃ"; + ou_str = "ǗՊᾋ"; + l_str = "ǘպᾃ"; + u_str = "ǗՊᾋ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_145.rob b/test/atmega1284p/mapping_file_145.rob new file mode 100644 index 0000000..5099836 --- /dev/null +++ b/test/atmega1284p/mapping_file_145.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǚջᾄ"; + ou_str = "ǙՋᾌ"; + l_str = "ǚջᾄ"; + u_str = "ǙՋᾌ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_146.rob b/test/atmega1284p/mapping_file_146.rob new file mode 100644 index 0000000..5d6ae14 --- /dev/null +++ b/test/atmega1284p/mapping_file_146.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǜռᾅ"; + ou_str = "ǛՌᾍ"; + l_str = "ǜռᾅ"; + u_str = "ǛՌᾍ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_147.rob b/test/atmega1284p/mapping_file_147.rob new file mode 100644 index 0000000..29ee720 --- /dev/null +++ b/test/atmega1284p/mapping_file_147.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǟսᾆ"; + ou_str = "ǞՍᾎ"; + l_str = "ǟսᾆ"; + u_str = "ǞՍᾎ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_148.rob b/test/atmega1284p/mapping_file_148.rob new file mode 100644 index 0000000..1f291a9 --- /dev/null +++ b/test/atmega1284p/mapping_file_148.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǡվᾇ"; + ou_str = "ǠՎᾏ"; + l_str = "ǡվᾇ"; + u_str = "ǠՎᾏ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_149.rob b/test/atmega1284p/mapping_file_149.rob new file mode 100644 index 0000000..2d8b5a9 --- /dev/null +++ b/test/atmega1284p/mapping_file_149.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǣտᾐ"; + ou_str = "ǢՏᾘ"; + l_str = "ǣտᾐ"; + u_str = "ǢՏᾘ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_150.rob b/test/atmega1284p/mapping_file_150.rob new file mode 100644 index 0000000..f10404c --- /dev/null +++ b/test/atmega1284p/mapping_file_150.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǥրᾑ"; + ou_str = "ǤՐᾙ"; + l_str = "ǥրᾑ"; + u_str = "ǤՐᾙ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_151.rob b/test/atmega1284p/mapping_file_151.rob new file mode 100644 index 0000000..9d79dd5 --- /dev/null +++ b/test/atmega1284p/mapping_file_151.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǧցᾒ"; + ou_str = "ǦՑᾚ"; + l_str = "ǧցᾒ"; + u_str = "ǦՑᾚ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_152.rob b/test/atmega1284p/mapping_file_152.rob new file mode 100644 index 0000000..885f59a --- /dev/null +++ b/test/atmega1284p/mapping_file_152.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǩւᾓ"; + ou_str = "ǨՒᾛ"; + l_str = "ǩւᾓ"; + u_str = "ǨՒᾛ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_153.rob b/test/atmega1284p/mapping_file_153.rob new file mode 100644 index 0000000..8f140d4 --- /dev/null +++ b/test/atmega1284p/mapping_file_153.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǫփᾔ"; + ou_str = "ǪՓᾜ"; + l_str = "ǫփᾔ"; + u_str = "ǪՓᾜ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_154.rob b/test/atmega1284p/mapping_file_154.rob new file mode 100644 index 0000000..1388ced --- /dev/null +++ b/test/atmega1284p/mapping_file_154.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǭքᾕ"; + ou_str = "ǬՔᾝ"; + l_str = "ǭքᾕ"; + u_str = "ǬՔᾝ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_155.rob b/test/atmega1284p/mapping_file_155.rob new file mode 100644 index 0000000..8bdbf86 --- /dev/null +++ b/test/atmega1284p/mapping_file_155.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǯօᾖ"; + ou_str = "ǮՕᾞ"; + l_str = "ǯօᾖ"; + u_str = "ǮՕᾞ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_156.rob b/test/atmega1284p/mapping_file_156.rob new file mode 100644 index 0000000..b6adcb7 --- /dev/null +++ b/test/atmega1284p/mapping_file_156.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "dzֆᾗ"; + ou_str = "DZՖᾟ"; + l_str = "dzֆᾗ"; + u_str = "DZՖᾟ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_157.rob b/test/atmega1284p/mapping_file_157.rob new file mode 100644 index 0000000..8036718 --- /dev/null +++ b/test/atmega1284p/mapping_file_157.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǵაᾠ"; + ou_str = "ǴႠᾨ"; + l_str = "ǵაᾠ"; + u_str = "ǴႠᾨ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_158.rob b/test/atmega1284p/mapping_file_158.rob new file mode 100644 index 0000000..0d23642 --- /dev/null +++ b/test/atmega1284p/mapping_file_158.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǻბᾡ"; + ou_str = "ǺႡᾩ"; + l_str = "ǻბᾡ"; + u_str = "ǺႡᾩ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_159.rob b/test/atmega1284p/mapping_file_159.rob new file mode 100644 index 0000000..4781fb9 --- /dev/null +++ b/test/atmega1284p/mapping_file_159.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǽგᾢ"; + ou_str = "ǼႢᾪ"; + l_str = "ǽგᾢ"; + u_str = "ǼႢᾪ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_160.rob b/test/atmega1284p/mapping_file_160.rob new file mode 100644 index 0000000..c02189a --- /dev/null +++ b/test/atmega1284p/mapping_file_160.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ǿდᾣ"; + ou_str = "ǾႣᾫ"; + l_str = "ǿდᾣ"; + u_str = "ǾႣᾫ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_161.rob b/test/atmega1284p/mapping_file_161.rob new file mode 100644 index 0000000..068651e --- /dev/null +++ b/test/atmega1284p/mapping_file_161.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȁეᾤ"; + ou_str = "ȀႤᾬ"; + l_str = "ȁეᾤ"; + u_str = "ȀႤᾬ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_162.rob b/test/atmega1284p/mapping_file_162.rob new file mode 100644 index 0000000..ea61e3a --- /dev/null +++ b/test/atmega1284p/mapping_file_162.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȃვᾥ"; + ou_str = "ȂႥᾭ"; + l_str = "ȃვᾥ"; + u_str = "ȂႥᾭ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_163.rob b/test/atmega1284p/mapping_file_163.rob new file mode 100644 index 0000000..7ac86dd --- /dev/null +++ b/test/atmega1284p/mapping_file_163.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȅზᾦ"; + ou_str = "ȄႦᾮ"; + l_str = "ȅზᾦ"; + u_str = "ȄႦᾮ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_164.rob b/test/atmega1284p/mapping_file_164.rob new file mode 100644 index 0000000..3441b1d --- /dev/null +++ b/test/atmega1284p/mapping_file_164.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȇთᾧ"; + ou_str = "ȆႧᾯ"; + l_str = "ȇთᾧ"; + u_str = "ȆႧᾯ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_165.rob b/test/atmega1284p/mapping_file_165.rob new file mode 100644 index 0000000..cf21850 --- /dev/null +++ b/test/atmega1284p/mapping_file_165.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȉიᾰ"; + ou_str = "ȈႨᾸ"; + l_str = "ȉიᾰ"; + u_str = "ȈႨᾸ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_166.rob b/test/atmega1284p/mapping_file_166.rob new file mode 100644 index 0000000..00fc078 --- /dev/null +++ b/test/atmega1284p/mapping_file_166.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȋკᾱ"; + ou_str = "ȊႩᾹ"; + l_str = "ȋკᾱ"; + u_str = "ȊႩᾹ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_167.rob b/test/atmega1284p/mapping_file_167.rob new file mode 100644 index 0000000..c7e8038 --- /dev/null +++ b/test/atmega1284p/mapping_file_167.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȍლῐ"; + ou_str = "ȌႪῘ"; + l_str = "ȍლῐ"; + u_str = "ȌႪῘ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_168.rob b/test/atmega1284p/mapping_file_168.rob new file mode 100644 index 0000000..3e5a087 --- /dev/null +++ b/test/atmega1284p/mapping_file_168.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȏმῑ"; + ou_str = "ȎႫῙ"; + l_str = "ȏმῑ"; + u_str = "ȎႫῙ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_169.rob b/test/atmega1284p/mapping_file_169.rob new file mode 100644 index 0000000..68b9532 --- /dev/null +++ b/test/atmega1284p/mapping_file_169.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȑნῠ"; + ou_str = "ȐႬῨ"; + l_str = "ȑნῠ"; + u_str = "ȐႬῨ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_170.rob b/test/atmega1284p/mapping_file_170.rob new file mode 100644 index 0000000..8de3d7c --- /dev/null +++ b/test/atmega1284p/mapping_file_170.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȓოῡ"; + ou_str = "ȒႭῩ"; + l_str = "ȓოῡ"; + u_str = "ȒႭῩ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_171.rob b/test/atmega1284p/mapping_file_171.rob new file mode 100644 index 0000000..b95425d --- /dev/null +++ b/test/atmega1284p/mapping_file_171.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȕპⓐ"; + ou_str = "ȔႮⒶ"; + l_str = "ȕპⓐ"; + u_str = "ȔႮⒶ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_172.rob b/test/atmega1284p/mapping_file_172.rob new file mode 100644 index 0000000..af3241e --- /dev/null +++ b/test/atmega1284p/mapping_file_172.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ȗჟⓑ"; + ou_str = "ȖႯⒷ"; + l_str = "ȗჟⓑ"; + u_str = "ȖႯⒷ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_173.rob b/test/atmega1284p/mapping_file_173.rob new file mode 100644 index 0000000..179745a --- /dev/null +++ b/test/atmega1284p/mapping_file_173.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɓრⓒ"; + ou_str = "ƁႰⒸ"; + l_str = "ɓრⓒ"; + u_str = "ƁႰⒸ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_174.rob b/test/atmega1284p/mapping_file_174.rob new file mode 100644 index 0000000..2d7785b --- /dev/null +++ b/test/atmega1284p/mapping_file_174.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɔსⓓ"; + ou_str = "ƆႱⒹ"; + l_str = "ɔსⓓ"; + u_str = "ƆႱⒹ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_175.rob b/test/atmega1284p/mapping_file_175.rob new file mode 100644 index 0000000..c99a6a4 --- /dev/null +++ b/test/atmega1284p/mapping_file_175.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɗტⓔ"; + ou_str = "ƊႲⒺ"; + l_str = "ɗტⓔ"; + u_str = "ƊႲⒺ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_176.rob b/test/atmega1284p/mapping_file_176.rob new file mode 100644 index 0000000..d50a1cf --- /dev/null +++ b/test/atmega1284p/mapping_file_176.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɘუⓕ"; + ou_str = "ƎႳⒻ"; + l_str = "ɘუⓕ"; + u_str = "ƎႳⒻ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_177.rob b/test/atmega1284p/mapping_file_177.rob new file mode 100644 index 0000000..c1f6087 --- /dev/null +++ b/test/atmega1284p/mapping_file_177.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "əფⓖ"; + ou_str = "ƏႴⒼ"; + l_str = "əფⓖ"; + u_str = "ƏႴⒼ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_178.rob b/test/atmega1284p/mapping_file_178.rob new file mode 100644 index 0000000..05744b0 --- /dev/null +++ b/test/atmega1284p/mapping_file_178.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɛქⓗ"; + ou_str = "ƐႵⒽ"; + l_str = "ɛქⓗ"; + u_str = "ƐႵⒽ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_179.rob b/test/atmega1284p/mapping_file_179.rob new file mode 100644 index 0000000..3b8a00c --- /dev/null +++ b/test/atmega1284p/mapping_file_179.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɠღⓘ"; + ou_str = "ƓႶⒾ"; + l_str = "ɠღⓘ"; + u_str = "ƓႶⒾ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_180.rob b/test/atmega1284p/mapping_file_180.rob new file mode 100644 index 0000000..2b5e4c0 --- /dev/null +++ b/test/atmega1284p/mapping_file_180.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɣყⓙ"; + ou_str = "ƔႷⒿ"; + l_str = "ɣყⓙ"; + u_str = "ƔႷⒿ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_181.rob b/test/atmega1284p/mapping_file_181.rob new file mode 100644 index 0000000..42b83fd --- /dev/null +++ b/test/atmega1284p/mapping_file_181.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɨშⓚ"; + ou_str = "ƗႸⓀ"; + l_str = "ɨშⓚ"; + u_str = "ƗႸⓀ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_182.rob b/test/atmega1284p/mapping_file_182.rob new file mode 100644 index 0000000..276e10e --- /dev/null +++ b/test/atmega1284p/mapping_file_182.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɩჩⓛ"; + ou_str = "ƖႹⓁ"; + l_str = "ɩჩⓛ"; + u_str = "ƖႹⓁ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_183.rob b/test/atmega1284p/mapping_file_183.rob new file mode 100644 index 0000000..7aa403a --- /dev/null +++ b/test/atmega1284p/mapping_file_183.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɯცⓜ"; + ou_str = "ƜႺⓂ"; + l_str = "ɯცⓜ"; + u_str = "ƜႺⓂ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_184.rob b/test/atmega1284p/mapping_file_184.rob new file mode 100644 index 0000000..8c5a7b7 --- /dev/null +++ b/test/atmega1284p/mapping_file_184.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɲძⓝ"; + ou_str = "ƝႻⓃ"; + l_str = "ɲძⓝ"; + u_str = "ƝႻⓃ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_185.rob b/test/atmega1284p/mapping_file_185.rob new file mode 100644 index 0000000..67d326b --- /dev/null +++ b/test/atmega1284p/mapping_file_185.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ɵწⓞ"; + ou_str = "ƟႼⓄ"; + l_str = "ɵწⓞ"; + u_str = "ƟႼⓄ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_186.rob b/test/atmega1284p/mapping_file_186.rob new file mode 100644 index 0000000..83b9d51 --- /dev/null +++ b/test/atmega1284p/mapping_file_186.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ʃჭⓟ"; + ou_str = "ƩႽⓅ"; + l_str = "ʃჭⓟ"; + u_str = "ƩႽⓅ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_187.rob b/test/atmega1284p/mapping_file_187.rob new file mode 100644 index 0000000..00d0aa9 --- /dev/null +++ b/test/atmega1284p/mapping_file_187.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ʈხⓠ"; + ou_str = "ƮႾⓆ"; + l_str = "ʈხⓠ"; + u_str = "ƮႾⓆ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_188.rob b/test/atmega1284p/mapping_file_188.rob new file mode 100644 index 0000000..601bfe9 --- /dev/null +++ b/test/atmega1284p/mapping_file_188.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ʊჯⓡ"; + ou_str = "ƱႿⓇ"; + l_str = "ʊჯⓡ"; + u_str = "ƱႿⓇ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_189.rob b/test/atmega1284p/mapping_file_189.rob new file mode 100644 index 0000000..9a01ae1 --- /dev/null +++ b/test/atmega1284p/mapping_file_189.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ʋჰⓢ"; + ou_str = "ƲჀⓈ"; + l_str = "ʋჰⓢ"; + u_str = "ƲჀⓈ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_190.rob b/test/atmega1284p/mapping_file_190.rob new file mode 100644 index 0000000..95c14a4 --- /dev/null +++ b/test/atmega1284p/mapping_file_190.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ʒჱⓣ"; + ou_str = "ƷჁⓉ"; + l_str = "ʒჱⓣ"; + u_str = "ƷჁⓉ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_191.rob b/test/atmega1284p/mapping_file_191.rob new file mode 100644 index 0000000..2a23780 --- /dev/null +++ b/test/atmega1284p/mapping_file_191.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "άჲⓤ"; + ou_str = "ΆჂⓊ"; + l_str = "άჲⓤ"; + u_str = "ΆჂⓊ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_192.rob b/test/atmega1284p/mapping_file_192.rob new file mode 100644 index 0000000..2361c83 --- /dev/null +++ b/test/atmega1284p/mapping_file_192.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "έჳⓥ"; + ou_str = "ΈჃⓋ"; + l_str = "έჳⓥ"; + u_str = "ΈჃⓋ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_193.rob b/test/atmega1284p/mapping_file_193.rob new file mode 100644 index 0000000..dc5f36d --- /dev/null +++ b/test/atmega1284p/mapping_file_193.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ήჴⓦ"; + ou_str = "ΉჄⓌ"; + l_str = "ήჴⓦ"; + u_str = "ΉჄⓌ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_194.rob b/test/atmega1284p/mapping_file_194.rob new file mode 100644 index 0000000..f3b8b64 --- /dev/null +++ b/test/atmega1284p/mapping_file_194.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ίჵⓧ"; + ou_str = "ΊჅⓍ"; + l_str = "ίჵⓧ"; + u_str = "ΊჅⓍ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_195.rob b/test/atmega1284p/mapping_file_195.rob new file mode 100644 index 0000000..ddc89c9 --- /dev/null +++ b/test/atmega1284p/mapping_file_195.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "αḁⓨ"; + ou_str = "ΑḀⓎ"; + l_str = "αḁⓨ"; + u_str = "ΑḀⓎ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_196.rob b/test/atmega1284p/mapping_file_196.rob new file mode 100644 index 0000000..141b71f --- /dev/null +++ b/test/atmega1284p/mapping_file_196.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "βḃⓩ"; + ou_str = "ΒḂⓏ"; + l_str = "βḃⓩ"; + u_str = "ΒḂⓏ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_197.rob b/test/atmega1284p/mapping_file_197.rob new file mode 100644 index 0000000..58160a5 --- /dev/null +++ b/test/atmega1284p/mapping_file_197.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "γḅa"; + ou_str = "ΓḄA"; + l_str = "γḅa"; + u_str = "ΓḄA"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_198.rob b/test/atmega1284p/mapping_file_198.rob new file mode 100644 index 0000000..f30fb9b --- /dev/null +++ b/test/atmega1284p/mapping_file_198.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "δḇb"; + ou_str = "ΔḆB"; + l_str = "δḇb"; + u_str = "ΔḆB"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_199.rob b/test/atmega1284p/mapping_file_199.rob new file mode 100644 index 0000000..198ca74 --- /dev/null +++ b/test/atmega1284p/mapping_file_199.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "εḉc"; + ou_str = "ΕḈC"; + l_str = "εḉc"; + u_str = "ΕḈC"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_200.rob b/test/atmega1284p/mapping_file_200.rob new file mode 100644 index 0000000..7cff320 --- /dev/null +++ b/test/atmega1284p/mapping_file_200.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ζḋd"; + ou_str = "ΖḊD"; + l_str = "ζḋd"; + u_str = "ΖḊD"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_201.rob b/test/atmega1284p/mapping_file_201.rob new file mode 100644 index 0000000..ef293fc --- /dev/null +++ b/test/atmega1284p/mapping_file_201.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ηḍe"; + ou_str = "ΗḌE"; + l_str = "ηḍe"; + u_str = "ΗḌE"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_202.rob b/test/atmega1284p/mapping_file_202.rob new file mode 100644 index 0000000..aef3699 --- /dev/null +++ b/test/atmega1284p/mapping_file_202.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "θḏf"; + ou_str = "ΘḎF"; + l_str = "θḏf"; + u_str = "ΘḎF"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_203.rob b/test/atmega1284p/mapping_file_203.rob new file mode 100644 index 0000000..690ceac --- /dev/null +++ b/test/atmega1284p/mapping_file_203.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ιḑg"; + ou_str = "ΙḐG"; + l_str = "ιḑg"; + u_str = "ΙḐG"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_204.rob b/test/atmega1284p/mapping_file_204.rob new file mode 100644 index 0000000..014757e --- /dev/null +++ b/test/atmega1284p/mapping_file_204.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "κḓh"; + ou_str = "ΚḒH"; + l_str = "κḓh"; + u_str = "ΚḒH"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_205.rob b/test/atmega1284p/mapping_file_205.rob new file mode 100644 index 0000000..d27a761 --- /dev/null +++ b/test/atmega1284p/mapping_file_205.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "λḕi"; + ou_str = "ΛḔI"; + l_str = "λḕi"; + u_str = "ΛḔI"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_206.rob b/test/atmega1284p/mapping_file_206.rob new file mode 100644 index 0000000..b2bc524 --- /dev/null +++ b/test/atmega1284p/mapping_file_206.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "μḗj"; + ou_str = "ΜḖJ"; + l_str = "μḗj"; + u_str = "ΜḖJ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_207.rob b/test/atmega1284p/mapping_file_207.rob new file mode 100644 index 0000000..95fbe84 --- /dev/null +++ b/test/atmega1284p/mapping_file_207.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "νḙk"; + ou_str = "ΝḘK"; + l_str = "νḙk"; + u_str = "ΝḘK"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_208.rob b/test/atmega1284p/mapping_file_208.rob new file mode 100644 index 0000000..e932b33 --- /dev/null +++ b/test/atmega1284p/mapping_file_208.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ξḛl"; + ou_str = "ΞḚL"; + l_str = "ξḛl"; + u_str = "ΞḚL"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_209.rob b/test/atmega1284p/mapping_file_209.rob new file mode 100644 index 0000000..d84bfd9 --- /dev/null +++ b/test/atmega1284p/mapping_file_209.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "οḝm"; + ou_str = "ΟḜM"; + l_str = "οḝm"; + u_str = "ΟḜM"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_210.rob b/test/atmega1284p/mapping_file_210.rob new file mode 100644 index 0000000..71d77fd --- /dev/null +++ b/test/atmega1284p/mapping_file_210.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "πḟn"; + ou_str = "ΠḞN"; + l_str = "πḟn"; + u_str = "ΠḞN"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_211.rob b/test/atmega1284p/mapping_file_211.rob new file mode 100644 index 0000000..8bc70e9 --- /dev/null +++ b/test/atmega1284p/mapping_file_211.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ρḡo"; + ou_str = "ΡḠO"; + l_str = "ρḡo"; + u_str = "ΡḠO"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_212.rob b/test/atmega1284p/mapping_file_212.rob new file mode 100644 index 0000000..807ba39 --- /dev/null +++ b/test/atmega1284p/mapping_file_212.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "σḣp"; + ou_str = "ΣḢP"; + l_str = "σḣp"; + u_str = "ΣḢP"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_213.rob b/test/atmega1284p/mapping_file_213.rob new file mode 100644 index 0000000..2663189 --- /dev/null +++ b/test/atmega1284p/mapping_file_213.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "τḥq"; + ou_str = "ΤḤQ"; + l_str = "τḥq"; + u_str = "ΤḤQ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_214.rob b/test/atmega1284p/mapping_file_214.rob new file mode 100644 index 0000000..c1df0ec --- /dev/null +++ b/test/atmega1284p/mapping_file_214.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "υḧr"; + ou_str = "ΥḦR"; + l_str = "υḧr"; + u_str = "ΥḦR"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_215.rob b/test/atmega1284p/mapping_file_215.rob new file mode 100644 index 0000000..962d8da --- /dev/null +++ b/test/atmega1284p/mapping_file_215.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "φḩs"; + ou_str = "ΦḨS"; + l_str = "φḩs"; + u_str = "ΦḨS"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_216.rob b/test/atmega1284p/mapping_file_216.rob new file mode 100644 index 0000000..bdc7147 --- /dev/null +++ b/test/atmega1284p/mapping_file_216.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "χḫt"; + ou_str = "ΧḪT"; + l_str = "χḫt"; + u_str = "ΧḪT"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_217.rob b/test/atmega1284p/mapping_file_217.rob new file mode 100644 index 0000000..7c6f48f --- /dev/null +++ b/test/atmega1284p/mapping_file_217.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ψḭu"; + ou_str = "ΨḬU"; + l_str = "ψḭu"; + u_str = "ΨḬU"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_218.rob b/test/atmega1284p/mapping_file_218.rob new file mode 100644 index 0000000..6c0fa71 --- /dev/null +++ b/test/atmega1284p/mapping_file_218.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ωḯv"; + ou_str = "ΩḮV"; + l_str = "ωḯv"; + u_str = "ΩḮV"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_219.rob b/test/atmega1284p/mapping_file_219.rob new file mode 100644 index 0000000..1b671e1 --- /dev/null +++ b/test/atmega1284p/mapping_file_219.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ϊḱw"; + ou_str = "ΪḰW"; + l_str = "ϊḱw"; + u_str = "ΪḰW"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_220.rob b/test/atmega1284p/mapping_file_220.rob new file mode 100644 index 0000000..0875b0d --- /dev/null +++ b/test/atmega1284p/mapping_file_220.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ϋḳx"; + ou_str = "ΫḲX"; + l_str = "ϋḳx"; + u_str = "ΫḲX"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_221.rob b/test/atmega1284p/mapping_file_221.rob new file mode 100644 index 0000000..dc99282 --- /dev/null +++ b/test/atmega1284p/mapping_file_221.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "όḵy"; + ou_str = "ΌḴY"; + l_str = "όḵy"; + u_str = "ΌḴY"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/mapping_file_222.rob b/test/atmega1284p/mapping_file_222.rob new file mode 100644 index 0000000..350764d --- /dev/null +++ b/test/atmega1284p/mapping_file_222.rob @@ -0,0 +1,15 @@ +use string.utf8lenstr; +use string.upperlowerstr; +int32 main() { + ol_str = "ύḷz"; + ou_str = "ΎḶZ"; + l_str = "ύḷz"; + u_str = "ΎḶZ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { + return 0; + } else { + return 1; + } +} diff --git a/test/atmega1284p/out/string-len b/test/atmega1284p/out/string-len new file mode 100755 index 0000000000000000000000000000000000000000..e017e81a964a674ca3de72fc53b71079c1677b65 GIT binary patch literal 12712 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 literal 0 HcmV?d00001 diff --git a/test/atmega1284p/runtest.sh b/test/atmega1284p/runtest.sh deleted file mode 120000 index d72879e..0000000 --- a/test/atmega1284p/runtest.sh +++ /dev/null @@ -1 +0,0 @@ -../atmega328p/runtest.sh \ No newline at end of file diff --git a/test/atmega1284p/runtest.sh b/test/atmega1284p/runtest.sh new file mode 100755 index 0000000..1d49882 --- /dev/null +++ b/test/atmega1284p/runtest.sh @@ -0,0 +1,25 @@ +#!/bin/bash +CMD="./robcmp-simavr-debug -c 16000000 -m atmega1284p -f $2" + +GREEN="\033[0;32m" +RED="\033[0;31m" +NC="\033[0m" + +echo -n " $1 " +make -s $2 +if [ "$?" -eq 0 ]; then + if [ "$V" = "1" ]; then + ${CMD} + else + timeout 10s ${CMD} &> /dev/null + fi + STATUS=$? + if [ "${STATUS}" -eq 0 ]; then + echo -e \\r${GREEN}[PASS]\\t\\t${NC} + else + echo -e \\r${RED}[FAILED] ${STATUS}\\t${NC} + fi +else + echo -e \\r${RED}[BUILD FAILED]\\t${NC} +fi + diff --git a/test/atmega1284p/runtestold.sh b/test/atmega1284p/runtestold.sh new file mode 120000 index 0000000..d72879e --- /dev/null +++ b/test/atmega1284p/runtestold.sh @@ -0,0 +1 @@ +../atmega328p/runtest.sh \ No newline at end of file diff --git a/test/atmega1284p/runtrace.sh b/test/atmega1284p/runtrace.sh deleted file mode 120000 index fc1aeb1..0000000 --- a/test/atmega1284p/runtrace.sh +++ /dev/null @@ -1 +0,0 @@ -../atmega328p/runtrace.sh \ No newline at end of file diff --git a/test/atmega1284p/runtrace.sh b/test/atmega1284p/runtrace.sh new file mode 100755 index 0000000..a9e5a0b --- /dev/null +++ b/test/atmega1284p/runtrace.sh @@ -0,0 +1,2 @@ +#!/bin/bash +./run_avr -g 1234 -t -f 16000000 -m atmega1284p -v -v -v $1 diff --git a/test/atmega1284p/runtraceold.sh b/test/atmega1284p/runtraceold.sh new file mode 120000 index 0000000..fc1aeb1 --- /dev/null +++ b/test/atmega1284p/runtraceold.sh @@ -0,0 +1 @@ +../atmega328p/runtrace.sh \ No newline at end of file diff --git a/test/atmega1284p/string-contains.rob b/test/atmega1284p/string-contains.rob new file mode 100644 index 0000000..43b1378 --- /dev/null +++ b/test/atmega1284p/string-contains.rob @@ -0,0 +1,17 @@ +use string.containsstr; + +const str = "W5L꼟ݾ݉E6N޺ߢ/󭀖D𣈬🭯೯몽뷥횖ថ󿼧֮�|钰𿲯􀖽񼽾r󷁸񟫟򔨄Gۯ㨋适ȣ޹1᯲ځ夫ΘӶⰇ5x̛艅ﮝG񜳄ʣߜ7bgӏ&򞈺׹ĶD޽إHń󪼖ۧ𵺔󹬛*Oǜrxʈ蘪ӧ欲΢ 9ЄfΤf󘈒ĉΑ򴕝򱥊ߘ񹶠f𰑊6r񱃬u$D𕽮D򦄯֒+鉨󉖠ݤ򦽫񓘓󿿖FIJܹèצԙΐݯ􎾏󉬋𶺐ə񰁄˒Ņǝᅯsl睠؆4󔵯큐䋴𰑊xgًһJ󂈛𺌾ƿ񏾼ޣۺzȗ񹨔cϐʝ򔆠񶸓jI=۷􈞓̀K䰈搶?䜖麾+禼ܗu񜏫μ𕧳L󸽨󂡡󀶉𹞹㎏/8󒰬0駗掼T]�ռj랳rᢇ!mլEH򁐨9洱P婩ʄu󨚐<{䬘䴒􄖰2ꁯ𰑊𰑊i𘃋򂖉軖⍇ުΥ𮍎ˌP䈸a򼻓ܖ۔㎼́WνϏɓcb꡷ƿ󢶝㍫󐥼񗩫𙠑4ʳ𰑊󨿉󝆅ί㬍ᦐ⢳ʂϬn󡛖%皰ﮨϠݿ(𥢍䓻„䯡𥁘𔎰ȣ񼘋𱵾܌􃴸씟꣯ʒ𞃄<𫌮瘤;6Ĕ�禪΢󪠆ﺍ갥슶Pġʂjo臣䶞ﭭr𷔨o򮵐𞠴,滑uꧼܚ质񠪈𞼨鱞꒔輾gےY𺻜􅾱O!�񪠽’站񘫽򐱸ղ.4񠬜˲@翬ιqډ򵭔S㏢ӎ詼߰緲򻓯סx󬈌㿼𩲻ݪʆ뺭򱕄󣗓ӂ񿩞􂯦髼m穋ąLT䇀󴐡򆔑𪜿쟃򄛰𰑊ʝᱤ충͈弖𠾴󟵻񤽿׻þfշ􀱥𖻢ĝK򤌶ɹ𻛷𿳵0߮򟚶ϼ󴶼䌊힂񈼿"; + +const substr1 = "ߢ/󭀖D𣈬🭯೯몽뷥횖ថ󿼧֮�|钰𿲯􀖽񼽾r󷁸񟫟򔨄Gۯ㨋适ȣ޹1᯲ځ夫ΘӶⰇ5x̛艅ﮝG񜳄ʣߜ7bgӏ&򞈺׹ĶD޽إHń󪼖ۧ𵺔󹬛*Oǜrxʈ蘪ӧ欲΢ 9ЄfΤf󘈒ĉΑ򴕝򱥊ߘ񹶠f𰑊6r񱃬u$D𕽮D򦄯֒+鉨󉖠ݤ򦽫񓘓󿿖FIJܹèצԙΐݯ􎾏󉬋𶺐ə񰁄˒Ņǝᅯsl睠؆4󔵯큐䋴𰑊xgًһJ󂈛𺌾ƿ񏾼ޣۺzȗ񹨔cϐʝ򔆠񶸓jI=۷􈞓̀K䰈搶?䜖麾+禼ܗu񜏫μ𕧳L󸽨󂡡󀶉𹞹㎏/8󒰬0駗掼T]�ռj랳rᢇ!mլEH򁐨9洱P婩ʄu󨚐<{䬘䴒􄖰2ꁯ𰑊𰑊i𘃋򂖉軖⍇ުΥ𮍎ˌP䈸a򼻓ܖ۔㎼́WνϏɓcb꡷ƿ󢶝㍫󐥼񗩫𙠑"; + +const substr2 = "M񩔇󐄝C𒴔ģ_L(°0񹙇󑍫ϫTİǯ魃.!qݼ!򆋐8𿖅솉瘖&܍V:쓃򸻁C�򣢆Dꋕ󗻜㚊탂Ⲻ嶂͹來瞲ؚ4⬎ռ򘔈厦뛴ਧAT6ߐM񓻙է͛䯋Y򬋻ࡽ3н.𕂺eȞ늅#쐬🨲Ԝ參~ݐ¡i񮁃zچ喈񅿧ַs圉󑍫ԡҧ胑.봋@쪻Ҟ򽎻軺뚻ƇϨȽȣòલ婠$枢Γ[b濷㱟񛻨ח􋕍迲{خ衄ޅ֢|c޵ճՑw񸂸쐪ᦲDZ3⩀pT揷󑍫앢奺Ť䮃Eա奦صZЍ񰲗㋴񬅀ş柋K꺋ټᶩ۸ݷ򢫧󺶕󑍫탪렫󳪸䩛͝.솗鉡ˈʘTΊe𜕭鰲񌝄c󭵾]钧󝆘癑I恅檷Ψ檚󸬦֐ͩ9󊦇aӻ򛧄ɛ騩꧴⣋⇳쵥pߔGK󀬏ᙽҎ՜Ʃ􃀋$󆿐A眞󫤿񂤿𖇛¥˻ꉿܚ垓ࣲB༙ⲣ!۠򐈣Éϛ/槀d󵔧簃楦睎v"; + +int8 main() { + r = containsstr(str, substr1); + s = containsstr(str, substr2); + if r != -1 and s == -1 { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/atmega1284p/string-equal.rob b/test/atmega1284p/string-equal.rob new file mode 100644 index 0000000..97235ca --- /dev/null +++ b/test/atmega1284p/string-equal.rob @@ -0,0 +1,15 @@ +use string.equalstr; + +const str = "惱羋󽲠񬽊񋥫ᦊ򽩿򇴙ꍜօ☀ۣ򍞚àj4񪥲躺丿յT󹴷b។񄭇ɓ怍񇰈оʾ*fކ5ᯘȍۂ񟬃񕢑4эЙȵ󆙫妵Ë荊暴`$ᦣɤn􈆮՚仌񳙎⥘܍ڛᘕѧ󚹭mΨ𴑂eRﱫﮮ墭ϋʜ恊抾ԉ߯슈񫀐퇨3ࡊ೸𨎩򢷺򏼷zե񟁛󾎔ꍷ_񳜕#𲜖єp𳳘ಕ痳ܔ�Ք*Ŀ󙢹󗨑๖7􆪷ᔬ󳔶ʪ񆁩逤𭜠SrQϠ񹒴񎧒񃘕|򵹺񧞟9㬞⡵镹Հ񑀄ʉ悊[ђԟIҠ2膋򵇑舨C랢G􍑣񎭄<󿬢򍋶򍶳ⶱϺ, 䏃𓀿젇򞩮󽤡ڲڴ|ڲL(6²1E񲦕8􄏚O񷚲æ񣙾QĹ󒤥a>o񼒝󱛪đ񸧽⛃뭭Dـ*𖵘n䐂g襸ٌ򧴑6σ;Ă֪(鏗Źɿ۪󅙸q􍀞ZŻ𭈍㇘ڂT걮쬨 x}F𧪉񙛀슏-ⵒ񞑇O򾱢Ȯ󝅶랓%}Ꮦ󶲎Ԫ򕞈 Ӈ-𿷘󬜱]₇Қ󧴠󵓳桟ˉ󃓞󧴠Eފ󪒅ԝ𴨇񕇽뀸렵񿞩Ɲp׳񇾭񱴗罣ׂ񎽖ȩlݓ񣫢𚴏׈n񳆶Ի󶺨󍞆鐝󮘝նΏU膩绰ޙ脆&{𳆯Dズ⥤򢈫􋒜𷰧̷'٩Gu׹5Β뀆�󢇉L󊕓𰋣必ػ휻B𽡰ØP蜸ねUꐢ񪐪O򥾵˃Oꬺ궫㤷:􄨡㨋?*ω龜ʋ㧪襅_x]ꖗワ򥘰ָָꎍ浓ժɒ񒫄S򿧊ɥݎ烠쑰藸e퉘𓬈@׵%ڛ䢈񶧇򛠺ԱCs屿󼾦酈챡􉯙񩫚򼮏�#𡄂Ոث􁒸-ٮ񎲚гԱn۷񃒆򱊷᜔XMꚬIƳݸuʚ싉Ӄ܂猺󩔐d񀁅5򊐳)򆎅Խů楻ŒU󭘹󷏦L󢴊򘇱򗺣񐓌򊇰?Žب󅝮�󰒧|򕧋CO槥Ǣ񐚭ԾڰiiЫƆӎ򗤖Ԥ$B󩰃œ򘫄$ܜy젰iނ،񆜙eߓĚūԖ0󬹏ϸ񫩢凒끐D՝̠溗Q̏H"; + +const str_equal = "惱羋󽲠񬽊񋥫ᦊ򽩿򇴙ꍜօ☀ۣ򍞚àj4񪥲躺丿յT󹴷b។񄭇ɓ怍񇰈оʾ*fކ5ᯘȍۂ񟬃񕢑4эЙȵ󆙫妵Ë荊暴`$ᦣɤn􈆮՚仌񳙎⥘܍ڛᘕѧ󚹭mΨ𴑂eRﱫﮮ墭ϋʜ恊抾ԉ߯슈񫀐퇨3ࡊ೸𨎩򢷺򏼷zե񟁛󾎔ꍷ_񳜕#𲜖єp𳳘ಕ痳ܔ�Ք*Ŀ󙢹󗨑๖7􆪷ᔬ󳔶ʪ񆁩逤𭜠SrQϠ񹒴񎧒񃘕|򵹺񧞟9㬞⡵镹Հ񑀄ʉ悊[ђԟIҠ2膋򵇑舨C랢G􍑣񎭄<󿬢򍋶򍶳ⶱϺ, 䏃𓀿젇򞩮󽤡ڲڴ|ڲL(6²1E񲦕8􄏚O񷚲æ񣙾QĹ󒤥a>o񼒝󱛪đ񸧽⛃뭭Dـ*𖵘n䐂g襸ٌ򧴑6σ;Ă֪(鏗Źɿ۪󅙸q􍀞ZŻ𭈍㇘ڂT걮쬨 x}F𧪉񙛀슏-ⵒ񞑇O򾱢Ȯ󝅶랓%}Ꮦ󶲎Ԫ򕞈 Ӈ-𿷘󬜱]₇Қ󧴠󵓳桟ˉ󃓞󧴠Eފ󪒅ԝ𴨇񕇽뀸렵񿞩Ɲp׳񇾭񱴗罣ׂ񎽖ȩlݓ񣫢𚴏׈n񳆶Ի󶺨󍞆鐝󮘝նΏU膩绰ޙ脆&{𳆯Dズ⥤򢈫􋒜𷰧̷'٩Gu׹5Β뀆�󢇉L󊕓𰋣必ػ휻B𽡰ØP蜸ねUꐢ񪐪O򥾵˃Oꬺ궫㤷:􄨡㨋?*ω龜ʋ㧪襅_x]ꖗワ򥘰ָָꎍ浓ժɒ񒫄S򿧊ɥݎ烠쑰藸e퉘𓬈@׵%ڛ䢈񶧇򛠺ԱCs屿󼾦酈챡􉯙񩫚򼮏�#𡄂Ոث􁒸-ٮ񎲚гԱn۷񃒆򱊷᜔XMꚬIƳݸuʚ싉Ӄ܂猺󩔐d񀁅5򊐳)򆎅Խů楻ŒU󭘹󷏦L󢴊򘇱򗺣񐓌򊇰?Žب󅝮�󰒧|򕧋CO槥Ǣ񐚭ԾڰiiЫƆӎ򗤖Ԥ$B󩰃œ򘫄$ܜy젰iނ،񆜙eߓĚūԖ0󬹏ϸ񫩢凒끐D՝̠溗Q̏H"; + +const str_diff = "ၛ 󠹘秙􂬺ʒB볧Ց*O˪쑟ϙ/⒵Ǹн츋+Ȳ蘛礑㍻Ζ)򪖣ϐɷ冭0􌪉гӨ󢦀⪁񈋽4ͤꐏ奸򭒚Ɇ蠲ܤ*󊗇ޖʉꝼpӝO񜁳򊚫٠ʼn䢪􀰉n򊥗ݚ鄞􌴬,Tq񻯬󦙚앎櫐Sшå%󕌞Wː럂ᅵ抌Þ레&󱭹UĘ:ފ񆬟ӛ񐭿󦲺uﺳѫ씸욍_❨ܒ񛯹򽡋󼮖갗W!璵쵅٘I㔧{У֚󐷢把�񷲜탓葉󃯊{򖉜񰚔X3N𔴧˨]𪕠t񥃋<𒨛^횱񘵣󁫜俳۸䎊ެ֭m枷Ғe󝔋U!奲A񋉡0푛Šے㕬�ߍꚉĂ𕸞󸩌iއ萘ⓜ₮O󛮼󯋀񁠹A縪񎏞泩叆·󢘄=𑴣󝐁󊗪ԁ񖎨1띗�uߢ<(V򴴸_ޅŲ򘣽񊏖𗬴܌􅆋񙿂۩绯2�򄌣嶾Ŝ낗4웧򯐝꼮򂭔sɉtϠX‡gO찟򊕎򚵛a汓�ހ󯋀񘂰󯋀󱒑񰉜񞎛6磩/􋥯1F󛽻򦃿Y﨨˚k.뗥񗇎ªō򑲒𽝡ȯ򻺒冔ﻑ򞵘-ᶫվ[𽌤󢾀hۜEԐꮫ𹸉ڷ󼂯𫰈辂%̒դ@4ξ°󍉚޽먨�뷁ө񙁛𿂳̸訅ʢ񻋾򜯖몃⬶Ң$A𖛭ꊚќlÜ񪵶܃袑0򳥦񷷡ǭY`m򿚽󯋀󯋀柴𞴡l޲gʐ(뱇i󜌝󓗹攙_Ʊ墡„馔郠,Đo釁tl󤅦㒷DژĂ.Fꊠh񺩫򓮧šӓ뗹ߐʚN擛҂뽎񓨇ՁŲ񹈺|躀󣁪%0得粒_񔼛􅭘=񫸗úd憏㭓񐲄𴡔ʭݦ󘃌ھ黜𗄎˯ԑĻG󞆕𮠨𞑽?񣊇n޼ǯؽ댬ڙù򘹴🅘񿽄ゎgࣀ񳷥󤕤񔙵ؑǙ@ܐ𳩛؈񛸪㱎ฉθ򆼷ɞa􄟀񦂝ؔ򠰵׵޲蔃ĔJb嗱󑖨񒯲OLÎt5?�º񱱄Īꕊ緳𪈹𶎊꥞ Al=א龽䌴힖󶰡�J󨗺킿ނƖbțѷ󣭑"; + +int8 main() { + if equalstr(str, str_equal) and !equalstr(str, str_diff) { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/atmega328p/string-utf8len.rob b/test/atmega1284p/string-len.rob similarity index 79% rename from test/atmega328p/string-utf8len.rob rename to test/atmega1284p/string-len.rob index f3eb5e4..c408c28 100644 --- a/test/atmega328p/string-utf8len.rob +++ b/test/atmega1284p/string-len.rob @@ -1,10 +1,10 @@ -use string.utf8strlen; +use string.lenstr; -const str = "Ԍ񪹅◣E憕K糈lغȶ픏G񞩑޸壴c񒠛Σ'Ϡڇ𖩢򼧽0澆hې񘃼؃2㭵fȼ돻쒢񗊧왏jĿԑ༯m垢2B覴󇹅S󤟎m2򲷸#烃󆨷쓃Īɑ뾀f򪍕[l𣖖󨜟Y&硨⇑͙𛢾􂶫 呫򟘫ǽ◓򨺗Wz^򽗛򔚽򭑃񓌑ӆW񙊰nݸ򧚱𭪬膌񹩔a%cᔥ𺓈ЭFʟ󯋬ҟ+>©󬔟񎎙񎎙͏᰷:뙉󪦝擛硰>nߘȷߐ񄷝蟐ʼnv쵮𵌐綊MgФ򑧳񎎙ݿ򭶝튠񳭘�ט축Æg㩗󵯊쫹Mԅ࣢ɒ»ⱖӳ򃑜ն𾲜򞭤Σ交ᄜ󼩠ד򦻬⿰쬦񼮜侶դߩŏz喧ф;�_͛弎ׯ߲OҐ@򠰼򷞞9񎑆𦺞𮨸Ȱ$.Ӧп񦡦|ʈ讥򒳛򬯚)񫟉sεTȗ𵐾3򈆠Ƭ񑨰ߪn3򀯛³ݘﯽs󳪖沄􎛒pй򣤍󖍾o=༂ړ񁢗󆿏J顯˶ᱣ󚃈􅯥򹯓ֽϊ征󪕅񼡪�B曡՟พ𒏚ӈs񎎙ۑR󬭵򧞑胂Ѥ𘘋𡢶ި+𻛹Ⴧѱƌ𶄼􃟨񪳭l򢩅t򦂲船𓧨񵞰񻛂⒤߀Ֆ剩򭐃򓝛쪑ޙմ߆ٱҀ﬉ϗ(񸠴o𾈺şi㥉lk`𱨶稯哫仇ǚƜtⲂỖbō𦪷睋󚼩ضF㟆拄౞8녘櫡өo2݈_捰򜼉슋�Y躘Y�*瑍ǃ󄑬񞊃G΢򼇉򨇓$B堁ʈȆᎰ̻󀏞􄞝𞞋򍐇Ŝˢɧ𗽢2힃Ǩ󱘅Ğͬ񓞥򣋱^߯󔛌ү-𠛛Ϻ0򋔑௯󓺣ᗣ𣦭95M򡹟􍎃ör蝗džЃ1񱠥藩󦛷Ꙧȶ󺇲1҅픸󃅭򉬻{犧 έț󤆯ꯨ񙾢X򟈜ཡس⵳ؕ?JժyJ(⋏܈󎴦ۥ农ߊʹ壛i󄻏󶮨䟊z逵ϳ񎎙轣󲾑y⮰VYφ񎎙⹁ίᜭર껔Ϳ❵૽䓮瘝pYeꤚ򐩼򥞢󲡞噲澘须󰜚c]cҺǙ󙁸󏾖ퟭ򘲱ͩ󆿳է0?񳤍󊟆񧖍𭷡򘹕୓;򬌆Ӽ搏:򅇚ٕ"; +const str = "Ԍ񪹅◣E憕K糈lغȶ픏G񞩑޸壴c񒠛Σ'Ϡڇ𖩢򼧽0澆hې񘃼؃2㭵fȼ돻쒢񗊧왏jĿԑ༯m垢2B覴󇹅S󤟎m2򲷸#烃󆨷쓃Īɑ뾀f򪍕[l𣖖󨜟Y&硨⇑͙𛢾􂶫 呫򟘫ǽ◓򨺗Wz^򽗛򔚽򭑃񓌑ӆW񙊰nݸ򧚱𭪬膌񹩔a%cᔥ𺓈ЭFʟ󯋬ҟ+>©󬔟񎎙񎎙͏᰷:뙉󪦝擛硰>nߘȷߐ񄷝蟐ʼnv쵮𵌐綊MgФ򑧳񎎙ݿ򭶝튠񳭘�ט축Æg㩗󵯊쫹Mԅ࣢ɒ»ⱖӳ򃑜ն𾲜򞭤Σ交ᄜ󼩠ד򦻬⿰쬦񼮜侶դߩŏz喧ф;�_͛弎ׯ߲OҐ@򠰼򷞞9񎑆𦺞𮨸Ȱ$.Ӧп񦡦|ʈ讥򒳛򬯚)񫟉sεTȗ𵐾3򈆠Ƭ񑨰ߪn3򀯛³ݘﯽs󳪖沄􎛒pй򣤍󖍾o=༂ړ񁢗󆿏J顯˶ᱣ󚃈􅯥򹯓ֽϊ征󪕅񼡪�B曡՟พ𒏚ӈs񎎙ۑR󬭵򧞑胂Ѥ𘘋𡢶ި+𻛹Ⴧѱƌ𶄼􃟨񪳭l򢩅t򦂲船𓧨񵞰񻛂⒤߀Ֆ剩򭐃򓝛쪑ޙմ߆ٱҀ﬉ϗ(񸠴o𾈺şi㥉lk`𱨶稯哫仇ǚƜtⲂỖbō𦪷睋󚼩ضF㟆拄౞8녘櫡өo2݈_捰򜼉슋�Y躘Y�*瑍ǃ󄑬񞊃G΢򼇉򨇓$B堁ʈȆᎰ̻󀏞􄞝𞞋򍐇Ŝˢɧ𗽢2힃Ǩ󱘅Ğͬ񓞥򣋱^߯󔛌ү-𠛛Ϻ0򋔑௯󓺣ᗣ𣦭95M򡹟􍎃ör蝗džЃ1񱠥藩󦛷Ꙧȶ󺇲1҅픸󃅭򉬻{犧 έț󤆯ꯨ񙾢X򟈜ཡس⵳ؕ?JժyJ(⋏܈󎴦ۥ农ߊʹ壛i󄻏󶮨䟊z逵ϳ񎎙轣󲾑y⮰VYφ񎎙⹁ίᜭર껔Ϳ❵૽䓮瘝pYeꤚ򐩼򥞢󲡞噲澘须󰜚c]cҺǙ󙁸󏾖ퟭ򘲱ͩ󆿳է0?񳤍󊟆񧖍𭷡򘹕୓;򬌆Ӽ搏:򅇚ٕ'񐂕ԣ>Ґ̀ԃ—薹熹U󴯽辑ҵ򵗥󆺜᲎ϟ͐񱪂ˌTР멡㪬샎ތO𬼝B鳩󋏌0䡡Ϋ𸃶⼔۴𿘅A󧿉􎹲ۑˑ䲨b9H୉⽏̊ݣꜢ곲򯎭c毣ﮒȟ߁ĘḔƲ֢檓嶷֑󊑵鎭ԥ̥䜏𦠼몖򏥖첡&뷠Դє𢀫$鉙牝ʓ)󩟈򪣅Ü𯏺 󘆷楂滵쐝󌰁ӆD𸉭鳔⌝װ򭺞Ү񓭥֋΅K^ì⫑kpȏ򝁢䑫‡o垡ѐط昆۱ଏ+𗥤L@3ݒ󼹭骱序ʲ􊜃ۓ􀯧cч7ῤ󓟞ߨ򩶾@Ì⑫aӰ𭹦M񄙲Ī𾚏扄ЯuN̾嘟佣c℡첪򪣅޷vǮс麟ՑϮ𛪺𒚀ޜ𮜈x)⬿𐎭񴤩︬񝩥쌏"; int8 main() { - r = utf8strlen(str); - if r == 810 { + r = lenstr(str); + if r == 1000 { return 0; } else { return 1; diff --git a/test/atmega1284p/timetest.sh b/test/atmega1284p/timetest.sh new file mode 100755 index 0000000..6ad5190 --- /dev/null +++ b/test/atmega1284p/timetest.sh @@ -0,0 +1,34 @@ +#!/bin/bash +CMD="./robcmp-simavr-debug -c 16000000 -m atmega1284p -f $2" + +GREEN="\033[0;32m" +RED="\033[0;31m" +NC="\033[0m" + +echo -n " $1 " +timer=0 +make -s $2 &> /dev/null +REP=10 +if [ "$?" -eq 0 ]; then + if [ "$V" = "1" ]; then + ${CMD} + else + timeout 10s ${CMD} &> /dev/null + fi + STATUS=$? + if [ "${STATUS}" -eq 0 ]; then + + TIMEFORMAT="%U" # get only the User time + for i in $(seq 1 $REP); do + timer=$timer+$({ time $CMD &>/dev/null; } 2>&1) + done + timer=$(echo "${timer//,/.}") + avg=$(echo "scale=6;($timer)/$REP -q"| bc) + + echo -e \\r${GREEN}[PASS]\\t\\t${NC}\\t\\t\\t${avg} + else + echo -e \\r${RED}[FAILED] ${STATUS}\\t${NC} + fi +else + echo -e \\r${RED}[BUILD FAILED]\\t${NC} +fi \ No newline at end of file diff --git a/test/atmega328p/Makefile b/test/atmega328p/Makefile index b7de220..562eb8a 100644 --- a/test/atmega328p/Makefile +++ b/test/atmega328p/Makefile @@ -9,7 +9,7 @@ INCLUDES=-I ../../lib ifndef OPT #OPT=-g -O0 -OPT=-Os +OPT=-Oz -w endif LD_FLAGS=-nostdlib -entry=main -L../../lib -Tatmega328p.ld ../../lib/avr5.o @@ -53,9 +53,5 @@ test: ${ALL_TT} time: ${ALL_TIME} -all_time: - @echo "Medindo o tempo total de execução para todos os arquivos..." - @{ time make ${ALL_TIME}; } 2> total_time.log - clean: - @rm -f ${ALL} ${ALL_LL} ${ALL_OO} ${ALL_TIME} total_time.log \ No newline at end of file + @rm -f ${ALL} ${ALL_LL} ${ALL_OO} ${ALL_TIME} \ No newline at end of file diff --git a/test/atmega328p/string-contains.rob b/test/atmega328p/string-contains.rob index 40e6590..80f5a2a 100644 --- a/test/atmega328p/string-contains.rob +++ b/test/atmega328p/string-contains.rob @@ -1,4 +1,4 @@ -use string.contains; +use string.containsstr; const str1 = "򐟎빉萦%ˍ켁̿Ǩ윊c升T{奀վuA񲁒𫾡𤃔򜄼􋉦괄񆔷ӌ>r󮤋ֆ۲𻍠ᚧ속腠ƒ󷼨񀐶񈪾ʴ󛐯mɁ姎-蓥񒡳^OC񉡎Łȵ́ꫢ؝񎯀𯏍є򬎧6􁜧Ǚ􂸫Æ񝽥DŽ흃򼵾ͥp񷰥񌕀y홋޹ӑqꥈ麧º겪𷣟󽨏񮆠Ҳߜ蟩̐󒉂m󽮁Ԏ粈#Aܳ𓖎k碽󶪩È೦繯˯󺶌ׂԠ:㮹>𸜝I񯙼V𙾌қ𷂯j𖪜٦Aॼ񩵜Ȯ怄᤟4񄥳肁睈)Ѿ又怾􉿿笚ǦO匯ؤĒ径lӪ񈦦񍿅ƣ꒥Yܐܩ>ꂛ߉򏆍ۗ/껠D䑥궖􌠬ՙ𓎪zb �롏|ʸh毕_š􅪃0փ򈔵񤁯ܡ歨򣍓򱤂ԛ񧞂댙ڞ#򯚭򽊤ĭעǃүK񷼝�e񙖰˵𤘖ق֩R𷄹Θx-껇ǹĻ񽀄靺O㊖Ĥ󙿗򗮡!ܒOLp񽿚ݰ񢛏$搜򯝠纱؟4ر� Ὧi󴢼啣򙤙瑉⤄񫝛񛎗UϘ󩧜݋󉏿񙥠ޔҴ󨮣޳ל򓁓d􍩶򡲵𥉐9Е󇆦󀨑2gڷ^󎽠𺹽ܨՋf酁ֲ🄒^񫨅)4L񆔜�⾎𑨂򡟸R쯐Ʃ󏅡4i䀠ݾ ܫ󷡚!컳䭾fX݃Ѝ)𑳛k􋫷J閇앳񑻻@nƝ󟧈򟏞򬁶𯘗񔳅ӧd򇾾ئ򱫪î׻9⿥m˒:ȞΆ텍Ⓐ򱭴䤁𒻯身摏c󤊋Т,׉߰淜Q켮L{ĭ˨󇿛㻒ș󪲑󔗩򀵃̂ŝCN򱢕἖­𚣿񉚘ô.弎Ь:*ܽ񴷎^󁒸􈥡)ፌ杻È[Ό󘵘ᆅ眔񟑤"; diff --git a/test/general/string-utf8len.rob b/test/atmega328p/string-len.rob similarity index 97% rename from test/general/string-utf8len.rob rename to test/atmega328p/string-len.rob index f3eb5e4..0444ef9 100644 --- a/test/general/string-utf8len.rob +++ b/test/atmega328p/string-len.rob @@ -1,9 +1,9 @@ -use string.utf8strlen; +use string.lenstr; const str = "Ԍ񪹅◣E憕K糈lغȶ픏G񞩑޸壴c񒠛Σ'Ϡڇ𖩢򼧽0澆hې񘃼؃2㭵fȼ돻쒢񗊧왏jĿԑ༯m垢2B覴󇹅S󤟎m2򲷸#烃󆨷쓃Īɑ뾀f򪍕[l𣖖󨜟Y&硨⇑͙𛢾􂶫 呫򟘫ǽ◓򨺗Wz^򽗛򔚽򭑃񓌑ӆW񙊰nݸ򧚱𭪬膌񹩔a%cᔥ𺓈ЭFʟ󯋬ҟ+>©󬔟񎎙񎎙͏᰷:뙉󪦝擛硰>nߘȷߐ񄷝蟐ʼnv쵮𵌐綊MgФ򑧳񎎙ݿ򭶝튠񳭘�ט축Æg㩗󵯊쫹Mԅ࣢ɒ»ⱖӳ򃑜ն𾲜򞭤Σ交ᄜ󼩠ד򦻬⿰쬦񼮜侶դߩŏz喧ф;�_͛弎ׯ߲OҐ@򠰼򷞞9񎑆𦺞𮨸Ȱ$.Ӧп񦡦|ʈ讥򒳛򬯚)񫟉sεTȗ𵐾3򈆠Ƭ񑨰ߪn3򀯛³ݘﯽs󳪖沄􎛒pй򣤍󖍾o=༂ړ񁢗󆿏J顯˶ᱣ󚃈􅯥򹯓ֽϊ征󪕅񼡪�B曡՟พ𒏚ӈs񎎙ۑR󬭵򧞑胂Ѥ𘘋𡢶ި+𻛹Ⴧѱƌ𶄼􃟨񪳭l򢩅t򦂲船𓧨񵞰񻛂⒤߀Ֆ剩򭐃򓝛쪑ޙմ߆ٱҀ﬉ϗ(񸠴o𾈺şi㥉lk`𱨶稯哫仇ǚƜtⲂỖbō𦪷睋󚼩ضF㟆拄౞8녘櫡өo2݈_捰򜼉슋�Y躘Y�*瑍ǃ󄑬񞊃G΢򼇉򨇓$B堁ʈȆᎰ̻󀏞􄞝𞞋򍐇Ŝˢɧ𗽢2힃Ǩ󱘅Ğͬ񓞥򣋱^߯󔛌ү-𠛛Ϻ0򋔑௯󓺣ᗣ𣦭95M򡹟􍎃ör蝗džЃ1񱠥藩󦛷Ꙧȶ󺇲1҅픸󃅭򉬻{犧 έț󤆯ꯨ񙾢X򟈜ཡس⵳ؕ?JժyJ(⋏܈󎴦ۥ农ߊʹ壛i󄻏󶮨䟊z逵ϳ񎎙轣󲾑y⮰VYφ񎎙⹁ίᜭર껔Ϳ❵૽䓮瘝pYeꤚ򐩼򥞢󲡞噲澘须󰜚c]cҺǙ󙁸󏾖ퟭ򘲱ͩ󆿳է0?񳤍󊟆񧖍𭷡򘹕୓;򬌆Ӽ搏:򅇚ٕ"; int8 main() { - r = utf8strlen(str); + r = lenstr(str); if r == 810 { return 0; } else { diff --git a/test/atmega328p/string-upperstr.rob b/test/atmega328p/string-upperstr.rob deleted file mode 100644 index c93db9a..0000000 --- a/test/atmega328p/string-upperstr.rob +++ /dev/null @@ -1,15 +0,0 @@ -use string.equalstr; -use string.upperstr; - -int32 main() { - - l_str = "aabbáçaabbáç"; - - utf8_string_to_uppercase(l_str); - - if equalstr (l_str, "AABBÁÇAABBÁÇ") { - return 0; - } else { - return 1; - } -} \ No newline at end of file diff --git a/test/debug/platformio.ini b/test/debug/platformio.ini index f39b390..014f3a6 100644 --- a/test/debug/platformio.ini +++ b/test/debug/platformio.ini @@ -1,7 +1,7 @@ [env] platform = robcmp -board = atmega328p +board = atmega1284p upload_protocol = serial [env:release] diff --git a/test/general/a.rob b/test/general/a.rob deleted file mode 100644 index c45af10..0000000 --- a/test/general/a.rob +++ /dev/null @@ -1 +0,0 @@ -"Á" \ No newline at end of file diff --git a/test/general/string-equal.rob b/test/general/string-equal.rob index 68c2b5e..97235ca 100644 --- a/test/general/string-equal.rob +++ b/test/general/string-equal.rob @@ -1,10 +1,10 @@ use string.equalstr; -const str = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯"; +const str = "惱羋󽲠񬽊񋥫ᦊ򽩿򇴙ꍜօ☀ۣ򍞚àj4񪥲躺丿յT󹴷b។񄭇ɓ怍񇰈оʾ*fކ5ᯘȍۂ񟬃񕢑4эЙȵ󆙫妵Ë荊暴`$ᦣɤn􈆮՚仌񳙎⥘܍ڛᘕѧ󚹭mΨ𴑂eRﱫﮮ墭ϋʜ恊抾ԉ߯슈񫀐퇨3ࡊ೸𨎩򢷺򏼷zե񟁛󾎔ꍷ_񳜕#𲜖єp𳳘ಕ痳ܔ�Ք*Ŀ󙢹󗨑๖7􆪷ᔬ󳔶ʪ񆁩逤𭜠SrQϠ񹒴񎧒񃘕|򵹺񧞟9㬞⡵镹Հ񑀄ʉ悊[ђԟIҠ2膋򵇑舨C랢G􍑣񎭄<󿬢򍋶򍶳ⶱϺ, 䏃𓀿젇򞩮󽤡ڲڴ|ڲL(6²1E񲦕8􄏚O񷚲æ񣙾QĹ󒤥a>o񼒝󱛪đ񸧽⛃뭭Dـ*𖵘n䐂g襸ٌ򧴑6σ;Ă֪(鏗Źɿ۪󅙸q􍀞ZŻ𭈍㇘ڂT걮쬨 x}F𧪉񙛀슏-ⵒ񞑇O򾱢Ȯ󝅶랓%}Ꮦ󶲎Ԫ򕞈 Ӈ-𿷘󬜱]₇Қ󧴠󵓳桟ˉ󃓞󧴠Eފ󪒅ԝ𴨇񕇽뀸렵񿞩Ɲp׳񇾭񱴗罣ׂ񎽖ȩlݓ񣫢𚴏׈n񳆶Ի󶺨󍞆鐝󮘝նΏU膩绰ޙ脆&{𳆯Dズ⥤򢈫􋒜𷰧̷'٩Gu׹5Β뀆�󢇉L󊕓𰋣必ػ휻B𽡰ØP蜸ねUꐢ񪐪O򥾵˃Oꬺ궫㤷:􄨡㨋?*ω龜ʋ㧪襅_x]ꖗワ򥘰ָָꎍ浓ժɒ񒫄S򿧊ɥݎ烠쑰藸e퉘𓬈@׵%ڛ䢈񶧇򛠺ԱCs屿󼾦酈챡􉯙񩫚򼮏�#𡄂Ոث􁒸-ٮ񎲚гԱn۷񃒆򱊷᜔XMꚬIƳݸuʚ싉Ӄ܂猺󩔐d񀁅5򊐳)򆎅Խů楻ŒU󭘹󷏦L󢴊򘇱򗺣񐓌򊇰?Žب󅝮�󰒧|򕧋CO槥Ǣ񐚭ԾڰiiЫƆӎ򗤖Ԥ$B󩰃œ򘫄$ܜy젰iނ،񆜙eߓĚūԖ0󬹏ϸ񫩢凒끐D՝̠溗Q̏H"; -const str_equal = "ඣ𮱮䡌얊䎻霂↎𝆁򘋟쌆ҕ􈙲񁆺葒񆉠l힦]ks酪ڴѹr򂨰񝡵쉽T󎬹A򯕙􍰴橖вǬ񩁅􀊻ꚧﲎ̰ى鉡л㧌􂐓챿⻧􅕍ࣶʶ#;姱䗗֠緿/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶw赟ʼÌّF󴵇䅧{󣦵뭭㶚Cʦߩ𷊺zAۿ@ޜˊ2蛽⃆ߠ򈧱뉳ʃ2*󚾊%]Tݍ񴒠쯦𑙀㬮襘پ󔑦Ȁ𶍧K󶤬Q蟂뤵𒂎񓶞RϨ(.릹EXϦȋ蛩뫵䥸蜑Xz$񗊶P􇊦۾೷Gىᙄ򅖩貘暾ٙ󀠋饣өƑ𤫷򸿢󬓣ٽ󕀤Ղ_Ş󤳨ƭͲ􊌵UꈂΑLἲ~蔵鏀c嚦s묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯򙢜ʉwKv鰪ƶs묫ӹ7㿲Гͩ⠦糺ťͽ‚񱆘ꂛ𠕣򞍥󲱊/HƤ掶?𜩨򮹯"; +const str_equal = "惱羋󽲠񬽊񋥫ᦊ򽩿򇴙ꍜօ☀ۣ򍞚àj4񪥲躺丿յT󹴷b។񄭇ɓ怍񇰈оʾ*fކ5ᯘȍۂ񟬃񕢑4эЙȵ󆙫妵Ë荊暴`$ᦣɤn􈆮՚仌񳙎⥘܍ڛᘕѧ󚹭mΨ𴑂eRﱫﮮ墭ϋʜ恊抾ԉ߯슈񫀐퇨3ࡊ೸𨎩򢷺򏼷zե񟁛󾎔ꍷ_񳜕#𲜖єp𳳘ಕ痳ܔ�Ք*Ŀ󙢹󗨑๖7􆪷ᔬ󳔶ʪ񆁩逤𭜠SrQϠ񹒴񎧒񃘕|򵹺񧞟9㬞⡵镹Հ񑀄ʉ悊[ђԟIҠ2膋򵇑舨C랢G􍑣񎭄<󿬢򍋶򍶳ⶱϺ, 䏃𓀿젇򞩮󽤡ڲڴ|ڲL(6²1E񲦕8􄏚O񷚲æ񣙾QĹ󒤥a>o񼒝󱛪đ񸧽⛃뭭Dـ*𖵘n䐂g襸ٌ򧴑6σ;Ă֪(鏗Źɿ۪󅙸q􍀞ZŻ𭈍㇘ڂT걮쬨 x}F𧪉񙛀슏-ⵒ񞑇O򾱢Ȯ󝅶랓%}Ꮦ󶲎Ԫ򕞈 Ӈ-𿷘󬜱]₇Қ󧴠󵓳桟ˉ󃓞󧴠Eފ󪒅ԝ𴨇񕇽뀸렵񿞩Ɲp׳񇾭񱴗罣ׂ񎽖ȩlݓ񣫢𚴏׈n񳆶Ի󶺨󍞆鐝󮘝նΏU膩绰ޙ脆&{𳆯Dズ⥤򢈫􋒜𷰧̷'٩Gu׹5Β뀆�󢇉L󊕓𰋣必ػ휻B𽡰ØP蜸ねUꐢ񪐪O򥾵˃Oꬺ궫㤷:􄨡㨋?*ω龜ʋ㧪襅_x]ꖗワ򥘰ָָꎍ浓ժɒ񒫄S򿧊ɥݎ烠쑰藸e퉘𓬈@׵%ڛ䢈񶧇򛠺ԱCs屿󼾦酈챡􉯙񩫚򼮏�#𡄂Ոث􁒸-ٮ񎲚гԱn۷񃒆򱊷᜔XMꚬIƳݸuʚ싉Ӄ܂猺󩔐d񀁅5򊐳)򆎅Խů楻ŒU󭘹󷏦L󢴊򘇱򗺣񐓌򊇰?Žب󅝮�󰒧|򕧋CO槥Ǣ񐚭ԾڰiiЫƆӎ򗤖Ԥ$B󩰃œ򘫄$ܜy젰iނ،񆜙eߓĚūԖ0󬹏ϸ񫩢凒끐D՝̠溗Q̏H"; -const str_diff = "𴙗Ȉ􉏺ݤ歠šω9୆碻ノ쿵E΃f񟸠&𗌐Ҁϓ򀙷睆i๒ۯ荬ե}萒㽁ȐƤ 𚟙𷓂񂅘㯩펑Ƹ确ʺ󩰭ݍ𧗐ٷꑩ6Х줎Q͙󎕭龜𙛿ٹꑙ X𫄕@u񐑧蔥ⰬF鐸痳ݠچ&{𳕷j惛򐴇cPǀΌޮQ𷼦𷼦󸯃,vǁˆ𢨿􅵈᷐崎?]xŃ朇⻕%WļͬlƸЯ򾨝Aֶ轟촆󥆵偲󝓇А󸤍m䙡7񵶛󡶓򘑧仐񯺝RP𐊆s٠~j炃ٴ񦷕򎶩դm󸳲招Ljق䓩󑮤W⍛񇹆朚쿃렼υȧ՚⠑ᄒf}뢮𳜞򃀷씊Rꅻ޻̘鵢ϳ̓�`󉝰񵱹󨏰۝m󂶍x󆍈ٿ6ЁⒻْƧ`š䃭TOs:P󎨜򷳍ު㌁솃亍ﯯ)ᷰ’ǀĒȃЍ֎𖼚󡋁3L򭣰ߪ듻ݯ9f򰳫󳾾Ƞ!柎򿥊󐱮Y㒇𾙌ѷ͌ݬݦ˒ƒϢ㾔㠆䙡ρ깪ꖘ9򃔺论癛uӖ켬e۶ذ򮪬Vꥰ􏣠O중옝㌬㦥𓫑򶭟-񹋭ᰶψ4s䑎󀿚􋥶Ӳ_758쉓ܵʁ缂;âs輌毑{鷛 ӵ񒧴񝹾틢sև󂴫X񈙔ӓʾ<奠묷å򅛬ꥪݹإݾv҉⪐敢gʃ򣻳éx釻񹓚򷧶ӆ򧩸늿ᶃ򵔹˭ԑ勇Ǹܮ𻜯񞄴6ױ琧򙺓bʼn❪#q邔ನ霞ᤡ͆V􇅑ٺ񞡪𘃘򸆌z񒼋󕌙ʿ𭖎򗜽􍩒դ۱h𚠫*󂺆襗oײQ9ݓ퐅𝒪𷨺𹸷3ɹ񶌎֚߯ȍ񽫺𡉥7}󑞉ρ菱񹓚󿌶𜖷o̸򷧶ӆh󡹶􊲓맢0"; +const str_diff = "ၛ 󠹘秙􂬺ʒB볧Ց*O˪쑟ϙ/⒵Ǹн츋+Ȳ蘛礑㍻Ζ)򪖣ϐɷ冭0􌪉гӨ󢦀⪁񈋽4ͤꐏ奸򭒚Ɇ蠲ܤ*󊗇ޖʉꝼpӝO񜁳򊚫٠ʼn䢪􀰉n򊥗ݚ鄞􌴬,Tq񻯬󦙚앎櫐Sшå%󕌞Wː럂ᅵ抌Þ레&󱭹UĘ:ފ񆬟ӛ񐭿󦲺uﺳѫ씸욍_❨ܒ񛯹򽡋󼮖갗W!璵쵅٘I㔧{У֚󐷢把�񷲜탓葉󃯊{򖉜񰚔X3N𔴧˨]𪕠t񥃋<𒨛^횱񘵣󁫜俳۸䎊ެ֭m枷Ғe󝔋U!奲A񋉡0푛Šے㕬�ߍꚉĂ𕸞󸩌iއ萘ⓜ₮O󛮼󯋀񁠹A縪񎏞泩叆·󢘄=𑴣󝐁󊗪ԁ񖎨1띗�uߢ<(V򴴸_ޅŲ򘣽񊏖𗬴܌􅆋񙿂۩绯2�򄌣嶾Ŝ낗4웧򯐝꼮򂭔sɉtϠX‡gO찟򊕎򚵛a汓�ހ󯋀񘂰󯋀󱒑񰉜񞎛6磩/􋥯1F󛽻򦃿Y﨨˚k.뗥񗇎ªō򑲒𽝡ȯ򻺒冔ﻑ򞵘-ᶫվ[𽌤󢾀hۜEԐꮫ𹸉ڷ󼂯𫰈辂%̒դ@4ξ°󍉚޽먨�뷁ө񙁛𿂳̸訅ʢ񻋾򜯖몃⬶Ң$A𖛭ꊚќlÜ񪵶܃袑0򳥦񷷡ǭY`m򿚽󯋀󯋀柴𞴡l޲gʐ(뱇i󜌝󓗹攙_Ʊ墡„馔郠,Đo釁tl󤅦㒷DژĂ.Fꊠh񺩫򓮧šӓ뗹ߐʚN擛҂뽎񓨇ՁŲ񹈺|躀󣁪%0得粒_񔼛􅭘=񫸗úd憏㭓񐲄𴡔ʭݦ󘃌ھ黜𗄎˯ԑĻG󞆕𮠨𞑽?񣊇n޼ǯؽ댬ڙù򘹴🅘񿽄ゎgࣀ񳷥󤕤񔙵ؑǙ@ܐ𳩛؈񛸪㱎ฉθ򆼷ɞa􄟀񦂝ؔ򠰵׵޲蔃ĔJb嗱󑖨񒯲OLÎt5?�º񱱄Īꕊ緳𪈹𶎊꥞ Al=א龽䌴힖󶰡�J󨗺킿ނƖbțѷ󣭑"; int8 main() { if equalstr(str, str_equal) and !equalstr(str, str_diff) { diff --git a/test/general/string-len.rob b/test/general/string-len.rob new file mode 100644 index 0000000..c408c28 --- /dev/null +++ b/test/general/string-len.rob @@ -0,0 +1,12 @@ +use string.lenstr; + +const str = "Ԍ񪹅◣E憕K糈lغȶ픏G񞩑޸壴c񒠛Σ'Ϡڇ𖩢򼧽0澆hې񘃼؃2㭵fȼ돻쒢񗊧왏jĿԑ༯m垢2B覴󇹅S󤟎m2򲷸#烃󆨷쓃Īɑ뾀f򪍕[l𣖖󨜟Y&硨⇑͙𛢾􂶫 呫򟘫ǽ◓򨺗Wz^򽗛򔚽򭑃񓌑ӆW񙊰nݸ򧚱𭪬膌񹩔a%cᔥ𺓈ЭFʟ󯋬ҟ+>©󬔟񎎙񎎙͏᰷:뙉󪦝擛硰>nߘȷߐ񄷝蟐ʼnv쵮𵌐綊MgФ򑧳񎎙ݿ򭶝튠񳭘�ט축Æg㩗󵯊쫹Mԅ࣢ɒ»ⱖӳ򃑜ն𾲜򞭤Σ交ᄜ󼩠ד򦻬⿰쬦񼮜侶դߩŏz喧ф;�_͛弎ׯ߲OҐ@򠰼򷞞9񎑆𦺞𮨸Ȱ$.Ӧп񦡦|ʈ讥򒳛򬯚)񫟉sεTȗ𵐾3򈆠Ƭ񑨰ߪn3򀯛³ݘﯽs󳪖沄􎛒pй򣤍󖍾o=༂ړ񁢗󆿏J顯˶ᱣ󚃈􅯥򹯓ֽϊ征󪕅񼡪�B曡՟พ𒏚ӈs񎎙ۑR󬭵򧞑胂Ѥ𘘋𡢶ި+𻛹Ⴧѱƌ𶄼􃟨񪳭l򢩅t򦂲船𓧨񵞰񻛂⒤߀Ֆ剩򭐃򓝛쪑ޙմ߆ٱҀ﬉ϗ(񸠴o𾈺şi㥉lk`𱨶稯哫仇ǚƜtⲂỖbō𦪷睋󚼩ضF㟆拄౞8녘櫡өo2݈_捰򜼉슋�Y躘Y�*瑍ǃ󄑬񞊃G΢򼇉򨇓$B堁ʈȆᎰ̻󀏞􄞝𞞋򍐇Ŝˢɧ𗽢2힃Ǩ󱘅Ğͬ񓞥򣋱^߯󔛌ү-𠛛Ϻ0򋔑௯󓺣ᗣ𣦭95M򡹟􍎃ör蝗džЃ1񱠥藩󦛷Ꙧȶ󺇲1҅픸󃅭򉬻{犧 έț󤆯ꯨ񙾢X򟈜ཡس⵳ؕ?JժyJ(⋏܈󎴦ۥ农ߊʹ壛i󄻏󶮨䟊z逵ϳ񎎙轣󲾑y⮰VYφ񎎙⹁ίᜭર껔Ϳ❵૽䓮瘝pYeꤚ򐩼򥞢󲡞噲澘须󰜚c]cҺǙ󙁸󏾖ퟭ򘲱ͩ󆿳է0?񳤍󊟆񧖍𭷡򘹕୓;򬌆Ӽ搏:򅇚ٕ'񐂕ԣ>Ґ̀ԃ—薹熹U󴯽辑ҵ򵗥󆺜᲎ϟ͐񱪂ˌTР멡㪬샎ތO𬼝B鳩󋏌0䡡Ϋ𸃶⼔۴𿘅A󧿉􎹲ۑˑ䲨b9H୉⽏̊ݣꜢ곲򯎭c毣ﮒȟ߁ĘḔƲ֢檓嶷֑󊑵鎭ԥ̥䜏𦠼몖򏥖첡&뷠Դє𢀫$鉙牝ʓ)󩟈򪣅Ü𯏺 󘆷楂滵쐝󌰁ӆD𸉭鳔⌝װ򭺞Ү񓭥֋΅K^ì⫑kpȏ򝁢䑫‡o垡ѐط昆۱ଏ+𗥤L@3ݒ󼹭骱序ʲ􊜃ۓ􀯧cч7ῤ󓟞ߨ򩶾@Ì⑫aӰ𭹦M񄙲Ī𾚏扄ЯuN̾嘟佣c℡첪򪣅޷vǮс麟ՑϮ𛪺𒚀ޜ𮜈x)⬿𐎭񴤩︬񝩥쌏"; + +int8 main() { + r = lenstr(str); + if r == 1000 { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/test/general/string-upper.rob b/test/general/string-upper.rob index 775c134..1e1f4a0 100644 --- a/test/general/string-upper.rob +++ b/test/general/string-upper.rob @@ -1,15 +1,15 @@ use string.equalstr; -use string.upperstr; - +use string.upperlowerstr; int32 main() { - - l_str = "abçd"; - - utf8_string_to_uppercase(l_str); - - if equalstr (l_str, "ABÇD") { + ol_str = "aώḹ"; + ou_str = "AΏḸ"; + l_str = "aώḹ"; + u_str = "AΏḸ"; + strtouppercase(l_str); + strtolowercase(u_str); + if equalstr (ol_str, u_str) and equalstr(ou_str, l_str) { return 0; } else { return 1; } -} \ No newline at end of file +}