diff options
Diffstat (limited to 'strings')
105 files changed, 15846 insertions, 0 deletions
diff --git a/strings/.cvsignore b/strings/.cvsignore new file mode 100644 index 00000000000..4fce34e473a --- /dev/null +++ b/strings/.cvsignore @@ -0,0 +1,8 @@ +.deps +.libs +Makefile +Makefile.in +ctype_autoconf.c +ctype_extra_sources.c +conf_to_src +old diff --git a/strings/Attic/bootstrap-ctype.c b/strings/Attic/bootstrap-ctype.c new file mode 100644 index 00000000000..dea3fcbb03c --- /dev/null +++ b/strings/Attic/bootstrap-ctype.c @@ -0,0 +1,91 @@ +/* Bootstrap configuration file (from the latin1 character set) */ +#include <global.h> +#include <m_ctype.h> + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. number_BOOTSTRAP=0 + */ + +/* ctype array must have 257 elements */ +uchar ctype_BOOTSTRAP[257] = { + 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +/* to_lower array must have 256 elements */ +uchar to_lower_BOOTSTRAP[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +/* to_upper array must have 256 elements */ +uchar to_upper_BOOTSTRAP[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +/* sort_order array must have 256 elements */ +uchar sort_order_BOOTSTRAP[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 65, 65, 65, 65, 92, 91, 92, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 68, 78, 79, 79, 79, 79, 93,215,216, 85, 85, 85, 89, 89,222,223, + 65, 65, 65, 65, 92, 91, 92, 67, 69, 69, 69, 69, 73, 73, 73, 73, + 68, 78, 79, 79, 79, 79, 93,247,216, 85, 85, 85, 89, 89,222,255 +}; diff --git a/strings/Attic/ct_init.c b/strings/Attic/ct_init.c new file mode 100644 index 00000000000..b0b1a8e126b --- /dev/null +++ b/strings/Attic/ct_init.c @@ -0,0 +1,6 @@ +/* Generate definitions of ctype arrays +*/ + +#include <global.h> +#define CTYPE_LIBRARY /* initialize ctype arrays */ +#include "m_ctype.h" diff --git a/strings/Attic/ctype-cp1251.c b/strings/Attic/ctype-cp1251.c new file mode 100644 index 00000000000..e717fd49c9e --- /dev/null +++ b/strings/Attic/ctype-cp1251.c @@ -0,0 +1,88 @@ +/* ctype-cp1251.c */ + +/* + * File generated by cset + * (C) Abandoned 1997 Zarko Mocnik <zarko.mocnik@dem.si> + * + * This file is obsolete; Please use ctype-win1251 instead! + */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_cp1251[257] = { +0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +}; + +uchar NEAR to_lower_cp1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167,184,169,170,171,172,173,174,175, +176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +}; + +uchar NEAR to_upper_cp1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, +176,177,178,179,180,181,182,183,168,185,186,187,188,189,190,191, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, +}; + +uchar NEAR sort_order_cp1251[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,124,125,126,127,128, +129, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,130,131,132,133,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255, 97,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255, 97,255,255,255,255,255,255,255, + 91, 92, 93, 94, 95, 96, 98, 99,100,101,102,103,104,105,106,107, +108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, + 91, 92, 93, 94, 95, 96, 98, 99,100,101,102,103,104,105,106,107, +108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, +}; diff --git a/strings/Attic/ctype-cp1257.c b/strings/Attic/ctype-cp1257.c new file mode 100644 index 00000000000..c60f71f635b --- /dev/null +++ b/strings/Attic/ctype-cp1257.c @@ -0,0 +1,88 @@ +/* cp1257 (Lithuanian) + * Created by Miroslav Stanish , Vilnius, 1999 + * This file is public domain and comes with no warranty of any kind + * Pleace send comments and bug reports to: <miroslav@mail.lt> + * + * File generated by cset + * (C) Abandoned 1997 Zarko Mocnik <zarko.mocnik@dem.si> + */ +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_cp1257[257] = { +0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, + 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, +}; + +uchar NEAR to_lower_cp1257[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, +176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, +224,225,194,195,196,197,230,199,232,201,202,235,204,205,206,207, +240,209,210,211,212,213,214,215,248,217,218,251,220,221,254,223, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +}; + +uchar NEAR to_upper_cp1257[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, +176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, +192,193,226,227,228,229,198,231,200,233,234,203,236,237,238,239, +208,241,242,243,244,245,246,247,216,249,250,219,252,253,222,255, +}; + +uchar NEAR sort_order_cp1257[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 67, 68, 70, 71, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 91, 92, 95, 96, 97, 78,255, 98, 99,100,101,102, +103, 65, 67, 68, 70, 71, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 91, 92, 95, 96, 97, 78,255,104,105,106,107,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 66, 79,255,255,255,255, 72,255, 69,255,255, 73,255,255,255,255, + 90,255,255,255,255,255,255,255, 94,255,255, 93,255,255,255,255, +255, 79,255,255,255,255, 72,255, 69,255,255, 73,255,255,255,255, + 90,255,255,255,255,255,255,255, 94,255,255, 93,255,255,255,255, +}; + diff --git a/strings/Attic/ctype-croat.c b/strings/Attic/ctype-croat.c new file mode 100644 index 00000000000..144ef337705 --- /dev/null +++ b/strings/Attic/ctype-croat.c @@ -0,0 +1,143 @@ +/* + This file is free for using + Author: Hrvoje Devcic, hdevcic@posluh.hr; + Sintaxx Error Software + POSLuH d.o.o., Zagreb, Croatia - http://www.posluh.hr +*/ + +/* This implements the hr (Croatian) character-set */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_croat[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,16,2,2,2,2,2,2,2,2, +}; + +uchar NEAR to_lower_croat[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) 154,(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) 158,(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) 230,(uchar) '\347', +(uchar) 232,(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) 240,(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\327', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_croat[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) 138,(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) 142,(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) 198,(uchar) '\307', +(uchar) 200,(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) 208,(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\367', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\377', +}; + +#ifndef __WIN32__ +uchar NEAR sort_order_croat[]={ +#else +uchar sort_order_croat[]={ +#endif +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 65, 66, 67, 70, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 88, 89, 90, 91, + 92, 93, 94, '[', '\\', ']', '^', '_', +'`', 65, 66, 67, 70, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 88, 89, 90, 91, + 92, 93, 94, '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) 87,(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) 95,(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) 87,(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) 95,(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +'A', 'A', 'A', 'A', '\\', '[', 69, 'C', + 68, 'E', 'E', 'E', 'I', 'I', 'I', 'I', + 71, 'N', 'O', 'O', 'O', 'O', ']',(uchar) '\327', +(uchar) '\330','U', 'U', 'U', 'Y', 'Y',(uchar) '\336',(uchar) '\337', +'A', 'A', 'A', 'A', '\\', '[', 69, 'C', + 68, 'E', 'E', 'E', 'I', 'I', 'I', 'I', + 71, 'N', 'O', 'O', 'O', 'O', ']',(uchar) '\367', +(uchar) '\330','U', 'U', 'U', 'Y', 'Y',(uchar) '\336',(uchar) '\377', +}; diff --git a/strings/Attic/ctype-danish.c b/strings/Attic/ctype-danish.c new file mode 100644 index 00000000000..7b74c5cba15 --- /dev/null +++ b/strings/Attic/ctype-danish.c @@ -0,0 +1,144 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* +** This implements the ISO 8859 Latin1 character-set with danish sorting +** This file is equivalent to ctype-latin1.c except for the last variable +** (sort_order_danish) +*/ + + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_danish[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,16,2,2,2,2,2,2,2,2, +}; + +uchar NEAR to_lower_danish[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\327', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_danish[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\367', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\377', +}; + +#ifndef __WIN32__ +uchar NEAR sort_order_danish[]={ +#else +uchar sort_order_danish[]={ +#endif +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +'A', 'A', 'A', 'A', '[', ']', '[', 'C', +'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', '\\', (uchar) '\327', +'\\','U', 'U', 'U', 'Y', 'Y', (uchar) '\336',(uchar) '\337', +'A', 'A', 'A', 'A', '[', ']', '[', 'C', +'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', '\\', (uchar) '\367', +'\\','U', 'U', 'U', 'Y', 'Y', (uchar) '\336',(uchar) '\377', +}; diff --git a/strings/Attic/ctype-dec8.c b/strings/Attic/ctype-dec8.c new file mode 100644 index 00000000000..f32302979eb --- /dev/null +++ b/strings/Attic/ctype-dec8.c @@ -0,0 +1,140 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +#include <global.h> +#include "m_string.h" + +#define CTYPE /* initialize ctype arrays */ +#include "m_ctype.h" + +void init_ctype(void) /* Stupid linker !! */ +{} /* Some symbol must be defined */ + +uchar ctype_dec8[257] = +{ +0, /* For standard library */ +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,16,2,2,2,2,2,2,2,2, +}; + +uchar NEAR to_lower_dec8[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\327', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_dec8[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\367', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\377', +}; + +uchar NEAR sort_order_dec8[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +'A', 'A', 'A', 'A', '\\', '[', '\\', 'C', +'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', ']', (uchar) '\327', +(uchar) '\330','U', 'U', 'U', 'Y', 'Y', (uchar) '\336',(uchar) '\337', +'A', 'A', 'A', 'A', '\\', '[', '\\', 'C', +'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', ']', (uchar) '\367', +(uchar) '\330','U', 'U', 'U', 'Y', 'Y', (uchar) '\336',(uchar) '\377', +}; diff --git a/strings/Attic/ctype-dos.c b/strings/Attic/ctype-dos.c new file mode 100644 index 00000000000..0578a33bfd0 --- /dev/null +++ b/strings/Attic/ctype-dos.c @@ -0,0 +1,139 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +#include <global.h> +#include "m_string.h" + +#ifndef _WINDOWS +uchar NEAR ctype[257] = +{ + 0, /* For standard library */ + 32,48,48,48,48,48,48,32,32,40,40,40,40,40,48,48, + 48,48,48,48,48,48,48,48,48,48,32,48,48,48,48,48, + 72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, + 16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, + 16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,48, + + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1, + 1,2,1,2,2,2,2,2,2,1,1,16,16,16,16,16, + 2,2,2,2,2,1,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,32, +}; + +uchar NEAR to_lower[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + 135, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 132, 134, + 130, 145, 145, 147, 148, 149, 150, 151, + 152, 148, 129, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 164, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +uchar NEAR to_upper[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + + 128, 154, 144, 65, 142, 65, 143, 128, + 69, 69, 69, 73, 73, 73, 142, 143, + 144, 146, 146, 79, 153, 79, 85, 85, + 89, 153, 154, 155, 156, 157, 158, 159, + 65, 73, 79, 85, 165, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +uchar NEAR sort_order[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + 67, 89, 69, 65, 92, 65, 91, 67, + 69, 69, 69, 73, 73, 73, 92, 91, + 69, 92, 92, 79, 93, 79, 85, 85, + 89, 93, 89, 36, 36, 36, 36, 36, + 65, 73, 79, 85, 78, 78, 166, 167, + 63, 169, 170, 171, 172, 33, 34, 34, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +#endif diff --git a/strings/Attic/ctype-estonia.c b/strings/Attic/ctype-estonia.c new file mode 100644 index 00000000000..f17463583c9 --- /dev/null +++ b/strings/Attic/ctype-estonia.c @@ -0,0 +1,93 @@ +/* See on Eesti character-set, +mis on kasutatav koos iso-8859-1(Latin1) tähestikuga +autor : Ülo Sõstra ylo@stat.vil.ee +*/ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_estonia[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,16,2,2,2,2,2,2,2,2, +}; + +uchar NEAR to_lower_estonia[]={ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, +31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, +46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, +61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, +107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, +120, 121, 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, +103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, +116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, +129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, +142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, +155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, +184, 169, 186, 171, 172, 173, 174, 191, 176, 177, 178, 179, 180, +181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 224, 225, +226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, +239, 240, 241, 242, 243, 244, 245, 246, 215, 248, 249, 250, 251, +252, 253, 254, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, +233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, +246, 247, 248, 249, 250, 251, 252, 253, 254, 255 +}; + +uchar NEAR to_upper_estonia[]={ +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, +31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, +46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, +61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, +76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, +91, 92, 93, 94, 95, 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, +74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, +89, 90, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, +134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, +147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, +173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 168, 185, +170, 187, 188, 189, 190, 175, 192, 193, 194, 195, 196, 197, 198, +199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, +212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 192, +193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, +206, 207, 208, 209, 210, 211, 212, 213, 214, 247, 216, 217, 218, +219, 220, 221, 222, 255 +}; + +#ifndef __WIN32__ +uchar NEAR sort_order_estonia[]={ +#else +uchar sort_order_estonia[]={ +#endif +0, 2, 3, 4, 5, 6, 7, 8, 9, 46, 47, 48, 49, 50, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 44, 51, 52, 53, 54, 55, +56, 39, 57, 58, 59, 93, 60, 40, 61, 62, 118, 122, 124, 126, 128, 129, 130, +131, 132, 133, 63, 64, 94, 95, 96, 65, 66, 134, 144, 146, 152, 154, 164, 166, +170, 172, 178, 180, 184, 190, 192, 198, 206, 208, 210, 214, 229, 232, 238, 240, +250, 252, 221, 67, 68, 69, 70, 71, 72, 135, 145, 147, 153, 155, 165, 167, 171, +173, 179, 181, 185, 191, 193, 199, 207, 209, 211, 215, 230, 233, 239, 241, 251, +253, 222, 73, 74, 75, 76, 28, 1, 29, 87, 30, 90, 116, 113, 114, 31, 117, 32, 91, +33, 78, 82, 81, 34, 85, 86, 88, 89, 115, 42, 43, 35, 231, 36, 92, 37, 79, 84, 38, 45, +254, 102, 103, 104, 255, 77, 105, 204, 106, 212, 98, 107, 41, 108, 142, 109, 97, 125, +127, 80, 110, 111, 112, 205, 123, 213, 99, 119, 120, 121, 143, 140, 176, 136, 148, 244, +138, 162, 160, 150, 156, 223, 158, 168, 182, 174, 186, 219, 194, 196, 200, 202, 242, 246, +100, 236, 188, 216, 234, 248, 225, 227, 218, 141, 177, 137, 149, 245, 139, 163, 161, 151, +157, 224, 159, 169, 183, 175, 187, 220, 195, 197, 201, 203, 243, 247, 101, 237, 189, 217, +235, 249, 226, 228, 83 +}; diff --git a/strings/Attic/ctype-german1.c b/strings/Attic/ctype-german1.c new file mode 100755 index 00000000000..f767edc5f3d --- /dev/null +++ b/strings/Attic/ctype-german1.c @@ -0,0 +1,135 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* This implements the ISO 8859 Latin1 (Modified for German) character-set */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_german1[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,16,2,2,2,2,2,2,2,2, +}; + +uchar NEAR to_lower_german1[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\327', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_german1[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\367', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\377', +}; + +uchar NEAR sort_order_german1[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', +'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', 'O', (uchar) '\327', +(uchar) '\330','U', 'U', 'U', 'U', 'Y', (uchar) '\336',(uchar) '\337', +'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', +'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', 'O', (uchar) '\367', +(uchar) '\330','U', 'U', 'U', 'U', 'Y', (uchar) '\336',(uchar) '\377', +}; diff --git a/strings/Attic/ctype-greek.c b/strings/Attic/ctype-greek.c new file mode 100644 index 00000000000..8d101687c91 --- /dev/null +++ b/strings/Attic/ctype-greek.c @@ -0,0 +1,855 @@ +/* SCV: The content of this file is freeware. + Use it or abuse it. I couldn't care less */ + +/* This implements the ISO 8859-7 Greek character-set */ +/* See the end of this file for a definition of the set */ + +#include <global.h> +#include "m_string.h" + +/* some definitions first */ +#define GREEK_TONOS ((uchar)('\264')) /* 180 */ +#define GREEK_DIALYTIKA_TONOS ((uchar)('\265')) /* 181 */ +#define GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS ((uchar)('\266')) /* 182 */ +#define GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS ((uchar)('\270')) /* 184 */ +#define GREEK_CAPITAL_LETTER_ETA_WITH_TONOS ((uchar)('\271')) /* 185 */ +#define GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS ((uchar)('\272')) /* 186 */ +#define GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS ((uchar)('\274')) /* 188 */ +#define GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS ((uchar)('\276')) /* 190 */ +#define GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS ((uchar)('\277')) /* 191 */ +#define GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS ((uchar)('\300')) /* 192 */ +#define GREEK_CAPITAL_LETTER_ALPHA ((uchar)('\301')) /* 193 */ +#define GREEK_CAPITAL_LETTER_BETA ((uchar)('\302')) /* 194 */ +#define GREEK_CAPITAL_LETTER_GAMMA ((uchar)('\303')) /* 195 */ +#define GREEK_CAPITAL_LETTER_DELTA ((uchar)('\304')) /* 196 */ +#define GREEK_CAPITAL_LETTER_EPSILON ((uchar)('\305')) /* 197 */ +#define GREEK_CAPITAL_LETTER_ZETA ((uchar)('\306')) /* 198 */ +#define GREEK_CAPITAL_LETTER_ETA ((uchar)('\307')) /* 199 */ +#define GREEK_CAPITAL_LETTER_THETA ((uchar)('\310')) /* 200 */ +#define GREEK_CAPITAL_LETTER_IOTA ((uchar)('\311')) /* 201 */ +#define GREEK_CAPITAL_LETTER_KAPPA ((uchar)('\312')) /* 202 */ +#define GREEK_CAPITAL_LETTER_LAMDA ((uchar)('\313')) /* 203 */ +#define GREEK_CAPITAL_LETTER_MU ((uchar)('\314')) /* 204 */ +#define GREEK_CAPITAL_LETTER_NU ((uchar)('\315')) /* 205 */ +#define GREEK_CAPITAL_LETTER_XI ((uchar)('\316')) /* 206 */ +#define GREEK_CAPITAL_LETTER_OMICRON ((uchar)('\317')) /* 207 */ +#define GREEK_CAPITAL_LETTER_PI ((uchar)('\320')) /* 208 */ +#define GREEK_CAPITAL_LETTER_RHO ((uchar)('\321')) /* 209 */ +#define GREEK_CAPITAL_LETTER_SIGMA ((uchar)('\323')) /* 211 */ +#define GREEK_CAPITAL_LETTER_TAU ((uchar)('\324')) /* 212 */ +#define GREEK_CAPITAL_LETTER_UPSILON ((uchar)('\325')) /* 213 */ +#define GREEK_CAPITAL_LETTER_PHI ((uchar)('\326')) /* 214 */ +#define GREEK_CAPITAL_LETTER_CHI ((uchar)('\327')) /* 215 */ +#define GREEK_CAPITAL_LETTER_PSI ((uchar)('\330')) /* 216 */ +#define GREEK_CAPITAL_LETTER_OMEGA ((uchar)('\331')) /* 217 */ +#define GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA ((uchar)('\332')) /* 218 */ +#define GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA ((uchar)('\333')) /* 219 */ +#define GREEK_SMALL_LETTER_ALPHA_WITH_TONOS ((uchar)('\334')) /* 220 */ +#define GREEK_SMALL_LETTER_EPSILON_WITH_TONOS ((uchar)('\335')) /* 221 */ +#define GREEK_SMALL_LETTER_ETA_WITH_TONOS ((uchar)('\336')) /* 222 */ +#define GREEK_SMALL_LETTER_IOTA_WITH_TONOS ((uchar)('\337')) /* 223 */ +#define GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS ((uchar)('\340')) /* 224 */ +#define GREEK_SMALL_LETTER_ALPHA ((uchar)('\341')) /* 225 */ +#define GREEK_SMALL_LETTER_BETA ((uchar)('\342')) /* 226 */ +#define GREEK_SMALL_LETTER_GAMMA ((uchar)('\343')) /* 227 */ +#define GREEK_SMALL_LETTER_DELTA ((uchar)('\344')) /* 228 */ +#define GREEK_SMALL_LETTER_EPSILON ((uchar)('\345')) /* 229 */ +#define GREEK_SMALL_LETTER_ZETA ((uchar)('\346')) /* 230 */ +#define GREEK_SMALL_LETTER_ETA ((uchar)('\347')) /* 231 */ +#define GREEK_SMALL_LETTER_THETA ((uchar)('\350')) /* 232 */ +#define GREEK_SMALL_LETTER_IOTA ((uchar)('\351')) /* 233 */ +#define GREEK_SMALL_LETTER_KAPPA ((uchar)('\352')) /* 234 */ +#define GREEK_SMALL_LETTER_LAMDA ((uchar)('\353')) /* 235 */ +#define GREEK_SMALL_LETTER_MU ((uchar)('\354')) /* 236 */ +#define GREEK_SMALL_LETTER_NU ((uchar)('\355')) /* 237 */ +#define GREEK_SMALL_LETTER_XI ((uchar)('\356')) /* 238 */ +#define GREEK_SMALL_LETTER_OMICRON ((uchar)('\357')) /* 239 */ +#define GREEK_SMALL_LETTER_PI ((uchar)('\360')) /* 240 */ +#define GREEK_SMALL_LETTER_RHO ((uchar)('\361')) /* 241 */ +#define GREEK_SMALL_LETTER_FINAL_SIGMA ((uchar)('\362')) /* 242 */ +#define GREEK_SMALL_LETTER_SIGMA ((uchar)('\363')) /* 243 */ +#define GREEK_SMALL_LETTER_TAU ((uchar)('\364')) /* 244 */ +#define GREEK_SMALL_LETTER_UPSILON ((uchar)('\365')) /* 245 */ +#define GREEK_SMALL_LETTER_PHI ((uchar)('\366')) /* 246 */ +#define GREEK_SMALL_LETTER_CHI ((uchar)('\367')) /* 247 */ +#define GREEK_SMALL_LETTER_PSI ((uchar)('\370')) /* 248 */ +#define GREEK_SMALL_LETTER_OMEGA ((uchar)('\371')) /* 249 */ +#define GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA ((uchar)('\372')) /* 250 */ +#define GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA ((uchar)('\373')) /* 251 */ +#define GREEK_SMALL_LETTER_OMICRON_WITH_TONOS ((uchar)('\374')) /* 252 */ +#define GREEK_SMALL_LETTER_UPSILON_WITH_TONOS ((uchar)('\375')) /* 253 */ +#define GREEK_SMALL_LETTER_OMEGA_WITH_TONOS ((uchar)('\376')) /* 254 */ + +uchar NEAR ctype_greek[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* 0 - 160 are the same as latin-1 */ +/* 160 */ 010 + 0100, +/* 161 */ 020, +/* 162 */ 020, +/* 163 */ 020, +/* 164 */ 0, +/* 165 */ 0, +/* 166 */ 020, +/* 167 */ 020, +/* 168 */ 020, +/* 169 */ 020, +/* 170 */ 0, +/* 171 */ 020, +/* 172 */ 020, +/* 173 */ 020, +/* 174 */ 0, +/* 175 */ 020, +/* 176 */ 020, +/* 177 */ 020, +/* 178 */ 020, +/* 179 */ 020, +/* 180 */ 020, +/* 181 */ 020, +/* 182 */ 01, +/* 183 */ 020, +/* 184 */ 01, +/* 185 */ 01, +/* 186 */ 01, +/* 187 */ 020, +/* 188 */ 01, +/* 189 */ 020, +/* 190 */ 01, +/* 191 */ 01, +/* 192 */ 02, +/* 193 */ 01, +/* 194 */ 01, +/* 195 */ 01, +/* 196 */ 01, +/* 197 */ 01, +/* 198 */ 01, +/* 199 */ 01, +/* 200 */ 01, +/* 201 */ 01, +/* 202 */ 01, +/* 203 */ 01, +/* 204 */ 01, +/* 205 */ 01, +/* 206 */ 01, +/* 207 */ 01, +/* 208 */ 01, +/* 209 */ 01, +/* 210 */ 0, +/* 211 */ 01, +/* 212 */ 01, +/* 213 */ 01, +/* 214 */ 01, +/* 215 */ 01, +/* 216 */ 01, +/* 217 */ 01, +/* 218 */ 01, +/* 219 */ 01, +/* 220 */ 02, +/* 221 */ 02, +/* 222 */ 02, +/* 223 */ 02, +/* 224 */ 02, +/* 225 */ 02, +/* 226 */ 02, +/* 227 */ 02, +/* 228 */ 02, +/* 229 */ 02, +/* 230 */ 02, +/* 231 */ 02, +/* 232 */ 02, +/* 233 */ 02, +/* 234 */ 02, +/* 235 */ 02, +/* 236 */ 02, +/* 237 */ 02, +/* 238 */ 02, +/* 239 */ 02, +/* 240 */ 02, +/* 241 */ 02, +/* 242 */ 02, +/* 243 */ 02, +/* 244 */ 02, +/* 245 */ 02, +/* 246 */ 02, +/* 247 */ 02, +/* 248 */ 02, +/* 249 */ 02, +/* 250 */ 02, +/* 251 */ 02, +/* 252 */ 02, +/* 253 */ 02, +/* 254 */ 02, +/* 255 */ 0 +}; + +uchar NEAR to_lower_greek[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +/* 128 */ (uchar)('\200'), +/* 129 */ (uchar)('\201'), +/* 130 */ (uchar)('\202'), +/* 131 */ (uchar)('\203'), +/* 132 */ (uchar)('\204'), +/* 133 */ (uchar)('\205'), +/* 134 */ (uchar)('\206'), +/* 135 */ (uchar)('\207'), +/* 136 */ (uchar)('\210'), +/* 137 */ (uchar)('\211'), +/* 138 */ (uchar)('\212'), +/* 139 */ (uchar)('\213'), +/* 140 */ (uchar)('\214'), +/* 141 */ (uchar)('\215'), +/* 142 */ (uchar)('\216'), +/* 143 */ (uchar)('\217'), +/* 144 */ (uchar)('\220'), +/* 145 */ (uchar)('\221'), +/* 146 */ (uchar)('\222'), +/* 147 */ (uchar)('\223'), +/* 148 */ (uchar)('\224'), +/* 149 */ (uchar)('\225'), +/* 150 */ (uchar)('\226'), +/* 151 */ (uchar)('\227'), +/* 152 */ (uchar)('\230'), +/* 153 */ (uchar)('\231'), +/* 154 */ (uchar)('\232'), +/* 155 */ (uchar)('\233'), +/* 156 */ (uchar)('\234'), +/* 157 */ (uchar)('\235'), +/* 158 */ (uchar)('\236'), +/* 159 */ (uchar)('\237'), +/* 160 */ (uchar)('\240'), +/* 161 */ (uchar)('\241'), +/* 162 */ (uchar)('\242'), +/* 163 */ (uchar)('\243'), +/* 164 */ (uchar)('\244'), +/* 165 */ (uchar)('\245'), +/* 166 */ (uchar)('\246'), +/* 167 */ (uchar)('\247'), +/* 168 */ (uchar)('\250'), +/* 169 */ (uchar)('\251'), +/* 170 */ (uchar)('\252'), +/* 171 */ (uchar)('\253'), +/* 172 */ (uchar)('\254'), +/* 173 */ (uchar)('\255'), +/* 174 */ (uchar)('\256'), +/* 175 */ (uchar)('\257'), +/* 176 */ (uchar)('\260'), +/* 177 */ (uchar)('\261'), +/* 178 */ (uchar)('\262'), +/* 179 */ (uchar)('\263'), +/* 180 */ GREEK_TONOS, +/* 181 */ GREEK_DIALYTIKA_TONOS, +/* 182 */ GREEK_SMALL_LETTER_ALPHA_WITH_TONOS, +/* 183 */ (uchar)('\267'), +/* 184 */ GREEK_SMALL_LETTER_EPSILON_WITH_TONOS, +/* 185 */ GREEK_SMALL_LETTER_ETA_WITH_TONOS, +/* 186 */ GREEK_SMALL_LETTER_IOTA_WITH_TONOS, +/* 187 */ (uchar)('\273'), +/* 188 */ GREEK_SMALL_LETTER_OMICRON_WITH_TONOS, +/* 189 */ (uchar)('\275'), +/* 190 */ GREEK_SMALL_LETTER_UPSILON_WITH_TONOS, +/* 191 */ GREEK_SMALL_LETTER_OMEGA_WITH_TONOS, +/* 192 */ GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS, +/* 193 */ GREEK_SMALL_LETTER_ALPHA, +/* 194 */ GREEK_SMALL_LETTER_BETA, +/* 195 */ GREEK_SMALL_LETTER_GAMMA, +/* 196 */ GREEK_SMALL_LETTER_DELTA, +/* 197 */ GREEK_SMALL_LETTER_EPSILON, +/* 198 */ GREEK_SMALL_LETTER_ZETA, +/* 199 */ GREEK_SMALL_LETTER_ETA, +/* 200 */ GREEK_SMALL_LETTER_THETA, +/* 201 */ GREEK_SMALL_LETTER_IOTA, +/* 202 */ GREEK_SMALL_LETTER_KAPPA, +/* 203 */ GREEK_SMALL_LETTER_LAMDA, +/* 204 */ GREEK_SMALL_LETTER_MU, +/* 205 */ GREEK_SMALL_LETTER_NU, +/* 206 */ GREEK_SMALL_LETTER_XI, +/* 207 */ GREEK_SMALL_LETTER_OMICRON, +/* 208 */ GREEK_SMALL_LETTER_PI, +/* 209 */ GREEK_SMALL_LETTER_RHO, +/* 210 */ (uchar)('\322'), +/* 211 */ GREEK_SMALL_LETTER_SIGMA, +/* 212 */ GREEK_SMALL_LETTER_TAU, +/* 213 */ GREEK_SMALL_LETTER_UPSILON, +/* 214 */ GREEK_SMALL_LETTER_PHI, +/* 215 */ GREEK_SMALL_LETTER_CHI, +/* 216 */ GREEK_SMALL_LETTER_PSI, +/* 217 */ GREEK_SMALL_LETTER_OMEGA, +/* 218 */ GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA, +/* 219 */ GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA, +/* 220 */ GREEK_SMALL_LETTER_ALPHA_WITH_TONOS, +/* 221 */ GREEK_SMALL_LETTER_EPSILON_WITH_TONOS, +/* 222 */ GREEK_SMALL_LETTER_ETA_WITH_TONOS, +/* 223 */ GREEK_SMALL_LETTER_IOTA_WITH_TONOS, +/* 224 */ GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS, +/* 225 */ GREEK_SMALL_LETTER_ALPHA, +/* 226 */ GREEK_SMALL_LETTER_BETA, +/* 227 */ GREEK_SMALL_LETTER_GAMMA, +/* 228 */ GREEK_SMALL_LETTER_DELTA, +/* 229 */ GREEK_SMALL_LETTER_EPSILON, +/* 230 */ GREEK_SMALL_LETTER_ZETA, +/* 231 */ GREEK_SMALL_LETTER_ETA, +/* 232 */ GREEK_SMALL_LETTER_THETA, +/* 233 */ GREEK_SMALL_LETTER_IOTA, +/* 234 */ GREEK_SMALL_LETTER_KAPPA, +/* 235 */ GREEK_SMALL_LETTER_LAMDA, +/* 236 */ GREEK_SMALL_LETTER_MU, +/* 237 */ GREEK_SMALL_LETTER_NU, +/* 238 */ GREEK_SMALL_LETTER_XI, +/* 239 */ GREEK_SMALL_LETTER_OMICRON, +/* 240 */ GREEK_SMALL_LETTER_PI, +/* 241 */ GREEK_SMALL_LETTER_RHO, +/* 242 */ GREEK_SMALL_LETTER_FINAL_SIGMA, +/* 243 */ GREEK_SMALL_LETTER_SIGMA, +/* 244 */ GREEK_SMALL_LETTER_TAU, +/* 245 */ GREEK_SMALL_LETTER_UPSILON, +/* 246 */ GREEK_SMALL_LETTER_PHI, +/* 247 */ GREEK_SMALL_LETTER_CHI, +/* 248 */ GREEK_SMALL_LETTER_PSI, +/* 249 */ GREEK_SMALL_LETTER_OMEGA, +/* 250 */ GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA, +/* 251 */ GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA, +/* 252 */ GREEK_SMALL_LETTER_OMICRON_WITH_TONOS, +/* 253 */ GREEK_SMALL_LETTER_UPSILON_WITH_TONOS, +/* 254 */ GREEK_SMALL_LETTER_OMEGA_WITH_TONOS, +/* 255 */ (uchar)('\377') +}; + +uchar NEAR to_upper_greek[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +/* 128 */ (uchar)('\200'), +/* 129 */ (uchar)('\201'), +/* 130 */ (uchar)('\202'), +/* 131 */ (uchar)('\203'), +/* 132 */ (uchar)('\204'), +/* 133 */ (uchar)('\205'), +/* 134 */ (uchar)('\206'), +/* 135 */ (uchar)('\207'), +/* 136 */ (uchar)('\210'), +/* 137 */ (uchar)('\211'), +/* 138 */ (uchar)('\212'), +/* 139 */ (uchar)('\213'), +/* 140 */ (uchar)('\214'), +/* 141 */ (uchar)('\215'), +/* 142 */ (uchar)('\216'), +/* 143 */ (uchar)('\217'), +/* 144 */ (uchar)('\220'), +/* 145 */ (uchar)('\221'), +/* 146 */ (uchar)('\222'), +/* 147 */ (uchar)('\223'), +/* 148 */ (uchar)('\224'), +/* 149 */ (uchar)('\225'), +/* 150 */ (uchar)('\226'), +/* 151 */ (uchar)('\227'), +/* 152 */ (uchar)('\230'), +/* 153 */ (uchar)('\231'), +/* 154 */ (uchar)('\232'), +/* 155 */ (uchar)('\233'), +/* 156 */ (uchar)('\234'), +/* 157 */ (uchar)('\235'), +/* 158 */ (uchar)('\236'), +/* 159 */ (uchar)('\237'), +/* 160 */ (uchar)('\240'), +/* 161 */ (uchar)('\241'), +/* 162 */ (uchar)('\242'), +/* 163 */ (uchar)('\243'), +/* 164 */ (uchar)('\244'), +/* 165 */ (uchar)('\245'), +/* 166 */ (uchar)('\246'), +/* 167 */ (uchar)('\247'), +/* 168 */ (uchar)('\250'), +/* 169 */ (uchar)('\251'), +/* 170 */ (uchar)('\252'), +/* 171 */ (uchar)('\253'), +/* 172 */ (uchar)('\254'), +/* 173 */ (uchar)('\255'), +/* 174 */ (uchar)('\256'), +/* 175 */ (uchar)('\257'), +/* 176 */ (uchar)('\260'), +/* 177 */ (uchar)('\261'), +/* 178 */ (uchar)('\262'), +/* 179 */ (uchar)('\263'), +/* 180 */ GREEK_TONOS, +/* 181 */ GREEK_DIALYTIKA_TONOS, +/* 182 */ GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS, +/* 183 */ (uchar)('\267'), +/* 184 */ GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS, +/* 185 */ GREEK_CAPITAL_LETTER_ETA_WITH_TONOS, +/* 186 */ GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS, +/* 187 */ (uchar)('\273'), +/* 188 */ GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS, +/* 189 */ (uchar)('\275'), +/* 190 */ GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS, +/* 191 */ GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS, +/* 192 */ GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA, +/* 193 */ GREEK_CAPITAL_LETTER_ALPHA, +/* 194 */ GREEK_CAPITAL_LETTER_BETA, +/* 195 */ GREEK_CAPITAL_LETTER_GAMMA, +/* 196 */ GREEK_CAPITAL_LETTER_DELTA, +/* 197 */ GREEK_CAPITAL_LETTER_EPSILON, +/* 198 */ GREEK_CAPITAL_LETTER_ZETA, +/* 199 */ GREEK_CAPITAL_LETTER_ETA, +/* 200 */ GREEK_CAPITAL_LETTER_THETA, +/* 201 */ GREEK_CAPITAL_LETTER_IOTA, +/* 202 */ GREEK_CAPITAL_LETTER_KAPPA, +/* 203 */ GREEK_CAPITAL_LETTER_LAMDA, +/* 204 */ GREEK_CAPITAL_LETTER_MU, +/* 205 */ GREEK_CAPITAL_LETTER_NU, +/* 206 */ GREEK_CAPITAL_LETTER_XI, +/* 207 */ GREEK_CAPITAL_LETTER_OMICRON, +/* 208 */ GREEK_CAPITAL_LETTER_PI, +/* 209 */ GREEK_CAPITAL_LETTER_RHO, +/* 210 */ (uchar)('\322'), +/* 211 */ GREEK_CAPITAL_LETTER_SIGMA, +/* 212 */ GREEK_CAPITAL_LETTER_TAU, +/* 213 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 214 */ GREEK_CAPITAL_LETTER_PHI, +/* 215 */ GREEK_CAPITAL_LETTER_CHI, +/* 216 */ GREEK_CAPITAL_LETTER_PSI, +/* 217 */ GREEK_CAPITAL_LETTER_OMEGA, +/* 218 */ GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA, +/* 219 */ GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA, +/* 220 */ GREEK_CAPITAL_LETTER_ALPHA, +/* 221 */ GREEK_CAPITAL_LETTER_EPSILON, +/* 222 */ GREEK_CAPITAL_LETTER_ETA, +/* 223 */ GREEK_CAPITAL_LETTER_IOTA, +/* 224 */ GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA, +/* 225 */ GREEK_CAPITAL_LETTER_ALPHA, +/* 226 */ GREEK_CAPITAL_LETTER_BETA, +/* 227 */ GREEK_CAPITAL_LETTER_GAMMA, +/* 228 */ GREEK_CAPITAL_LETTER_DELTA, +/* 229 */ GREEK_CAPITAL_LETTER_EPSILON, +/* 230 */ GREEK_CAPITAL_LETTER_ZETA, +/* 231 */ GREEK_CAPITAL_LETTER_ETA, +/* 232 */ GREEK_CAPITAL_LETTER_THETA, +/* 233 */ GREEK_CAPITAL_LETTER_IOTA, +/* 234 */ GREEK_CAPITAL_LETTER_KAPPA, +/* 235 */ GREEK_CAPITAL_LETTER_LAMDA, +/* 236 */ GREEK_CAPITAL_LETTER_MU, +/* 237 */ GREEK_CAPITAL_LETTER_NU, +/* 238 */ GREEK_CAPITAL_LETTER_XI, +/* 239 */ GREEK_CAPITAL_LETTER_OMICRON, +/* 240 */ GREEK_CAPITAL_LETTER_PI, +/* 241 */ GREEK_CAPITAL_LETTER_RHO, +/* 242 */ GREEK_CAPITAL_LETTER_SIGMA, +/* 243 */ GREEK_CAPITAL_LETTER_SIGMA, +/* 244 */ GREEK_CAPITAL_LETTER_TAU, +/* 245 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 246 */ GREEK_CAPITAL_LETTER_PHI, +/* 247 */ GREEK_CAPITAL_LETTER_CHI, +/* 248 */ GREEK_CAPITAL_LETTER_PSI, +/* 249 */ GREEK_CAPITAL_LETTER_OMEGA, +/* 250 */ GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA, +/* 251 */ GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA, +/* 252 */ GREEK_CAPITAL_LETTER_OMICRON, +/* 253 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 254 */ GREEK_CAPITAL_LETTER_OMEGA, +/* 255 */ (uchar)('\377') +}; + +uchar NEAR sort_order_greek[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263', + /* 0 - 180 are the same as latin-1 */ +/* 180 */ GREEK_TONOS, +/* 181 */ GREEK_DIALYTIKA_TONOS, +/* 182 */ GREEK_CAPITAL_LETTER_ALPHA, +/* 183 */ (uchar)('\267'), +/* 184 */ GREEK_CAPITAL_LETTER_EPSILON, +/* 185 */ GREEK_CAPITAL_LETTER_ETA, +/* 186 */ GREEK_CAPITAL_LETTER_IOTA, +/* 187 */ (uchar)('\273'), +/* 188 */ GREEK_CAPITAL_LETTER_OMICRON, +/* 189 */ (uchar)('\275'), +/* 190 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 191 */ GREEK_CAPITAL_LETTER_OMEGA, +/* 192 */ GREEK_CAPITAL_LETTER_IOTA, +/* 193 */ GREEK_CAPITAL_LETTER_ALPHA, +/* 194 */ GREEK_CAPITAL_LETTER_BETA, +/* 195 */ GREEK_CAPITAL_LETTER_GAMMA, +/* 196 */ GREEK_CAPITAL_LETTER_DELTA, +/* 197 */ GREEK_CAPITAL_LETTER_EPSILON, +/* 198 */ GREEK_CAPITAL_LETTER_ZETA, +/* 199 */ GREEK_CAPITAL_LETTER_ETA, +/* 200 */ GREEK_CAPITAL_LETTER_THETA, +/* 201 */ GREEK_CAPITAL_LETTER_IOTA, +/* 202 */ GREEK_CAPITAL_LETTER_KAPPA, +/* 203 */ GREEK_CAPITAL_LETTER_LAMDA, +/* 204 */ GREEK_CAPITAL_LETTER_MU, +/* 205 */ GREEK_CAPITAL_LETTER_NU, +/* 206 */ GREEK_CAPITAL_LETTER_XI, +/* 207 */ GREEK_CAPITAL_LETTER_OMICRON, +/* 208 */ GREEK_CAPITAL_LETTER_PI, +/* 209 */ GREEK_CAPITAL_LETTER_RHO, +/* 210 */ (uchar)('\322'), +/* 211 */ GREEK_CAPITAL_LETTER_SIGMA, +/* 212 */ GREEK_CAPITAL_LETTER_TAU, +/* 213 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 214 */ GREEK_CAPITAL_LETTER_PHI, +/* 215 */ GREEK_CAPITAL_LETTER_CHI, +/* 216 */ GREEK_CAPITAL_LETTER_PSI, +/* 217 */ GREEK_CAPITAL_LETTER_OMEGA, +/* 218 */ GREEK_CAPITAL_LETTER_IOTA, +/* 219 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 220 */ GREEK_CAPITAL_LETTER_ALPHA, +/* 221 */ GREEK_CAPITAL_LETTER_EPSILON, +/* 222 */ GREEK_CAPITAL_LETTER_ETA, +/* 223 */ GREEK_CAPITAL_LETTER_IOTA, +/* 224 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 225 */ GREEK_CAPITAL_LETTER_ALPHA, +/* 226 */ GREEK_CAPITAL_LETTER_BETA, +/* 227 */ GREEK_CAPITAL_LETTER_GAMMA, +/* 228 */ GREEK_CAPITAL_LETTER_DELTA, +/* 229 */ GREEK_CAPITAL_LETTER_EPSILON, +/* 230 */ GREEK_CAPITAL_LETTER_ZETA, +/* 231 */ GREEK_CAPITAL_LETTER_ETA, +/* 232 */ GREEK_CAPITAL_LETTER_THETA, +/* 233 */ GREEK_CAPITAL_LETTER_IOTA, +/* 234 */ GREEK_CAPITAL_LETTER_KAPPA, +/* 235 */ GREEK_CAPITAL_LETTER_LAMDA, +/* 236 */ GREEK_CAPITAL_LETTER_MU, +/* 237 */ GREEK_CAPITAL_LETTER_NU, +/* 238 */ GREEK_CAPITAL_LETTER_XI, +/* 239 */ GREEK_CAPITAL_LETTER_OMICRON, +/* 240 */ GREEK_CAPITAL_LETTER_PI, +/* 241 */ GREEK_CAPITAL_LETTER_RHO, +/* 242 */ GREEK_CAPITAL_LETTER_SIGMA, +/* 243 */ GREEK_CAPITAL_LETTER_SIGMA, +/* 244 */ GREEK_CAPITAL_LETTER_TAU, +/* 245 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 246 */ GREEK_CAPITAL_LETTER_PHI, +/* 247 */ GREEK_CAPITAL_LETTER_CHI, +/* 248 */ GREEK_CAPITAL_LETTER_PSI, +/* 249 */ GREEK_CAPITAL_LETTER_OMEGA, +/* 250 */ GREEK_CAPITAL_LETTER_IOTA, +/* 251 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 252 */ GREEK_CAPITAL_LETTER_OMICRON, +/* 253 */ GREEK_CAPITAL_LETTER_UPSILON, +/* 254 */ GREEK_CAPITAL_LETTER_OMEGA, +(uchar) '\377' +}; + +/* let's clean after ourselves */ +#undef GREEK_TONOS +#undef GREEK_DIALYTIKA_TONOS +#undef GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS +#undef GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS +#undef GREEK_CAPITAL_LETTER_ETA_WITH_TONOS +#undef GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS +#undef GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS +#undef GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS +#undef GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS +#undef GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS +#undef GREEK_CAPITAL_LETTER_ALPHA +#undef GREEK_CAPITAL_LETTER_BETA +#undef GREEK_CAPITAL_LETTER_GAMMA +#undef GREEK_CAPITAL_LETTER_DELTA +#undef GREEK_CAPITAL_LETTER_EPSILON +#undef GREEK_CAPITAL_LETTER_ZETA +#undef GREEK_CAPITAL_LETTER_ETA +#undef GREEK_CAPITAL_LETTER_THETA +#undef GREEK_CAPITAL_LETTER_IOTA +#undef GREEK_CAPITAL_LETTER_KAPPA +#undef GREEK_CAPITAL_LETTER_LAMDA +#undef GREEK_CAPITAL_LETTER_MU +#undef GREEK_CAPITAL_LETTER_NU +#undef GREEK_CAPITAL_LETTER_XI +#undef GREEK_CAPITAL_LETTER_OMICRON +#undef GREEK_CAPITAL_LETTER_PI +#undef GREEK_CAPITAL_LETTER_RHO +#undef GREEK_CAPITAL_LETTER_SIGMA +#undef GREEK_CAPITAL_LETTER_TAU +#undef GREEK_CAPITAL_LETTER_UPSILON +#undef GREEK_CAPITAL_LETTER_PHI +#undef GREEK_CAPITAL_LETTER_CHI +#undef GREEK_CAPITAL_LETTER_PSI +#undef GREEK_CAPITAL_LETTER_OMEGA +#undef GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA +#undef GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA +#undef GREEK_SMALL_LETTER_ALPHA_WITH_TONOS +#undef GREEK_SMALL_LETTER_EPSILON_WITH_TONOS +#undef GREEK_SMALL_LETTER_ETA_WITH_TONOS +#undef GREEK_SMALL_LETTER_IOTA_WITH_TONOS +#undef GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS ((uchar)('\340')) /* 224 */ +#undef GREEK_SMALL_LETTER_ALPHA +#undef GREEK_SMALL_LETTER_BETA +#undef GREEK_SMALL_LETTER_GAMMA +#undef GREEK_SMALL_LETTER_DELTA +#undef GREEK_SMALL_LETTER_EPSILON +#undef GREEK_SMALL_LETTER_ZETA +#undef GREEK_SMALL_LETTER_ETA +#undef GREEK_SMALL_LETTER_THETA +#undef GREEK_SMALL_LETTER_IOTA +#undef GREEK_SMALL_LETTER_KAPPA +#undef GREEK_SMALL_LETTER_LAMDA +#undef GREEK_SMALL_LETTER_MU +#undef GREEK_SMALL_LETTER_NU +#undef GREEK_SMALL_LETTER_XI +#undef GREEK_SMALL_LETTER_OMICRON +#undef GREEK_SMALL_LETTER_PI +#undef GREEK_SMALL_LETTER_RHO +#undef GREEK_SMALL_LETTER_FINAL_SIGMA +#undef GREEK_SMALL_LETTER_SIGMA +#undef GREEK_SMALL_LETTER_TAU +#undef GREEK_SMALL_LETTER_UPSILON +#undef GREEK_SMALL_LETTER_PHI +#undef GREEK_SMALL_LETTER_CHI +#undef GREEK_SMALL_LETTER_PSI +#undef GREEK_SMALL_LETTER_OMEGA +#undef GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA +#undef GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA +#undef GREEK_SMALL_LETTER_OMICRON_WITH_TONOS +#undef GREEK_SMALL_LETTER_UPSILON_WITH_TONOS +#undef GREEK_SMALL_LETTER_OMEGA_WITH_TONOS + +#if 0 +ISO 8859-7 (Latin/Greek Alphabet) +Dec Hex ISO/IEC 10646-1:1993(E) Character Name + 32 20 SPACE + 33 21 EXCLAMATION MARK + 34 22 QUOTATION MARK + 35 23 NUMBER SIGN + 36 24 DOLLAR SIGN + 37 25 PERCENT SIGN + 38 26 AMPERSAND + 39 27 APOSTROPHE + 40 28 LEFT PARENTHESIS + 41 29 RIGHT PARENTHESIS + 42 2A ASTERISK + 43 2B PLUS SIGN + 44 2C COMMA + 45 2D HYPHEN-MINUS + 46 2E FULL STOP + 47 2F SOLIDUS + 48 30 DIGIT ZERO + 49 31 DIGIT ONE + 50 32 DIGIT TWO + 51 33 DIGIT THREE + 52 34 DIGIT FOUR + 53 35 DIGIT FIVE + 54 36 DIGIT SIX + 55 37 DIGIT SEVEN + 56 38 DIGIT EIGHT + 57 39 DIGIT NINE + 58 3A COLON + 59 3B SEMICOLON + 60 3C LESS-THAN SIGN + 61 3D EQUALS SIGN + 62 3E GREATER-THAN SIGN + 63 3F QUESTION MARK + 64 40 COMMERCIAL AT + 65 41 LATIN CAPITAL LETTER A + 66 42 LATIN CAPITAL LETTER B + 67 43 LATIN CAPITAL LETTER C + 68 44 LATIN CAPITAL LETTER D + 69 45 LATIN CAPITAL LETTER E + 70 46 LATIN CAPITAL LETTER F + 71 47 LATIN CAPITAL LETTER G + 72 48 LATIN CAPITAL LETTER H + 73 49 LATIN CAPITAL LETTER I + 74 4A LATIN CAPITAL LETTER J + 75 4B LATIN CAPITAL LETTER K + 76 4C LATIN CAPITAL LETTER L + 77 4D LATIN CAPITAL LETTER M + 78 4E LATIN CAPITAL LETTER N + 79 4F LATIN CAPITAL LETTER O + 80 50 LATIN CAPITAL LETTER P + 81 51 LATIN CAPITAL LETTER Q + 82 52 LATIN CAPITAL LETTER R + 83 53 LATIN CAPITAL LETTER S + 84 54 LATIN CAPITAL LETTER T + 85 55 LATIN CAPITAL LETTER U + 86 56 LATIN CAPITAL LETTER V + 87 57 LATIN CAPITAL LETTER W + 88 58 LATIN CAPITAL LETTER X + 89 59 LATIN CAPITAL LETTER Y + 90 5A LATIN CAPITAL LETTER Z + 91 5B LEFT SQUARE BRACKET + 92 5C REVERSE SOLIDUS + 93 5D RIGHT SQUARE BRACKET + 94 5E CIRCUMFLEX ACCENT + 95 5F LOW LINE + 96 60 GRAVE ACCENT + 97 61 LATIN SMALL LETTER A + 98 62 LATIN SMALL LETTER B + 99 63 LATIN SMALL LETTER C +100 64 LATIN SMALL LETTER D +101 65 LATIN SMALL LETTER E +102 66 LATIN SMALL LETTER F +103 67 LATIN SMALL LETTER G +104 68 LATIN SMALL LETTER H +105 69 LATIN SMALL LETTER I +106 6A LATIN SMALL LETTER J +107 6B LATIN SMALL LETTER K +108 6C LATIN SMALL LETTER L +109 6D LATIN SMALL LETTER M +110 6E LATIN SMALL LETTER N +111 6F LATIN SMALL LETTER O +112 70 LATIN SMALL LETTER P +113 71 LATIN SMALL LETTER Q +114 72 LATIN SMALL LETTER R +115 73 LATIN SMALL LETTER S +116 74 LATIN SMALL LETTER T +117 75 LATIN SMALL LETTER U +118 76 LATIN SMALL LETTER V +119 77 LATIN SMALL LETTER W +120 78 LATIN SMALL LETTER X +121 79 LATIN SMALL LETTER Y +122 7A LATIN SMALL LETTER Z +123 7B LEFT CURLY BRACKET +124 7C VERTICAL LINE +125 7D RIGHT CURLY BRACKET +126 7E TILDE +160 A0 NO-BREAK SPACE +161 A1 LEFT SINGLE QUOTATION MARK +162 A2 RIGHT SINGLE QUOTATION MARK +163 A3 POUND SIGN +166 A6 BROKEN BAR +167 A7 SECTION SIGN +168 A8 DIAERESIS +169 A9 COPYRIGHT SIGN +171 AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +172 AC NOT SIGN +173 AD SOFT HYPHEN +175 AF HORIZONTAL BAR +176 B0 DEGREE SIGN +177 B1 PLUS-MINUS SIGN +178 B2 SUPERSCRIPT TWO +179 B3 SUPERSCRIPT THREE +180 B4 GREEK TONOS +181 B5 GREEK DIALYTIKA TONOS +182 B6 GREEK CAPITAL LETTER ALPHA WITH TONOS +183 B7 MIDDLE DOT +184 B8 GREEK CAPITAL LETTER EPSILON WITH TONOS +185 B9 GREEK CAPITAL LETTER ETA WITH TONOS +186 BA GREEK CAPITAL LETTER IOTA WITH TONOS +187 BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +188 BC GREEK CAPITAL LETTER OMICRON WITH TONOS +189 BD VULGAR FRACTION ONE HALF +190 BE GREEK CAPITAL LETTER UPSILON WITH TONOS +191 BF GREEK CAPITAL LETTER OMEGA WITH TONOS +192 C0 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +193 C1 GREEK CAPITAL LETTER ALPHA +194 C2 GREEK CAPITAL LETTER BETA +195 C3 GREEK CAPITAL LETTER GAMMA +196 C4 GREEK CAPITAL LETTER DELTA +197 C5 GREEK CAPITAL LETTER EPSILON +198 C6 GREEK CAPITAL LETTER ZETA +199 C7 GREEK CAPITAL LETTER ETA +200 C8 GREEK CAPITAL LETTER THETA +201 C9 GREEK CAPITAL LETTER IOTA +202 CA GREEK CAPITAL LETTER KAPPA +203 CB GREEK CAPITAL LETTER LAMDA +204 CC GREEK CAPITAL LETTER MU +205 CD GREEK CAPITAL LETTER NU +206 CE GREEK CAPITAL LETTER XI +207 CF GREEK CAPITAL LETTER OMICRON +208 D0 GREEK CAPITAL LETTER PI +209 D1 GREEK CAPITAL LETTER RHO +211 D3 GREEK CAPITAL LETTER SIGMA +212 D4 GREEK CAPITAL LETTER TAU +213 D5 GREEK CAPITAL LETTER UPSILON +214 D6 GREEK CAPITAL LETTER PHI +215 D7 GREEK CAPITAL LETTER CHI +216 D8 GREEK CAPITAL LETTER PSI +217 D9 GREEK CAPITAL LETTER OMEGA +218 DA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +219 DB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +220 DC GREEK SMALL LETTER ALPHA WITH TONOS +221 DD GREEK SMALL LETTER EPSILON WITH TONOS +222 DE GREEK SMALL LETTER ETA WITH TONOS +223 DF GREEK SMALL LETTER IOTA WITH TONOS +224 E0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +225 E1 GREEK SMALL LETTER ALPHA +226 E2 GREEK SMALL LETTER BETA +227 E3 GREEK SMALL LETTER GAMMA +228 E4 GREEK SMALL LETTER DELTA +229 E5 GREEK SMALL LETTER EPSILON +230 E6 GREEK SMALL LETTER ZETA +231 E7 GREEK SMALL LETTER ETA +232 E8 GREEK SMALL LETTER THETA +233 E9 GREEK SMALL LETTER IOTA +234 EA GREEK SMALL LETTER KAPPA +235 EB GREEK SMALL LETTER LAMDA +236 EC GREEK SMALL LETTER MU +237 ED GREEK SMALL LETTER NU +238 EE GREEK SMALL LETTER XI +239 EF GREEK SMALL LETTER OMICRON +240 F0 GREEK SMALL LETTER PI +241 F1 GREEK SMALL LETTER RHO +242 F2 GREEK SMALL LETTER FINAL SIGMA +243 F3 GREEK SMALL LETTER SIGMA +244 F4 GREEK SMALL LETTER TAU +245 F5 GREEK SMALL LETTER UPSILON +246 F6 GREEK SMALL LETTER PHI +247 F7 GREEK SMALL LETTER CHI +248 F8 GREEK SMALL LETTER PSI +249 F9 GREEK SMALL LETTER OMEGA +250 FA GREEK SMALL LETTER IOTA WITH DIALYTIKA +251 FB GREEK SMALL LETTER UPSILON WITH DIALYTIKA +252 FC GREEK SMALL LETTER OMICRON WITH TONOS +253 FD GREEK SMALL LETTER UPSILON WITH TONOS +254 FE GREEK SMALL LETTER OMEGA WITH TONOS +#endif diff --git a/strings/Attic/ctype-hebrew.c b/strings/Attic/ctype-hebrew.c new file mode 100644 index 00000000000..b1566b2bbe4 --- /dev/null +++ b/strings/Attic/ctype-hebrew.c @@ -0,0 +1,135 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* This implements the ISO 8859 Latin1 character-set */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_hebrew[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0, +}; + +uchar NEAR to_lower_hebrew[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_hebrew[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_hebrew[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\367', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\377', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; diff --git a/strings/Attic/ctype-hp8.c b/strings/Attic/ctype-hp8.c new file mode 100644 index 00000000000..6397c3cb974 --- /dev/null +++ b/strings/Attic/ctype-hp8.c @@ -0,0 +1,133 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_hp8[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, + +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,32,32,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,2,16,16,16,16,16,16,2,16,2,2, +1,16,16,1,2,16,16,2,1,16,1,1,1,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,32,32,32,32,16,16,16,16,16,16,16,16,16,32, +}; + +uchar NEAR to_lower_hp8[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\310',(uchar) '\300',(uchar) '\311',(uchar) '\301',(uchar) '\315',(uchar) '\321',(uchar) '\335', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\313',(uchar) '\303',(uchar) '\257', +(uchar) '\260',(uchar) '\262',(uchar) '\262',(uchar) '\263',(uchar) '\265',(uchar) '\265',(uchar) '\267',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\324',(uchar) '\321',(uchar) '\326',(uchar) '\327',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\314',(uchar) '\331',(uchar) '\316',(uchar) '\317',(uchar) '\305',(uchar) '\335',(uchar) '\336',(uchar) '\302', +(uchar) '\304',(uchar) '\342',(uchar) '\342',(uchar) '\344',(uchar) '\344',(uchar) '\325',(uchar) '\331',(uchar) '\306', +(uchar) '\312',(uchar) '\352',(uchar) '\352',(uchar) '\354',(uchar) '\354',(uchar) '\307',(uchar) '\357',(uchar) '\357', +(uchar) '\361',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_hp8[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\261',(uchar) '\263',(uchar) '\264',(uchar) '\264',(uchar) '\266',(uchar) '\266', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\242',(uchar) '\244',(uchar) '\337',(uchar) '\256',(uchar) '\340',(uchar) '\334',(uchar) '\347',(uchar) '\355', +(uchar) '\241',(uchar) '\243',(uchar) '\350',(uchar) '\255',(uchar) '\330',(uchar) '\245',(uchar) '\332',(uchar) '\333', +(uchar) '\320',(uchar) '\246',(uchar) '\322',(uchar) '\323',(uchar) '\320',(uchar) '\345',(uchar) '\322',(uchar) '\323', +(uchar) '\330',(uchar) '\346',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\247',(uchar) '\336',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\341',(uchar) '\343',(uchar) '\343',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\351',(uchar) '\353',(uchar) '\353',(uchar) '\355',(uchar) '\356',(uchar) '\356', +(uchar) '\360',(uchar) '\360',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_hp8[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '\\', ']', '[', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; diff --git a/strings/Attic/ctype-hungarian.c b/strings/Attic/ctype-hungarian.c new file mode 100644 index 00000000000..548c87f0d49 --- /dev/null +++ b/strings/Attic/ctype-hungarian.c @@ -0,0 +1,113 @@ +/* + * File generated by cset + * (C) Abandoned 1998 Zoltan Klar <klarz@svr-sun.ktg.gau.hu> + * (C) 1999 é,ö sort order corrected by Huba Gaspar <huba@unixoft.hu> + * This file is based on ctype-latin2.c + * + * n a g y k i c s i sort + * kod + * A' 143 181 193 160 225 67 ==a, ha == 65 + * E' 144 201 130 233 79 ==e, ha == 78 + * I' 141 140 205 161 237 86 ==i + * O" 167 138 213 147 139 245 103 + * O' 149 224 211 162 243 100 ==o + * O: 153 214 148 246 103 + * U" 152 235 219 150 251 120 + * U' 151 218 163 250 117 ==u + * U: 154 220 129 252 120 + */ +#define hungarian_AA_EE +/* megadása esetén az A és Á, valamint az E és az É nincs megkülönböztetve + * a rendezés szempomtjából + */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_hungarian[257] = { +0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, + 1, 16, 1, 16, 1, 1, 16, 0, 0, 1, 1, 1, 1, 16, 1, 1, + 16, 2, 16, 2, 16, 2, 2, 16, 16, 2, 2, 2, 2, 16, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 16, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16 +}; + +uchar NEAR to_lower_hungarian[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,139,139,161,161,142,160, +130,145,146,147,148,162,150,163,150,148,129,155,156,157,158,159, +160,161,162,163,181,182,166,147,168,185,186,187,188,173,190,191, +176,177,178,179,180,225,182,183,184,185,186,187,188,189,190,191, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +208,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, +162,225,226,227,228,229,230,231,232,233,234,150,236,237,238,239, +240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 +}; + +uchar NEAR to_upper_hungarian[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, +128,154,144,131,132,133,134,135,136,137,138,138,140,141,142,143, +144,145,146,167,153,149,152,151,152,153,154,155,156,157,158,159, +143,141,149,151,164,165,166,167,168,169,170,171,172,173,174,175, +176,160,178,162,180,181,165,183,184,169,170,171,172,189,174,175, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, +224,193,194,195,196,197,198,199,200,201,202,235,204,205,206,207, +240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255 +}; + +uchar NEAR sort_order_hungarian[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100, +105,106,107,110,114,117,122,123,124,125,127,131,132,133,134,135, +136, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100, +105,106,107,110,114,117,122,123,124,125,127,137,138,139,140, 0, +#ifdef hungarian_AA_EE + 1,120, 78, 4, 5, 6, 7, 8, 9, 10,103,103, 86, 86, 15, 65, + 78, 18, 19,103,103,100,120,117,120,103,120, 28, 29, 30, 31,255, + 65, 86,100,117, 94,111,255,103,255,112,113,115,128,255,129,130, +255, 66,255, 93,255, 65,111,255,255,112,113,115,128,255,129,130, +108, 65, 68, 69, 70, 95, 73, 75, 74, 78, 81, 82, 80, 86, 87, 77, +255, 98, 99,100,102,103,103,255,109,119,117,120,120,126,116,255, +100, 65, 68, 69, 70, 95, 73, 75, 74, 78, 81,120, 80, 86, 88, 77, +255, 98, 99,100,102,103,103,255,109,119,117,120,120,126,116,255 +#else + 1,120, 79, 4, 5, 6, 7, 8, 9, 10,103,103, 86, 86, 15, 67, + 79, 18, 19,103,103,100,120,117,120,103,120, 28, 29, 30, 31,255, + 67, 86,100,117, 94,111,255,103,255,112,113,115,128,255,129,130, +255, 66,255, 93,255, 67,111,255,255,112,113,115,128,255,129,130, +108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 86, 87, 77, +255, 98, 99,100,102,103,103,255,109,119,117,120,120,126,116,255, +100, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81,120, 80, 86, 88, 77, +255, 98, 99,100,102,103,103,255,109,119,117,120,120,126,116,255 +#endif +}; diff --git a/strings/Attic/ctype-koi8_ru.c b/strings/Attic/ctype-koi8_ru.c new file mode 100644 index 00000000000..6619e5322e6 --- /dev/null +++ b/strings/Attic/ctype-koi8_ru.c @@ -0,0 +1,133 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_koi8_ru[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,2,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,1,16,16,16,16,16,16,16,16,16,16,16,16, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +}; + +uchar NEAR to_lower_koi8_ru[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\243',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +}; + +uchar NEAR to_upper_koi8_ru[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\263',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_koi8_ru[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\345',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246', +(uchar) '\247',(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256', +(uchar) '\257',(uchar) '\260',(uchar) '\261',(uchar) '\345',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265', +(uchar) '\266',(uchar) '\267',(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275', +(uchar) '\376',(uchar) '\337',(uchar) '\340',(uchar) '\366',(uchar) '\343',(uchar) '\344',(uchar) '\364',(uchar) '\342', +(uchar) '\365',(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356', +(uchar) '\357',(uchar) '\377',(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\346',(uchar) '\341', +(uchar) '\374',(uchar) '\373',(uchar) '\347',(uchar) '\370',(uchar) '\375',(uchar) '\371',(uchar) '\367',(uchar) '\372', +(uchar) '\376',(uchar) '\337',(uchar) '\340',(uchar) '\366',(uchar) '\343',(uchar) '\344',(uchar) '\364',(uchar) '\342', +(uchar) '\365',(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356', +(uchar) '\357',(uchar) '\377',(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\346',(uchar) '\341', +(uchar) '\374',(uchar) '\373',(uchar) '\347',(uchar) '\370',(uchar) '\375',(uchar) '\371',(uchar) '\367',(uchar) '\372', +}; diff --git a/strings/Attic/ctype-koi8_ukr.c b/strings/Attic/ctype-koi8_ukr.c new file mode 100644 index 00000000000..d318e026f3a --- /dev/null +++ b/strings/Attic/ctype-koi8_ukr.c @@ -0,0 +1,141 @@ +//Created by Max Veremayenko (verem@tg.kiev.ua) +//As standart for ukranian font i use ukrainian koi8 for KSI linux + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_koi8_ukr[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\2',(uchar)'\2',(uchar)'\20',(uchar)'\2',(uchar)'\2', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\2',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\1',(uchar)'\1',(uchar)'\20',(uchar)'\1',(uchar)'\1', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\1',(uchar)'\20',(uchar)'\20', +(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2', +(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2', +(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2', +(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2', +(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1', +(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1', +(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1', +(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1', +}; + +uchar NEAR to_lower_koi8_ukr[] = { +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\243',(uchar)'\244',(uchar)'\40',(uchar)'\246',(uchar)'\247', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\255',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\243',(uchar)'\244',(uchar)'\40',(uchar)'\246',(uchar)'\247', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\255',(uchar)'\40',(uchar)'\40', +(uchar)'\300',(uchar)'\301',(uchar)'\302',(uchar)'\303',(uchar)'\304',(uchar)'\305',(uchar)'\306',(uchar)'\307', +(uchar)'\310',(uchar)'\311',(uchar)'\312',(uchar)'\313',(uchar)'\314',(uchar)'\315',(uchar)'\316',(uchar)'\317', +(uchar)'\320',(uchar)'\321',(uchar)'\322',(uchar)'\323',(uchar)'\324',(uchar)'\325',(uchar)'\326',(uchar)'\327', +(uchar)'\330',(uchar)'\331',(uchar)'\332',(uchar)'\333',(uchar)'\334',(uchar)'\335',(uchar)'\336',(uchar)'\337', +(uchar)'\300',(uchar)'\301',(uchar)'\302',(uchar)'\303',(uchar)'\304',(uchar)'\305',(uchar)'\306',(uchar)'\307', +(uchar)'\310',(uchar)'\311',(uchar)'\312',(uchar)'\313',(uchar)'\314',(uchar)'\315',(uchar)'\316',(uchar)'\317', +(uchar)'\320',(uchar)'\321',(uchar)'\322',(uchar)'\323',(uchar)'\324',(uchar)'\325',(uchar)'\326',(uchar)'\327', +(uchar)'\330',(uchar)'\331',(uchar)'\332',(uchar)'\333',(uchar)'\334',(uchar)'\335',(uchar)'\336',(uchar)'\337', +}; + +uchar NEAR to_upper_koi8_ukr[] = { +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\263',(uchar)'\264',(uchar)'\40',(uchar)'\266',(uchar)'\267', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\275',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\263',(uchar)'\264',(uchar)'\40',(uchar)'\266',(uchar)'\267', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\275',(uchar)'\40',(uchar)'\40', +(uchar)'\340',(uchar)'\341',(uchar)'\342',(uchar)'\343',(uchar)'\344',(uchar)'\345',(uchar)'\346',(uchar)'\347', +(uchar)'\350',(uchar)'\351',(uchar)'\352',(uchar)'\353',(uchar)'\354',(uchar)'\355',(uchar)'\356',(uchar)'\357', +(uchar)'\360',(uchar)'\361',(uchar)'\362',(uchar)'\363',(uchar)'\364',(uchar)'\365',(uchar)'\366',(uchar)'\367', +(uchar)'\370',(uchar)'\371',(uchar)'\372',(uchar)'\373',(uchar)'\374',(uchar)'\375',(uchar)'\376',(uchar)'\377', +(uchar)'\340',(uchar)'\341',(uchar)'\342',(uchar)'\343',(uchar)'\344',(uchar)'\345',(uchar)'\346',(uchar)'\347', +(uchar)'\350',(uchar)'\351',(uchar)'\352',(uchar)'\353',(uchar)'\354',(uchar)'\355',(uchar)'\356',(uchar)'\357', +(uchar)'\360',(uchar)'\361',(uchar)'\362',(uchar)'\363',(uchar)'\364',(uchar)'\365',(uchar)'\366',(uchar)'\367', +(uchar)'\370',(uchar)'\371',(uchar)'\372',(uchar)'\373',(uchar)'\374',(uchar)'\375',(uchar)'\376',(uchar)'\377', +}; + +uchar NEAR sort_order_koi8_ukr[] = { +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar)'\245',(uchar)'\246',(uchar)'\247',(uchar)'\250',(uchar)'\251',(uchar)'\252',(uchar)'\253',(uchar)'\254', +(uchar)'\255',(uchar)'\256',(uchar)'\257',(uchar)'\260',(uchar)'\261',(uchar)'\262',(uchar)'\263',(uchar)'\264', +(uchar)'\265',(uchar)'\266',(uchar)'\267',(uchar)'\270',(uchar)'\271',(uchar)'\272',(uchar)'\273',(uchar)'\274', +(uchar)'\275',(uchar)'\276',(uchar)'\277',(uchar)'\300',(uchar)'\301',(uchar)'\302',(uchar)'\303',(uchar)'\304', +(uchar)'\305',(uchar)'\306',(uchar)'\307',(uchar)'\210',(uchar)'\207',(uchar)'\310',(uchar)'\214',(uchar)'\215', +(uchar)'\311',(uchar)'\312',(uchar)'\313',(uchar)'\314',(uchar)'\315',(uchar)'\204',(uchar)'\316',(uchar)'\317', +(uchar)'\320',(uchar)'\321',(uchar)'\322',(uchar)'\210',(uchar)'\207',(uchar)'\323',(uchar)'\214',(uchar)'\215', +(uchar)'\324',(uchar)'\325',(uchar)'\326',(uchar)'\327',(uchar)'\330',(uchar)'\204',(uchar)'\331',(uchar)'\332', +(uchar)'\243',(uchar)'\200',(uchar)'\201',(uchar)'\233',(uchar)'\205',(uchar)'\206',(uchar)'\231',(uchar)'\203', +(uchar)'\232',(uchar)'\213',(uchar)'\216',(uchar)'\217',(uchar)'\220',(uchar)'\221',(uchar)'\222',(uchar)'\223', +(uchar)'\224',(uchar)'\244',(uchar)'\225',(uchar)'\226',(uchar)'\227',(uchar)'\230',(uchar)'\211',(uchar)'\202', +(uchar)'\241',(uchar)'\240',(uchar)'\212',(uchar)'\235',(uchar)'\242',(uchar)'\236',(uchar)'\234',(uchar)'\237', +(uchar)'\243',(uchar)'\200',(uchar)'\201',(uchar)'\233',(uchar)'\205',(uchar)'\206',(uchar)'\231',(uchar)'\203', +(uchar)'\232',(uchar)'\213',(uchar)'\216',(uchar)'\217',(uchar)'\220',(uchar)'\221',(uchar)'\222',(uchar)'\223', +(uchar)'\224',(uchar)'\244',(uchar)'\225',(uchar)'\226',(uchar)'\227',(uchar)'\230',(uchar)'\211',(uchar)'\202', +(uchar)'\241',(uchar)'\240',(uchar)'\212',(uchar)'\235',(uchar)'\242',(uchar)'\236',(uchar)'\234',(uchar)'\237', +}; diff --git a/strings/Attic/ctype-latin1.c b/strings/Attic/ctype-latin1.c new file mode 100644 index 00000000000..470b72ce34e --- /dev/null +++ b/strings/Attic/ctype-latin1.c @@ -0,0 +1,142 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* This implements the ISO 8859 Latin1 character-set */ + +#include <global.h> +#include "m_string.h" + +#if MY_CHARSET_CURRENT == MY_CHARSET_LATIN1 + +uchar NEAR ctype_latin1[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,16,1,1,1,1,1,1,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,16,2,2,2,2,2,2,2,2, +}; + +uchar NEAR to_lower_latin1[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\327', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\337', +(uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', +(uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', +(uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', +(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_latin1[]={ +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', +(uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', +(uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', +(uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\367', +(uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\377', +}; + +#ifndef __WIN32__ +uchar NEAR sort_order_latin1[]={ +#else +uchar sort_order_latin1[]={ +#endif +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', +(uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', +(uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', +(uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', +(uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', +(uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', +(uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', +(uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', +'A', 'A', 'A', 'A', '\\', '[', '\\', 'C', +'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', ']', (uchar) '\327', +(uchar) '\330','U', 'U', 'U', 'Y', 'Y', (uchar) '\336',(uchar) '\337', +'A', 'A', 'A', 'A', '\\', '[', '\\', 'C', +'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', ']', (uchar) '\367', +(uchar) '\330','U', 'U', 'U', 'Y', 'Y', (uchar) '\336',(uchar) '\377', +}; +#endif /* MY_CHARSET_LATIN1 */ diff --git a/strings/Attic/ctype-latin2.c b/strings/Attic/ctype-latin2.c new file mode 100644 index 00000000000..32ab6cface5 --- /dev/null +++ b/strings/Attic/ctype-latin2.c @@ -0,0 +1,186 @@ +/* + * File generated by cset + * (C) Abandoned 1997 Zarko Mocnik <zarko.mocnik@dem.si> + * + * August, 1997 + * Regenerated, Jaroslaw Lewandowski <jotel@itnet.com.pl> + * - changed sort order characters with the accents : + * a-ogonek, c-ogonek, e-ogonek, l-slash, n-acute, o-acute, + * s-acute, z-acute, z-dot according to Polish alphabet standard. + * - changed type for character 'diaeresis' to _P + * Characters table are useful for Slovenian and Polish language + * and ISO-8859-2 character set + */ + +#include <global.h> +#include "m_string.h" + +#ifndef OLD_LATIN2_DEFINITION + +uchar NEAR ctype_latin2[257] = { +0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 72, 1, 16, 1, 16, 1, 1, 16, 16, 1, 1, 1, 1, 16, 1, 1, + 16, 2, 16, 2, 16, 2, 2, 16, 16, 2, 2, 2, 2, 16, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 16, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16, +}; + +uchar NEAR to_lower_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +160,177,162,179,164,181,182,167,168,185,186,187,188,173,190,191, +176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +208,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +}; + +uchar NEAR to_upper_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, +176,161,178,163,180,165,166,183,184,169,170,171,172,189,174,175, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255, +}; + +uchar NEAR sort_order_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 68, 69, 72, 73, 75, 76, 77, 78, 79, 80, 81, 83, 84, 86, + 88, 89, 90, 91, 94, 95, 96, 97, 98, 99,100,104,105,106,107,108, +109, 65, 68, 69, 72, 73, 75, 76, 77, 78, 79, 80, 81, 83, 84, 86, + 88, 89, 90, 91, 94, 95, 96, 97, 98, 99,100,110,111,112,113,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 66,255, 82,255, 81, 92,255,255, 93, 91, 94,101,255,103,102, +255, 66,255, 82,255, 81, 92,255,255, 93, 91, 94,101,255,103,102, + 90, 67, 67, 67, 67, 81, 70, 69, 71, 73, 74, 73, 73, 78, 78, 72, +255, 85, 84, 87, 86, 86, 86,255, 90, 95, 95, 95, 95, 99, 94,255, + 90, 67, 67, 67, 67, 81, 70, 69, 71, 73, 74, 73, 73, 78, 78, 72, +255, 85, 84, 87, 86, 86, 86,255, 90, 95, 95, 95, 95, 99, 94,255, +}; + + +#else + +/* + * File generated by cset + * (C) Abandoned 1997 Zarko Mocnik <zarko.mocnik@dem.si> + * + * definition table reworked by Jaromir Dolecek <dolecek@ics.muni.cz> + */ +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_latin2[257] = { +0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, + 1, 16, 1, 16, 1, 1, 16, 0, 0, 1, 1, 1, 1, 16, 1, 1, + 16, 2, 16, 2, 16, 2, 2, 16, 16, 2, 2, 2, 2, 16, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 16, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16, +}; + +uchar NEAR to_lower_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +177,161,179,163,181,182,166,167,168,185,186,187,188,173,190,191, +176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +208,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +}; + +uchar NEAR to_upper_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, +176,160,178,162,180,164,165,183,184,169,170,171,172,189,174,175, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255, +}; + +uchar NEAR sort_order_latin2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100, +105,106,107,110,114,117,122,123,124,125,127,131,132,133,134,135, +136, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100, +105,106,107,110,114,117,122,123,124,125,127,137,138,139,140, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,255, + 66,255, 93,255, 94,111,255,255,255,112,113,115,128,255,129,130, +255, 66,255, 93,255, 94,111,255,255,112,113,115,128,255,129,130, +108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 89, 87, 77, +255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255, +108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 89, 88, 77, +255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255, +}; + +#endif diff --git a/strings/Attic/ctype-swe7.c b/strings/Attic/ctype-swe7.c new file mode 100644 index 00000000000..19a79ecd3f7 --- /dev/null +++ b/strings/Attic/ctype-swe7.c @@ -0,0 +1,137 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +/* Define arrays to map character codes to types, uppercase, + lowercase and sortorder. */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_swe7[257] = +{ + 0, /* For standard library */ + 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, + 1,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16, + 1,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + +uchar NEAR to_lower_swe7[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_swe7[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_swe7[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + 'E', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '\\', ']', '[', 'Y', '_', + 'E', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '\\', ']', '[', 'Y', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; diff --git a/strings/Attic/ctype-usa7.c b/strings/Attic/ctype-usa7.c new file mode 100644 index 00000000000..87e9d30f854 --- /dev/null +++ b/strings/Attic/ctype-usa7.c @@ -0,0 +1,134 @@ +/* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_usa7[257] = +{ + 0, /* For standard library */ + 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, + 16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, + 16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + +uchar NEAR to_lower_usa7[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_usa7[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_usa7[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '\\', ']', '[', '^', '_', + 'E', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', 'Y', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; diff --git a/strings/Attic/ctype-win1250.c b/strings/Attic/ctype-win1250.c new file mode 100644 index 00000000000..300f6967ac4 --- /dev/null +++ b/strings/Attic/ctype-win1250.c @@ -0,0 +1,152 @@ +/* ctype-win1250.c */ +/* + * win1250 code page with Croatian sort order + * Created by Davor Stare, Zagreb, 1999. + * This file is public domain and comes with NO WARRANTY of any kind. + * Send comments to: davor.stare@artronic.hr + */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_win1250[257] = { +0, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, +132, 132, 132, 132, 132, 132, 132, 132, +132, 132, 16, 16, 16, 16, 16, 16, + 16, 129, 129, 129, 129, 129, 129, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 16, 16, 16, 16, 16, + 16, 130, 130, 130, 130, 130, 130, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 16, 16, 16, 16, 32, + 32, 32, 16, 32, 16, 16, 16, 16, + 32, 16, 1, 16, 1, 1, 1, 1, + 32, 16, 16, 16, 16, 16, 16, 16, + 32, 16, 2, 16, 2, 2, 2, 2, + 72, 16, 16, 1, 16, 1, 16, 1, + 16, 16, 1, 16, 16, 16, 16, 1, + 16, 16, 16, 2, 16, 16, 16, 16, + 16, 2, 2, 16, 1, 16, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 16, + 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, + 2, 2, 2, 2, 2, 2, 2, 16 +}; + +uchar NEAR to_lower_win1250[]={ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99, 100, 101, 102, 103, +104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, +120, 121, 122, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, +104, 105, 106, 107, 108, 109, 110, 111, +112, 113, 114, 115, 116, 117, 118, 119, +120, 121, 122, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, +136, 137, 154, 139, 156, 157, 158, 159, +144, 145, 146, 147, 148, 149, 150, 151, +152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 179, 164, 185, 166, 223, +168, 169, 186, 171, 172, 173, 174, 191, +176, 177, 178, 179, 180, 181, 182, 183, +184, 185, 186, 187, 190, 189, 190, 191, +224, 225, 226, 227, 228, 229, 230, 231, +232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 215, +248, 249, 250, 251, 252, 253, 254, 223, +224, 225, 226, 227, 228, 229, 230, 231, +232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 247, +248, 249, 250, 251, 252, 253, 254, 255 +}; + +uchar NEAR to_upper_win1250[]={ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, +136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, +152, 153, 138, 155, 140, 141, 142, 143, +160, 161, 162, 163, 164, 165, 166, 167, +168, 169, 170, 171, 172, 173, 174, 175, +176, 177, 178, 163, 180, 181, 182, 183, +184, 165, 170, 187, 188, 189, 188, 175, +192, 193, 194, 195, 196, 197, 198, 199, +200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 215, +216, 217, 218, 219, 220, 221, 222, 167, +192, 193, 194, 195, 196, 197, 198, 199, +200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 247, +216, 217, 218, 219, 220, 221, 222, 255 +}; + +uchar NEAR sort_order_win1250[]={ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 70, 73, 74, 75, + 76, 77, 78, 79, 80, 82, 83, 85, + 86, 87, 88, 89, 91, 92, 93, 94, + 95, 96, 97, 99, 100, 101, 102, 103, +104, 65, 66, 67, 70, 73, 74, 75, + 76, 77, 78, 79, 80, 82, 83, 85, + 86, 87, 88, 89, 91, 92, 93, 94, + 95, 96, 97, 123, 124, 125, 126, 127, +128, 129, 130, 131, 132, 133, 134, 135, +136, 137, 90, 139, 90, 91, 98, 98, +144, 145, 146, 147, 148, 149, 150, 151, +152, 153, 90, 155, 90, 91, 98, 98, + 32, 161, 162, 80, 164, 65, 166, 89, +168, 169, 89, 171, 172, 173, 174, 98, +176, 177, 178, 80, 180, 181, 182, 183, +184, 65, 89, 187, 80, 189, 80, 98, + 88, 65, 65, 65, 65, 80, 69, 67, + 68, 73, 73, 73, 73, 77, 77, 70, + 71, 83, 83, 85, 85, 85, 85, 215, + 88, 92, 92, 92, 92, 96, 91, 89, + 88, 65, 65, 65, 65, 80, 69, 67, + 68, 73, 73, 73, 73, 77, 77, 70, + 71, 83, 83, 85, 85, 85, 85, 247, + 88, 92, 92, 92, 92, 96, 91, 255 +}; + diff --git a/strings/Attic/ctype-win1251.c b/strings/Attic/ctype-win1251.c new file mode 100644 index 00000000000..fadad184dad --- /dev/null +++ b/strings/Attic/ctype-win1251.c @@ -0,0 +1,135 @@ +/* ctype-win1251.c */ +/* + * Created by Rustam B. Abdullaev, Tashkent, 1998. + * This file is public domain and comes with NO WARRANTY of any kind. + * Send bugs and wishes to: rustik@writeme.com + */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_win1251[257] = { +0, +32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, +32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +132,132,132,132,132,132,132,132, 132,132,16, 16, 16, 16, 16, 16, +16, 129,129,129,129,129,129,1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, +16, 130,130,130,130,130,130,2, 2, 2, 2, 2, 2, 2, 2, 2, +2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, +16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +16, 16, 16, 16, 16, 16, 16, 16, 1, 16, 16, 16, 16, 16, 16, 16, +16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +}; + +uchar NEAR to_lower_win1251[]={ +'\0', '\x1', '\x2', '\x3', '\x4', '\x5', '\x6', '\x7', +'\x8', '\x9', '\xA', '\xB', '\xC', '\xD', '\xE', '\xF', +'\x10','\x11','\x12','\x13','\x14','\x15','\x16','\x17', +'\x18','\x19','\x1A','\x1B','\x1C','\x1D','\x1E','\x1F', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\x7F', +'\x80','\x81','\x82','\x83','\x84','\x85','\x86','\x87', +'\x88','\x89','\x8A','\x8B','\x8C','\x8D','\x8E','\x8F', +'\x90','\x91','\x92','\x93','\x94','\x95','\x96','\x97', +'\x98','\x99','\x9A','\x9B','\x9C','\x9D','\x9E','\x9F', +'\xA0','\xA1','\xA2','\xA3','\xA4','\xA5','\xA6','\xA7', +'\xB8','\xA9','\xAA','\xAB','\xAC','\xAD','\xAE','\xAF', +'\xB0','\xB1','\xB2','\xB3','\xB4','\xB5','\xB6','\xB7', +'\xB8','\xB9','\xBA','\xBB','\xBC','\xBD','\xBE','\xBF', +'\xE0','\xE1','\xE2','\xE3','\xE4','\xE5','\xE6','\xE7', +'\xE8','\xE9','\xEA','\xEB','\xEC','\xED','\xEE','\xEF', +'\xF0','\xF1','\xF2','\xF3','\xF4','\xF5','\xF5','\xF7', +'\xF8','\xF9','\xFA','\xFB','\xFC','\xFD','\xFE','\xFF', +'\xE0','\xE1','\xE2','\xE3','\xE4','\xE5','\xE6','\xE7', +'\xE8','\xE9','\xEA','\xEB','\xEC','\xED','\xEE','\xEF', +'\xF0','\xF1','\xF2','\xF3','\xF4','\xF5','\xF6','\xF7', +'\xF8','\xF9','\xFA','\xFB','\xFC','\xFD','\xFE','\xFF' +}; + +uchar NEAR to_upper_win1251[]={ +'\0', '\x1', '\x2', '\x3', '\x4', '\x5', '\x6', '\x7', +'\x8', '\x9', '\xA', '\xB', '\xC', '\xD', '\xE', '\xF', +'\x10','\x11','\x12','\x13','\x14','\x15','\x16','\x17', +'\x18','\x19','\x1A','\x1B','\x1C','\x1D','\x1E','\x1F', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\x7F', +'\x80','\x81','\x82','\x83','\x84','\x85','\x86','\x87', +'\x88','\x89','\x8A','\x8B','\x8C','\x8D','\x8E','\x8F', +'\x90','\x91','\x92','\x93','\x94','\x95','\x96','\x97', +'\x98','\x99','\x9A','\x9B','\x9C','\x9D','\x9E','\x9F', +'\xA0','\xA1','\xA2','\xA3','\xA4','\xA5','\xA6','\xA7', +'\xA8','\xA9','\xAA','\xAB','\xAC','\xAD','\xAE','\xAF', +'\xB0','\xB1','\xB2','\xB3','\xB4','\xB5','\xB6','\xB7', +'\xA8','\xB9','\xBA','\xBB','\xBC','\xBD','\xBE','\xBF', +'\xC0','\xC1','\xC2','\xC3','\xC4','\xC5','\xC6','\xC7', +'\xC8','\xC9','\xCA','\xCB','\xCC','\xCD','\xCE','\xCF', +'\xD0','\xD1','\xD2','\xD3','\xD4','\xD5','\xD5','\xD7', +'\xD8','\xD9','\xDA','\xDB','\xDC','\xDD','\xDE','\xDF', +'\xC0','\xC1','\xC2','\xC3','\xC4','\xC5','\xC6','\xC7', +'\xC8','\xC9','\xCA','\xCB','\xCC','\xCD','\xCE','\xCF', +'\xD0','\xD1','\xD2','\xD3','\xD4','\xD5','\xD6','\xD7', +'\xD8','\xD9','\xDA','\xDB','\xDC','\xDD','\xDE','\xDF' +}; + +uchar NEAR sort_order_win1251[]={ +'\0', '\x1', '\x2', '\x3', '\x4', '\x5', '\x6', '\x7', +'\x8', '\x9', '\xA', '\xB', '\xC', '\xD', '\xE', '\xF', +'\x10','\x11','\x12','\x13','\x14','\x15','\x16','\x17', +'\x18','\x19','\x1A','\x1B','\x1C','\x1D','\x1E','\x1F', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +'`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\x7F', +'\x80','\x81','\x82','\x83','\x84','\x85','\x86','\x87', +'\x88','\x89','\x8A','\x8B','\x8C','\x8D','\x8E','\x8F', +'\x90','\x91','\x92','\x93','\x94','\x95','\x96','\x97', +'\x98','\x99','\x9A','\x9B','\x9C','\x9D','\x9E','\x9F', +'\xA0','\xA1','\xA2','\xA3','\xA4','\xA5','\xA6','\xA7', +'\xC6','\xA9','\xAA','\xAB','\xAC','\xAD','\xAE','\xAF', +'\xB0','\xB1','\xB2','\xB3','\xB4','\xB5','\xB6','\xB7', +'\xC6','\xB9','\xBA','\xBB','\xBC','\xBD','\xBE','\xBF', +'\xC0','\xC1','\xC2','\xC3','\xC4','\xC5','\xC7','\xC8', +'\xC9','\xCA','\xCB','\xCC','\xCD','\xCE','\xCF','\xD0', +'\xD1','\xD2','\xD3','\xD4','\xD5','\xD6','\xD7','\xD8', +'\xD9','\xDA','\xDB','\xDC','\xDD','\xDE','\xDF','\xE0', +'\xC0','\xC1','\xC2','\xC3','\xC4','\xC5','\xC7','\xC8', +'\xC9','\xCA','\xCB','\xCC','\xCD','\xCE','\xCF','\xD0', +'\xD1','\xD2','\xD3','\xD4','\xD5','\xD6','\xD7','\xD8', +'\xD9','\xDA','\xDB','\xDC','\xDD','\xDE','\xDF','\xE0' +}; + diff --git a/strings/Attic/ctype-win1251ukr.c b/strings/Attic/ctype-win1251ukr.c new file mode 100644 index 00000000000..ae33e04f38f --- /dev/null +++ b/strings/Attic/ctype-win1251ukr.c @@ -0,0 +1,142 @@ +//Created by Max Veremayenko (verem@tg.kiev.ua) +//As standart for ukranian font i use ukrainian for window95 + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_win1251ukr[257] = { +0, +32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, +132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, +16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, +16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\1',(uchar)'\20',(uchar)'\20', +(uchar)'\1',(uchar)'\20',(uchar)'\1',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\1', +(uchar)'\20',(uchar)'\20',(uchar)'\1',(uchar)'\2',(uchar)'\2',(uchar)'\20',(uchar)'\20',(uchar)'\20', +(uchar)'\2',(uchar)'\20',(uchar)'\2',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\20',(uchar)'\2', +(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1', +(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1', +(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1', +(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1',(uchar)'\1', +(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2', +(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2', +(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2', +(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2',(uchar)'\2', +}; + +uchar NEAR to_lower_win1251ukr[] = { +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '[', '\\', ']', '^', '_', +' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +'x', 'y', 'z', '{', '|', '}', '~', '\177', + +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\245',(uchar)'\40',(uchar)'\40', +(uchar)'\250',(uchar)'\40',(uchar)'\252',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\257', +(uchar)'\40',(uchar)'\40',(uchar)'\262',(uchar)'\262',(uchar)'\245',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\250',(uchar)'\40',(uchar)'\252',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\257', +(uchar)'\300',(uchar)'\301',(uchar)'\302',(uchar)'\303',(uchar)'\304',(uchar)'\305',(uchar)'\306',(uchar)'\307', +(uchar)'\310',(uchar)'\311',(uchar)'\312',(uchar)'\313',(uchar)'\314',(uchar)'\315',(uchar)'\316',(uchar)'\317', +(uchar)'\320',(uchar)'\321',(uchar)'\322',(uchar)'\323',(uchar)'\324',(uchar)'\325',(uchar)'\326',(uchar)'\327', +(uchar)'\330',(uchar)'\331',(uchar)'\332',(uchar)'\333',(uchar)'\334',(uchar)'\335',(uchar)'\336',(uchar)'\337', +(uchar)'\300',(uchar)'\301',(uchar)'\302',(uchar)'\303',(uchar)'\304',(uchar)'\305',(uchar)'\306',(uchar)'\307', +(uchar)'\310',(uchar)'\311',(uchar)'\312',(uchar)'\313',(uchar)'\314',(uchar)'\315',(uchar)'\316',(uchar)'\317', +(uchar)'\320',(uchar)'\321',(uchar)'\322',(uchar)'\323',(uchar)'\324',(uchar)'\325',(uchar)'\326',(uchar)'\327', +(uchar)'\330',(uchar)'\331',(uchar)'\332',(uchar)'\333',(uchar)'\334',(uchar)'\335',(uchar)'\336',(uchar)'\337', +}; + +uchar NEAR to_upper_win1251ukr[] = { +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\264',(uchar)'\40',(uchar)'\40', +(uchar)'\270',(uchar)'\40',(uchar)'\272',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\277', +(uchar)'\40',(uchar)'\40',(uchar)'\263',(uchar)'\263',(uchar)'\264',(uchar)'\40',(uchar)'\40',(uchar)'\40', +(uchar)'\270',(uchar)'\40',(uchar)'\272',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\40',(uchar)'\277', +(uchar)'\340',(uchar)'\341',(uchar)'\342',(uchar)'\343',(uchar)'\344',(uchar)'\345',(uchar)'\346',(uchar)'\347', +(uchar)'\350',(uchar)'\351',(uchar)'\352',(uchar)'\353',(uchar)'\354',(uchar)'\355',(uchar)'\356',(uchar)'\357', +(uchar)'\360',(uchar)'\361',(uchar)'\362',(uchar)'\363',(uchar)'\364',(uchar)'\365',(uchar)'\366',(uchar)'\367', +(uchar)'\370',(uchar)'\371',(uchar)'\372',(uchar)'\373',(uchar)'\374',(uchar)'\375',(uchar)'\376',(uchar)'\377', +(uchar)'\340',(uchar)'\341',(uchar)'\342',(uchar)'\343',(uchar)'\344',(uchar)'\345',(uchar)'\346',(uchar)'\347', +(uchar)'\350',(uchar)'\351',(uchar)'\352',(uchar)'\353',(uchar)'\354',(uchar)'\355',(uchar)'\356',(uchar)'\357', +(uchar)'\360',(uchar)'\361',(uchar)'\362',(uchar)'\363',(uchar)'\364',(uchar)'\365',(uchar)'\366',(uchar)'\367', +(uchar)'\370',(uchar)'\371',(uchar)'\372',(uchar)'\373',(uchar)'\374',(uchar)'\375',(uchar)'\376',(uchar)'\377', +}; + +uchar NEAR sort_order_win1251ukr[] = { +'\000','\001','\002','\003','\004','\005','\006','\007', +'\010','\011','\012','\013','\014','\015','\016','\017', +'\020','\021','\022','\023','\024','\025','\026','\027', +'\030','\031','\032','\033','\034','\035','\036','\037', +' ', '!', '"', '#', '$', '%', '&', '\'', +'(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', +'8', '9', ':', ';', '<', '=', '>', '?', +'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '[', '\\', ']', '^', '_', +' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', +'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', +'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', +'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + +(uchar)'\245',(uchar)'\246',(uchar)'\247',(uchar)'\250',(uchar)'\251',(uchar)'\252',(uchar)'\253',(uchar)'\254', +(uchar)'\255',(uchar)'\256',(uchar)'\257',(uchar)'\260',(uchar)'\261',(uchar)'\262',(uchar)'\263',(uchar)'\264', +(uchar)'\265',(uchar)'\266',(uchar)'\267',(uchar)'\270',(uchar)'\271',(uchar)'\272',(uchar)'\273',(uchar)'\274', +(uchar)'\275',(uchar)'\276',(uchar)'\277',(uchar)'\300',(uchar)'\301',(uchar)'\302',(uchar)'\303',(uchar)'\304', +(uchar)'\305',(uchar)'\306',(uchar)'\307',(uchar)'\310',(uchar)'\311',(uchar)'\204',(uchar)'\312',(uchar)'\313', +(uchar)'\210',(uchar)'\314',(uchar)'\207',(uchar)'\315',(uchar)'\316',(uchar)'\317',(uchar)'\320',(uchar)'\215', +(uchar)'\321',(uchar)'\322',(uchar)'\214',(uchar)'\214',(uchar)'\204',(uchar)'\323',(uchar)'\324',(uchar)'\325', +(uchar)'\210',(uchar)'\326',(uchar)'\207',(uchar)'\327',(uchar)'\330',(uchar)'\331',(uchar)'\332',(uchar)'\215', +(uchar)'\200',(uchar)'\201',(uchar)'\202',(uchar)'\203',(uchar)'\205',(uchar)'\206',(uchar)'\211',(uchar)'\212', +(uchar)'\213',(uchar)'\216',(uchar)'\217',(uchar)'\220',(uchar)'\221',(uchar)'\222',(uchar)'\223',(uchar)'\224', +(uchar)'\225',(uchar)'\226',(uchar)'\227',(uchar)'\230',(uchar)'\231',(uchar)'\232',(uchar)'\233',(uchar)'\234', +(uchar)'\235',(uchar)'\236',(uchar)'\237',(uchar)'\240',(uchar)'\241',(uchar)'\242',(uchar)'\243',(uchar)'\244', +(uchar)'\200',(uchar)'\201',(uchar)'\202',(uchar)'\203',(uchar)'\205',(uchar)'\206',(uchar)'\211',(uchar)'\212', +(uchar)'\213',(uchar)'\216',(uchar)'\217',(uchar)'\220',(uchar)'\221',(uchar)'\222',(uchar)'\223',(uchar)'\224', +(uchar)'\225',(uchar)'\226',(uchar)'\227',(uchar)'\230',(uchar)'\231',(uchar)'\232',(uchar)'\233',(uchar)'\234', +(uchar)'\235',(uchar)'\236',(uchar)'\237',(uchar)'\240',(uchar)'\241',(uchar)'\242',(uchar)'\243',(uchar)'\244', + +}; diff --git a/strings/Attic/ctype.c.in b/strings/Attic/ctype.c.in new file mode 100644 index 00000000000..2a76246a03a --- /dev/null +++ b/strings/Attic/ctype.c.in @@ -0,0 +1,20 @@ +#include <global.h> +#include <m_ctype.h> + +@CHARSET_DECLARATIONS@ + +static CHARSET_INFO comp_cs[] = { +@CHARSET_COMP_CS_INIT@ +}; + +CHARSET_INFO *default_charset_info = &comp_cs[0]; + +CHARSET_INFO *find_compiled_charset(uint8 cs_number) +{ + uint i; + for (i = 0; i < array_elements(comp_cs); ++i) + if (comp_cs[i].number == cs_number) + return &comp_cs[i]; + + return NULL; +} diff --git a/strings/Attic/memory.h b/strings/Attic/memory.h new file mode 100644 index 00000000000..9b959336caf --- /dev/null +++ b/strings/Attic/memory.h @@ -0,0 +1,33 @@ +/* File : memory.h + Author : Richard A. O'Keefe. + Updated: 1 June 1984 + Purpose: Header file for the System V "memory(3C)" package. + + All the functions in this package are the original work of Richard + A. O'Keefe. Any resemblance between them and any functions in AT&T + or other licensed software is due entirely to my use of the System V + memory(3C) manual page as a specification. See the READ-ME to find + the conditions under which this material may be used and copied. + + The System V manual says that the mem* functions are declared in the + <memory.h> file. This file is also included in the <strings.h> file, + but it does no harm to #include both in either order. +*/ + +#ifndef DGUX +#ifndef memeql + +#define memeql !memcmp +extern int memcmp(/*char^,char^,int*/); +#ifndef memcpy +extern char *memcpy(/*char^,char^,int*/); +#endif +extern char *memccpy(/*char^,char^,char,int*/); +extern char *memset(/*char^,char,int*/); +extern char *memchr(/*char^,char,int*/); +extern char *memrchr(/*char^,char,int*/); +extern char *memmov(/*char^,char^,int*/); +extern void memrev(/*char^,char^,int*/); + +#endif /* memeql */ +#endif diff --git a/strings/Attic/ptr_cmp.c b/strings/Attic/ptr_cmp.c new file mode 100644 index 00000000000..d3d4a36a054 --- /dev/null +++ b/strings/Attic/ptr_cmp.c @@ -0,0 +1,151 @@ +/* + get_ptr_compare(len) returns a pointer to a optimal byte-compare function + for a array of stringpointer where all strings have size len. + The bytes are compare as unsigned chars. + Because the size is saved in a static variable. + When using threads the program must have called my_init and the thread + my_init_thread() + */ + +#include <global.h> +#include "m_string.h" + +static int ptr_compare(uchar **a, uchar **b); +static int ptr_compare_0(uchar **a, uchar **b); +static int ptr_compare_1(uchar **a, uchar **b); +static int ptr_compare_2(uchar **a, uchar **b); +static int ptr_compare_3(uchar **a, uchar **b); + +#ifdef THREAD +#include <my_pthread.h> +#define compare_length my_thread_var->cmp_length +#else +static uint compare_length; +#endif + + /* Get a pointer to a optimal byte-compare function for a given size */ + +qsort_cmp get_ptr_compare (uint size) +{ + compare_length=size; /* Remember for loop */ + + if (size < 4) + return (qsort_cmp) ptr_compare; + switch (size & 3) { + case 0: return (qsort_cmp) ptr_compare_0; + case 1: return (qsort_cmp) ptr_compare_1; + case 2: return (qsort_cmp) ptr_compare_2; + case 3: return (qsort_cmp) ptr_compare_3; + } + return 0; /* Impossible */ +} + + + /* + Compare to keys to see witch is smaller. + Loop unrolled to make it quick !! + */ + +#define cmp(N) if (first[N] != last[N]) return (int) first[N] - (int) last[N] + +static int ptr_compare(uchar **a, uchar **b) +{ + reg3 int length= compare_length; + reg1 uchar *first,*last; + + first= *a; last= *b; + while (--length) + { + if (*first++ != *last++) + return (int) first[-1] - (int) last[-1]; + } + return (int) first[0] - (int) last[0]; +} + + +static int ptr_compare_0(uchar **a, uchar **b) +{ + reg3 int length= compare_length; + reg1 uchar *first,*last; + + first= *a; last= *b; + loop: + cmp(0); + cmp(1); + cmp(2); + cmp(3); + if ((length-=4)) + { + first+=4; + last+=4; + goto loop; + } + return (0); +} + + +static int ptr_compare_1(uchar **a, uchar **b) +{ + reg3 int length= compare_length-1; + reg1 uchar *first,*last; + + first= *a+1; last= *b+1; + cmp(-1); + loop: + cmp(0); + cmp(1); + cmp(2); + cmp(3); + if ((length-=4)) + { + first+=4; + last+=4; + goto loop; + } + return (0); +} + +static int ptr_compare_2(uchar **a, uchar **b) +{ + reg3 int length= compare_length-2; + reg1 uchar *first,*last; + + first= *a +2 ; last= *b +2; + cmp(-2); + cmp(-1); + loop: + cmp(0); + cmp(1); + cmp(2); + cmp(3); + if ((length-=4)) + { + first+=4; + last+=4; + goto loop; + } + return (0); +} + +static int ptr_compare_3(uchar **a, uchar **b) +{ + reg3 int length= compare_length-3; + reg1 uchar *first,*last; + + first= *a +3 ; last= *b +3; + cmp(-3); + cmp(-2); + cmp(-1); + loop: + cmp(0); + cmp(1); + cmp(2); + cmp(3); + if ((length-=4)) + { + first+=4; + last+=4; + goto loop; + } + return (0); +} diff --git a/strings/ChangeLog b/strings/ChangeLog new file mode 100755 index 00000000000..2d31f2946a1 --- /dev/null +++ b/strings/ChangeLog @@ -0,0 +1,38 @@ +Thu May 20 13:45:15 1993 Michael Widenius (monty at bitch) + + * changed itoa() and ltoa() to use the same interface as microsoft:s + and zortech:s libraryes. + +Sun Mar 24 00:30:34 1991 Michael Widenius (monty at LYNX) + + * Changed int2str to return BIG converted chars. + +Sun Feb 24 00:22:54 1991 Michael Widenius (monty at LYNX) + + * Added new function strcend(string,char). Its eqvialent to + if (!(a=strchr(string,char))) + a=strend(string); + +Tue Oct 16 18:53:19 1990 Michael Widenius (monty at LYNX) + + * Added define BAD_STRING_COMPILER to set define strmov() + if compiler is very bad at stringoperations. + * Changed to use cc on sun-systems instead of gcc. + +Sat Sep 29 18:42:31 1990 Michael Widenius (monty at LYNX) + + * Added my_atof for sparc system to get some speed. + +Sun Mar 11 16:35:59 1990 Monty (monty at monty) + + * strnmov() was changed to not fill to-string with null. + * strmake() changed to point at closing null. + +Wed Feb 7 20:15:34 1990 David Axmark (davida at isil) + + * Made functon strinrstr that is reverse search. + +Fri Dec 2 03:37:59 1988 Monty (monty at monty) + + * Fixed bug in strcont; It didn't return first found character in + set. diff --git a/strings/Makefile.am b/strings/Makefile.am new file mode 100644 index 00000000000..0c71356823c --- /dev/null +++ b/strings/Makefile.am @@ -0,0 +1,84 @@ +# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# This file is public domain and comes with NO WARRANTY of any kind + +INCLUDES = @MT_INCLUDES@ -I$(srcdir)/../include -I../include +pkglib_LIBRARIES = libmystrings.a + +# Exact one of ASSEMBLER_X +if ASSEMBLER_x86 +ASRCS = strings-x86.s longlong2str-x86.s +CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c llstr.c ctype.c strnlen.c +else +if ASSEMBLER_sparc +# These file MUST all be on the same line!! Otherwise automake +# generats a very broken makefile +ASRCS = bmove_upp-sparc.s strappend-sparc.s strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s strnmov-sparc.s strstr-sparc.s strxmov-sparc.s +CSRCS = strcont.c strfill.c strcend.c is_prefix.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c strnlen.c +else +#no assembler +ASRCS = +# These file MUST all be on the same line!! Otherwise automake +# generats a very broken makefile +CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c atof.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c ctype.c strnlen.c +endif +endif + +libmystrings_a_SOURCES = @CHARSET_SRCS@ $(ASRCS) $(CSRCS) + +noinst_PROGRAMS = conf_to_src +# Default charset definitions +EXTRA_DIST = ctype-big5.c ctype-czech.c ctype-euc_kr.c \ + ctype-gb2312.c ctype-gbk.c ctype-sjis.c \ + ctype-tis620.c ctype-ujis.c \ + ctype_autoconf.c \ + strto.c strings-x86.s longlong2str-x86.s \ + strxmov.c bmove_upp.c strappend.c strcont.c strend.c \ + strfill.c strcend.c is_prefix.c strstr.c strinstr.c \ + strmake.c strnmov.c strmov.c strnlen.c \ + bmove_upp-sparc.s strappend-sparc.s strend-sparc.s \ + strinstr-sparc.s strmake-sparc.s strmov-sparc.s \ + strnmov-sparc.s strstr-sparc.s strxmov-sparc.s + +OMIT_DEPENDENCIES = pthread.h stdio.h __stdio.h stdlib.h __stdlib.h math.h\ + __math.h time.h __time.h unistd.h __unistd.h types.h \ + xtypes.h ac-types.h posix.h string.h __string.h \ + errno.h socket.h inet.h dirent.h netdb.h \ + cleanup.h cond.h debug_out.h fd.h kernel.h mutex.h \ + prio_queue.h pthread_attr.h pthread_once.h queue.h\ + sleep.h specific.h version.h pwd.h timers.h uio.h \ + cdefs.h machdep.h signal.h __signal.h util.h + +libmystrings_a_LIBADD= @CHARSET_OBJS@ +ctype.c: ctype_extra_sources.c +ctype_extra_sources.c: conf_to_src + ./conf_to_src $(top_srcdir) @CHARSETS_NEED_SOURCE@ > \ + $(srcdir)/ctype_extra_sources.c +conf_to_src_SOURCES = conf_to_src.c +conf_to_src_LDADD= + +# This is because the dependency tracking misses @FOO@ vars in sources. +strtoull.o: @CHARSET_OBJS@ + +clean-local: + rm -f ctype_extra_sources.c + +if ASSEMBLER +# On Linux gcc can compile the assembly files +%.o : %.s + $(AS) -o $@ $< +endif diff --git a/strings/READ-ME b/strings/READ-ME new file mode 100644 index 00000000000..a8b8c54ab0a --- /dev/null +++ b/strings/READ-ME @@ -0,0 +1,82 @@ +File : READ-ME +Author : Richard A. O'Keefe. +Updated: 30 April 1984 +Purpose: Explain the new strings package. + + The UNIX string libraries (described in the string(3) manual page) +differ from UNIX to UNIX (e.g. strtok is not in V7 or 4.1bsd). Worse, +the sources are not in the public domain, so that if there is a string +routine which is nearly what you want but not quite you can't take a +copy and modify it. And of course C programmers on non-UNIX systems +are at the mercy of their supplier. + + This package was designed to let me do reasonable things with C's +strings whatever UNIX (V7, PaNiX, UX63, 4.1bsd) I happen to be using. +Everything in the System III manual is here and does just what the S3 +manual says it does. There are also lots of new goodies. I'm sorry +about the names, but the routines do have to work on asphyxiated-at- +birth systems which truncate identifiers. The convention is that a +routine is called + str [n] [c] <operation> +If there is an "n", it means that the function takes an (int) "length" +argument, which bounds the number of characters to be moved or looked +at. If the function has a "set" argument, a "c" in the name indicates +that the complement of the set is used. Functions or variables whose +names start with _ are support routines which aren't really meant for +general use. I don't know what the "p" is doing in "strpbrk", but it +is there in the S3 manual so it's here too. "istrtok" does not follow +this rule, but with 7 letters what can you do? + + I have included new versions of atoi(3) and atol(3) as well. They +use a new primitive str2int, which takes a pair of bounds and a radix, +and does much more thorough checking than the normal atoi and atol do. +The result returned by atoi & atol is valid if and only if errno == 0. +There is also an output conversion routine int2str, with itoa and ltoa +as interface macros. Only after writing int2str did I notice that the +str2int routine has no provision for unsigned numbers. On reflection, +I don't greatly care. I'm afraid that int2str may depend on your "C" +compiler in unexpected ways. Do check the code with -S. + + Several of these routines have "asm" inclusions conditional on the +VaxAsm option. These insertions can make the routines which have them +quite a bit faster, but there is a snag. The VAX architects, for some +reason best known to themselves and their therapists, decided that all +"strings" were shorter than 2^16 bytes. Even when the length operands +are in 32-bit registers, only 16 bits count. So the "asm" versions do +not work for long strings. If you can guarantee that all your strings +will be short, define VaxAsm in the makefile, but in general, and when +using other machines, do not define it. + + To use this library, you need the "strings.a" library file and the +"strings.h" and "ctypes.h" header files. The other header files are +for compiling the library itself, though if you are hacking extensions +you may find them useful. General users really shouldn't see them. +I've defined a few macros I find useful in "strings.h"; if you have no +need for "index", "rindex", "streql", and "beql", just edit them out. +On the 4.1bsd system I am using declaring all these functions 'extern' +does not mean that they will all be loaded; but only the ones you use. +When using lesser systems you may find it necessary to break strings.h +up, or you could get by with just adding "extern" declarations for the +functions you want as you need them. Many of these functions have the +same names as functions in the "standard C library", by design as this +is a replacement/reimplementation of part of that library. So you may +have to talk the loader into loading this library first. Again, I've +found no problems on 4.1bsd. + + You may wonder at my failure to provide manual pages for this code. +For the things in V7, 4.?, or SIII, you should be able to use whichever +manual page came with that system, and anything I might write would be +so like it as to raise suspicions of violating AT&T copyrights. In the +sources you will find comments which provide far more documentation for +these routines than AT&T ever provided for their strings stuff, I just +don't happen to have put it in nroff -man form. Had I done so, the .3 +files would have outbulked the .c files! + + These files are in the public domain. This includes getopt.c, which +is the work of Henry Spencer, University of Toronto Zoology, who says of +it "None of this software is derived from Bell software. I had no access +to the source for Bell's versions at the time I wrote it. This software +is hereby explicitly placed in the public domain. It may be used for +any purpose on any machine by anyone." I would greatly prefer it if *my* +material received no military use. + diff --git a/strings/README b/strings/README new file mode 100644 index 00000000000..ddb811ede5e --- /dev/null +++ b/strings/README @@ -0,0 +1,82 @@ +File : README +Author : Richard A. O'Keefe. +Updated: 30 April 1984 +Purpose: Explain the new strings package. + + The UNIX string libraries (described in the string(3) manual page) +differ from UNIX to UNIX (e.g. strtok is not in V7 or 4.1bsd). Worse, +the sources are not in the public domain, so that if there is a string +routine which is nearly what you want but not quite you can't take a +copy and modify it. And of course C programmers on non-UNIX systems +are at the mercy of their supplier. + + This package was designed to let me do reasonable things with C's +strings whatever UNIX (V7, PaNiX, UX63, 4.1bsd) I happen to be using. +Everything in the System III manual is here and does just what the S3 +manual says it does. There are also lots of new goodies. I'm sorry +about the names, but the routines do have to work on asphyxiated-at- +birth systems which truncate identifiers. The convention is that a +routine is called + str [n] [c] <operation> +If there is an "n", it means that the function takes an (int) "length" +argument, which bounds the number of characters to be moved or looked +at. If the function has a "set" argument, a "c" in the name indicates +that the complement of the set is used. Functions or variables whose +names start with _ are support routines which aren't really meant for +general use. I don't know what the "p" is doing in "strpbrk", but it +is there in the S3 manual so it's here too. "istrtok" does not follow +this rule, but with 7 letters what can you do? + + I have included new versions of atoi(3) and atol(3) as well. They +use a new primitive str2int, which takes a pair of bounds and a radix, +and does much more thorough checking than the normal atoi and atol do. +The result returned by atoi & atol is valid if and only if errno == 0. +There is also an output conversion routine int2str, with itoa and ltoa +as interface macros. Only after writing int2str did I notice that the +str2int routine has no provision for unsigned numbers. On reflection, +I don't greatly care. I'm afraid that int2str may depend on your "C" +compiler in unexpected ways. Do check the code with -S. + + Several of these routines have "asm" inclusions conditional on the +VaxAsm option. These insertions can make the routines which have them +quite a bit faster, but there is a snag. The VAX architects, for some +reason best known to themselves and their therapists, decided that all +"strings" were shorter than 2^16 bytes. Even when the length operands +are in 32-bit registers, only 16 bits count. So the "asm" versions do +not work for long strings. If you can guarantee that all your strings +will be short, define VaxAsm in the makefile, but in general, and when +using other machines, do not define it. + + To use this library, you need the "strings.a" library file and the +"strings.h" and "ctypes.h" header files. The other header files are +for compiling the library itself, though if you are hacking extensions +you may find them useful. General users really shouldn't see them. +I've defined a few macros I find useful in "strings.h"; if you have no +need for "index", "rindex", "streql", and "beql", just edit them out. +On the 4.1bsd system I am using declaring all these functions 'extern' +does not mean that they will all be loaded; but only the ones you use. +When using lesser systems you may find it necessary to break strings.h +up, or you could get by with just adding "extern" declarations for the +functions you want as you need them. Many of these functions have the +same names as functions in the "standard C library", by design as this +is a replacement/reimplementation of part of that library. So you may +have to talk the loader into loading this library first. Again, I've +found no problems on 4.1bsd. + + You may wonder at my failure to provide manual pages for this code. +For the things in V7, 4.?, or SIII, you should be able to use whichever +manual page came with that system, and anything I might write would be +so like it as to raise suspicions of violating AT&T copyrights. In the +sources you will find comments which provide far more documentation for +these routines than AT&T ever provided for their strings stuff, I just +don't happen to have put it in nroff -man form. Had I done so, the .3 +files would have outbulked the .c files! + + These files are in the public domain. This includes getopt.c, which +is the work of Henry Spencer, University of Toronto Zoology, who says of +it "None of this software is derived from Bell software. I had no access +to the source for Bell's versions at the time I wrote it. This software +is hereby explicitly placed in the public domain. It may be used for +any purpose on any machine by anyone." I would greatly prefer it if *my* +material received no military use. + diff --git a/strings/atof.c b/strings/atof.c new file mode 100644 index 00000000000..1ce16027089 --- /dev/null +++ b/strings/atof.c @@ -0,0 +1,208 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + A quicker atof. About 2-10 times faster than standard atof on sparc. + This don't handle iee-options (NaN...) and the presission :s is a little + less for some high exponential numbers (+-1 at 14th place). + Returns 0.0 if overflow or wrong number. + Must be inited with init_my_atof to handle possibly overflows. +*/ + +#include <global.h> +#ifdef USE_MY_ATOF /* Skipp if we don't want it */ +#include <m_ctype.h> +#include <floatingpoint.h> +#include <signal.h> + +/* Read a double. If float is wrong return 0. + float ::= [space]* [sign] {digit}+ decimal-point {digit}+ [exponent] | + [sign] {digit}+ [decimal-point {digit}*] exponent | + [sign] {digit}+ decimal-point [{digit}*] exponent | + [sign] decimal-point {digit}* exponent | + exponent :: = exponent-marker [sign] {digit}+ + exponent-marker ::= E e + */ + + +#define is_exponent_marker(ch) (ch == 'E' || ch == 'e') + +static void my_atof_overflow _A((int sig,int code, struct sigcontext *scp, + char *addr)); +static int parse_sign _A((char **str)); +static void parse_float_number_part _A((char **str,double *number, int *length)); +static void parse_decimal_number_part _A((char **str,double *number)); +static int parse_int_number_part _A((char **str,uint *number)); + +static int volatile overflow,in_my_atof; +static sigfpe_handler_type old_overflow_handler; + +void init_my_atof() +{ + old_overflow_handler = (sigfpe_handler_type) + ieee_handler("get", "overflow", old_overflow_handler); + VOID(ieee_handler("set", "overflow", my_atof_overflow)); + return; +} + +static void my_atof_overflow(sig, code, scp, addr) +int sig; +int code; +struct sigcontext *scp; +char *addr; +{ + if (!in_my_atof) + old_overflow_handler(sig,code,scp,addr); + else + overflow=1; + return; +} + +double my_atof(src) +const char *src; +{ + int sign, exp_sign; /* is number negative (+1) or positive (-1) */ + int length_before_point; + double after_point; /* Number after decimal point and before exp */ + uint exponent; /* Exponent value */ + double exp_log,exp_val; + char *tmp_src; + double result_number; + + tmp_src = (char*) src; + while (isspace(tmp_src[0])) + tmp_src++; /* Skipp pre-space */ + sign = parse_sign(&tmp_src); + overflow=0; + in_my_atof=1; + parse_float_number_part(&tmp_src, &result_number, &length_before_point); + if (*tmp_src == '.') + { + tmp_src++; + parse_decimal_number_part(&tmp_src, &after_point); + result_number += after_point; + } + else if (length_before_point == 0) + { + in_my_atof=0; + return 0.0; + } + if (is_exponent_marker(*tmp_src)) + { + tmp_src++; + exp_sign = parse_sign(&tmp_src); + overflow|=parse_int_number_part(&tmp_src, &exponent); + + exp_log=10.0; exp_val=1.0; + for (;;) + { + if (exponent & 1) + { + exp_val*= exp_log; + exponent--; + } + if (!exponent) + break; + exp_log*=exp_log; + exponent>>=1; + } + if (exp_sign < 0) + result_number*=exp_val; + else + result_number/=exp_val; + } + if (sign > 0) + result_number= -result_number; + + in_my_atof=0; + if (overflow) + return 0.0; + return result_number; +} + + +static int parse_sign(str) +char **str; +{ + if (**str == '-') + { + (*str)++; + return 1; + } + if (**str == '+') + (*str)++; + return -1; +} + + /* Get number with may be separated with ',' */ + +static void parse_float_number_part(str, number, length) +char **str; +double *number; +int *length; +{ + *number = 0; + *length = 0; + + for (;;) + { + while (isdigit(**str)) + { + (*length)++; + *number = (*number * 10) + (**str - '0'); + (*str)++; + } + if (**str != ',') + return; /* Skipp possibly ',' */ + (*str)++; + } +} + +static void parse_decimal_number_part(str, number) +char **str; +double *number; +{ + double exp_log; + + *number = 0; + exp_log=1/10.0; + while (isdigit(**str)) + { + *number+= (**str - '0')*exp_log; + exp_log/=10; + (*str)++; + } +} + + /* Parses int suitably for exponent */ + +static int parse_int_number_part(str, number) +char **str; +uint *number; +{ + *number = 0; + while (isdigit(**str)) + { + if (*number >= ((uint) ~0)/10) + return 1; /* Don't overflow */ + *number = (*number * 10) + **str - '0'; + (*str)++; + } + return 0; +} + +#endif diff --git a/strings/bchange.c b/strings/bchange.c new file mode 100644 index 00000000000..99066cf1e95 --- /dev/null +++ b/strings/bchange.c @@ -0,0 +1,39 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : bchange.c + Author : Michael widenius + Updated: 1987-03-20 + Defines: bchange() + + bchange(dst, old_length, src, new_length, tot_length) + replaces old_length characters at dst to new_length characters from + src in a buffer with tot_length bytes. +*/ + +#include <global.h> +#include "m_string.h" + +void bchange(register char *dst, uint old_length, register const char *src, uint new_length, uint tot_length) +{ + uint rest=tot_length-old_length; + if (old_length < new_length) + bmove_upp(dst+rest+new_length,dst+tot_length,rest); + else + bmove(dst+new_length,dst+old_length,rest); + memcpy(dst,src,new_length); +} diff --git a/strings/bcmp.c b/strings/bcmp.c new file mode 100644 index 00000000000..3dce5025b64 --- /dev/null +++ b/strings/bcmp.c @@ -0,0 +1,63 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + bcmp(s1, s2, len) returns 0 if the "len" bytes starting at "s1" are + identical to the "len" bytes starting at "s2", non-zero if they are + different. + Now only used with purify. +*/ + +#include <global.h> +#include "m_string.h" + +#if !defined(bcmp) && !defined(HAVE_BCMP) + +#if defined(MC68000) && defined(DS90) + +int bcmp(s1,s2, len) +const char *s1; +const char *s2; +uint len; /* 0 <= len <= 65535 */ +{ + asm(" movl 12(a7),d0 "); + asm(" subqw #1,d0 "); + asm(" blt .L5 "); + asm(" movl 4(a7),a1 "); + asm(" movl 8(a7),a0 "); + asm(".L4: cmpmb (a0)+,(a1)+ "); + asm(" dbne d0,.L4 "); + asm(".L5: addqw #1,d0 "); +} + +#else + +#ifdef HAVE_purify +int my_bcmp(s1, s2, len) +#else +int bcmp(s1, s2, len) +#endif + register const char *s1; + register const char *s2; + register uint len; +{ + while (len-- != 0 && *s1++ == *s2++) ; + return len+1; +} + +#endif +#endif /* BSD_FUNCS */ diff --git a/strings/bcopy-duff.c b/strings/bcopy-duff.c new file mode 100644 index 00000000000..2f5a709c3a0 --- /dev/null +++ b/strings/bcopy-duff.c @@ -0,0 +1,50 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +#define IFACTOR 4 + + void +dcopy(char *chardest, char *charsrc, int size) +{ + register int *src, *dest, intcount ; + int startcharcpy, intoffset, numints2cpy, i ; + + numints2cpy = size >> 2 ; + startcharcpy = numints2cpy << 2 ; + intcount = numints2cpy & ~(IFACTOR-1) ; + intoffset = numints2cpy - intcount ; + + src = (int *)(((int) charsrc) + intcount*sizeof(int*)) ; + dest = (int *)(((int) chardest) + intcount*sizeof(int*)) ; + + /* copy the ints */ + switch(intoffset) + do + { + case 0: dest[3] = src[3] ; + case 3: dest[2] = src[2] ; + case 2: dest[1] = src[1] ; + case 1: dest[0] = src[0] ; + intcount -= IFACTOR ; + dest -= IFACTOR ; + src -= IFACTOR ; + } while (intcount >= 0) ; + + /* copy the chars left over by the int copy at the end */ + for(i=startcharcpy ; i<size ; i++) + chardest[i] = charsrc[i] ; +} diff --git a/strings/bfill.c b/strings/bfill.c new file mode 100644 index 00000000000..ac5d3096b14 --- /dev/null +++ b/strings/bfill.c @@ -0,0 +1,81 @@ +/* File : bfill.c + Author : Richard A. O'Keefe. + Michael Widenius; ifdef MC68000 + Updated: 23 April 1984 + Defines: bfill() + + bfill(dst, len, fill) moves "len" fill characters to "dst". + Thus to set a buffer to 80 spaces, do bfill(buff, 80, ' '). + + Note: the "b" routines are there to exploit certain VAX order codes, + but the MOVC5 instruction will only move 65535 characters. The asm + code is presented for your interest and amusement. +*/ + +#include <global.h> +#include "m_string.h" + +#if !defined(bfill) && !defined(HAVE_BFILL) + +#if VaxAsm + +void bfill(dst, len, fill) +char *dst; +uint len; +int fill; /* actually char */ +{ + asm("movc5 $0,*4(ap),12(ap),8(ap),*4(ap)"); +} + +#elif defined(MC68000) && defined(DS90) + +void bfill(dst, len,fill) /* Optimized with long-fill */ +char *dst; +uint len; +pchar fill; +{ +asm(" movl 8.(a7),d1 "); +asm(" jeq .L9 "); +asm(" movl 4.(a7),a0 "); +asm(" moveq #0,d0 "); +asm(" movb 15.(a7),d0 "); +asm(" movl d2,a1 "); +asm(" movw d0,d2 "); +asm(" aslw #8,d0 "); +asm(" orw d2,d0 "); +asm(" movl d0,d2 "); +asm(" swap d0 "); +asm(" orl d2,d0 "); +asm(" movl a0,d2 "); +asm(" btst #0,d2 "); +asm(" jeq .L1 "); +asm(" movb d0,(a0)+ "); +asm(" subql #1,d1 "); +asm(".L1: movl d1,d2 "); +asm(" lsrl #2,d2 "); +asm(" jcc .L2 "); +asm(" movw d0,(a0)+ "); +asm(" jra .L2 "); +asm(".L3: movl d0,(a0)+ "); +asm(".L2: dbra d2,.L3 "); +asm(" addqw #1,d2 "); +asm(" subql #1,d2 "); +asm(" jcc .L3 "); +asm(" andl #1,d1 "); +asm(" jeq .L8 "); +asm(" movb d0,(a0) "); +asm(".L8: movl a1,d2 "); +asm(".L9: rts "); +} +#else + +void bfill(dst, len, fill) +register byte *dst; +register uint len; +register pchar fill; +{ + while (len-- != 0) *dst++ = fill; +} + +#endif +#endif diff --git a/strings/bmove.c b/strings/bmove.c new file mode 100644 index 00000000000..096a6282609 --- /dev/null +++ b/strings/bmove.c @@ -0,0 +1,63 @@ +/* File : bmove.c + Author : Richard A. O'Keefe. + Michael Widenius; ifdef MC68000 + Updated: 23 April 1984 + Defines: bmove() + + bmove(dst, src, len) moves exactly "len" bytes from the source "src" + to the destination "dst". It does not check for NUL characters as + strncpy() and strnmov() do. Thus if your C compiler doesn't support + structure assignment, you can simulate it with + bmove(&to, &from, sizeof from); + The standard 4.2bsd routine for this purpose is bcopy. But as bcopy + has its first two arguments the other way around you may find this a + bit easier to get right. + No value is returned. + + Note: the "b" routines are there to exploit certain VAX order codes, + but the MOVC3 instruction will only move 65535 characters. The asm + code is presented for your interest and amusement. +*/ + +#include <global.h> +#include "m_string.h" + +#if !defined(HAVE_BMOVE) && !defined(bmove) + +#if VaxAsm + +void bmove(dst, src, len) + char *dst, *src; + uint len; + { + asm("movc3 12(ap),*8(ap),*4(ap)"); + } + +#else +#if defined(MC68000) && defined(DS90) + +void bmove(dst, src, len) +char *dst,*src; +uint len; /* 0 <= len <= 65535 */ +{ +asm(" movl 12(a7),d0 "); +asm(" subql #1,d0 "); +asm(" blt .L5 "); +asm(" movl 4(a7),a1 "); +asm(" movl 8(a7),a0 "); +asm(".L4: movb (a0)+,(a1)+ "); +asm(" dbf d0,.L4 "); +asm(".L5: "); +} +#else + +void bmove(dst, src, len) +register byte *dst; +register const char *src; +register uint len; +{ + while (len-- != 0) *dst++ = *src++; +} +#endif +#endif +#endif diff --git a/strings/bmove512.c b/strings/bmove512.c new file mode 100644 index 00000000000..4b0c3f5c1cb --- /dev/null +++ b/strings/bmove512.c @@ -0,0 +1,129 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : bmove512.c + Author : Michael Widenius; + Defines: bmove512() + + bmove512(dst, src, len) moves exactly "len" bytes from the source "src" + to the destination "dst". "src" and "dst" must be alligned on long + boundory and len must be a mutliple of 512 byte. If len is not a + multiple of 512 byte len/512*512+1 bytes is copyed. + bmove512 is moustly used to copy IO_BLOCKS. bmove512 should be the + fastest way to move a mutiple of 512 byte. +*/ + +#include <global.h> +#include "m_string.h" + +#ifndef bmove512 + +#ifdef HAVE_LONG_LONG +#define LONG ulonglong +#else +#define LONG ulonglong +#endif + +void bmove512(register gptr to, register const gptr from, register uint length) +{ + reg1 LONG *f,*t; + reg3 int len; + + f= (LONG*) from; + t= (LONG*) to; + len= (int) length; + +#if defined(m88k) || defined(sparc) || defined(HAVE_LONG_LONG) + do { + t[0]=f[0]; t[1]=f[1]; t[2]=f[2]; t[3]=f[3]; + t[4]=f[4]; t[5]=f[5]; t[6]=f[6]; t[7]=f[7]; + t[8]=f[8]; t[9]=f[9]; t[10]=f[10]; t[11]=f[11]; + t[12]=f[12]; t[13]=f[13]; t[14]=f[14]; t[15]=f[15]; + t[16]=f[16]; t[17]=f[17]; t[18]=f[18]; t[19]=f[19]; + t[20]=f[20]; t[21]=f[21]; t[22]=f[22]; t[23]=f[23]; + t[24]=f[24]; t[25]=f[25]; t[26]=f[26]; t[27]=f[27]; + t[28]=f[28]; t[29]=f[29]; t[30]=f[30]; t[31]=f[31]; + t[32]=f[32]; t[33]=f[33]; t[34]=f[34]; t[35]=f[35]; + t[36]=f[36]; t[37]=f[37]; t[38]=f[38]; t[39]=f[39]; + t[40]=f[40]; t[41]=f[41]; t[42]=f[42]; t[43]=f[43]; + t[44]=f[44]; t[45]=f[45]; t[46]=f[46]; t[47]=f[47]; + t[48]=f[48]; t[49]=f[49]; t[50]=f[50]; t[51]=f[51]; + t[52]=f[52]; t[53]=f[53]; t[54]=f[54]; t[55]=f[55]; + t[56]=f[56]; t[57]=f[57]; t[58]=f[58]; t[59]=f[59]; + t[60]=f[60]; t[61]=f[61]; t[62]=f[62]; t[63]=f[63]; +#ifdef HAVE_LONG_LONG + t+=64; f+=64; +#else + t[64]=f[64]; t[65]=f[65]; t[66]=f[66]; t[67]=f[67]; + t[68]=f[68]; t[69]=f[69]; t[70]=f[70]; t[71]=f[71]; + t[72]=f[72]; t[73]=f[73]; t[74]=f[74]; t[75]=f[75]; + t[76]=f[76]; t[77]=f[77]; t[78]=f[78]; t[79]=f[79]; + t[80]=f[80]; t[81]=f[81]; t[82]=f[82]; t[83]=f[83]; + t[84]=f[84]; t[85]=f[85]; t[86]=f[86]; t[87]=f[87]; + t[88]=f[88]; t[89]=f[89]; t[90]=f[90]; t[91]=f[91]; + t[92]=f[92]; t[93]=f[93]; t[94]=f[94]; t[95]=f[95]; + t[96]=f[96]; t[97]=f[97]; t[98]=f[98]; t[99]=f[99]; + t[100]=f[100]; t[101]=f[101]; t[102]=f[102]; t[103]=f[103]; + t[104]=f[104]; t[105]=f[105]; t[106]=f[106]; t[107]=f[107]; + t[108]=f[108]; t[109]=f[109]; t[110]=f[110]; t[111]=f[111]; + t[112]=f[112]; t[113]=f[113]; t[114]=f[114]; t[115]=f[115]; + t[116]=f[116]; t[117]=f[117]; t[118]=f[118]; t[119]=f[119]; + t[120]=f[120]; t[121]=f[121]; t[122]=f[122]; t[123]=f[123]; + t[124]=f[124]; t[125]=f[125]; t[126]=f[126]; t[127]=f[127]; + t+=128; f+=128; +#endif + } while ((len-=512) > 0); +#else + do { + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + *t++ = *f++; *t++ = *f++; *t++ = *f++; *t++ = *f++; + } while ((len-=512) > 0); +#endif + return; +} /* bmove512 */ + +#endif /* bmove512 */ diff --git a/strings/bmove_upp-sparc.s b/strings/bmove_upp-sparc.s new file mode 100644 index 00000000000..4fae7f5cc7c --- /dev/null +++ b/strings/bmove_upp-sparc.s @@ -0,0 +1,40 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "bmove_upp-sparc.s" +.section ".text" + .align 4 + .global bmove_upp + .type bmove_upp,#function + .proc 020 +bmove_upp: + subcc %o2, 1, %o2 ! o2= len + bcs .end + nop +.loop: + sub %o1, 1, %o1 + ldub [%o1], %g2 + sub %o0, 1, %o0 + subcc %o2, 1, %o2 + bcc .loop + stb %g2, [%o0] +.end: + retl + nop +.bmove_upp_end: + .size bmove_upp,.bmove_upp_end-bmove_upp + .ident "Matt Wagner & Monty" diff --git a/strings/bmove_upp.c b/strings/bmove_upp.c new file mode 100644 index 00000000000..af6575ebf41 --- /dev/null +++ b/strings/bmove_upp.c @@ -0,0 +1,51 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : bmove.c + Author : Michael widenius + Updated: 1987-03-20 + Defines: bmove_upp() + + bmove_upp(dst, src, len) moves exactly "len" bytes from the source + "src-len" to the destination "dst-len" counting downwards. +*/ + +#include <global.h> +#include "m_string.h" + +#if defined(MC68000) && defined(DS90) + +/* 0 <= len <= 65535 */ +void bmove_upp(byte *dst, const byte *src,uint len) +{ +asm(" movl 12(a7),d0 "); +asm(" subql #1,d0 "); +asm(" blt .L5 "); +asm(" movl 4(a7),a1 "); +asm(" movl 8(a7),a0 "); +asm(".L4: movb -(a0),-(a1) "); +asm(" dbf d0,.L4 "); +asm(".L5: "); +} +#else + +void bmove_upp(register char *dst, register const char *src, register uint len) +{ + while (len-- != 0) *--dst = *--src; +} + +#endif diff --git a/strings/bzero.c b/strings/bzero.c new file mode 100644 index 00000000000..cc628e05277 --- /dev/null +++ b/strings/bzero.c @@ -0,0 +1,67 @@ +/* File : bzero.c + Author : Richard A. O'Keefe. + Michael Widenius; ifdef MC68000 + Updated: 23 April 1984 + Defines: bzero() + + bzero(dst, len) moves "len" 0 bytes to "dst". + Thus to clear a disc buffer to 0s do bzero(buffer, BUFSIZ). + + Note: the "b" routines are there to exploit certain VAX order codes, + The asm code is presented for your interest and amusement. +*/ + +#ifndef BSD_FUNCS +#include "strings.h" + +#ifdef bzero +#undef bzero /* remove macro */ +#endif + +#if VaxAsm + +static void _bzero64 _A((char *dst,int len)); + +void bzero(dst, len) +char *dst; +uint len; +{ + while ((int) len >= 64*K) + { + _bzero64(dst, 64*K-1); + dst += 64*K-1; + len -= 64*K-1; + } + _bzero64(dst, len); +} + +_bzero64(dst, len) +char *dst; +int len; +{ + asm("movc5 $0,*4(ap),$0,8(ap),*4(ap)"); +} + +#else + +#if defined(MC68000) && defined(DS90) + +void bzero(dst, len) +char *dst; +uint len; +{ + bfill(dst,len,0); /* This is very optimized ! */ +} /* bzero */ + +#else + +void bzero(dst, len) +register char *dst; +register uint len; +{ + while (len-- != 0) *dst++ = 0; +} /* bzero */ + +#endif +#endif +#endif /* BSD_FUNCS */ diff --git a/strings/conf_to_src.c b/strings/conf_to_src.c new file mode 100644 index 00000000000..76316638153 --- /dev/null +++ b/strings/conf_to_src.c @@ -0,0 +1,143 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* can't use -lmysys because this prog is used to create -lstrings */ + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define CHARSETS_SUBDIR "sql/share/charsets" +#define CTYPE_TABLE_SIZE 257 +#define TO_LOWER_TABLE_SIZE 256 +#define TO_UPPER_TABLE_SIZE 256 +#define SORT_ORDER_TABLE_SIZE 256 +#define ROW_LEN 16 + +void print_arrays_for(char *set); + +char *prog; +char buf[1024], *p, *endptr; + +int +main(int argc, char **argv) +{ + prog = *argv; + + if (argc < 2) { + fprintf(stderr, "usage: %s source-dir [charset [, charset]]\n", prog); + exit(EXIT_FAILURE); + } + + --argc; ++argv; /* skip program name */ + + if (chdir(*argv) != 0) { + fprintf(stderr, "%s: can't cd to %s\n", prog, *argv); + exit(EXIT_FAILURE); + } + --argc; ++argv; + + if (chdir(CHARSETS_SUBDIR) != 0) { + fprintf(stderr, "%s: can't cd to %s\n", prog, CHARSETS_SUBDIR); + exit(EXIT_FAILURE); + } + + while (argc--) + print_arrays_for(*argv++); + + exit(EXIT_SUCCESS); +} + +void +print_array(FILE *f, const char *set, const char *name, int n) +{ + int i; + char val[100]; + + printf("uchar %s_%s[] = {\n", name, set); + + p = buf; + *buf = '\0'; + for (i = 0; i < n; ++i) + { + /* get a word from f */ + endptr = p; + for (;;) + { + while (isspace(*endptr)) + ++endptr; + if (*endptr && *endptr != '#') /* not comment */ + break; + if ((fgets(buf, sizeof(buf), f)) == NULL) + return; /* XXX: break silently */ + endptr = buf; + } + + p = val; + while (!isspace(*endptr)) + *p++ = *endptr++; + *p = '\0'; + p = endptr; + + /* write the value out */ + + if (i == 0 || i % ROW_LEN == n % ROW_LEN) + printf(" "); + + printf("%3d", (unsigned char) strtol(val, (char **) NULL, 16)); + + if (i < n - 1) + printf(","); + + if ((i+1) % ROW_LEN == n % ROW_LEN) + printf("\n"); + } + + printf("};\n\n"); +} + +void +print_arrays_for(char *set) +{ + FILE *f; + + sprintf(buf, "%s.conf", set); + + if ((f = fopen(buf, "r")) == NULL) { + fprintf(stderr, "%s: can't read conf file for charset %s\n", prog, set); + exit(EXIT_FAILURE); + } + + printf("\ +/* The %s character set. Generated automatically by configure and\n\ + * the %s program\n\ + */\n\n", + set, prog); + + /* it would be nice if this used the code in mysys/charset.c, but... */ + print_array(f, set, "ctype", CTYPE_TABLE_SIZE); + print_array(f, set, "to_lower", TO_LOWER_TABLE_SIZE); + print_array(f, set, "to_upper", TO_UPPER_TABLE_SIZE); + print_array(f, set, "sort_order", SORT_ORDER_TABLE_SIZE); + printf("\n"); + + fclose(f); + + return; +} diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c new file mode 100644 index 00000000000..1fb98273fec --- /dev/null +++ b/strings/ctype-big5.c @@ -0,0 +1,389 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + * This file is basicly usa7 character sets with some extra functions + * for big5 handling +*/ + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. strxfrm_multiply_big5=1 + * .configure. mbmaxlen_big5=2 + */ + +#include <global.h> +#include "m_string.h" +#include "m_ctype.h" + +/* Support for Chinese(BIG5) characters, by jou@nematic.ieo.nctu.edu.tw + modified by Wei He (hewei@mail.ied.ac.cn) */ + +#define isbig5head(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xf9) +#define isbig5tail(c) ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e) || \ + (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe)) + +#define isbig5code(c,d) (isbig5head(c) && isbig5tail(d)) +#define big5code(c,d) (((uchar)(c) <<8) | (uchar)(d)) +#define big5head(e) ((uchar)(e>>8)) +#define big5tail(e) ((uchar)(e&0xff)) + +uchar NEAR ctype_big5[257] = +{ + 0, /* For standard library */ + 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, + 16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, + 16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + +uchar NEAR to_lower_big5[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_big5[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_big5[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '\\', ']', '[', '^', '_', + 'E', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', 'Y', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +static uint16 big5strokexfrm(uint16 i) +{ + if ((i == 0xA440) || (i == 0xA441)) return 0xA440; + else if (((i >= 0xA442) && (i <= 0xA453)) || ((i >= 0xC940) && (i <= 0xC944))) return 0xA442; + else if (((i >= 0xA454) && (i <= 0xA47E)) || ((i >= 0xC945) && (i <= 0xC94C))) return 0xA454; + else if (((i >= 0xA4A1) && (i <= 0xA4FD)) || ((i >= 0xC94D) && (i <= 0xC962))) return 0xA4A1; + else if (((i >= 0xA4FE) && (i <= 0xA5DF)) || ((i >= 0xC963) && (i <= 0xC9AA))) return 0xA4FE; + else if (((i >= 0xA5E0) && (i <= 0xA6E9)) || ((i >= 0xC9AB) && (i <= 0xCA59))) return 0xA5E0; + else if (((i >= 0xA6EA) && (i <= 0xA8C2)) || ((i >= 0xCA5A) && (i <= 0xCBB0))) return 0xA6EA; + else if ((i == 0xA260) || ((i >= 0xA8C3) && (i <= 0xAB44)) || ((i >= 0xCBB1) && (i <= 0xCDDC))) return 0xA8C3; + else if ((i == 0xA259) || (i == 0xF9DA) || ((i >= 0xAB45) && (i <= 0xADBB)) || ((i >= 0xCDDD) && (i <= 0xD0C7))) return 0xAB45; + else if ((i == 0xA25A) || ((i >= 0xADBC) && (i <= 0xB0AD)) || ((i >= 0xD0C8) && (i <= 0xD44A))) return 0xADBC; + else if ((i == 0xA25B) || (i == 0xA25C) || ((i >= 0xB0AE) && (i <= 0xB3C2)) || ((i >= 0xD44B) && (i <= 0xD850))) return 0xB0AE; + else if ((i == 0xF9DB) || ((i >= 0xB3C3) && (i <= 0xB6C2)) || ((i >= 0xD851) && (i <= 0xDCB0))) return 0xB3C3; + else if ((i == 0xA25D) || (i == 0xA25F) || (i == 0xC6A1) || (i == 0xF9D6) || (i == 0xF9D8) || ((i >= 0xB6C3) && (i <= 0xB9AB)) || ((i >= 0xDCB1) && (i <= 0xE0EF))) return 0xB6C3; + else if ((i == 0xF9DC) || ((i >= 0xB9AC) && (i <= 0xBBF4)) || ((i >= 0xE0F0) && (i <= 0xE4E5))) return 0xB9AC; + else if ((i == 0xA261) || ((i >= 0xBBF5) && (i <= 0xBEA6)) || ((i >= 0xE4E6) && (i <= 0xE8F3))) return 0xBBF5; + else if ((i == 0xA25E) || (i == 0xF9D7) || (i == 0xF9D9) || ((i >= 0xBEA7) && (i <= 0xC074)) || ((i >= 0xE8F4) && (i <= 0xECB8))) return 0xBEA7; + else if (((i >= 0xC075) && (i <= 0xC24E)) || ((i >= 0xECB9) && (i <= 0xEFB6))) return 0xC075; + else if (((i >= 0xC24F) && (i <= 0xC35E)) || ((i >= 0xEFB7) && (i <= 0xF1EA))) return 0xC24F; + else if (((i >= 0xC35F) && (i <= 0xC454)) || ((i >= 0xF1EB) && (i <= 0xF3FC))) return 0xC35F; + else if (((i >= 0xC455) && (i <= 0xC4D6)) || ((i >= 0xF3FD) && (i <= 0xF5BF))) return 0xC455; + else if (((i >= 0xC4D7) && (i <= 0xC56A)) || ((i >= 0xF5C0) && (i <= 0xF6D5))) return 0xC4D7; + else if (((i >= 0xC56B) && (i <= 0xC5C7)) || ((i >= 0xF6D6) && (i <= 0xF7CF))) return 0xC56B; + else if (((i >= 0xC5C8) && (i <= 0xC5F0)) || ((i >= 0xF7D0) && (i <= 0xF8A4))) return 0xC5C8; + else if (((i >= 0xC5F1) && (i <= 0xC654)) || ((i >= 0xF8A5) && (i <= 0xF8ED))) return 0xC5F1; + else if (((i >= 0xC655) && (i <= 0xC664)) || ((i >= 0xF8EE) && (i <= 0xF96A))) return 0xC655; + else if (((i >= 0xC665) && (i <= 0xC66B)) || ((i >= 0xF96B) && (i <= 0xF9A1))) return 0xC665; + else if (((i >= 0xC66C) && (i <= 0xC675)) || ((i >= 0xF9A2) && (i <= 0xF9B9))) return 0xC66C; + else if (((i >= 0xC676) && (i <= 0xC678)) || ((i >= 0xF9BA) && (i <= 0xF9C5))) return 0xC676; + else if (((i >= 0xC679) && (i <= 0xC67C)) || ((i >= 0xF9C7) && (i <= 0xF9CB))) return 0xC679; + else if ((i == 0xC67D) || ((i >= 0xF9CC) && (i <= 0xF9CF))) return 0xC67D; + else if (i == 0xF9D0) return 0xF9D0; + else if ((i == 0xC67E) || (i == 0xF9D1)) return 0xC67E; + else if ((i == 0xF9C6) || (i == 0xF9D2)) return 0xF9C6; + else if (i == 0xF9D3) return 0xF9D3; + else if (i == 0xF9D4) return 0xF9D4; + else if (i == 0xF9D5) return 0xF9D5; + return 0xA140; +} + +int my_strnncoll_big5(const uchar * s1, int len1, const uchar * s2, int len2) +{ + uint len; + + len = min(len1,len2); + while (len--) + { + if ((len > 0) && isbig5code(*s1,*(s1+1)) && isbig5code(*s2, *(s2+1))) + { + if (*s1 != *s2 || *(s1+1) != *(s2+1)) + return ((int) big5code(*s1,*(s1+1)) - + (int) big5code(*s2,*(s2+1))); + s1 +=2; + s2 +=2; + len--; + } else if (sort_order_big5[(uchar) *s1++] != sort_order_big5[(uchar) *s2++]) + return ((int) sort_order_big5[(uchar) s1[-1]] - + (int) sort_order_big5[(uchar) s2[-1]]); + } + return (int) (len1-len2); +} + +int my_strnxfrm_big5(uchar * dest, uchar * src, int len, int srclen) +{ + uint16 e; + /*uchar *d = dest; XXX: unused*/ + + len = srclen; + while (len--) + { + if ((len > 0) && isbig5code(*src, *(src+1))) + { + e = big5strokexfrm((uint16) big5code(*src, *(src+1))); + *dest++ = big5head(e); + *dest++ = big5tail(e); + src +=2; + len--; + } else + *dest++ = sort_order_big5[(uchar) *src++]; + } + return srclen; +} + +int my_strcoll_big5(const uchar * s1, const uchar * s2) +{ + + while (*s1 && *s2) + { + if (*(s1+1) && *(s2+1) && isbig5code(*s1,*(s1+1)) && isbig5code(*s2, *(s2+1))) + { + if (*s1 != *s2 || *(s1+1) != *(s2+1)) + return ((int) big5code(*s1,*(s1+1)) - + (int) big5code(*s2,*(s2+1))); + s1 +=2; + s2 +=2; + } else if (sort_order_big5[(uchar) *s1++] != sort_order_big5[(uchar) *s2++]) + return ((int) sort_order_big5[(uchar) s1[-1]] - + (int) sort_order_big5[(uchar) s2[-1]]); + } + return 0; +} + +int my_strxfrm_big5(uchar * dest, uchar * src, int len) +{ + uint16 e; + uchar *d = dest; + + if (len < 1) return 0; + if (!*src) + { + *d = '\0'; + return 0; + } + while (*src && (len > 1)) + { + if (*(src+1) && isbig5code(*src, *(src+1))) + { + e = big5strokexfrm((uint16) big5code(*src, *(src+1))); + *d++ = big5head(e); + *d++ = big5tail(e); + src +=2; + len--; + } else + *d++ = sort_order_big5[(uchar) *src++]; + } + *d = '\0'; + return (int) (d-dest); +} + +/* +** Calculate min_str and max_str that ranges a LIKE string. +** Arguments: +** ptr Pointer to LIKE string. +** ptr_length Length of LIKE string. +** escape Escape character in LIKE. (Normally '\'). +** All escape characters should be removed from min_str and max_str +** res_length Length of min_str and max_str. +** min_str Smallest case sensitive string that ranges LIKE. +** Should be space padded to res_length. +** max_str Largest case sensitive string that ranges LIKE. +** Normally padded with the biggest character sort value. +** +** The function should return 0 if ok and 1 if the LIKE string can't be +** optimized ! +*/ + +#define max_sort_char ((char) 255) +#define wild_one '_' +#define wild_many '%' + +my_bool my_like_range_big5(const char *ptr,uint ptr_length,pchar escape, + uint res_length, char *min_str,char *max_str, + uint *min_length,uint *max_length) +{ + const char *end=ptr+ptr_length; + char *min_org=min_str; + char *min_end=min_str+res_length; + + for (; ptr != end && min_str != min_end ; ptr++) + { + if (ptr+1 != end && isbig5code(ptr[0],ptr[1])) + { + *min_str++= *max_str++ = *ptr++; + *min_str++= *max_str++ = *ptr; + continue; + } + if (*ptr == escape && ptr+1 != end) + { + ptr++; /* Skipp escape */ + *min_str++= *max_str++ = *ptr; + continue; + } + if (*ptr == wild_one) /* '_' in SQL */ + { + *min_str++='\0'; /* This should be min char */ + *max_str++=max_sort_char; + continue; + } + if (*ptr == wild_many) /* '%' in SQL */ + { + *min_length= (uint) (min_str-min_org); + *max_length= res_length; + do { + *min_str++ = '\0'; /* Because if key compression */ + *max_str++ = max_sort_char; + } while (min_str != min_end); + return 0; + } + *min_str++= *max_str++ = *ptr; + } + *min_length= *max_length= (uint) (min_str-min_org); + while (min_str != min_end) + { + *min_str++ = ' '; /* Because if key compression */ + *max_str++ = ' '; + } + return 0; +} + +int ismbchar_big5(const char* p, const char *e) +{ + return (isbig5head(*(p)) && (e)-(p)>1 && isbig5tail(*((p)+1))? 2: 0); +} + +my_bool ismbhead_big5(uint c) +{ + return isbig5head(c); +} + +int mbcharlen_big5(uint c) +{ + return (isbig5head(c)? 2: 0); +} diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c new file mode 100644 index 00000000000..b47eaf3a63f --- /dev/null +++ b/strings/ctype-czech.c @@ -0,0 +1,510 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File strings/ctype-czech.c for MySQL. + + This file implements the Czech sorting for the MySQL database + server (www.mysql.com). Due to some complicated rules the + Czech language has for sorting strings, a more complex + solution was needed than the one-to-one conversion table. To + note a few, here is an example of a Czech sorting sequence: + + co < hlaska < hláska < hlava < chlapec < krtek + + It because some of the rules are: double char 'ch' is sorted + between 'h' and 'i'. Accented character 'á' (a with acute) is + sorted after 'a' and before 'b', but only if the word is + otherwise the same. However, because 's' is sorted before 'v' + in hlava, the accentness of 'á' is overridden. There are many + more rules. + + This file defines functions my_strxfrm and my_strcoll for + C-like zero terminated strings and my_strnxfrm and my_strnncoll + for strings where the length comes as an parameter. Also + defined here you will find function my_like_range that returns + index range strings for LIKE expression and the + MY_STRXFRM_MULTIPLY set to value 4 -- this is the ratio the + strings grows during my_strxfrm. The algorithm has four + passes, that's why we need four times more space for expanded + string. + + This file also contains the ISO-Latin-2 definitions of + characters. + + Author: (c) 1997--1998 Jan Pazdziora, adelton@fi.muni.cz + Jan Pazdziora has a shared copyright for this code + + The original of this file can also be found at + http://www.fi.muni.cz/~adelton/l10n/ + + Bug reports and suggestions are always welcome. +*/ + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. strxfrm_multiply_czech=4 + */ + +#define SKIP_TRAILING_SPACES 1 + +#define REAL_MYSQL + +#ifdef REAL_MYSQL + +#include <global.h> +#include "m_string.h" + +#else + +#include <stdio.h> +#define uchar unsigned char + +#endif + +/* + These are four tables for four passes of the algorithm. Please see + below for what are the "special values" +*/ + +static uchar * CZ_SORT_TABLE[] = { + (uchar*) "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\043\044\045\046\047\050\051\052\053\054\000\000\000\000\000\000\000\003\004\377\007\010\011\012\013\015\016\017\020\022\023\024\025\026\027\031\033\034\035\036\037\040\041\000\000\000\000\000\000\003\004\377\007\010\011\012\013\015\016\017\020\022\023\024\025\026\027\031\033\034\035\036\037\040\041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\021\000\020\032\000\000\032\032\033\042\000\042\042\000\003\000\021\000\020\032\000\000\032\032\033\042\000\042\042\027\003\003\003\003\020\006\006\006\010\010\010\010\015\015\007\007\023\023\024\024\024\024\000\030\034\034\034\034\040\033\000\027\003\003\003\003\020\006\006\006\010\010\010\010\015\015\007\007\023\023\024\024\024\024\000\030\034\034\034\034\040\033\000", + (uchar*) "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\106\107\110\111\112\113\114\115\116\117\000\000\000\000\000\000\000\003\011\377\016\021\026\027\030\032\035\036\037\043\044\047\054\055\056\061\065\070\075\076\077\100\102\000\000\000\000\000\000\003\011\377\016\021\026\027\030\032\035\036\037\043\044\047\054\055\056\061\065\070\075\076\077\100\102\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\042\000\041\063\000\000\062\064\066\104\000\103\105\000\010\000\042\000\041\063\000\000\062\064\066\104\000\103\105\057\004\005\007\006\040\014\015\013\022\025\024\023\033\034\017\020\046\045\050\051\053\052\000\060\072\071\074\073\101\067\000\057\004\005\007\006\040\014\015\013\022\025\024\023\033\034\017\020\046\045\050\051\053\052\000\060\072\071\074\073\101\067\000", +(uchar*) "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\213\214\215\216\217\220\221\222\223\000\000\000\000\000\000\000\004\020\377\032\040\052\054\056\063\071\073\075\105\107\115\127\131\133\141\151\157\171\173\175\177\203\000\000\000\000\000\000\003\017\377\031\037\051\053\055\062\070\072\074\104\106\114\126\130\132\140\150\156\170\172\174\176\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\103\000\101\145\000\000\143\147\153\207\000\205\211\000\015\000\102\000\100\144\000\000\142\146\152\206\000\204\210\135\006\010\014\012\077\026\030\024\042\050\046\044\065\067\034\036\113\111\117\121\125\123\000\137\163\161\167\165\201\155\000\134\005\007\013\011\076\025\027\023\041\047\045\043\064\066\033\035\112\110\116\120\124\122\000\136\162\160\166\164\200\154\000", +(uchar*) "\264\265\266\267\270\271\272\273\274\002\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\002\230\232\253\324\252\251\234\240\241\261\260\225\262\224\235\212\213\214\215\216\217\220\221\222\223\231\226\244\257\245\227\250\004\020\377\032\040\052\054\056\063\071\073\075\105\107\115\127\131\133\141\151\157\171\173\175\177\203\242\237\243\254\255\233\003\017\377\031\037\051\053\055\062\070\072\074\104\106\114\126\130\132\140\150\156\170\172\174\176\202\246\236\247\256\325\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\326\016\327\103\330\101\145\331\332\143\147\153\207\333\205\211\334\015\335\102\336\100\144\337\340\142\146\152\206\341\204\210\135\006\010\014\012\077\026\030\024\042\050\046\044\065\067\034\036\113\111\117\121\125\123\263\137\163\161\167\165\201\155\342\134\005\007\013\011\076\025\027\023\041\047\045\043\064\066\033\035\112\110\116\120\124\122\343\136\162\160\166\164\200\154\344", +}; + +/* + These define the valuse for the double chars that need to be + sorted as they were single characters -- in Czech these are + 'ch', 'Ch' and 'CH'. +*/ + +struct wordvalue + { + const char * word; + uchar * outvalue; + }; +static struct wordvalue doubles[] = { + { "ch", (uchar*) "\014\031\057\057" }, + { "Ch", (uchar*) "\014\031\060\060" }, + { "CH", (uchar*) "\014\031\061\061" }, + { "c", (uchar*) "\005\012\021\021" }, + { "C", (uchar*) "\005\012\022\022" }, + }; + +/* + Unformal description of the algorithm: + + We walk the string left to right. + + The end of the string is either passed as parameter, or is + *p == 0. This is hidden in the IS_END macro. + + In the first two passes, we compare word by word. So we make + first and second pass on the first word, first and second pass + on the second word, etc. If we come to the end of the string + during the first pass, we need to jump to the last word of the + second pass. + + End of pass is marked with value 1 on the output. + + For each character, we read it's value from the table. + + If the value is ignore (0), we go straight to the next character. + + If the value is space/end of word (2) and we are in the first + or second pass, we skip all characters having value 0 -- 2 and + switch the passwd. + + If it's the compose character (255), we check if the double + exists behind it, find its value. + + We append 0 to the end. +--- + Neformální popis algoritmu: + + Procházíme øetìzec zleva doprava. + + Konec øetìzce je pøedán buï jako parametr, nebo je to *p == 0. + Toto je o¹etøeno makrem IS_END. + + Pokud jsme do¹li na konec øetìzce pøi prùchodu 0, nejdeme na + zaèátek, ale na ulo¾enou pozici, proto¾e první a druhý prùchod + bì¾í souèasnì. + + Konec vstupu (prùchodu) oznaèíme na výstupu hodnotou 1. + + Pro ka¾dý znak øetìzce naèteme hodnotu z tøídící tabulky. + + Jde-li o hodnotu ignorovat (0), skoèíme ihned na dal¹í znak.. + + Jde-li o hodnotu konec slova (2) a je to prùchod 0 nebo 1, + pøeskoèíme v¹echny dal¹í 0 -- 2 a prohodíme prùchody. + + Jde-li o kompozitní znak (255), otestujeme, zda následuje + správný do dvojice, dohledáme správnou hodnotu. + + Na konci pøipojíme znak 0 + */ + +#define ADD_TO_RESULT(dest, len, totlen, value) \ + if ((totlen) < (len)) { dest[totlen] = value; } (totlen++); + +#define NEXT_CMP_VALUE(src, p, store, pass, value, len) \ + while (1) /* we will make a loop */ \ + { \ + if (IS_END(p, src, len)) \ + /* when we are at the end of string */ \ + { /* return either 0 for end of string */ \ + /* or 1 for end of pass */ \ + if (pass == 3) { value = 0; break; } \ + if (pass == 0) p = store; \ + else p = src; \ + value = 1; pass++; break; \ + } \ + /* not at end of string */ \ + value = CZ_SORT_TABLE[pass][*p]; \ + \ + if (value == 0) { p++; continue; } /* ignore value */ \ + if (value == 2) /* space */ \ + { \ + const uchar * tmp; \ + const uchar * runner = ++p; \ + while (!(IS_END(runner, src, len)) && (CZ_SORT_TABLE[pass][*runner] == 2)) \ + runner++; /* skip all spaces */ \ + if (IS_END(runner, src, len) && SKIP_TRAILING_SPACES) \ + p = runner; \ + if ((pass <= 2) && !(IS_END(runner, src, len))) \ + p = runner; \ + if (IS_END(p, src, len)) \ + continue; \ + /* we switch passes */ \ + if (pass > 1) \ + break; \ + tmp = p; \ + if (pass == 0) pass = 1; \ + else pass = 0; \ + p = store; store = tmp; \ + break; \ + } \ + if (value == 255) \ + { \ + int i; \ + for (i = 0; i < (int) sizeof(doubles); i++) \ + { \ + const char * pattern = doubles[i].word; \ + const char * q = (const char *) p; \ + int j = 0; \ + while (pattern[j]) \ + { \ + if (IS_END(q, src, len) || (*q != pattern[j])) \ + { break ; } \ + j++; q++; \ + } \ + if (!(pattern[j])) \ + { \ + value = (int)(doubles[i].outvalue[pass]); \ + p = (const uchar *) q - 1; \ + break; \ + } \ + } \ + } \ + p++; \ + break; \ + } + +#define IS_END(p, src, len) (!(*p)) + +/* Function strcoll, with Czech sorting, for zero terminated strings */ +int my_strcoll_czech(const uchar * s1, const uchar * s2) + { + int v1, v2; + const uchar * p1, * p2, * store1, * store2; + int pass1 = 0, pass2 = 0; + int diff; + + p1 = s1; p2 = s2; + store1 = s1; store2 = s2; + + do + { + NEXT_CMP_VALUE(s1, p1, store1, pass1, v1, 0); + NEXT_CMP_VALUE(s2, p2, store2, pass2, v2, 0); + diff = v1 - v2; + if (diff != 0) return diff; + } + while (v1); + return 0; + } + +/* Function strxfrm, with Czech sorting, for zero terminated strings */ +int my_strxfrm_czech(uchar * dest, const uchar * src, int len) +{ + int value; + const uchar * p, * store; + int pass = 0; + int totlen = 0; + p = store = src; + + do + { + NEXT_CMP_VALUE(src, p, store, pass, value, 0); + ADD_TO_RESULT(dest, len, totlen, value); + } + while (value); + return totlen; + } + +#undef IS_END + + + + +#define IS_END(p, src, len) (((char *)p - (char *)src) >= (len)) + +/* Function strnncoll, actually strcoll, with Czech sorting, which expect + the length of the strings being specified */ +int my_strnncoll_czech(const uchar * s1, int len1, const uchar * s2, int len2) + { + int v1, v2; + const uchar * p1, * p2, * store1, * store2; + int pass1 = 0, pass2 = 0; + int diff; + + p1 = s1; p2 = s2; + store1 = s1; store2 = s2; + + do + { + NEXT_CMP_VALUE(s1, p1, store1, pass1, v1, len1); + NEXT_CMP_VALUE(s2, p2, store2, pass2, v2, len2); + diff = v1 - v2; + + if (diff != 0) return diff; + } + while (v1); + return 0; + } + +/* Function strnxfrm, actually strxfrm, with Czech sorting, which expect + the length of the strings being specified */ +int my_strnxfrm_czech(uchar * dest, const uchar * src, int len, int srclen) + { + int value; + const uchar * p, * store; + int pass = 0; + int totlen = 0; + p = src; store = src; + + do + { + NEXT_CMP_VALUE(src, p, store, pass, value, srclen); + ADD_TO_RESULT(dest, len, totlen, value); + } + while (value); + return totlen; + } + +#undef IS_END + + +/* + Neformální popis algoritmu: + + procházíme øetìzec zleva doprava + konec øetìzce poznáme podle *p == 0 + pokud jsme do¹li na konec øetìzce pøi prùchodu 0, nejdeme na + zaèátek, ale na ulo¾enou pozici, proto¾e první a druhý + prùchod bì¾í souèasnì + konec vstupu (prùchodu) oznaèíme na výstupu hodnotou 1 + + naèteme hodnotu z tøídící tabulky + jde-li o hodnotu ignorovat (0), skoèíme na dal¹í prùchod + jde-li o hodnotu konec slova (2) a je to prùchod 0 nebo 1, + pøeskoèíme v¹echny dal¹í 0 -- 2 a prohodíme + prùchody + jde-li o kompozitní znak (255), otestujeme, zda následuje + správný do dvojice, dohledáme správnou hodnotu + + na konci pøipojíme znak 0 + */ + + +/* +** Calculate min_str and max_str that ranges a LIKE string. +** Arguments: +** ptr Pointer to LIKE string. +** ptr_length Length of LIKE string. +** escape Escape character in LIKE. (Normally '\'). +** All escape characters should be removed from min_str and max_str +** res_length Length of min_str and max_str. +** min_str Smallest case sensitive string that ranges LIKE. +** Should be space padded to res_length. +** max_str Largest case sensitive string that ranges LIKE. +** Normally padded with the biggest character sort value. +** +** The function should return 0 if ok and 1 if the LIKE string can't be +** optimized ! +*/ + +#ifdef REAL_MYSQL + +#define min_sort_char ' ' +#define max_sort_char '9' +#define wild_one '_' +#define wild_many '%' + +#define EXAMPLE + +my_bool my_like_range_czech(const char *ptr,uint ptr_length,pchar escape, + uint res_length, char *min_str,char *max_str, + uint *min_length,uint *max_length) +{ +#ifdef EXAMPLE + uchar value; + const char *end=ptr+ptr_length; + char *min_org=min_str; + char *min_end=min_str+res_length; + + for (; ptr != end && min_str != min_end ; ptr++) + { + if (*ptr == wild_one) /* '_' in SQL */ + { break; } + if (*ptr == wild_many) /* '%' in SQL */ + { break; } + + if (*ptr == escape && ptr+1 != end) + { ptr++; } /* Skip escape */ + + value = CZ_SORT_TABLE[0][(int) (uchar) *ptr]; + + if (value == 0) /* Ignore in the first pass */ + { continue; } + if (value <= 2) /* End of pass or end of string */ + { break; } + if (value == 255) /* Double char too compicated */ + { break; } + + *min_str++= *max_str++ = *ptr; + } + *min_length= (uint) (min_str - min_org); + *max_length= res_length; + while (min_str != min_end) + { + *min_str++ = min_sort_char; /* Because of key compression */ + *max_str++ = max_sort_char; + } + return 0; +#else + return 1; +#endif +} + +#endif + +#ifdef REAL_MYSQL +/* This is a latin2 file */ + +/* + * File generated by cset + * (C) Abandoned 1997 Zarko Mocnik <zarko.mocnik@dem.si> + * + * definition table reworked by Jaromir Dolecek <dolecek@ics.muni.cz> + */ +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_czech[257] = { +0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, +132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16, + 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16, + 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, + 1, 16, 1, 16, 1, 1, 16, 0, 0, 1, 1, 1, 1, 16, 1, 1, + 16, 2, 16, 2, 16, 2, 2, 16, 16, 2, 2, 2, 2, 16, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 16, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 16, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16, +}; + +uchar NEAR to_lower_czech[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +177,161,179,163,181,182,166,167,168,185,186,187,188,173,190,191, +176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +208,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223, +224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, +}; + +uchar NEAR to_upper_czech[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, +176,160,178,162,180,164,165,183,184,169,170,171,172,189,174,175, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, +192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, +240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255, +}; + +uchar NEAR sort_order_czech[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100, +105,106,107,110,114,117,122,123,124,125,127,131,132,133,134,135, +136, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100, +105,106,107,110,114,117,122,123,124,125,127,137,138,139,140, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,255, + 66,255, 93,255, 94,111,255,255,255,112,113,115,128,255,129,130, +255, 66,255, 93,255, 94,111,255,255,112,113,115,128,255,129,130, +108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 89, 87, 77, +255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255, +108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 89, 88, 77, +255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255, +}; + +#endif diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c new file mode 100644 index 00000000000..13d4513ce2d --- /dev/null +++ b/strings/ctype-euc_kr.c @@ -0,0 +1,198 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + * This file is for Korean EUC charset, and created by powerm90@tinc.co.kr. + * and updated by mrpark@tinc.co.kr. + */ + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. mbmaxlen_euc_kr=2 + */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_euc_kr[257] = +{ + 0, /* For standard library */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* NUL ^A - ^G */ + 0040, 0050, 0050, 0050, 0050, 0050, 0040, 0040, /* ^H - ^O */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* ^P - ^W */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* ^X - ^Z ^[ ^\ ^] ^^ ^_ */ + 0110, 0020, 0020, 0020, 0020, 0020, 0020, 0020, /* SPC ! " # $ % ^ ' */ + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, /* ( ) * + , - . / */ + 0204, 0204, 0204, 0204, 0204, 0204, 0204, 0204, /* 0 1 2 3 4 5 6 7 */ + 0204, 0204, 0020, 0020, 0020, 0020, 0020, 0020, /* 8 9 : ; < = > ? */ + 0020, 0201, 0201, 0201, 0201, 0201, 0201, 0001, /* @ A B C D E F G */ + 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, /* H I J K L M N O */ + 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, /* P Q R S T U V W */ + 0001, 0001, 0001, 0020, 0020, 0020, 0020, 0020, /* X Y Z [ \ ] ^ _ */ + 0020, 0202, 0202, 0202, 0202, 0202, 0202, 0002, /* ` a b c d e f g */ + 0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, /* h i j k l m n o */ + 0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, /* p q r s t u v w */ + 0002, 0002, 0002, 0020, 0020, 0020, 0020, 0040, /* x y z { | } + DEL */ + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0000, +}; + +uchar NEAR to_lower_euc_kr[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377', +}; + +uchar NEAR to_upper_euc_kr[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377', +}; + +uchar NEAR sort_order_euc_kr[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377', +}; + +/* Support for Korean(EUC_KR) characters, by powerm90@tinc.co.kr and mrpark@tinc.co.kr */ + +#define iseuc_kr(c) ((0xa1<=(uchar)(c) && (uchar)(c)<=0xfe)) + + +int ismbchar_euc_kr(const char* p, const char *e) +{ + return ((*(uchar*)(p)<0x80)? 0:\ + iseuc_kr(*(p)) && (e)-(p)>1 && iseuc_kr(*((p)+1))? 2:\ + 0); +} + +my_bool ismbhead_euc_kr(uint c) +{ + return (iseuc_kr(c)); +} + +int mbcharlen_euc_kr(uint c) +{ + return (iseuc_kr(c) ? 2 : 0); +} diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c new file mode 100644 index 00000000000..a587d72905e --- /dev/null +++ b/strings/ctype-gb2312.c @@ -0,0 +1,180 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* This file is for Chinese EUC character sets (GB2312), and created by Miles Tsai (net-bull@126.com). + */ + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. mbmaxlen_gb2312=2 + */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_gb2312[257] = +{ + 0, /* For standard library */ + 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, + 16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, + 16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0, +}; + +uchar NEAR to_lower_gb2312[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_gb2312[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_gb2312[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '\\', ']', '[', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', 'Y', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +/* Support for Chinese(GB2312) characters, by Miles Tsai (net-bull@126.com) + modified by Wei He (hewei@mail.ied.ac.cn) */ + +#define isgb2312head(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xf7) +#define isgb2312tail(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe) + + +int ismbchar_gb2312(const char* p, const char *e) +{ + return (isgb2312head(*(p)) && (e)-(p)>1 && isgb2312tail(*((p)+1))? 2: 0); +} + +my_bool ismbhead_gb2312(uint c) +{ + return isgb2312head(c); +} + +int mbcharlen_gb2312(uint c) +{ + return (isgb2312head(c)? 2:0); +} diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c new file mode 100644 index 00000000000..9628f21b8d4 --- /dev/null +++ b/strings/ctype-gbk.c @@ -0,0 +1,2722 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* This file is for Chinese character sets GBK, created by Wei He + (hewei@mail.ied.ac.cn) +*/ + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. strxfrm_multiply_gbk=1 + * .configure. mbmaxlen_gbk=2 + */ + + +#include <global.h> +#include "m_string.h" +#include "m_ctype.h" + +/* Support for Chinese(GBK) characters, by hewei@mail.ied.ac.cn */ + +#define isgbkhead(c) (0x81<=(uchar)(c) && (uchar)(c)<=0xfe) +#define isgbktail(c) ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e) || \ + (0x80<=(uchar)(c) && (uchar)(c)<=0xfe)) + +#define isgbkcode(c,d) (isgbkhead(c) && isgbktail(d)) +#define gbkcode(c,d) ((((uint) (uchar) (c)) <<8) | (uchar)(d)) +#define gbkhead(e) ((uchar)(e>>8)) +#define gbktail(e) ((uchar)(e&0xff)) + +uchar NEAR ctype_gbk[257] = +{ + 0, /* For standard library */ + 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, + 16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, + 16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0, +}; + +uchar NEAR to_lower_gbk[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_gbk[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_gbk[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '\\', ']', '[', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', 'Y', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +static uint16 NEAR gbk_order[]= +{ +8653,14277,17116,11482,11160,2751,14613,3913,13337,9827, +19496,1759,8105,7103,7836,5638,2223,21433,5878,8006, +4851,18766,18879,16728,8129,6200,19133,6389,2500,19084, +16228,5074,8130,5900,6201,3985,14597,11566,8588,8769, +15885,11411,11965,1961,18012,18303,12242,14118,11490,12911, +15015,4367,3184,2093,20937,5710,5108,10560,9993,18982, +8393,10697,14620,19558,14970,15193,5359,18189,12666,18192, +3310,18659,17358,7973,18673,19537,3404,9723,4221,16486, +7023,13648,16310,1049,1726,4799,15534,4366,17133,4192, +6219,5118,1804,2360,2279,14279,13740,4511,2361,12906, +16650,18590,4723,2001,16313,3594,21026,12146,19561,3800, +4161,16774,18892,17657,7025,892,7917,12245,3394,4813, +11902,3189,20002,2365,12964,18115,17660,20227,17182,11907, +11671,17562,17864,21131,13423,1361,12246,18897,14978,18848, +20727,5902,10726,21241,1906,13424,1408,20519,3038,18495, +20446,1431,17138,13464,14558,1221,6720,6137,17348,5268, +4448,11313,1760,6172,6870,5744,13541,3044,17701,14368, +16114,5051,9142,18776,5669,19089,11088,17867,925,10395, +4372,10578,2138,2554,18118,21087,13862,7461,14983,3322, +15305,11844,7924,8087,2542,20701,21772,2754,10490,8218, +14800,15869,14436,16119,1814,11543,17398,16069,19659,17020, +17844,5694,8833,16744,18925,4957,9812,6852,8036,12966, +14038,12145,16833,11165,17076,17756,3673,2367,20916,9143, +14927,6885,17486,7469,1661,2827,4627,18198,1307,19711, +17637,2595,2262,20807,1764,8150,18547,3192,9711,16262, +9144,2006,21629,5311,15743,14733,10991,15402,2916,17724, +12195,12622,5141,8039,15169,7780,4568,20835,21575,10580, +15022,9470,6853,3926,21563,1342,16745,8181,11526,1947, +7402,18641,14145,13149,19222,2468,12920,13916,21077,2968, +16438,19667,1768,15632,18374,4738,15517,16655,4309,2374, +14492,8602,3679,2103,1312,18681,6613,18604,20451,2755, +18218,19473,17854,20316,3003,4998,1391,20938,11169,7049, +18861,17577,18091,1937,4085,2059,20633,15948,1313,20138, +7785,16439,15081,20955,15117,17065,19924,13831,11913,20062, +7568,10703,3717,15480,6047,7790,16867,14223,12971,8429, +2008,2833,14026,1317,17493,19411,18551,15452,15257,18504, +4441,1769,7249,20128,5509,1970,9420,19365,20190,21617, +12202,15041,2871,19676,20388,21674,14258,2901,8058,5970, +20472,13257,18226,3694,17591,10279,1318,12409,7901,9794, +10416,10769,12876,17154,15455,19298,3970,21327,14228,13095, +8096,16072,21748,12581,9326,2311,5683,12641,3583,2184, +16464,6969,1795,6778,2880,15819,3433,7674,4713,17297, +8231,4333,9995,1841,5558,17155,17298,11283,18694,7946, +7311,13129,4753,21149,905,14010,18821,8532,11873,2190, +19006,3456,8874,7433,2841,7680,14143,20130,1993,1699, +976,15361,2736,2154,9202,11685,7951,12982,11008,16763, +11829,13327,11686,2299,9940,10507,8917,1277,19790,1636, +20143,21002,15011,19443,6026,13299,2455,9667,15612,16477, +10261,2811,2202,13674,14760,6818,9691,10624,20145,11940, +15524,18349,9437,11578,20132,17736,4121,4122,16023,2280, +4371,4373,7873,18307,14602,14695,13054,5410,6065,14389, +3979,1137,5411,6672,16311,11632,9829,19575,5901,15708, +12553,7165,18983,10860,13664,18242,10848,2049,8075,5579, +8083,10863,21136,5445,17851,19132,8597,18771,11054,14631, +10997,8292,8803,11246,4999,17559,11134,15369,5155,6407, +12054,4857,11265,12834,7322,15057,10937,15984,5544,8040, +13291,3961,5142,19101,869,9631,2009,11315,21404,3172, +14941,4204,7947,9997,16906,4035,4476,4477,8171,2818, +20725,4724,11453,20868,4725,4729,8565,5109,12490,8862, +5920,13737,2888,6930,12963,3223,6934,3395,16243,8397, +9475,4858,13515,3777,11266,10029,21028,1671,7765,7766, +14169,2221,5328,2907,8951,4225,4416,7770,3046,8014, +3975,10636,20236,19825,3248,8717,2140,2908,3249,9477, +4628,2225,12676,2909,21564,5167,1225,4186,13266,4017, +7471,7146,18214,6890,4195,16037,16688,5583,14497,7476, +3286,8566,2910,2862,2232,16038,10417,9492,12234,14190, +8793,5573,6486,20322,21455,9734,8317,10143,5781,7681, +5782,7500,7501,15466,7188,7511,7512,21003,2203,21693, +11350,9540,21212,18183,7918,8754,17511,20869,18899,21160, +11356,9315,8364,8798,18460,16189,17483,11415,8897,7771, +9917,8718,7926,5228,11270,2644,9269,19404,8719,8367, +13267,10400,1914,2157,8584,11171,3964,17881,16785,18951, +18052,16616,14500,9323,10418,12410,14661,6963,7570,7668, +13601,17386,18995,8437,4460,8346,15920,8318,3387,10734, +18057,18058,10525,9654,2390,13675,13603,20000,8106,1260, +10824,1426,5075,5076,18887,12175,8174,15558,5269,4304, +5380,3287,8156,5386,11605,8142,18768,7580,8641,6319, +13425,4478,13147,2019,8900,6331,19668,5756,6769,3381, +9009,9730,9735,15160,4036,8167,13489,17009,8667,18308, +13439,18112,11735,21667,14617,17010,16290,16291,17515,3368, +7050,14841,5636,16826,17573,7760,18493,13306,14312,2619, +17868,13609,8991,7038,4310,16881,14020,16422,20565,5941, +18174,3642,20346,12080,856,13144,18158,20908,10800,15630, +14340,15837,21707,4629,2060,19870,9632,3718,7902,994, +5762,18391,9647,2312,9199,9648,18281,18342,19911,5367, +9950,13834,13513,8771,9414,4057,21302,1963,1964,1967, +902,3349,14697,5602,1071,13959,14621,21428,7288,15079, +7039,16495,13949,3111,5580,13365,2615,4109,6202,11213, +10792,17918,21538,3226,18658,11985,6862,18734,2752,13232, +7838,1907,4252,6223,16703,11495,18037,3974,6301,5226, +8514,10487,5267,10892,12763,16706,7702,20003,2616,14457, +16083,16587,4296,14513,8355,12171,16590,10670,13651,3646, +14626,21132,15826,17015,18911,12792,12461,21545,17848,18912, +17396,3277,13516,5918,16115,12548,1673,4864,18438,6078, +5880,3263,16211,21784,1909,15296,17183,6884,12796,4417, +4299,17021,21137,14801,17484,8852,6512,15560,4300,17921, +5819,9342,15900,17742,19525,3869,11715,17703,12554,6040, +19865,10267,12549,10804,21670,6091,17277,9319,12531,9840, +1060,11215,10514,15170,4892,5904,14898,19534,5469,5470, +1128,5922,18937,7270,15971,17189,16263,9474,13382,2369, +20210,18177,3976,12767,3618,13236,10885,5397,15621,8770, +9830,9310,14121,21573,16634,19148,12803,4381,13051,956, +20237,3755,19551,15744,9169,16852,866,11893,21439,3680, +6197,17412,17324,16086,16747,16602,3834,5510,12770,12771, +3420,16198,21552,1421,3198,6097,18178,12772,20576,9831, +17200,19226,5584,20226,5822,10609,11641,3599,13550,15387, +5361,15481,952,3426,19731,20581,21103,2153,16223,19719, +20139,18533,11172,6356,20044,6584,6585,6954,21058,16397, +14150,17888,6618,4199,11775,9843,19732,14051,2564,13093, +18379,3377,12174,1968,19359,16350,19294,12243,1294,5362, +20214,6898,15645,18557,6146,13005,14084,19366,6272,17534, +10713,2104,5894,13900,16200,6964,12093,16692,12975,21496, +9358,16216,7314,15280,3056,14008,5363,11510,13001,1474, +997,9724,21709,20612,11383,15441,7715,2684,7622,8585, +15456,14192,872,17497,10281,17428,6338,6779,5831,11989, +17156,20245,2293,12512,3560,10705,6367,5040,15465,18663, +14003,7716,17498,6462,10721,13660,9327,17501,6973,9010, +17433,6024,10669,13098,2842,15393,3436,18133,4283,21749, +4461,2571,6707,1986,2900,3138,3434,19771,9090,16900, +12816,6022,9736,17830,6708,19167,18099,11781,14950,18337, +19249,3270,20404,21152,11875,6791,17596,7723,19933,884, +19376,8877,19687,12164,3544,17647,4150,3457,17648,12338, +19127,21715,11831,3635,9259,15329,6901,17127,18710,4191, +12352,21112,7195,7956,2300,18061,10887,15701,10319,6808, +1859,19445,11794,19170,6436,10969,6216,20594,9522,10157, +5898,11567,11326,18410,9674,10340,10229,11345,3447,2456, +12439,12340,17368,10889,17057,4224,8845,18285,2207,19263, +3872,9117,15331,17456,2995,6523,6919,21337,11803,17457, +1936,9533,2248,2161,9697,19072,10607,20163,15100,6199, +20287,7392,20107,21238,9225,11809,13650,10203,6717,19085, +11816,16035,8643,19823,8084,12359,20004,3059,6719,4253, +5838,15886,15982,5839,13638,13780,5840,15341,5842,19140, +6854,5923,10582,5843,2868,16398,19872,13534,8824,12598, +19879,19880,18208,16051,16004,16005,16039,10567,6783,19020, +10539,10550,18184,16018,15868,12573,10392,8863,8172,19697, +12845,12846,21424,3476,12833,17119,14167,11764,11357,7264, +20873,18048,18901,13220,4667,8756,16106,4705,1432,8009, +3665,7966,7128,2587,7967,12053,15477,13430,20832,5587, +15350,8076,18496,4801,10396,13339,5438,18013,1074,10032, +21247,4985,6322,20909,989,3323,12104,11235,7138,6138, +10512,3008,2621,19090,6306,4110,20541,4877,5674,18543, +4231,5748,2116,18465,17517,14702,1762,6233,3281,8548, +3479,6000,954,17677,17278,1186,4803,1097,18938,19207, +5954,17874,2917,13191,1374,4557,13610,19406,8518,7240, +3675,9306,8357,7882,20573,9913,6446,1915,8078,18661, +3600,18200,13551,15199,13252,16268,8298,10602,20739,8775, +2704,3928,15450,1948,2829,1375,8603,4214,18952,20841, +21403,12685,8299,11653,8726,9031,11701,7331,5169,19721, +4311,5546,9471,4548,18163,9032,972,14386,11607,15974, +2517,6540,1462,9789,5823,21324,1244,19595,10838,7744, +13909,18685,5360,21578,19596,6619,4318,18552,1268,3013, +10906,2309,16148,12551,4773,21079,7858,7887,6198,5174, +2935,8605,12479,9418,17729,6610,4093,16233,17928,17030, +7062,8871,19299,19417,8569,15122,14579,11123,16618,2526, +15997,13618,21060,9639,12203,1209,20185,4112,15728,16751, +20767,18053,20711,898,5381,18272,8607,16540,17592,10190, +5887,9300,2294,12204,1384,2426,10427,10374,11972,12978, +10920,11384,16040,14865,10301,1622,2072,20975,20512,8617, +3765,2439,20849,7172,5829,13045,7943,3700,3174,18392, +15307,20290,12928,16506,21383,13068,14230,14231,1088,12583, +8875,3942,4462,13626,4146,3217,3701,14505,4242,4245, +15413,3587,11432,4684,6631,15414,3271,18690,21282,7502, +1039,13032,13072,8748,19021,12316,3766,7551,18665,1852, +15419,9243,8322,6513,3492,13684,12987,18062,9260,16999, +906,18151,3529,13911,7957,9427,8940,10341,18286,15427, +16481,6514,10263,10264,13950,9675,9985,2208,18070,18291, +9406,1106,16240,14024,21355,18735,10727,21254,21358,6353, +9064,6357,17889,9070,14715,10820,4147,14718,18755,5496, +7582,4769,20373,1592,15166,13637,10033,3251,17753,17613, +11596,17130,19916,10850,4182,13264,11964,5447,12805,11003, +11047,2440,20269,5601,5209,15535,15370,18300,1406,6926, +20037,7229,1056,4359,3596,12118,8363,17518,3735,18497, +6573,8553,20360,1351,6662,4610,3780,18127,1363,1032, +16617,12536,16800,1037,7571,9731,4203,19993,7572,14677, +4715,6902,1527,10540,2376,3886,12847,8131,11926,2135, +17136,4517,7104,6221,3365,4816,8031,5875,16599,21029, +11997,5995,21069,20005,4807,2552,8400,21341,18361,11496, +17629,4669,4726,16292,4072,1075,21429,20521,11523,19918, +15958,17185,18913,4247,11358,1436,14370,4248,6080,17849, +4434,20728,11236,1173,4817,10034,21539,13666,14173,18439, +10741,21482,8275,13754,3952,7040,5056,17377,6456,8339, +5443,7327,7328,11738,20834,20673,17273,6182,5675,8491, +8847,18364,11314,9918,12150,4302,19527,18255,14375,14566, +5749,13543,15020,6234,17279,14316,2502,17574,10805,4827, +11443,8723,2979,2980,15870,17708,11546,19581,12503,11626, +20926,5924,21344,12472,16076,17280,16710,18256,16748,16841, +18260,19582,14989,9609,8190,21375,12628,17194,21440,3929, +10404,879,4249,10275,11146,3095,12550,8191,1949,10054, +17413,14766,12773,6692,5001,16647,16648,15405,4581,4582, +15709,11654,13552,8046,7979,12868,3756,17726,6421,16231, +9150,19109,21097,11614,5002,10583,973,9033,19149,18201, +8192,9622,3737,17195,6447,6480,3483,18605,11564,13964, +7294,15949,19734,16351,3689,13838,10941,3378,13918,13178, +6693,16657,12924,2936,11189,5005,7831,4086,18806,21080, +6620,11148,932,19228,17929,7745,16352,20747,13345,15635, +17584,16171,9790,10871,13670,14932,12361,16502,16199,3132, +6358,7791,1245,17817,15950,5715,21662,18558,19882,13796, +13901,10132,10944,12039,1026,10672,9002,13206,20689,19883, +7746,13800,11302,19235,15124,11752,15542,12085,9276,11609, +1235,12346,18996,19759,17966,10773,18749,8627,19370,11703, +5719,7905,21307,20246,5908,9361,20563,6426,6427,1034, +13922,10677,12423,5487,16758,13099,16174,20438,11193,17210, +17211,11392,9864,9712,6490,5723,3572,20852,17832,18753, +6482,16901,9011,13705,18396,2181,7625,10946,4534,4463, +17161,19022,6168,7724,4536,14680,15209,13033,9774,17945, +17649,11755,3943,19023,1971,907,11742,11832,10673,15800, +2738,7958,3028,19632,12437,13822,13876,11528,18236,15363, +19255,12988,19972,11154,1403,14431,17732,11711,4037,10186, +19849,9247,18411,10100,7696,11743,9249,17172,19264,14855, +6822,13579,11104,9538,10541,18292,21213,9251,8394,21477, +17662,14984,15342,19522,21318,15232,11216,3096,12869,18145, +11682,21506,9501,18022,1877,11517,11798,19265,10542,13830, +13303,7230,13858,18591,18772,8010,21395,21223,6229,14563, +18794,15793,14603,2503,13642,5375,17403,20364,3516,14419, +6659,11115,8804,1950,20141,19831,13343,6142,20637,7482, +11825,1770,6541,13226,14576,11826,7938,11847,20963,19677, +1247,8885,11827,8312,13229,6339,14584,11828,14425,16469, +17560,8886,6784,8533,19039,18830,1257,13187,2705,1258, +4762,10511,4124,12519,21303,4828,8724,7588,21305,18092, +14812,4131,3527,7762,4393,4394,14764,14280,11327,9907, +17242,17243,9046,16304,9904,10796,16305,16306,16307,18541, +4232,8998,21059,5110,5515,16061,5115,5116,17012,1390, +7844,15716,3798,14519,20669,17576,11649,16842,16843,10758, +10309,12474,15684,4631,17585,10500,2084,17597,8329,8391, +9883,8392,21237,17624,11692,16188,17134,9579,4288,3503, +6742,10206,13743,16775,5949,14364,2765,18725,19947,1157, +18592,981,16777,7768,4290,4670,16248,12907,12663,7839, +21769,21770,18498,8276,5161,18015,12501,9591,15773,13432, +4865,16137,12288,1030,8924,13433,12525,15774,10036,2589, +12463,2091,1185,15898,18016,1588,6083,8721,10649,4303, +4990,3826,10399,4363,4375,5057,13530,18786,11438,14567, +926,16386,6533,11113,9552,7139,3954,16387,19529,5502, +9919,18545,7610,4258,17519,1884,13639,4736,11585,9555, +19464,17281,13793,3517,14382,2504,15985,5349,5231,17082, +19141,19665,9307,8616,17234,13611,2695,15316,9955,6478, +8193,9151,11248,9034,9035,21671,5547,18164,5179,10584, +10585,10055,4187,20740,19151,3965,5926,20741,16440,12301, +7787,21672,8823,3930,19152,21490,20275,6621,19597,18474, +4742,13395,18475,15636,18862,20956,14654,4319,21271,8594, +10518,18318,10942,5932,6955,6586,15855,16795,19598,21579, +9193,8712,18267,18268,16447,21580,2121,15200,8679,13179, +12699,15998,4113,16882,16619,2010,15485,13801,7795,870, +10133,16801,13060,1368,3719,12950,19418,11778,3238,14580, +13968,15043,21588,7596,9858,8628,2233,3853,2076,3890, +15978,10302,20433,20434,998,2031,13447,13009,3175,21713, +3524,3525,16958,19760,12160,10221,17387,2085,1796,13182, +7626,18232,9328,20458,9866,9867,7890,4243,21738,7721, +8441,18574,7627,18575,8442,20405,19024,18023,11593,18705, +18706,18824,11788,17251,7074,17601,8707,5724,3710,1040, +21730,16369,13823,3530,10114,7818,19688,19975,19196,13859, +7823,9660,5732,10230,10231,19319,16937,8244,2209,19345, +8961,18287,11599,13580,2359,3159,10543,3729,3730,11805, +18293,18294,18354,8989,18295,8861,6605,7968,2341,9938, +8768,12561,12562,13406,20792,20522,18795,7897,15252,13598, +12240,4852,20087,3876,11763,4648,12010,20874,6409,3412, +3325,11359,4866,11367,18927,18928,12467,12835,8356,13863, +14839,14878,13123,20625,14523,13643,3336,5707,12475,20508, +7408,16232,3339,14148,12687,4061,6287,20780,17818,16400, +18969,1192,12480,3839,5382,12040,15543,11124,7309,15602, +6704,21044,14193,1623,5847,20247,11469,1193,8019,2236, +20985,6342,1492,1504,20496,11136,13073,2171,4685,11015, +1195,2739,11224,2793,7816,17258,9214,7318,1761,5147, +7112,15831,20270,5689,10886,13188,4163,18175,1124,7840, +21342,18140,3047,15899,18853,20918,15766,20919,17405,15986, +5754,8835,10998,19501,1885,1763,2547,9152,7051,15026, +14808,13284,19736,11210,15061,2064,17327,4633,8155,4327, +16448,10191,17124,15062,20964,1923,13258,8159,8160,10282, +19210,3348,10428,18997,2788,16006,14951,17645,11211,2313, +16759,4637,5691,8789,8878,1513,13034,9999,9884,10342, +7208,19346,17173,15845,19387,9539,15847,18074,3612,12524, +6721,11524,6722,4706,8251,18309,20183,18728,4413,14016, +4414,14663,3799,6402,16674,3664,7583,1095,14412,20469, +15536,4954,3649,2329,20674,18787,8365,14285,19827,8041, +3781,20470,7589,13024,12198,1463,14347,15407,7422,5256, +4428,1475,8794,7429,1682,17439,3437,5832,7552,6264, +11065,5836,16239,8476,7122,10397,6770,6771,18825,18826, +18836,19941,19942,16558,18365,19706,2556,3782,19419,12386, +2582,21425,16167,7028,21030,16314,3597,10037,4867,16320, +16834,16192,2543,20927,8042,3094,20798,3097,16984,7154, +20939,3065,21098,9153,17578,7857,7477,14656,7295,1595, +5007,16449,1210,16883,20750,12413,15649,3561,20754,1676, +2686,2387,18576,6792,10927,10271,17338,1280,13490,9371, +13717,3895,5069,13719,5093,18895,14619,16819,4457,19220, +11238,16588,16780,7029,17016,7841,16249,3061,19702,12664, +3190,15371,16092,12908,6842,17740,16318,17139,8623,8277, +18915,1238,11239,12128,8801,1174,11583,15810,5542,8283, +19457,3670,15969,19460,4821,17017,1437,19436,17979,3064, +1738,6656,18038,12251,14802,16835,15386,19400,11360,8772, +14633,17022,9344,6183,8902,11416,20884,17520,15767,3827, +6041,5750,12620,17485,14929,6328,13340,6723,2645,18788, +17743,5604,10010,2624,14282,13531,19953,12179,3554,6754, +17406,10801,19407,19828,12258,19955,19722,15988,7855,20577, +10011,6042,13150,15685,1916,12969,16845,10742,18954,6179, +2544,16786,9484,9295,3066,18955,9610,11603,4312,16788, +3098,3557,2322,10985,9623,5646,5641,12629,8777,15745, +10586,16868,8604,5796,11702,4142,5857,20398,19836,7885, +7161,9956,19723,6106,13553,15406,15689,11772,2981,6832, +17639,4282,15278,21613,7332,19412,3558,11608,20063,3840, +2970,13315,2065,1573,6835,21581,15637,1324,17930,16353, +5277,16450,1465,17931,6587,11173,19413,12806,14256,19110, +2421,10875,12840,8731,900,13156,18319,13919,21614,13998, +19229,13624,5383,20021,15132,12707,18560,15042,6665,7064, +5516,8313,2911,11704,17535,8570,20769,19420,2042,18131, +14446,1834,8586,17035,6859,19422,18507,9640,14053,15544, +19118,17896,15382,20067,11316,5407,3101,12414,11470,5848, +2665,1985,1980,1978,3176,11284,20476,15945,1035,14866, +5648,13627,20215,8161,9726,11995,15044,7944,19212,10523, +14260,16041,10744,12882,14352,13297,3707,20853,10283,8383, +12648,12643,19772,12491,9860,3115,19442,2687,20986,15946, +2474,12817,13449,12214,1335,13328,7628,2661,9737,12494, +9012,6786,2533,19214,19215,16992,16993,3438,15415,4244, +4177,15139,8454,2074,17434,4465,4714,9329,9362,17212, +11285,9868,16760,1987,8443,3139,17304,15442,14485,12280, +19025,17162,11876,3439,15443,8022,15032,6985,16515,6520, +13218,13213,8323,2043,8750,19256,19026,10001,14089,8534, +6504,908,18238,9098,17128,2669,19633,19217,3316,11048, +910,11016,4136,12731,11353,9205,10989,2740,21004,11955, +2792,18512,1860,21010,8942,8918,19446,4850,10158,11225, +2540,6809,2254,9248,6506,17972,13691,2256,7209,8336, +6524,14358,9808,11563,11076,15525,8477,21363,5186,19944, +5244,7323,3962,3835,1943,7276,20814,8973,20456,13010, +5259,7430,19761,18334,17044,20461,17050,17052,13492,6403, +6405,4289,14622,15676,10851,3752,14272,18796,18858,18320, +13367,9372,4512,13896,20126,20502,3797,19543,8815,5950, +14365,2095,16110,5497,16776,3566,13744,2096,12909,7265, +19564,1029,16825,20875,20905,3567,18301,8908,1583,8173, +16589,6347,19948,13234,14413,20763,20038,16250,11622,12542, +12543,1073,1020,20229,20006,1739,20880,11540,12559,18593, +20671,20312,18440,6068,11675,18672,2642,12253,7231,10952, +13434,2822,7233,20423,12100,11484,12910,16116,1125,3651, +8284,9079,12829,12861,6169,11818,5398,3221,2622,17521, +2054,6683,1109,20920,9081,4212,4213,11887,20702,5270, +7704,3956,11486,9920,20313,10367,3828,8407,9912,8256, +18196,17190,19661,16120,1820,5350,15671,2509,14122,8758, +10939,11888,8182,12193,7403,14178,13957,17523,2101,4770, +7655,8183,6886,15989,12544,20274,15038,18649,8414,16254, +1917,21752,18677,20375,10368,15058,16121,1188,16434,16294, +13198,14335,11249,10977,4962,3511,16649,8358,19962,21612, +15746,15973,1355,13958,21757,16656,12631,2512,14067,10572, +13292,5170,3655,6855,12688,14737,12872,10056,18202,20742, +9832,5590,11679,6891,18375,20766,1952,1731,15687,21643, +8751,12006,7737,11319,5333,10992,14052,12235,11944,7413, +20748,8118,7414,18273,11558,6209,12344,16354,13999,11761, +14657,21615,20712,18094,6624,1596,18476,6588,18321,21705, +17819,8705,7046,15690,9113,9121,2422,8120,15995,6694, +5325,2707,17426,17586,12922,2106,1289,18553,16355,3565, +16605,21616,5326,5451,13240,13802,13619,2711,15246,15234, +13803,12205,8685,18561,3522,20817,11914,9109,13419,17244, +7939,11219,4328,2922,14191,15318,20350,12042,9641,15545, +6359,20965,16202,17095,16606,13043,15730,20641,4329,11939, +13563,20368,16752,14349,8638,13804,13990,2234,15265,8122, +2685,2894,5849,4775,3702,12812,15070,9770,2475,2568, +5649,10429,10303,21619,5080,6428,20369,13046,15531,6487, +11516,7546,5720,19339,1004,20987,11782,10745,2253,8795, +2767,14353,16042,7675,2169,12884,1662,7594,18566,5458, +12885,6974,12417,9313,4151,17301,13910,5783,20142,19007, +17213,2477,11592,6276,5697,3272,11727,9998,20770,6709, +7682,7117,2025,15459,3406,1797,2375,8390,17435,1358, +4973,21451,16175,12569,13241,4148,6463,7683,15325,13131, +16643,7435,19378,11574,10380,21452,20254,12571,2992,6993, +3467,14090,13276,7756,8860,3388,17543,18699,1043,8324, +18700,4343,10993,11066,7118,15364,3531,9246,8267,18656, +13908,18715,18711,11688,6903,7819,1717,11833,5263,21005, +7817,9093,11343,7524,17550,9943,15396,1121,15086,10320, +10570,13706,21006,18513,9453,1932,14761,3157,11732,17259, +8542,9676,9130,6569,19320,10343,10265,12893,12894,12899, +9215,17174,19266,10930,2173,19321,3154,17554,14359,10645, +10933,11077,2580,20146,10544,15397,9698,3731,16207,3470, +7698,9252,9704,5767,5771,6957,18101,8654,18849,5096, +1140,12527,3715,8802,11271,16783,6092,2057,2828,5274, +17882,7710,2416,20634,4197,19671,1129,17883,4198,11776, +3738,4188,18970,8713,18381,6958,15960,17494,4200,18478, +17067,11280,873,874,3633,20715,14821,9870,13450,17754, +18870,7685,14235,7686,21462,19040,9775,1521,9528,17504, +17505,18011,12669,12677,8419,20377,20378,1147,19690,9221, +16487,14459,7291,7296,19678,7717,15962,4011,19137,12994, +13466,20429,21443,21447,21453,13211,9972,21463,2846,4106, +21215,7846,5998,12151,19461,11481,12678,12263,10127,4830, +4569,7982,20546,18863,14293,7483,4368,20996,4466,12391, +4467,20414,8881,15223,19646,7123,7156,6895,17513,15764, +15348,3667,17805,2222,18456,14564,11240,11241,16084,2931, +16740,1302,1158,7769,14460,6416,4564,5768,17920,4651, +13221,6324,18251,20273,4565,14437,8285,18467,1742,17981, +12528,20675,10041,6038,11368,1593,17872,6829,21627,14637, +4625,3870,16539,3924,878,1743,983,10210,8927,15794, +14574,6661,17923,8964,8848,7656,7929,20929,15903,6271, +5059,17362,5957,8521,17282,9030,21142,16846,14496,20578, +20579,5961,6045,16271,15748,21444,21722,21126,14210,11681, +16870,12775,20768,18971,961,16277,9958,2268,16325,17473, +4602,17975,18813,20068,6698,17857,11253,18643,19350,14773, +16456,13275,10876,11552,7423,18479,2937,18567,15281,12600, +7676,8573,5236,16622,2324,12813,6052,18393,9649,7183, +10986,20150,17598,6053,11393,3076,11708,20482,6787,5977, +17968,2874,9874,15444,8023,12418,9973,16994,19027,7189, +6675,3350,18695,18696,9655,15420,15927,17477,4639,14429, +20556,6027,19041,17388,17691,14198,7688,1278,8067,18405, +911,18712,13881,11019,9668,2434,8943,3863,3864,18635, +6920,10483,13827,10236,10646,10545,14163,15526,18355,21216, +19936,18904,6325,14734,2028,14470,20288,1984,17891,6772, +19191,13158,4664,12324,1141,10042,4606,13468,11921,15795, +9298,21708,11298,6609,16087,12635,19232,21586,16342,15928, +9305,9330,10237,12445,14794,15622,13718,1053,4209,3505, +9582,13370,8108,1407,2494,3042,13898,12854,19565,16680, +18079,4479,21541,13747,16113,3668,10797,2553,18905,5077, +5370,18773,7584,14171,16293,8133,10798,16977,19860,4621, +3922,17141,2932,14727,6475,17634,11859,2753,15018,19951, +7925,6942,10831,1438,984,4672,18918,4818,11541,6417, +18159,3988,17654,18530,4279,20540,20056,21718,14461,3671, +10325,15019,11542,17145,14990,16978,5598,4878,11369,18930, +18674,18679,14638,11766,1414,18789,11678,9105,6085,12036, +4480,21036,3332,3009,18518,4822,14731,14306,15021,14376, +11545,19408,20921,20314,3416,5467,12563,990,4879,1816, +4233,1400,20361,14991,21256,12130,14627,5599,2118,18599, +8149,10174,10898,9600,13786,20199,13996,19405,18087,12800, +20626,18797,17351,20707,9612,14076,8590,1730,13728,1115, +13729,1765,21485,2719,18941,3049,7472,21719,4379,4400, +19713,4440,5399,20394,9613,19097,18942,14643,4893,13865, +18798,8821,13311,14040,18042,4234,2918,11418,20093,11959, +19223,7782,10175,20449,18088,13977,20635,1287,15839,9083, +8048,1826,1356,13929,16855,9278,10177,4739,12632,16593, +8497,5125,15113,13389,19504,10268,12182,21359,3681,17925, +15994,20213,19535,1457,3622,5928,20813,13761,1314,7409, +6581,16272,11937,7244,15777,7157,17414,10492,8890,2079, +4675,15024,14993,4001,13223,19335,8195,9065,21441,2164, +16441,8049,9485,1732,17122,4802,15566,20941,9154,9720, +21415,9489,12807,1750,10589,3067,12973,12700,1958,2177, +20582,4613,12019,1206,6836,2519,20201,9633,19738,19739, +5551,5813,3967,5172,16326,3257,4489,2466,20454,12776, +19839,18322,19740,13535,18972,13732,12637,21417,4914,9159, +21645,21646,4658,2395,13272,11658,16278,10412,6019,7748, +2723,8257,8226,2520,21758,13002,18147,12304,21445,21499, +1690,12201,3903,2804,2269,10970,6448,7415,5716,17031, +3539,5774,3739,20815,13600,11483,4965,5335,12236,14225, +18807,14390,4216,5014,16457,16361,7297,21587,7347,18814, +16955,18388,18328,7348,19679,6110,16663,12369,1476,18535, +5825,17823,13967,18480,9122,18274,1353,6699,8975,7859, +8976,14937,4748,16173,7052,11471,10877,8831,6364,15860, +19611,19481,3070,17992,18505,20643,12370,18691,7796,18692, +14887,19602,16362,10915,15692,7058,7797,13854,6628,9380, +13564,17332,14606,15409,16542,14408,2779,12309,7300,18998, +20435,4929,11948,11127,5527,7497,15300,18609,14133,19889, +21557,11307,15133,7310,18568,7806,6674,5148,12929,10706, +19890,13809,14585,20820,16547,15861,13805,15490,20380,14943, +14506,8690,16890,5522,12644,5215,15238,12043,15547,5289, +2939,20652,11894,7070,5455,13011,12953,10921,17901,5184, +21420,16154,13096,18523,3721,7301,20976,3526,10222,14042, +16962,6975,9771,6788,19373,12983,5864,5087,5088,16043, +6488,14108,3179,12211,19513,7574,6431,6596,5784,11783, +19008,5199,8631,5725,5726,10747,20588,21351,9382,9302, +2427,3077,9502,17769,13277,14867,15892,5652,20250,15140, +9392,10377,9824,11135,10286,2347,15141,8693,1628,10435, +8123,20614,20325,14755,10748,11476,18525,15782,12212,21285, +14134,13572,7358,3078,6976,18233,18030,4423,18102,20856, +21710,3109,12603,14824,6489,9018,20659,14236,16908,2943, +3767,4430,11338,16764,13698,10016,10150,13104,17305,13956, +4494,20440,9353,20031,14892,4152,2480,15500,11009,15148, +8456,15421,6793,6986,11941,16176,11841,13935,15929,20295, +4689,13329,13672,6191,12935,5489,10184,9364,5200,16995, +14508,21558,14031,7083,3981,7995,7513,2845,3312,14758, +7555,10004,11581,19193,6801,14199,21731,17970,2484,5149, +8239,21734,19042,12606,4757,6738,3493,7196,15214,12496, +2537,2812,21294,6802,7084,7835,7303,14686,7436,13036, +3547,18872,1660,15033,14328,9661,19171,15580,15366,11155, +12734,16046,1734,6907,7202,12892,11690,11836,18759,5223, +7525,19218,11897,13288,18340,12735,11140,20559,5788,2945, +7000,8981,12517,3592,2794,5299,11156,19448,21012,6670, +12895,9430,9397,13995,10385,9669,3158,10527,11228,6814, +11979,10481,21007,5204,4039,19906,9677,4643,21465,15088, +9750,7602,2798,13302,21190,10348,18289,9683,21191,2458, +7824,4352,15099,6508,11800,19802,10238,9134,7646,17260, +5738,8268,17458,10103,19270,7384,19200,19492,19326,17341, +11884,1869,2211,9222,8270,14857,14362,21736,3113,13582, +13493,2022,8170,19809,10630,9701,3160,10546,3472,8481, +18296,9253,9228,21217,9411,9575,1108,11572,19816,10106, +5687,6517,12857,17808,2331,2825,12804,8582,18943,8415, +17025,17875,6069,9000,9273,8891,14905,862,17820,2629, +13239,8606,8893,8608,2873,5568,19113,19613,17429,18697, +16694,15460,7948,11973,6343,15695,6518,17833,12166,16996, +17502,17837,16910,9776,2847,19043,4350,19637,2994,6526, +1911,1912,8286,12915,2596,14082,2630,14086,21061,15203, +15204,9650,20251,19624,9656,5733,4287,20567,11361,11362, +18595,14464,17876,8421,12838,13390,15114,13269,18973,15961, +18686,1977,6837,3849,20653,20047,16543,2763,15696,7949, +14264,19168,3788,8162,9019,3165,3389,4080,7556,9803, +1719,4040,7378,7385,21257,13293,18956,14123,8704,13125, +18554,18129,6773,13628,6970,11974,6737,4103,18760,17463, +5637,10935,877,7830,12293,2197,10829,10830,12290,9911, +7237,13997,11460,16169,18089,4401,13794,17235,8221,13391, +4002,11963,12138,8227,4189,1392,14019,10878,14001,14749, +16184,6111,15323,14021,10479,11433,9507,15930,13816,20410, +14071,20411,11022,10386,3868,8398,12785,18461,11633,1712, +14377,12801,16847,13253,18205,3934,18508,20026,20762,1727, +3474,14876,9373,11693,4515,5741,1683,20271,11161,3776, +19946,2881,16244,4518,3320,16111,10794,13371,12447,12849, +16675,16676,16020,8132,20793,20876,12855,8011,8012,13939, +8490,6225,13589,1584,5137,21027,12072,8402,6390,11853, +17866,17869,20007,18302,3413,19454,6411,6881,11856,10893, +11109,2678,12073,1411,20877,12056,21372,20089,10122,20230, +4728,10953,20092,16118,9594,11089,18779,4425,15717,14926, +8925,8085,8177,18919,7234,21033,6746,1340,20232,21196, +19437,5466,6326,12178,3039,2590,15105,2462,14981,8217, +18039,14462,8404,4871,7106,5640,3414,19139,21089,18675, +6685,20127,2505,16388,6308,7465,14994,4376,17705,4881, +14075,20887,19205,16712,8657,10654,967,15679,11417,9442, +18739,11091,13545,12529,17465,17570,15107,8903,13152,8279, +12469,17744,20923,5676,11294,16683,13435,18931,8037,14521, +12239,2224,7927,9925,13383,16435,5925,10806,19465,1821, +3996,6240,18944,19334,9236,5943,9556,5331,9787,2951, +4771,18945,15905,9322,7242,2680,8090,15171,2467,12153, +17283,14440,9076,12453,5958,7977,11723,15972,17490,15872, +4259,16085,9614,14879,14995,9444,14880,4024,20015,6180, +17728,14711,2982,20493,8778,16273,16125,3931,16635,8196, +14343,9816,6833,15317,13154,3556,8372,5511,5858,5962, +21099,12232,6046,2264,12633,4546,2598,10405,8222,9445, +20611,12476,15747,19725,11655,10406,11118,8050,10058,10587, +13473,19726,11725,1619,6334,19837,9155,13254,12949,20890, +19184,1827,1343,19832,16603,13965,4583,19833,8711,7158, +14344,14079,12690,12343,16858,19835,13840,6589,7416,11927, +13397,15856,4743,16636,15639,16356,13868,2066,6099,18323, +6248,11097,10835,19230,18324,6210,14493,10943,20116,6845, +11533,5758,2653,4321,9791,12808,12809,10910,15727,3118, +16401,1969,6764,1831,17856,7060,7411,4788,18974,19208, +14577,7749,20638,15453,19603,1467,11277,14526,15975,14474, +19414,8228,3968,16054,7670,13398,15464,10220,6896,19874, +11559,1178,19508,13557,21347,9845,2178,17201,2956,6144, +21500,10759,19295,9119,4744,10277,16402,17092,19296,12506, +7940,5777,15282,19885,9727,18607,11004,21405,2527,15381, +3290,16203,5419,14055,20320,14581,10603,10688,16363,20117, +16802,16544,13006,20243,14529,871,20023,19114,15127,15290, +14530,863,12065,2837,16620,2011,11220,5286,6049,6673, +17036,3626,20966,19240,7798,5258,15176,7713,6775,19158, +5194,14849,2958,17495,19750,17782,6429,1478,1624,20977, +7595,8809,14451,14261,11128,1000,10375,6397,19441,2235, +4533,19372,5803,10762,13286,19619,7174,18171,2345,16989, +7175,10304,10223,7907,5850,3102,20854,5089,13030,7718, +3071,2961,16044,11996,15605,18664,16959,11129,15491,14262, +5975,9728,16204,2609,5113,12206,21572,8630,12187,20495, +2697,17902,6879,7499,18230,2902,9861,3185,15650,7549, +3103,19341,6258,17658,14820,5650,3104,9047,17903,20978, +12349,8444,7722,12508,3487,6789,7811,16761,12009,7075, +16410,15146,12956,17045,17046,15253,4178,11286,13955,15142, +20657,3105,18999,20988,16237,15394,18100,9013,18645,16007, +13982,6167,1505,2192,14780,12602,9969,16411,14095,14088, +2534,8099,6491,7629,9363,3218,6277,5938,20028,10192, +6278,4935,6054,6122,17214,7503,14197,17047,1038,10378, +11848,19634,10003,14486,3458,6599,20255,17604,19780,14681, +18024,10085,10782,21520,19379,6794,1994,9801,3768,18707, +6550,20660,10783,3407,19029,15210,12351,8325,15326,13215, +21459,11877,5833,7953,12165,14091,7085,16516,2810,15332, +15034,15884,14092,21234,9744,11102,14544,14825,11137,11849, +19312,19313,11017,7959,12732,7197,21716,16667,15553,19197, +19128,4133,3029,6904,13300,9261,8537,885,16413,1701, +5533,12941,19314,1702,9094,4642,2014,10888,7526,16478, +10666,20155,10454,9662,19447,18514,10384,15013,20997,19355, +4038,16334,6715,17614,12048,14432,1638,2200,11226,10159, +7375,14097,2539,5536,1706,6914,17311,10344,13242,13826, +9678,8070,17452,19323,15190,16484,6507,18047,21188,10232, +9181,4137,4537,6383,9182,14762,10097,19324,11103,7217, +9806,7528,19267,9986,19065,7382,2210,3359,13676,7450, +9216,4504,14870,19851,21470,4763,14360,9433,9217,3112, +13491,19388,12943,4452,8473,18429,19327,13983,20164,10547, +18419,9534,11105,14250,15398,3471,7699,2249,19329,6064, +21214,9266,9226,11577,16241,10551,18111,17265,18432,5152, +18436,19820,5668,17394,17395,6679,6203,21322,20357,17563, +2639,20109,12794,21034,4673,11860,16561,12560,18920,12254, +8580,12058,8581,12097,11457,9905,5670,17663,5671,5672, +1567,3282,17079,20734,21198,8710,20525,4882,1078,17571, +17572,10118,21411,12108,15354,18500,15887,14207,16389,6658, +21091,7657,17877,6186,13592,6579,17760,17761,17236,19142, +16686,21093,18548,14644,16345,15906,18043,20114,8583,17083, +17974,20736,12532,6727,5679,2381,6689,2412,6757,9927, +4902,8091,2382,12596,15840,21435,15874,5886,9299,14182, +17884,2650,13795,6355,16860,14740,6143,18051,8837,8422, +17415,16861,21360,8525,3682,17580,7053,16793,10493,18376, +8223,10013,9039,6857,16088,16871,3203,16719,6211,8304, +4966,16661,3068,4789,12481,13316,13966,16872,13317,17669, +18975,7618,19741,5182,12305,5517,16327,14475,5569,14290, +14291,11634,5336,16357,2424,6147,8993,21062,17068,6700, +4790,9796,17681,7671,1479,19233,21230,16458,16032,14211, +16885,11929,11930,2182,18227,8092,8097,10963,16505,20340, +7936,13322,13855,6591,4490,13402,15205,18481,9934,7752, +20216,5570,19990,11554,14664,9847,5456,15492,2357,4362, +1842,6667,17539,17041,16805,19992,6118,6149,16892,20027, +11515,14213,13323,18623,11130,9732,19304,16753,5408,18394, +13052,1494,1629,3079,10436,7359,10287,12213,15178,19011, +15893,8445,21592,6432,18822,20989,16509,10181,5978,11975, +13712,8098,9051,3163,20296,7366,16912,16913,19012,17503, +2668,6635,2240,18698,18103,18400,18104,13075,8536,3573, +4179,14399,7632,4690,14958,19781,9974,8100,14299,4691, +18105,9258,10947,15533,19030,8101,10987,8024,8025,19309, +19044,18025,9206,15383,1996,16919,13631,21622,9751,6739, +21208,10093,16371,19045,17549,20557,6803,3299,11934,1757, +13882,6156,18066,7961,2742,3549,18631,6157,9262,1641, +13824,9670,11406,13972,10528,9131,992,18071,8944,14917, +9891,9684,10349,8463,9900,18415,16939,17617,10239,18716, +1999,13688,19981,9263,3114,2702,5658,8338,2392,11075, +15527,9264,21218,9254,10107,19822,20533,20731,12109,2465, +16403,5936,8446,18652,21685,4404,2899,8671,20171,3850, +13012,19374,13037,12060,2338,7339,2893,19614,20341,1553, +1200,1843,2895,19515,4041,2471,11852,8109,15294,13748, +10790,4544,5162,18363,5246,1303,14992,19530,5248,11439, +3653,13599,13548,21566,10808,8760,12870,9490,12552,5173, +15593,1345,13558,2957,7254,4749,8686,8229,2786,17042, +1329,10661,7863,10679,14022,16510,9508,4153,15931,13105, +16920,9671,4042,9945,12024,12395,1866,16940,2714,16419, +13701,2715,1072,7105,2148,21426,5242,8645,1807,6302, +18190,19135,4458,21357,8910,21070,11455,12255,8219,18780, +17675,16139,10039,12256,11676,18596,19523,18040,3396,1811, +23007,23008,23009,23010,23011,23012,23013,23014,23015,23016, +23017,23018,23019,23020,23021,23022,23023,23024,23025,23026, +23027,23028,23029,23030,23031,23032,23033,23034,23035,23036, +23037,23038,23039,23040,23041,23042,23043,23044,23045,23046, +23047,23048,23049,23050,23051,23052,23053,23054,23055,23056, +23057,23058,23059,23060,23061,23062,23063,23064,23065,23066, +23067,23068,23069,23070,23071,23072,23073,23074,23075,23076, +23077,23078,23079,23080,23081,23082,23083,23084,23085,23086, +23087,23088,23089,23090,23091,23092,23093,23094,23095,23096, +23097,23098,23099,23100,23101,23102,11,34,37,328, +70,72,68,118,23934,6,66,74,330,75, +76,77,78,109,112,88,90,92,94,96, +98,100,102,114,115,104,106,131,132,133, +151,143,144,136,135,146,145,134,152,137, +165,142,140,167,124,147,148,158,155,154, +153,138,157,163,164,159,160,431,150,149, +339,338,327,79,80,443,18,323,321,322, +331,325,491,335,336,176,178,177,175,174, +169,168,171,170,332,185,189,183,187,334, +23103,23104,23105,23106,23107,23108,23109,23110,23111,23112, +23113,23114,23115,23116,23117,23118,23119,23120,23121,23122, +23123,23124,23125,23126,23127,23128,23129,23130,23131,23132, +23133,23134,23135,23136,23137,23138,23139,23140,23141,23142, +23143,23144,23145,23146,23147,23148,23149,23150,23151,23152, +23153,23154,23155,23156,23157,23158,23159,23160,23161,23162, +23163,23164,23165,23166,23167,23168,23169,23170,23171,23172, +23173,23174,23175,23176,23177,23178,23179,23180,23181,23182, +23183,23184,23185,23186,23187,23188,23189,23190,23191,23192, +23193,23194,23195,23196,23197,23198,345,352,359,366, +373,380,387,394,401,407,23679,23680,23681,23682, +23683,23684,344,351,358,365,372,379,386,393, +400,406,410,413,416,418,420,422,424,426, +428,430,343,350,357,364,371,378,385,392, +399,405,409,412,415,417,419,421,423,425, +427,429,342,349,356,363,370,377,384,391, +398,404,23685,23686,18727,4412,14015,14972,16730,10188, +12616,1048,8127,14553,23687,23688,346,353,360,367, +374,381,388,395,402,408,411,414,23689,23690, +23199,23200,23201,23202,23203,23204,23205,23206,23207,23208, +23209,23210,23211,23212,23213,23214,23215,23216,23217,23218, +23219,23220,23221,23222,23223,23224,23225,23226,23227,23228, +23229,23230,23231,23232,23233,23234,23235,23236,23237,23238, +23239,23240,23241,23242,23243,23244,23245,23246,23247,23248, +23249,23250,23251,23252,23253,23254,23255,23256,23257,23258, +23259,23260,23261,23262,23263,23264,23265,23266,23267,23268, +23269,23270,23271,23272,23273,23274,23275,23276,23277,23278, +23279,23280,23281,23282,23283,23284,23285,23286,23287,23288, +23289,23290,23291,23292,23293,23294,13,14,16,324, +20,22,1,24,27,30,121,32,3,36, +38,340,341,348,355,362,369,376,383,390, +397,40,43,126,128,130,45,47,432,439, +441,447,449,456,459,462,464,470,472,477, +481,487,492,498,500,502,504,506,509,520, +522,524,526,528,48,50,51,52,53,57, +433,440,442,448,450,457,460,463,465,471, +473,478,482,488,493,499,501,503,505,507, +510,521,523,525,527,529,60,62,64,69, +23295,23296,23297,23298,23299,23300,23301,23302,23303,23304, +23305,23306,23307,23308,23309,23310,23311,23312,23313,23314, +23315,23316,23317,23318,23319,23320,23321,23322,23323,23324, +23325,23326,23327,23328,23329,23330,23331,23332,23333,23334, +23335,23336,23337,23338,23339,23340,23341,23342,23343,23344, +23345,23346,23347,23348,23349,23350,23351,23352,23353,23354, +23355,23356,23357,23358,23359,23360,23361,23362,23363,23364, +23365,23366,23367,23368,23369,23370,23371,23372,23373,23374, +23375,23376,23377,23378,23379,23380,23381,23382,23383,23384, +23385,23386,23387,23388,23389,23390,645,647,649,651, +653,655,658,660,662,664,667,669,671,673, +675,677,680,682,684,686,688,690,692,694, +696,698,700,702,704,706,708,710,712,714, +716,718,720,722,724,726,728,730,732,734, +736,738,740,742,744,746,748,750,752,754, +756,758,760,762,764,766,768,770,772,774, +776,778,780,782,784,786,788,790,792,794, +796,798,800,802,804,806,808,810,812,23691, +23692,23693,23694,23695,23696,23697,23698,23699,23700,23701, +23391,23392,23393,23394,23395,23396,23397,23398,23399,23400, +23401,23402,23403,23404,23405,23406,23407,23408,23409,23410, +23411,23412,23413,23414,23415,23416,23417,23418,23419,23420, +23421,23422,23423,23424,23425,23426,23427,23428,23429,23430, +23431,23432,23433,23434,23435,23436,23437,23438,23439,23440, +23441,23442,23443,23444,23445,23446,23447,23448,23449,23450, +23451,23452,23453,23454,23455,23456,23457,23458,23459,23460, +23461,23462,23463,23464,23465,23466,23467,23468,23469,23470, +23471,23472,23473,23474,23475,23476,23477,23478,23479,23480, +23481,23482,23483,23484,23485,23486,644,646,648,650, +652,654,657,659,661,663,666,668,670,672, +674,676,679,681,683,685,687,689,691,693, +695,697,699,701,703,705,707,709,711,713, +715,717,719,721,723,725,727,729,731,733, +735,737,739,741,743,745,747,749,751,753, +755,757,759,761,763,765,767,769,771,773, +775,777,779,781,783,785,787,789,791,793, +795,797,799,801,803,805,807,809,811,656, +665,678,23702,23703,23704,23705,23706,23707,23708,23709, +23487,23488,23489,23490,23491,23492,23493,23494,23495,23496, +23497,23498,23499,23500,23501,23502,23503,23504,23505,23506, +23507,23508,23509,23510,23511,23512,23513,23514,23515,23516, +23517,23518,23519,23520,23521,23522,23523,23524,23525,23526, +23527,23528,23529,23530,23531,23532,23533,23534,23535,23536, +23537,23538,23539,23540,23541,23542,23543,23544,23545,23546, +23547,23548,23549,23550,23551,23552,23553,23554,23555,23556, +23557,23558,23559,23560,23561,23562,23563,23564,23565,23566, +23567,23568,23569,23570,23571,23572,23573,23574,23575,23576, +23577,23578,23579,23580,23581,23582,530,532,534,536, +538,540,542,544,546,548,550,552,554,556, +558,560,562,564,566,568,570,572,574,576, +23710,23711,23712,23713,23714,23715,23716,23717,531,533, +535,537,539,541,543,545,547,549,551,553, +555,557,559,561,563,565,567,569,571,573, +575,577,23718,23719,23720,23721,23722,23723,23724,25, +28,110,113,89,91,93,95,97,99,101, +103,23725,23726,105,107,61,65,8,23727,82, +87,23728,23729,23730,23731,23732,23733,23734,23735,23736, +23583,23584,23585,23586,23587,23588,23589,23590,23591,23592, +23593,23594,23595,23596,23597,23598,23599,23600,23601,23602, +23603,23604,23605,23606,23607,23608,23609,23610,23611,23612, +23613,23614,23615,23616,23617,23618,23619,23620,23621,23622, +23623,23624,23625,23626,23627,23628,23629,23630,23631,23632, +23633,23634,23635,23636,23637,23638,23639,23640,23641,23642, +23643,23644,23645,23646,23647,23648,23649,23650,23651,23652, +23653,23654,23655,23656,23657,23658,23659,23660,23661,23662, +23663,23664,23665,23666,23667,23668,23669,23670,23671,23672, +23673,23674,23675,23676,23677,23678,578,580,582,584, +586,588,590,592,594,596,598,600,602,604, +606,608,610,612,614,616,618,620,622,624, +626,628,630,632,634,636,638,640,642,23737, +23738,23739,23740,23741,23742,23743,23744,23745,23746,23747, +23748,23749,23750,23751,579,581,583,585,587,589, +591,593,595,597,599,601,603,605,607,609, +611,613,615,617,619,621,623,625,627,629, +631,633,635,637,639,641,643,23752,23753,23754, +23755,23756,23757,23758,23759,23760,23761,23762,23763,23764, +71,58,73,5,7,329,81,446,458,190, +184,186,188,123,139,141,156,161,162,166, +197,204,209,210,211,217,218,219,225,226, +227,233,234,235,245,246,247,256,257,258, +267,268,269,278,279,280,297,298,299,212, +220,236,228,300,301,302,303,307,309,311, +313,315,317,319,318,316,314,312,310,308, +304,320,305,306,172,173,179,180,181,182, +337,122,333,116,117,23765,23766,23767,23768,23769, +23770,23771,23772,23773,23774,23775,437,434,436,435, +455,451,454,452,469,466,468,467,497,494, +496,495,515,511,514,512,519,516,518,517, +513,453,438,23776,489,490,23777,461,23778,23779, +23780,23781,813,814,815,816,817,818,819,820, +821,822,823,824,825,826,827,828,829,830, +831,832,833,834,835,836,837,838,839,840, +841,842,843,844,845,846,847,848,849,23782, +23783,23784,23785,23786,23787,23788,23789,23790,23791,23792, +23793,23794,23795,23796,23797,23798,23799,23800,23801,23802, +347,354,361,368,375,382,389,396,403,20773, +484,474,486,445,475,483,444,476,479,480, +485,41,326,67,23803,508,21167,23804,4,23805, +23806,23807,23935,9,10,23936,23937,119,23938,23939, +83,84,85,86,54,55,56,31,33,35, +42,39,44,12,23,26,59,63,108,111, +15,21,29,120,2,125,129,127,49,17, +19,46,23808,23809,23810,23811,23812,23813,23814,23815, +23816,23817,23818,23819,23820,0,23821,23822,23823,23824, +23825,23826,23827,23828,23829,23830,23831,23832,23833,191, +192,198,199,193,194,200,201,195,196,202, +203,205,206,207,208,213,214,215,216,221, +222,223,224,229,230,231,232,237,238,239, +240,241,242,243,244,248,249,250,251,252, +253,254,255,259,260,261,262,263,264,265, +266,270,271,272,273,274,275,276,277,281, +282,283,284,285,286,287,288,289,290,291, +292,293,294,295,296,23834,23835,23836,23837,23838, +23839,23840,23841,23842,23843,23844,23845,23846,23847,23848, +8829,17231,6535,6086,20542,7042,18120,14179,15314,15901, +9317,10807,16850,17084,1310,20931,18257,14124,5959,7983, +12018,4587,17416,1130,12691,1620,19209,9156,7333,12998, +9036,18384,21630,20942,20743,18167,9930,2092,21583,5037, +4745,16637,19875,2869,16031,18206,17531,7250,1549,19478, +18563,15235,1836,11304,15065,10689,19887,3315,19763,14531, +6021,13003,18986,20644,2012,6025,10777,7575,11431,2185, +1002,5217,3180,1359,1506,1495,6633,1901,9970,17909, +15926,18626,14914,17436,14719,4149,7725,5316,8386,4033, +6795,8879,17252,17253,11834,1558,21785,21786,21787,21788, +21789,21790,21791,21792,21793,21794,21795,21796,21797,21798, +21799,21800,21801,21802,21803,21804,21805,21806,21807,21808, +21809,21810,21811,21812,21813,21814,21815,21816,21817,21818, +21819,21820,21821,21822,21823,21824,21825,21826,21827,21828, +21829,21830,21831,21832,21833,21834,21835,21836,21837,21838, +21839,21840,21841,21842,21843,21844,21845,21846,21847,21848, +21849,21850,21851,21852,21853,21854,21855,21856,21857,21858, +21859,21860,21861,21862,21863,21864,21865,21866,21867,21868, +21869,21870,21871,21872,21873,21874,21875,21876,21877,21878, +6905,11896,11018,9944,11594,5692,14720,10345,15311,17313, +11073,13677,11600,10627,17262,12754,8479,11208,21486,10333, +15102,13369,5048,9375,1054,6226,3669,2883,5098,19567, +12765,19568,2317,6231,16742,4819,7847,18193,10973,1202, +19952,8405,20040,8406,7324,3397,12430,12996,18932,951, +12470,4883,17960,3000,5431,7289,14307,3007,13669,14466, +14378,15344,21686,10176,1444,20623,7883,7706,7474,9616, +5680,17147,21094,18216,17786,18471,17853,15109,13192,19144, +18090,1242,17380,17085,5708,2681,17878,12154,9347,3452, +19224,16567,4261,2513,15633,16750,21879,21880,21881,21882, +21883,21884,21885,21886,21887,21888,21889,21890,21891,21892, +21893,21894,21895,21896,21897,21898,21899,21900,21901,21902, +21903,21904,21905,21906,21907,21908,21909,21910,21911,21912, +21913,21914,21915,21916,21917,21918,21919,21920,21921,21922, +21923,21924,21925,21926,21927,21928,21929,21930,21931,21932, +21933,21934,21935,21936,21937,21938,21939,21940,21941,21942, +21943,21944,21945,21946,21947,21948,21949,21950,21951,21952, +21953,21954,21955,21956,21957,21958,21959,21960,21961,21962, +21963,21964,21965,21966,21967,21968,21969,21970,21971,21972, +16716,2510,8526,10903,1315,15875,17286,2830,5964,17964, +18262,17987,17789,4903,16862,10059,9624,7886,15277,4741, +16257,3760,12433,20430,14083,11250,19742,9160,11251,14501, +16404,15749,2834,1377,2472,4330,2270,1378,10413,5626, +3784,1321,12999,21418,13200,4454,7888,4062,7860,6701, +19680,10917,2940,17937,15646,17682,3347,13842,11254,7350, +16459,13920,6592,17537,2863,7424,21326,2323,9797,13565, +4098,18168,6630,10141,14536,13811,15283,18569,16545,16756, +20654,7945,19306,10691,15548,10144,9651,9282,15761,13013, +3229,8438,20536,1694,14752,2296,21973,21974,21975,21976, +21977,21978,21979,21980,21981,21982,21983,21984,21985,21986, +21987,21988,21989,21990,21991,21992,21993,21994,21995,21996, +21997,21998,21999,22000,22001,22002,22003,22004,22005,22006, +22007,22008,22009,22010,22011,22012,22013,22014,22015,22016, +22017,22018,22019,22020,22021,22022,22023,22024,22025,22026, +22027,22028,22029,22030,22031,22032,22033,22034,22035,22036, +22037,22038,22039,22040,22041,22042,22043,22044,22045,22046, +22047,22048,22049,22050,22051,22052,22053,22054,22055,22056, +22057,22058,22059,22060,22061,22062,22063,22064,22065,22066, +9052,21308,3080,18756,12724,8021,20202,13409,1006,9772, +10979,19169,6464,16517,16723,3574,17793,20297,18106,13480, +3494,9975,9876,13330,15149,5727,8026,4496,7891,10151, +6988,6796,8027,912,20204,3459,7689,5816,15446,6804, +6553,14096,15216,15737,2813,19638,7962,10346,1705,14771, +21717,9211,17004,7203,17971,13927,16668,5090,9398,4043, +9679,21013,13850,9709,20158,13332,15702,5736,15188,9135, +10240,10350,9685,9265,19271,11078,17342,13335,5659,3552, +20166,6564,1812,1822,20848,9705,14696,17347,13055,1161, +12167,4566,3398,4797,11233,16212,22067,22068,22069,22070, +22071,22072,22073,22074,22075,22076,22077,22078,22079,22080, +22081,22082,22083,22084,22085,22086,22087,22088,22089,22090, +22091,22092,22093,22094,22095,22096,22097,22098,22099,22100, +22101,22102,22103,22104,22105,22106,22107,22108,22109,22110, +22111,22112,22113,22114,22115,22116,22117,22118,22119,22120, +22121,22122,22123,22124,22125,22126,22127,22128,22129,22130, +22131,22132,22133,22134,22135,22136,22137,22138,22139,22140, +22141,22142,22143,22144,22145,22146,22147,22148,22149,22150, +22151,22152,22153,22154,22155,22156,22157,22158,22159,22160, +6350,18790,1138,8373,2289,2560,10201,3484,11035,21378, +12482,1554,21148,10202,3018,19241,12814,17208,10305,3708, +11976,21309,10017,16765,3445,16627,19259,18343,15724,5934, +2291,13265,14383,2227,2228,13930,15091,14397,10393,4786, +20334,4856,12451,3878,13590,10995,1440,8146,15241,10123, +11440,20011,4884,5330,7849,4885,15720,11441,15587,7543, +16196,4895,11547,11444,11445,2058,15723,5061,1451,3266, +20943,10563,12032,18741,6481,19604,19605,11447,8527,18957, +10129,3842,6483,3455,21380,7592,2530,2325,16105,9393, +2111,10152,3859,10020,7559,2744,22161,22162,22163,22164, +22165,22166,22167,22168,22169,22170,22171,22172,22173,22174, +22175,22176,22177,22178,22179,22180,22181,22182,22183,22184, +22185,22186,22187,22188,22189,22190,22191,22192,22193,22194, +22195,22196,22197,22198,22199,22200,22201,22202,22203,22204, +22205,22206,22207,22208,22209,22210,22211,22212,22213,22214, +22215,22216,22217,22218,22219,22220,22221,22222,22223,22224, +22225,22226,22227,22228,22229,22230,22231,22232,22233,22234, +22235,22236,22237,22238,22239,22240,22241,22242,22243,22244, +22245,22246,22247,22248,22249,22250,22251,22252,22253,22254, +12354,3866,3867,7773,3417,14744,20979,11522,1412,5163, +21124,17120,17806,2446,18041,12674,17062,3191,1445,21628, +18004,20808,4436,20891,4630,8185,14183,11699,15601,15889, +7738,16442,6730,15388,2651,10960,8055,17418,15976,10812, +17419,15158,12565,4201,14713,18987,1369,20510,5627,10676, +9961,7166,15752,935,2656,1481,11255,4114,8681,18181, +3134,14449,21064,20980,19764,4751,18483,2428,15999,5830, +16571,6595,8842,19119,8448,16903,5616,19013,2896,6780, +11925,3722,20516,14453,3142,19031,21634,15089,14093,3815, +10313,10314,13216,4943,9879,13106,22255,22256,22257,22258, +22259,22260,22261,22262,22263,22264,22265,22266,22267,22268, +22269,22270,22271,22272,22273,22274,22275,22276,22277,22278, +22279,22280,22281,22282,22283,22284,22285,22286,22287,22288, +22289,22290,22291,22292,22293,22294,22295,22296,22297,22298, +22299,22300,22301,22302,22303,22304,22305,22306,22307,22308, +22309,22310,22311,22312,22313,22314,22315,22316,22317,22318, +22319,22320,22321,22322,22323,22324,22325,22326,22327,22328, +22329,22330,22331,22332,22333,22334,22335,22336,22337,22338, +22339,22340,22341,22342,22343,22344,22345,22346,22347,22348, +10154,9331,17220,4640,3390,19213,6155,17221,5617,16373, +11889,19795,16417,19383,9428,9663,14784,3446,10006,10007, +1681,7210,2577,18515,7757,20761,10891,9692,6922,9185, +7009,17978,19348,19201,19392,15399,3732,10647,10554,10555, +1775,1778,1079,4426,4427,13140,1389,20208,10861,11998, +3040,10047,11370,7043,12233,5191,4263,5968,1468,2727, +12976,875,17476,6055,6676,6056,20256,3188,6057,17480, +18701,6059,7691,916,17694,6671,9686,12406,6134,7731, +5119,12121,13399,13620,20323,5528,8503,8504,21150,20327, +20328,20443,4044,12766,19283,1286,852,851,860,861, +857,859,858,868,876,882,881,891,901,893, +896,941,928,924,955,966,974,965,970,969, +979,982,985,987,993,1005,1009,1023,1031,1033, +1042,1041,1058,1061,1052,1051,1055,1062,1047,1059, +1050,1076,1084,1093,1090,12005,1094,1105,1098,1096, +1111,1114,1112,1120,1113,1126,1127,1131,1145,1142, +1146,1139,1143,1144,1159,1160,1172,1175,1171,1183, +1170,1169,1176,1184,1187,1189,1199,1201,1197,1205, +1214,1203,1215,1204,1208,1223,1224,1220,1230,1780, +20526,6087,6094,1781,16266,19553,4527,4967,13400,3540, +10420,20432,9504,7908,17904,7356,12044,942,10339,17862, +21113,3495,947,5537,9687,5138,16340,12795,19913,15721, +17636,17023,4733,11245,11295,14640,20012,12031,4567,10866, +17275,14645,18444,20737,18600,14384,6887,3311,20680,8930, +8186,14441,10957,11371,21261,20628,14646,3832,11700,21568, +2356,1747,11093,10214,15909,3871,3683,11623,11299,17988, +20709,18472,11377,21078,11372,10912,13094,5969,6565,2548, +3240,8376,4264,10760,17289,16874,9077,14212,15753,5814, +16235,9473,14665,13324,9935,20751,1853,1236,1240,1243, +1239,1237,1262,1261,1273,1263,1270,1279,1285,1290, +1288,1284,1295,1323,1305,1297,1306,1308,1298,1301, +1319,1320,1311,1339,1350,1349,1357,1364,1365,1373, +1380,1387,1381,1393,1402,1405,1423,1417,1413,1496, +1483,1501,1429,1449,1443,1427,1433,1480,1430,1456, +1493,1428,1488,1511,1523,1519,1448,1563,1546,1550, +1568,1569,1590,1591,1580,1605,1606,1608,1598,1615, +1614,1630,1654,1666,1665,1672,1680,1687,1689,1700, +1691,1686,1713,1729,1728,1744,1735,1740,1746,1745, +9494,9172,15206,8380,12347,6839,10421,5195,21127,19620, +6840,10704,17125,17716,6705,5815,20118,2971,7351,10964, +6291,17939,15762,17905,4443,16666,5780,11053,16623,8812, +3489,2399,13325,11395,4702,20257,20518,19032,3789,8796, +11396,14893,3085,10290,2572,10750,5728,6600,14894,16921, +12586,14430,9909,2391,7518,18702,17913,11423,5785,7519, +18713,917,6810,7442,20560,10929,2758,14072,11842,18068, +18634,6910,11023,11157,12440,11158,9431,8945,17951,11159, +6923,10352,11028,10241,5660,10767,17006,15528,8622,21239, +13193,19743,14907,20244,8482,14416,1766,1758,1779,1791, +1798,1776,1785,1777,1829,1815,1835,1825,1844,1805, +1809,1828,1790,1845,1830,1810,1808,1898,1894,1897, +1896,1920,1904,1905,1908,1929,1919,1910,1931,1938, +1944,1940,1939,1941,1953,1956,1946,1951,1957,1959, +1972,1962,1975,1974,1976,1983,1991,2004,2007,2000, +2003,2021,2026,2027,2034,2029,2041,2052,2067,2051, +2050,2055,2083,2088,2105,2094,2119,2120,2117,2128, +2122,2127,2137,2142,2139,2145,2150,2152,2166,2165, +2186,2180,2175,2183,2229,2220,2230,2255,2261,2265, +6285,19332,21100,7690,20298,19940,1104,3897,12790,21542, +16782,20568,8817,5164,3370,8409,9603,4823,16562,4280, +8624,20888,7851,1685,4297,20569,15195,16213,7878,11373, +8187,19715,10638,16144,4306,11446,21225,11910,12454,10048, +12122,9378,1782,12534,19430,8931,8759,13555,21171,5682, +4313,12839,10408,16443,895,17287,18263,12184,9348,6244, +13270,16498,13091,2089,8761,13614,2252,9283,6212,19606, +17421,17093,1207,10269,19415,2371,2385,18385,14130,9067, +5518,2090,6449,10371,2437,11932,15030,21448,8763,18329, +21381,8779,2528,12708,21631,13294,2306,2285,2287,2278, +2286,2281,2305,2310,2318,2321,2319,2335,2328,2332, +2342,2346,2348,2340,2354,2355,2364,2373,2388,2384, +2378,2389,2394,2404,2407,2403,2417,2405,2406,2408, +2449,2445,2478,2447,2501,2536,2493,2495,2507,2521, +2518,2535,2498,2496,2545,2546,2550,2551,2569,2592, +2597,2585,2588,2584,2586,2625,2620,2618,2614,2640, +2648,2638,2646,2675,2676,2693,2694,2703,2709,2733, +2724,2735,2728,2726,2729,2716,2721,2756,2750,2760, +2766,2764,2791,2774,2796,2778,2785,2775,2772,2808, +9962,8501,1793,11256,7352,6148,13621,9465,19159,16754, +12709,10591,11591,13923,18276,3907,16152,19236,8734,16465, +14913,20655,4100,17099,3488,15648,11612,15732,12815,4175, +4752,13629,13069,10692,5387,15143,4269,10146,14954,15497, +6465,12273,8996,15734,17102,12649,9738,16511,20050,4115, +9114,12030,18577,21312,2195,12820,1008,12190,10193,10382, +8620,2903,2441,19121,9424,12390,12821,12822,3181,21599, +2993,10596,6994,14238,9332,20299,7520,17053,3911,3770, +1800,20104,13077,3608,9664,7521,16922,20497,13108,7443, +19791,21391,6128,8738,20260,9454,2803,2805,2851,2836, +2838,2819,2854,2859,2861,2872,2864,2867,2879,2882, +2890,2892,21361,2898,2444,2905,2912,2913,2920,2926, +2915,2933,2938,2963,2950,2954,2948,2974,2976,2983, +3001,3012,3021,3022,3019,3017,3014,3006,3037,3045, +3053,3043,3084,3069,2889,3058,3057,3093,3117,3123, +3141,3143,3130,3153,3164,3162,3177,3170,3171,3196, +3204,3205,3200,3207,3215,3220,3225,3231,3232,3228, +3255,3252,3260,3267,3274,3291,3295,3308,3309,3313, +3317,3318,3354,3329,3333,3319,3335,3342,3330,3344, +7820,2814,18717,13633,3496,18873,12281,12282,19642,12426, +12824,919,8701,7379,19796,13928,12125,3032,1861,18516, +10710,17224,8946,9400,9432,21017,9680,9688,4505,13636, +12126,19272,9693,10242,10243,11408,14858,5661,9223,1934, +18297,13775,19949,15295,10699,17566,18531,12671,1362,4125, +21071,21072,18737,14570,19531,20924,15776,4991,11114,15161, +10955,2151,10494,19666,16717,21262,5755,17086,20809,5232, +5233,14881,7934,14443,5062,9066,3684,15570,5552,5647, +21724,10070,10414,3520,20845,1469,2807,6702,19510,19115, +21507,6897,20646,19928,16720,17245,3331,3372,3367,3364, +3366,3373,3403,3399,3410,3427,3411,3422,3423,3415, +3421,3425,3451,3464,3465,3480,3481,3500,3518,3532, +3515,3513,3519,3512,3534,3545,3535,3541,3537,3562, +3555,3564,3579,3568,3569,3580,3589,3584,3582,3603, +3595,3606,3617,3619,3623,3613,3620,20383,3628,3650, +3648,3663,3693,3685,3674,3666,3677,3692,3723,3716, +3720,3740,3736,3734,3769,3751,3745,3746,3747,3750, +3757,3759,3758,3761,3786,3775,3790,3779,3774,3806, +3801,3802,3805,3821,3820,3854,3858,3824,3836,3848, +18482,20818,18748,10918,14938,3695,1326,20656,19424,7176, +5237,15494,14944,10707,15324,5018,17941,12725,19792,6989, +15008,2196,3441,5786,15217,9568,11879,11071,3533,9672, +19982,20829,20167,9459,13835,17581,15967,13720,21543,2115, +18921,17143,11714,13342,4709,6039,20013,20801,7974,20802, +19709,8836,1177,12259,11650,9619,19466,12260,1823,10049, +11716,21755,20810,8288,6872,15910,20945,6873,6101,19102, +21492,20946,13731,4075,21265,11871,5008,5212,20276,14882, +9068,5127,7987,15640,15996,18209,10599,10423,5555,21760, +21408,1211,6966,20967,9071,9466,3873,3880,3875,3881, +3887,3889,3906,3898,3894,3914,3918,3919,3941,3944, +3948,3957,3950,3955,3949,3958,3978,3987,3984,3990, +3994,3998,4005,3977,4020,4023,4029,4058,4025,4060, +4064,4063,4070,4078,4071,4073,4076,4069,4087,4090, +4101,4091,4092,4094,4111,4123,4119,4120,4145,4141, +4155,4143,4170,4162,4169,4166,4171,4196,4184,4181, +4193,4211,4219,4208,4240,4236,4226,4237,4235,4268, +4257,4267,4255,4273,4251,4256,4305,4286,4293,4326, +4316,4308,4360,4370,4369,4396,4395,4399,4398,4411, +12208,9994,21675,19752,10565,10566,18751,17043,1575,7177, +4930,1497,11949,7753,21065,21589,17827,2452,3542,9799, +21513,19773,17910,20990,5218,5529,13812,15211,13833,7190, +8632,1988,10980,21008,7178,10445,15095,6990,19343,16596, +13353,9102,19033,6642,13165,7119,17444,12587,7635,21421, +15934,21735,10508,15219,11881,14098,6811,13673,11957,19797, +12427,7211,16066,16597,2486,6911,8947,10510,1645,14100, +21422,9542,3161,18186,19547,14379,8015,18615,9318,18601, +1234,1748,16197,21202,7707,3803,16689,5712,2891,18619, +17422,2514,8807,3431,21449,17824,4418,4424,4437,4442, +4433,4432,4439,4449,4453,4469,4456,4459,4468,4492, +4481,4483,4499,4475,4485,4510,4514,4521,4522,4516, +4520,4519,4541,4542,4539,4556,4555,4553,4554,4560, +4561,4563,4575,4585,4578,4580,4576,4600,4608,4609, +4619,4624,4620,4622,4626,4650,4661,4647,4652,4646, +4649,4668,4680,4671,4701,4707,4704,4708,4711,4712, +4721,4731,4730,4750,4737,4747,4722,4732,4740,4772, +4768,4777,4780,4785,4784,4800,4806,4812,4843,4820, +4841,4860,4869,4924,4913,4880,4904,4854,4876,4870, +15094,5614,21419,16641,16205,18210,13326,18578,18579,15799, +2349,15735,3816,8326,9877,16914,16809,8957,2897,20531, +8894,8895,2485,3210,9880,20221,3168,13134,13333,4013, +20225,10266,13170,2820,14560,4986,12858,2826,6236,12675, +6016,14467,4654,11209,13505,21263,10050,10216,1767,1117, +15001,6249,8056,3810,18988,14815,8052,13509,12456,9505, +21320,2086,3575,3219,16224,8072,8612,8073,9377,12194, +2593,10802,21199,16252,7658,15162,13222,18161,21374,19867, +6002,2081,12295,18859,3932,14186,17088,21204,11505,5473, +13155,11275,1226,2061,12156,10060,4894,4901,4919,4912, +4853,4952,4951,4964,4959,4960,4956,4963,4968,4953, +4971,4994,5000,5034,5013,4989,5004,4980,4987,4978, +5016,4982,5006,4979,4983,4981,5015,4984,5045,5044, +5052,5070,5085,5078,5079,5081,5091,5092,5097,5103, +5104,5099,5123,5128,5120,5124,5150,5153,5156,5166, +5165,5160,5159,5158,5180,5181,5201,5187,5190,5198, +5188,5202,5213,5220,5219,5227,5250,5257,5255,5240, +5253,5251,5247,5254,5273,5279,5275,5281,5272,5283, +5313,5308,5309,5317,5319,5320,5332,5327,5329,5344, +11905,4905,4487,5126,4528,14605,10857,14651,13312,11276, +10656,5775,13442,2602,19111,18620,1422,9084,7665,15245, +13869,6960,6007,21081,9161,3454,2069,4838,16000,9495, +9286,8258,5628,7425,5935,15941,17098,20969,2522,15163, +21278,21761,15857,2070,5235,5112,8905,20024,11962,17475, +12547,9163,21648,12021,1499,5314,15358,5600,19556,7357, +20552,6398,20755,14154,21128,10431,9963,8529,4931,20324, +5486,12886,8530,2927,2073,21676,1875,17942,1555,15248, +17248,12492,17686,6371,14539,19939,2941,10524,16696,3945, +14915,7077,7800,17687,10967,4535,5348,5352,5354,5364, +5369,5368,5376,5379,5371,5378,5366,5374,5365,5394, +5395,5396,5404,5403,5415,5412,5414,5429,5428,5442, +5439,5441,5446,5481,5474,5462,5485,5461,5465,5464, +5463,5524,5495,5513,5504,5500,5501,5543,5545,5541, +5553,5564,5563,5582,5585,5589,5594,5596,5597,5603, +5612,5605,5607,5608,5606,5629,5625,5663,5642,5657, +5639,5667,5688,5695,5717,5702,5699,5711,5698,5701, +5706,5742,5753,5746,5751,5773,5769,5779,5772,5765, +5799,5800,5812,5828,5821,5841,5856,5868,5872,5879, +2875,4754,21288,6262,13163,13350,11202,12984,5488,14588, +20032,6124,15501,19974,2713,13971,20758,11789,12986,17478, +5388,12086,4067,21460,2789,14159,21289,13016,10227,7367, +1927,6805,1515,3634,3086,18237,14110,3166,12318,12404, +19798,16045,20258,14160,5787,18832,6434,2241,8813,12497, +20219,6995,10307,2075,11731,15268,3167,3793,15269,9383, +9810,17445,1862,11141,14161,3497,9885,3392,4975,7444, +11287,9022,3357,7639,15249,9333,17453,10460,14689,20135, +12781,12023,12736,12321,5133,8333,10461,10455,18288,3461, +14012,21296,5424,12896,9758,14690,5883,5882,5884,5893, +5890,5892,5891,5906,5910,5916,5933,5915,5929,5931, +5917,5944,5942,5983,5982,5956,5953,5981,5955,5963, +5951,5948,5993,5999,6003,6029,6028,6023,6018,6035, +6034,6044,6036,6043,6067,6070,6096,6102,6093,6074, +6079,6076,6075,6100,6114,6089,6081,6098,6151,6150, +6152,6139,6166,6165,6170,6173,6174,6176,6178,6177, +6190,6192,6184,6204,6205,6207,6239,6247,6235,6224, +6220,6222,6286,6284,6288,6300,6305,6310,6303,6321, +6318,6323,6366,6352,6363,6351,6373,6349,6372,6360, +9218,9024,19647,19977,6031,20667,15367,15704,11801,2745, +18839,12746,15615,21338,21157,4472,14789,21156,12944,21473, +15617,10469,10353,7389,16187,19328,19812,9187,10246,13171, +9764,9227,12904,19984,21054,13495,9765,1566,4108,21702, +9543,14550,10632,19331,19986,21475,19821,4482,14371,20570, +14380,11917,6088,11647,3227,20507,12863,20374,1418,1163, +16789,14125,8625,13837,1419,15197,19145,20574,11094,15377, +6420,5107,8294,11378,21145,2563,15115,6250,15913,2062, +9960,21348,1118,9312,4384,13443,6107,17294,4920,9561, +19968,10432,8232,12716,1132,20479,6348,6391,6393,6410, +6401,6412,6404,6444,6455,6454,6461,6460,6476,6474, +6473,6477,6501,6499,6498,6500,6511,6516,6531,6537, +6530,6566,6576,6580,6575,6590,6593,6582,6578,6574, +6570,6607,6611,6617,6641,6639,6644,6612,6614,6623, +6629,6660,6664,6657,6663,6678,6684,6696,6713,6682, +6731,6718,6774,6735,6785,6741,6763,6760,6758,6761, +6744,6756,6743,6745,6752,6749,6830,6828,6831,6846, +6843,6856,6867,6871,6875,6874,6888,6882,6894,6906, +6883,6892,6929,6935,6952,6936,6965,6978,6949,6971, +5865,6450,14029,15498,1577,11182,21633,7505,9509,17606, +4847,11952,1336,5531,17783,7259,21352,15505,14032,4717, +7598,11340,14033,14034,11956,2670,9826,8882,1880,6558, +14787,7212,17314,16048,11806,9689,21783,3638,11807,15809, +9267,14923,8111,5372,20764,8113,19524,7143,2143,21139, +18085,19938,6237,19549,5249,16253,13755,16564,13384,11502, +21487,15959,11862,4804,7147,14736,2952,12261,20708,14126, +6241,20892,7045,4656,20016,13758,3402,7884,4570,3193, +8138,20094,1064,4831,20948,12639,2710,6245,20095,17027, +4906,17582,14388,1788,21266,13507,6938,6932,6944,6987, +6928,6941,6947,6953,6961,7026,7033,7057,7069,7092, +7061,7024,7041,7047,7030,7032,7063,7031,7108,7101, +7109,7102,7168,7131,7187,7136,7126,7159,7135,7155, +7142,7153,7152,7124,7125,7140,7130,7134,7129,7148, +7127,7257,7236,7228,7232,7241,7227,7268,7278,7292, +7287,7293,7307,7312,7304,7306,7305,7308,7320,7330, +7319,7317,7334,7321,7349,7329,7325,7326,7316,7341, +7401,7410,7400,7432,7418,7397,7404,7426,7399,7407, +7406,7467,7498,7494,7491,7468,7458,7495,7504,7459, +10061,21267,14318,5144,18503,4907,16147,20682,3340,2831, +14524,21042,17196,21688,8079,1179,13475,11379,14809,21720, +8933,7984,13763,6008,17588,7792,21174,2725,5592,1119, +8431,8934,6362,3051,6542,5337,15540,17532,8840,7666, +13560,5071,10657,17991,1366,17290,4915,5318,15914,13798, +15804,19112,9419,17589,8377,5063,3843,15940,14934,7591, +17353,6765,8432,7427,8381,2570,16607,20713,10498,2523, +13403,14750,1198,15942,17427,6544,13180,5355,17781,15647, +17792,17538,6255,17038,4921,15841,15186,4130,9072,4839, +7991,6424,20819,18270,8095,4776,7470,7475,7464,7463, +7478,7486,7473,7462,7548,7539,7540,7542,7538,7561, +7569,7567,7566,7565,7581,7593,7585,7631,7616,7634, +7617,7615,7606,7607,7611,7614,7609,8468,7663,7662, +7660,7650,7661,7652,7648,7654,7687,7653,7667,7711, +7719,7708,7709,7701,7712,7747,7736,7735,7739,7751, +7733,7805,7767,7763,8220,7772,7788,7799,7808,7777, +7778,7832,7829,7842,7867,7843,7848,7854,7837,7850, +7853,7845,7869,7889,7871,7874,7870,7876,7894,7898, +7904,7895,7903,7923,7942,7930,7941,7922,7932,7931, +7167,17898,13734,21590,2398,4220,9652,10521,9822,2734, +13594,14319,12717,21406,12719,16283,12980,17299,14717,16407, +15572,16284,5175,16330,1371,21384,1955,5866,3206,10592, +10180,12779,20457,1500,2988,10080,11150,12647,13160,15733, +21591,5804,21649,16894,21514,17730,9835,7909,4590,13931, +11258,19765,21620,4491,10522,17906,19242,14284,12720,17911, +17335,7360,8735,17302,13924,11151,6979,4102,2699,3709, +11259,10841,19892,17599,1253,14955,13351,1556,6568,5340, +3082,11178,16512,5021,16470,15956,5421,11203,17544,9800, +21593,1601,5807,19122,15651,5574,7919,7920,7975,7992, +7972,7989,7986,7996,7969,7980,7993,7990,7971,8005, +8030,8017,8016,8064,8060,8054,8068,8034,8043,8059, +8051,8044,8032,8088,8093,8119,8110,8107,8135,8137, +8128,8134,8126,8139,8152,8153,8143,8144,8157,8145, +8154,8147,8213,8176,8178,8184,8175,8180,8224,8216, +8250,8254,8253,8252,8315,8278,8301,8273,8282,8303, +8320,8311,8290,8272,8300,8287,8293,8341,8345,8340, +8366,8374,8354,8370,8389,8478,8401,8418,8413,8458, +8412,8396,8399,8410,8489,8499,8494,8487,8488,8519, +20998,20073,2479,2194,3351,17103,19893,21621,17834,14484, +16366,5341,14114,19310,7954,19034,21386,11709,1194,5530, +12046,21153,7368,3004,13574,14868,20076,17105,3182,7191, +13817,15551,5027,20033,20693,5221,13907,6376,20131,15608, +17306,15147,20694,21635,15552,6668,1960,1516,4779,3144, +9516,15270,18339,17000,21637,9395,21332,12989,10785,20858, +10509,11400,12392,9745,18000,21623,6996,14200,15220,10526, +1372,18758,14058,11323,13047,6848,17166,7198,14144,17799, +13663,18001,15224,13080,20301,21765,20826,14241,14035,9981, +19799,4501,9886,2337,21741,7527,8515,8528,8522,8516, +8524,8545,8544,8546,10204,8552,8554,8571,8559,8567, +8589,8593,8591,8598,8600,8614,8626,8629,8633,8637, +8644,8639,8647,8655,8656,8659,8664,8668,8669,8670, +8680,8695,8692,8673,8702,8703,8708,8714,8715,8716, +8720,8725,8741,8745,8743,8744,8757,8755,8773,8786, +8785,8787,8790,8797,8800,8805,8819,8820,8826,8830, +8843,8832,8841,8846,8853,8855,8857,8856,8864,8872, +8866,8865,8884,8892,8896,8904,8909,8929,8926,8932, +8923,8922,8950,8954,8952,8955,8971,8963,8977,8992, +13709,2243,13936,17800,6812,6495,21698,16928,13049,20034, +3300,14487,6815,7213,14099,7445,7562,6559,13081,3089, +7868,7694,1531,2204,19057,11885,15225,19058,14141,13884, +7218,1708,12959,9219,12590,18072,12747,12225,18637,11409, +9457,17555,21701,8948,19449,17915,9401,17176,2212,7697, +10354,2213,19276,1945,13689,17180,21712,21703,10667,17007, +9255,9412,9809,6227,13749,21244,20700,3829,17026,19231, +15568,20065,17291,3173,17568,4808,4809,12626,1789,12483, +17382,20548,5176,19250,5654,21742,15425,2017,12825,16628, +19268,9402,15432,10355,14973,5154,9008,9004,9005,9028, +9029,9062,9075,9080,9078,9089,9088,9103,9104,9115, +9124,9120,9127,9106,9148,9141,9173,9196,9192,9191, +9190,9204,9195,9188,9200,9198,9237,9235,9244,9238, +9256,9257,9279,9281,9274,9277,9270,9296,9308,9311, +9314,9316,9340,9341,9343,9360,9357,9356,9379,9369, +9388,9396,9425,9422,9446,9426,9417,9451,9440,9443, +9441,9463,9464,9469,9476,9478,9486,9514,9515,9479, +9480,9493,9558,9549,9550,9566,9547,9482,9605,9581, +9611,9583,9578,9585,9618,9577,9584,9630,9590,9598, +13649,14373,5471,21226,8188,10999,11247,5591,15642,8378, +4916,14394,5593,21450,19753,962,4444,14945,10708,10182, +1101,4446,2350,16518,1507,7199,2690,10185,8387,11142, +20561,10621,12322,7014,7020,10548,11086,3283,18469,19502, +19500,4676,1065,18521,5506,12997,20172,5189,18958,21268, +18808,13799,13645,13044,6545,17295,18990,18509,13014,12933, +19625,5342,19899,4502,14203,4694,14204,9780,11891,13053, +5405,2682,4657,6242,2647,3194,4908,17089,12172,9107, +12264,10189,20949,13476,16951,17533,16878,8706,6767,6695, +17423,14153,6256,7547,3543,14155,9634,9580,9626,9588, +9597,9576,9503,9553,9710,9721,9718,9714,9757,9725, +9716,9717,9715,9766,9768,9793,9786,9785,9783,9819, +9813,9815,9820,9811,9828,9842,9846,9844,9839,9841, +9869,9855,9856,9854,9875,9857,9853,9352,9902,9908, +9881,9859,9906,9914,9933,9926,9915,9929,9959,9952, +9979,9977,9953,9951,9988,9957,9996,10012,10009,10027, +10044,10067,10078,10079,10051,10028,10063,10046,10030,10052, +10035,10112,10116,10115,10119,10128,10140,10130,10138,10126, +10121,10145,10125,10173,10187,10205,10218,10207,10217,10226, +2662,17943,2667,21594,16297,6710,6295,6153,12393,9746, +13485,1012,9982,12173,13135,1014,6816,17952,3550,9339, +5432,5435,5433,3833,13915,4377,4084,15836,12265,2599, +13519,7246,8295,2780,10600,7071,20259,10291,7001,9365, +6915,19450,6509,18906,13195,20018,3371,6243,20837,20838, +20683,2383,20745,19505,16215,15770,4385,18207,15813,14106, +6050,14504,9936,7994,1424,3660,5851,16572,17907,12484, +3072,3908,3909,15864,8264,3083,8956,9739,9740,16624, +9016,9747,9752,3087,14478,15045,15843,9023,11795,20859, +3393,11837,13142,7531,15844,15846,10219,10258,10260,10257, +10280,10273,10300,10306,10310,10308,10323,10321,10335,10322, +10327,10369,10365,10366,10372,10466,10422,10316,10425,10401, +10411,10444,10415,10398,10394,10434,10474,10486,10496,10488, +10491,10505,10497,10499,10515,10519,10513,10516,10419,10517, +10531,10532,10530,10536,10557,10558,10561,10562,10571,10579, +10574,10573,10576,10577,10601,10612,10620,10608,10613,10616, +10617,10618,10640,10658,10650,10653,10651,10671,10675,10684, +10685,10686,10682,10701,10714,10712,10715,10718,10728,10729, +10725,10730,10749,10746,10743,10761,10780,10768,10775,10776, +10247,20545,14996,15128,20554,18888,13372,8740,2045,5245, +3614,6572,2617,13750,13891,19917,2099,5919,4674,12129, +12074,19459,13652,16591,12673,12291,16831,16832,8742,3830, +1446,1080,1817,13469,15722,21544,4607,20803,11696,12180, +21570,4824,17192,11442,13437,8674,2623,18443,12075,2557, +17745,4380,6188,21571,5709,2511,15796,3195,10900,17524, +17525,10731,17526,11815,16604,16594,17764,8053,19506,6181, +9931,14184,15876,10904,2955,14444,7274,15592,8343,7054, +17763,17666,16126,2515,16070,4003,11606,12332,5512,9461, +20509,15201,7750,9833,14872,1621,10770,10795,10803,10799, +10994,10793,10817,10825,10833,10840,10827,10828,10856,10849, +10864,10865,10872,10881,10867,10890,10896,10895,10902,10922, +10926,10916,10894,10899,10907,10945,10936,10938,10954,10959, +10951,10958,10971,10983,10990,11001,11036,11021,11005,11037, +11034,11046,11045,11096,11064,11072,11067,11057,11060,11055, +11085,11116,11112,11111,11132,11117,11121,11149,11145,11147, +11170,11162,11166,11168,11175,11181,11188,11190,11191,11204, +11198,11200,11207,11206,11221,11217,11234,11268,11264,11274, +11273,11272,11292,11311,11293,11300,11291,11318,11321,11325, +10590,12368,5874,13561,2924,3428,11628,11514,13764,14445, +2985,8199,3969,12308,5846,16664,10919,13921,4173,2657, +10615,11988,3696,936,11611,14847,20069,21063,13843,16001, +16461,7672,7255,4099,1482,2292,12954,16218,14714,15495, +15134,21382,19001,9862,7072,12312,17540,10502,11977,2297, +10437,5853,12078,2853,7577,4844,21310,10438,7630,19353, +10480,18031,2077,15932,11710,9878,3209,5729,17440,15598, +4497,20857,7633,6344,3208,18724,17336,15189,4716,21295, +3409,8880,11880,8459,2848,8361,9129,9777,16103,12737, +3213,1720,18067,11618,16669,20188,11331,11346,11332,11333, +11339,11336,11349,11352,11355,11376,11391,11401,11364,11386, +11385,11366,11420,11413,11428,11437,11435,11434,11436,11429, +11467,11475,11468,11464,11474,11450,11452,11472,11458,11479, +11485,11491,11621,11501,11494,11499,11497,11521,11518,11519, +11531,11529,11544,11539,11549,11568,11584,11604,11602,11613, +11615,11625,11627,11493,11635,11636,11642,11665,11648,11646, +11643,11674,11673,11698,11707,11697,11705,18231,11712,11713, +11729,11728,11724,11737,11741,11744,11747,11758,11760,11769, +11799,11771,11786,11787,11768,11817,11823,11822,11830,11819, +17312,1642,17733,9056,9132,18239,10351,6921,20098,10644, +13496,20189,10549,11670,20099,12859,16654,5696,9980,5693, +7647,7162,5193,2761,11152,11790,5278,7488,3845,20816, +17766,15359,17271,2100,13616,19682,17688,8265,8163,17671, +14339,8136,15389,14673,15458,12611,12612,5631,6496,15763, +17100,3507,4484,12000,15378,4486,2866,10331,10066,17090, +13319,12084,8849,4922,20217,4778,9497,19616,9287,15880, +1846,11740,8205,6638,21595,1602,11477,3857,3983,1216, +2110,19035,2015,10292,3355,18032,18632,3577,3462,13039, +10387,18874,7091,7532,6916,12748,11821,11845,11851,11855, +11861,11858,11870,11869,11866,11886,11901,11908,11912,11915, +11928,11924,11923,11936,11954,11958,11942,11961,11968,11971, +11969,11992,11986,11987,11994,12001,11999,12004,12011,12012, +12007,12014,12017,12020,12016,12027,12026,12034,12033,12037, +12045,12061,12062,12055,12059,12071,12081,12083,12094,12098, +12099,12103,12102,12107,12110,12117,12119,12127,12131,12137, +12141,12139,12135,12155,12148,12147,12163,12168,12181,12177, +12183,12215,12199,12209,12200,12207,12217,12218,12192,12210, +12231,12237,12250,12257,12284,12247,12252,12272,12306,12292, +10389,10356,2216,14861,7370,12455,18412,18428,2040,9374, +15833,15771,7605,12191,18896,2097,11144,5094,19700,6408, +21561,6750,15167,20902,16093,16427,12791,16560,13721,4862, +21245,6445,8403,7133,1021,2773,10862,13776,5996,19136, +19498,18907,13139,12331,3672,3616,9596,19429,1304,18852, +21250,11677,1813,1741,17779,18597,17144,6232,20347,3923, +3823,11765,6327,10897,14463,5565,1441,16492,4875,21479, +20882,7144,3063,11749,18017,5271,9604,13789,2155,2410, +19710,6011,21562,9922,16714,4185,5705,3048,5444,5677, +7613,19579,21484,4438,10819,21073,12299,12307,12294,12285, +12327,12333,12350,12341,12355,12363,12360,12358,12381,12389, +12387,12399,12408,12416,12419,12425,12435,12431,12443,12449, +12450,12462,12464,12477,12458,12460,12473,12459,12466,12500, +12502,12505,12511,12533,12539,12526,12535,12540,12558,12566, +12555,12575,12578,12576,12580,12594,12592,12593,12597,12595, +12601,12614,12613,12636,12638,12624,12630,12619,12615,12623, +12646,12621,12618,12667,12701,12668,12670,12692,12686,12680, +12660,12715,12672,12659,12698,12769,12760,12756,12758,12762, +12797,12798,12818,12783,12787,12788,12789,12793,12784,12827, +12856,21200,6536,4825,5058,3284,2878,7976,4378,968, +13088,2594,12471,7879,9345,14805,21343,3285,2056,19580, +4074,16436,9481,3997,4829,13730,19146,1918,20042,15173, +2506,2413,16715,1674,16851,5353,21264,11375,21346,21756, +16122,13385,15256,2414,12196,11000,17725,7978,2370,8495, +18259,3253,5960,3254,7272,16315,19468,11863,14289,17284, +16601,7783,11548,11461,16026,11637,10818,3050,3686,13470, +3933,21644,9108,10409,16499,11773,9037,12577,20115,5211, +5860,10588,2722,2921,20453,10978,9487,1266,13237,8359, +13196,3656,7740,7900,13092,15355,12836,12837,12862,12848, +12860,12867,12842,12851,12878,12843,12873,12919,12937,12917, +12918,12912,12932,12952,12947,12957,12970,12972,12962,12979, +12995,12990,13004,12991,13026,13028,13025,13041,13074,13067, +13065,13056,13090,13107,13086,13087,13115,13132,13130,13126, +13122,13119,13124,13138,13141,13143,13146,13148,13174,13173, +13172,13194,13199,13204,13190,13210,13201,13228,13235,13245, +13247,13246,13248,13249,13255,13278,13271,13273,13268,13282, +13283,13290,13318,13308,13341,13336,13338,13392,13373,13366, +13381,13375,13446,13421,13440,13422,13441,13431,13429,13474, +5334,6458,13177,930,16324,1376,21125,7336,9992,15438, +15726,3538,6394,6103,2934,2290,6538,4632,9157,14149, +18315,18805,14308,7160,5611,2063,20684,16182,8116,1459, +18961,11002,1282,12123,3902,13346,8682,17383,16296,19673, +19674,5009,9792,17934,11560,2068,16638,2969,17424,1551, +11465,933,19297,9085,9086,7545,11176,21759,21780,21665, +13841,16985,18688,934,13477,7342,4917,10520,7343,12170, +6251,6252,6289,18386,15977,21503,13274,11098,6626,14391, +5082,21146,7489,16452,1832,16358,7163,4095,18621,15175, +13562,20639,6838,14528,9194,21585,13504,13506,13511,13522, +13514,13533,13585,13540,13575,13544,13539,13554,13547,13588, +13597,13596,13605,13604,13607,13608,13623,13625,13615,13613, +13644,13646,13658,13662,13665,13668,13680,13686,13687,13685, +13690,13695,13702,13707,13710,13711,13716,13715,13713,13726, +13752,13742,13738,13736,13746,13745,13772,13773,13778,13784, +13790,13807,13791,13818,13810,13806,13792,13788,13829,13839, +13836,13857,13864,13885,13873,13877,13861,13893,13892,13890, +13895,13906,13914,13912,13933,13944,13943,13951,13952,13960, +13962,13978,13979,13988,14002,14005,14000,14009,14014,14017, +18534,19838,10913,19989,14810,21325,5613,13671,18005,9007, +16453,19509,15066,19116,14532,2959,14582,19991,20647,13870, +9643,13606,19888,9644,8261,16887,2776,17846,16002,10135, +6899,3741,12977,21666,12537,3242,19840,2781,19754,12041, +12579,11511,16956,4681,20025,13969,2013,11061,15236,11305, +15067,10136,16957,5477,9280,5086,3259,15488,10639,17938, +18608,5778,21618,5801,21781,15779,2071,12157,9197,14395, +9301,10074,3811,15780,10858,15891,21207,938,9729,3073, +12485,13348,7910,2962,7809,16408,16057,2033,19774,19002, +8233,1484,10376,1924,20480,9391,14025,14027,14041,14043, +14050,14054,14056,14066,14068,14085,14074,14077,14107,14111, +14127,14120,14115,14119,14116,14117,14142,14147,14152,14158, +14162,14180,14218,14170,14164,14168,14194,14175,14205,14206, +14234,14240,14237,14224,14216,14220,14232,14259,14253,14255, +14274,14273,14278,14281,14270,14287,14286,14292,14288,14304, +14303,14309,14310,14315,14313,14314,14321,14323,14332,14329, +14334,14346,14350,14341,14348,14342,14338,14337,14385,14363, +14369,14366,14367,14387,14381,14372,14407,14414,14415,14422, +14438,14435,14447,14442,14458,14455,14476,14465,14454,14483, +13031,10779,18277,10081,7164,1625,5805,5945,3629,10433, +14354,14263,3630,18056,1883,3704,3243,14398,17996,6368, +1007,11100,10284,21045,12513,7573,11131,3074,11754,6781, +8384,19162,14195,19117,5852,2425,6430,14131,8810,12981, +10678,2020,20249,9510,16471,7078,12934,14507,11011,11991, +2237,3742,13934,9423,19626,13101,2787,6466,7361,10722, +20029,1229,19487,10446,13697,4337,15652,4616,8449,4638, +13872,4686,9017,14891,18182,17835,5022,3490,16722,3946, +14956,17441,17048,10224,20074,14298,7362,15239,10086,19783, +17104,15010,11878,17946,20077,19775,14490,14498,14499,14468, +14494,14512,14511,14522,14520,14527,14516,14510,14514,14552, +14556,14568,14559,14555,14572,14571,14562,14561,14595,14596, +14599,14604,14601,14600,14618,14616,14609,14612,14639,14623, +14635,14675,14649,14625,14636,14662,14679,14642,14614,14624, +14660,14630,14610,14615,14634,14632,14628,14629,14698,14699, +14703,14701,14705,14710,14709,14706,14716,14708,14756,14728, +14738,14735,14724,14751,14726,14746,14739,14745,14722,14768, +14767,14770,14782,14774,14783,14776,14779,14775,14777,21229, +14795,14799,14803,14797,14796,14804,14818,14807,14814,14819, +16964,6058,909,6797,6798,7192,3030,17333,16299,11222, +9468,7554,1995,14400,13035,9748,8691,19900,3297,15698, +15469,20407,15240,17163,4498,3892,17607,5532,14781,7514, +6015,13994,18059,18628,1134,4134,12438,16476,11835,2741, +10716,12400,12823,20205,2432,20662,4408,11689,19315,3110, +17446,12733,4447,7437,17912,8982,1579,3818,11138,9207, +7960,13331,13166,17249,17222,15151,10482,19052,17914,17561, +19053,9116,9429,7726,3636,20898,1292,18633,11403,6601, +1639,15087,15426,16058,13334,13109,16528,10160,6806,11980, +5224,20082,1256,9681,14785,21189,14806,14831,14833,14836, +14835,14837,14838,14845,14843,14851,14848,14864,14871,14875, +14885,14883,14886,14895,14888,14889,14897,14906,14903,14902, +14933,14952,14949,14928,14924,14922,14921,14968,15004,14974, +15003,14971,14976,14977,14986,14969,15017,15039,15036,15051, +15050,15048,15047,15049,15063,15072,15084,14911,15090,15092, +15101,15110,15111,15118,15131,15123,15126,15112,15104,15106, +15159,15164,15165,15168,15183,15184,15182,15192,15207,15194, +15218,15202,15208,15196,15229,15242,15243,15264,15260,15254, +15266,15276,15275,15279,15273,15299,15292,15293,7828,15306, +887,10021,17953,13243,9184,16186,16814,13937,13938,12741, +10347,15097,16067,10816,20085,12498,19692,18069,7214,8082, +17954,13359,15098,8104,4796,1882,13678,19066,17261,19804, +8245,9781,9782,19199,13040,19269,10233,15964,6453,19979, +10101,18587,10931,5991,8962,9220,7219,3498,10789,9458, +9403,6497,4764,20827,16533,8987,6510,9535,7221,9435, +6515,10628,7015,8988,10471,7393,14013,15618,9409,13595, +17464,19080,10552,10982,1669,14930,17409,2832,6335,17814, +3236,4911,17821,10373,6396,6051,7623,8309,1275,18279, +20462,20463,8958,1703,17054,14830,15308,15313,15333,15328, +15345,15352,15351,15347,15376,15379,15368,15373,15372,15384, +15391,15385,15395,15392,15400,15423,15410,15416,15412,15403, +15435,15439,15436,15457,15451,15448,15449,15462,15484,15486, +15479,15482,15499,15478,15502,15516,15521,15518,15532,15530, +15539,15537,15546,15538,15569,15563,15562,15567,15564,15584, +15585,15590,15613,15603,15600,15604,15624,15623,15626,15625, +15638,15654,15656,15634,15670,15691,15699,15686,15682,15678, +15677,15707,15710,15729,15715,15725,15718,15754,15750,15768, +15772,15775,15801,15807,15811,15816,15827,15830,15834,15838, +3778,13376,2463,14515,8411,20571,14331,19550,5921,21548, +17360,4547,4307,1066,2626,12865,16565,19957,19958,8496, +12681,15908,12682,19868,8416,6728,13197,12683,21076,11462, +16316,4677,4678,6004,4995,13655,12112,11657,3341,12478, +2600,8296,9628,5003,20338,5436,12302,1873,17198,3783, +1675,1749,20396,15817,5514,19293,5280,3052,6732,10813, +5010,9932,18747,17203,9635,18976,12486,7793,14333,18809, +16328,11381,13157,5759,13321,9350,17684,7861,13404,7279, +16078,2372,1328,5971,17965,20714,4970,17246,9288,1485, +19841,19511,7801,3429,3762,6733,15832,15849,15853,15850, +15851,15871,15878,15888,15904,15917,15933,15895,15911,15897, +15912,15938,15937,15939,15936,15944,15947,15954,15953,15965, +15966,15968,15970,15983,15987,15992,15990,15993,16017,16019, +16025,16030,16034,16056,16059,16071,16079,16080,16075,16082, +16091,16102,16117,16109,16127,16146,16134,16132,16141,16172, +16168,16179,16181,16193,16190,16201,16194,16191,16208,16214, +16222,16226,16238,16229,16234,16251,16255,16242,16256,16247, +16282,16264,16265,16280,16270,16261,16269,16289,16295,16308, +16312,16309,16321,16317,16319,16339,16341,16337,16336,16344, +15031,8206,12721,19766,8531,14946,10593,9653,3855,15573, +9048,5937,5976,1213,4604,16466,4144,19845,15291,12955, +13945,11661,16467,9836,3935,4334,1166,3705,16331,1979, +11099,2187,9125,7067,15865,10883,17836,11153,7755,14586, +17944,18335,13845,16367,5023,19894,10968,16513,13925,17546, +17071,19245,14540,2700,15468,21180,21596,15653,19895,11012, +9128,4032,13352,16963,16644,19994,13510,19307,7550,1150, +14959,3054,16917,16613,9749,1151,13819,7086,16697,17798, +5984,18827,1395,6467,18871,4079,11536,6126,6377,6736, +10693,19037,16577,19311,15609,21047,16374,16360,16343,16379, +16384,16391,16381,16393,16395,16378,16406,16396,16428,16444, +16429,16423,16424,16425,16426,16489,16507,16491,16493,16494, +16501,16527,16490,16503,16500,16497,16508,16488,16548,16541, +16566,16557,16563,16559,16586,16595,16592,16598,16611,16610, +16625,16630,16642,16632,16640,16646,16665,16653,16659,16651, +16681,16679,16685,16672,16677,16684,16682,16701,16707,16711, +16705,16704,16702,16741,16729,16746,16731,16757,16733,16743, +16734,16772,16803,16791,16781,16770,16771,16787,16784,16827, +16893,16828,16821,16863,16829,16869,16899,16823,16888,16849, +2016,15014,12728,15788,14266,3713,10452,16524,21009,2430, +13482,12319,19639,7522,10293,13231,19198,7557,16580,17447, +10786,20593,20616,10681,5837,10155,3088,9519,10765,17448, +2301,11404,21711,14961,13356,15597,20860,12222,7692,13486, +1678,9887,5764,17002,7120,21314,4605,9334,8461,8462, +19172,2201,7640,11595,17454,11427,2701,18108,14962,2795, +2487,3463,9570,14243,18875,8029,3301,12826,3033,17369, +14355,13219,19325,2160,9673,20280,17955,21209,20264,17510, +10823,17619,12749,13828,7451,6032,21471,7826,1709,6073, +4508,9434,7825,9138,11289,9690,16875,16844,16824,16853, +16904,16817,16854,16891,16859,16884,16820,16873,16966,16952, +16950,16948,16954,16983,16982,16979,17013,17034,17011,17018, +17070,17063,17073,17110,17101,17096,17077,17074,17080,17117, +17123,17121,17118,17149,17153,17135,17132,17158,17137,17188, +17187,17199,17197,17184,17191,17186,17206,17232,17233,17269, +17293,17266,17296,17288,17292,17274,17285,17272,17270,17320, +17323,17343,17321,17334,17337,17328,17318,17354,17352,17349, +17364,17359,17357,17379,17378,17389,17385,17376,17381,17417, +17420,17438,17399,17487,17451,17425,17407,17404,17468,17472, +13417,11808,10357,4082,17461,21194,10248,9537,10249,12092, +18646,12326,11569,5540,19277,14790,16944,1981,13498,13584, +1982,10757,7827,21219,21423,6608,11919,12132,21082,10733, +4420,8555,11230,17060,8615,19923,13471,10069,17989,14811, +15915,10270,17207,6374,16514,3546,2689,16519,3548,21401, +5121,19572,18781,4826,4655,7774,21038,3400,18935,21074, +7852,20805,17527,13653,20806,8492,2158,6687,13654,16145, +10111,1267,18618,21778,1452,14317,8297,6140,18019,20681, +18801,12013,1783,3598,4996,5798,20934,20950,13656,18947, +16123,11503,5416,17985,20575,13438,17471,17481,17489,17482, +17492,17491,17488,17507,17506,17508,17509,17547,17512,17522, +17536,17514,17529,17516,17530,17558,17579,17569,17618,17603, +17564,17565,17590,17575,17650,17631,17642,17635,17632,17643, +17630,17627,17664,17667,17676,17683,17680,17679,17674,17696, +17704,17699,17698,17697,17717,17721,17719,17722,17720,17735, +17734,17746,17737,17741,17749,17750,17755,17757,17762,17780, +17895,17790,17784,17788,17787,17831,17804,17828,17815,17826, +17811,17845,17847,17899,17887,17870,17863,17865,17879,17871, +17893,17890,17885,17886,17919,17927,17922,17962,17963,17959, +19727,11058,1784,1792,2631,2627,8838,13762,7590,7479, +11380,7789,4382,13866,21172,5713,19103,8550,17710,14105, +9038,11753,14813,7252,9069,9562,8344,14392,5282,20685, +10131,7169,18993,1899,21350,14884,13647,9559,17794,2168, +9042,15571,19930,10075,2632,2271,2730,9834,12142,4589, +5802,18331,4030,20981,12777,12710,5863,8753,12640,15694, +14674,4932,2698,17595,3856,9049,4088,17795,17796,19931, +5019,19623,16055,18333,6706,12115,3383,20048,15303,5422, +6502,13814,19932,11535,8102,2129,1152,14046,11756,19251, +7865,6505,8844,9741,9511,14542,17973,17977,17984,17983, +18006,18007,18014,18010,18029,18036,18049,18054,18093,18077, +18080,18075,18078,18076,18123,18116,18113,18114,18122,18117, +18138,18141,18142,18144,18139,18137,18157,18154,18162,18165, +18170,18166,18180,18176,18185,18188,18221,18212,18223,18215, +18220,18261,18245,18258,18271,18250,18243,18248,18278,18266, +18253,18252,18305,18313,18314,18310,18332,18371,18380,18401, +18360,18367,18387,18368,18366,18382,18369,18377,18373,18442, +18437,18446,18445,18457,18452,18459,18462,18453,18468,18455, +18501,18494,18502,18499,18520,18524,18538,18536,18529,18570, +10506,19038,3822,17611,17167,16525,1658,2035,7193,14109, +1232,1508,4944,7438,21333,7439,3211,7088,3391,20105, +4500,1857,17390,18107,1677,13699,10764,9208,1027,20261, +5789,2047,15221,11882,2172,9779,3460,14786,15447,1533, +9212,4947,20899,15340,14788,16219,14691,1122,17552,1870, +2459,9186,10244,16974,17178,9224,20600,3361,8271,20168, +14549,7456,19077,9231,18187,16822,4781,5011,4798,1103, +6132,7017,7022,7460,5609,1594,18372,5714,8423,12377, +10870,11119,11120,11218,14652,15002,2167,20686,8433,11125, +15805,9733,18624,20982,8505,16960,18562,18540,18565,18550, +18555,18544,18598,18603,18616,18617,18636,18642,18644,18648, +18647,18662,18660,18657,18669,18682,18666,18667,18668,18687, +18671,18683,18726,18744,18733,18745,18743,18736,18731,18732, +18818,18770,18812,18804,18767,18800,18820,18774,18777,18785, +18835,18864,18855,18857,18844,18843,18850,18845,18885,18903, +18917,18909,18893,18881,18902,19048,18966,18991,18933,18891, +18992,18984,19009,18884,18880,18946,18985,18923,18889,18948, +18908,18894,19047,18960,18922,19093,19094,19086,19098,19095, +19088,19091,19134,19155,19153,19150,19181,19178,19179,19183, +14214,16368,17049,15756,19635,9245,4344,4065,13183,12095, +7200,11312,19316,5459,13526,20464,7963,5618,3578,7529, +10622,13527,7380,16418,8470,13529,10625,9250,14433,3639, +5623,18362,15751,13378,7881,3124,20951,2363,7048,3430, +3657,6484,13566,5287,14667,5760,7833,6860,13407,17685, +11662,6980,10439,20326,1518,17692,14267,5390,21014,18026, +2850,16932,18840,10470,8475,16942,18422,16946,18249,3899, +4992,13379,13380,7705,7145,4524,18124,3804,6274,2102, +15586,17812,7784,3418,13759,18125,19147,14221,12802,16124, +7150,18126,19163,4262,4659,18203,19203,19221,19247,19227, +19261,19219,19243,19289,19290,19291,19288,19305,19284,19318, +19286,19340,19338,19351,19349,19357,19361,19360,19382,19362, +19364,19368,19423,19421,19399,19401,19409,19397,19410,19403, +19428,19438,19432,19439,19433,19452,19453,19456,19472,19455, +19458,19477,19499,19495,19494,19518,19520,19539,19532,19517, +19519,19545,19552,19557,19570,19612,19617,19610,19622,19562, +19574,19608,19573,19600,19554,19588,19592,19559,19583,19658, +19653,19656,19662,19655,19663,19657,19694,19720,19699,19705, +19696,19745,19733,19712,19737,19749,19724,19708,19704,19756, +18532,15052,14424,19154,17640,8425,17469,11624,2418,19475, +20893,17747,4572,17668,2333,14345,18264,13980,21407,17855, +18962,18963,15119,2565,6071,14393,6108,17894,20687,21273, +20781,5448,21556,20399,5519,5012,7420,3846,10071,3658, +18522,11590,12064,21147,5145,18977,8302,18622,20367,16149, +18810,13508,20549,12487,1471,17752,13445,1083,3292,21689, +15541,21232,3015,20584,19416,17858,18095,18994,6666,6112, +14668,2126,17496,14534,6175,2144,5452,5761,13567,6776, +7802,6485,5065,17355,16365,14396,2731,3971,11062,11320, +4332,6703,18275,17748,5595,4422,19714,19735,19744,19717, +19776,19695,19830,19834,19826,19854,19861,19869,19864,19873, +19891,19858,19857,19866,19886,19884,19876,19912,19919,19929, +19920,19921,19935,19937,19966,19964,19954,19950,19965,19943, +19956,19961,20017,19999,20014,20001,20041,20035,20055,20075, +20061,20059,20071,20054,20088,20101,20100,20113,20112,20110, +20120,20121,20124,20125,20137,20144,20149,20152,20173,20184, +20186,20191,20192,20195,20206,20198,20197,20203,20200,20224, +20218,20212,20209,20207,20220,20234,20231,20228,20233,20277, +20283,20292,20293,20289,20307,20332,20317,20319,20333,20335, +1772,15798,18815,9421,21176,8906,8850,16693,7179,20983, +13770,3136,9303,4270,8914,16896,15881,3432,1331,2188, +19541,8764,13127,13181,14834,939,19683,17499,2529,7864, +17300,16695,16806,5238,15054,1890,6782,8062,14899,20716, +14900,4031,6451,2326,14873,7813,8736,13451,3106,17470, +15212,16332,17215,4617,2573,15327,19014,11487,19164,3814, +12335,21456,2238,2400,21400,7185,12650,15417,21387,16472, +8207,13287,3947,20783,20252,21650,12887,21457,9849,7506, +2843,17126,10604,14426,1657,6492,12372,19628,3860,17838, +12380,14682,17947,14683,6861,6493,20339,20337,20348,20362, +20370,20311,20356,20363,20358,20379,20376,20382,20384,20386, +20389,20412,20392,20401,20395,20391,20427,20424,20436,20428, +20426,20466,20448,20445,20447,20450,20455,20452,20483,20471, +20475,20477,20468,20494,20492,20504,20500,20503,20506,20501, +20505,20517,20511,20523,20524,20534,20535,20543,20550,20551, +20538,20553,20537,20564,20566,20572,20583,20592,20602,20603, +20613,20607,20609,20622,20642,20629,20645,20630,20661,20618, +20619,20620,20672,20679,20670,20720,20705,20719,20699,20752, +20733,20744,20729,20735,20726,20730,20771,20765,20772,20778, +4345,21083,3711,17548,4939,12605,15866,7515,12780,19784, +21521,21313,16998,6799,19124,943,17217,11555,2431,4783, +21183,18484,18402,6643,17948,5296,11950,12652,11422,18708, +16520,17689,15611,21114,14239,12516,9020,6669,6908,5264, +19317,11063,17479,11139,17001,13038,2402,18046,15658,15152, +1217,2613,12890,14688,7578,19902,17612,17449,15554,18582, +18583,20824,19643,1640,3116,9520,11341,11342,14268,20595, +11324,7446,20262,21692,9755,10294,1998,11981,5817,16967, +21466,1013,1044,7915,20596,18837,6345,7603,10787,2353, +5988,6469,2245,17839,20302,14103,20777,20779,20776,20774, +20790,20794,20787,20791,20821,20795,20797,20811,20789,20786, +20796,20842,20833,20843,20844,20830,20836,20831,20872,20885, +20866,20894,20867,20870,20878,20903,20928,20940,20901,20933, +20970,20911,20917,20907,20958,20932,20968,20914,20913,20944, +20959,20912,20947,21025,21037,21032,21039,21041,21035,21056, +21055,21075,21067,21068,21085,21088,21084,21090,21086,21104, +21119,21122,21123,21133,21143,21134,21138,21154,21168,21166, +21175,21159,21170,21169,21162,21203,21195,21201,21231,21224, +21236,21233,21222,21269,21255,21243,21270,21251,21277,21272, +16933,20329,4138,20785,11597,9213,4278,19356,8464,7003, +21751,7695,1881,6817,21335,11347,20285,20345,14592,13110, +15428,20286,12608,14488,17956,20222,15431,3468,15227,17175, +7006,7730,9760,11892,18763,888,20415,6740,6819,19067, +19068,14244,13692,11900,12960,4140,15338,6438,21117,6033, +920,19273,7386,19805,7455,6826,4047,20599,17958,20165, +9436,14434,16535,2250,9702,18841,1611,20601,18423,4355, +2748,16537,2749,18639,2217,13693,19202,9229,2460,17556, +11810,6528,20169,19082,3473,20422,18433,4056,16108,13741, +17739,17751,1434,21092,14421,17816,21242,21249,21259,21253, +21293,21298,21299,21301,21304,21317,21329,21328,21330,21345, +21340,21349,21339,21362,21354,21356,21367,21368,21365,21385, +21373,21376,21399,21402,21413,21410,21409,21414,21446,21430, +21437,21438,21442,21427,21432,21480,21481,21489,21483,21501, +21491,21478,21553,21476,21536,21554,21537,21560,21567,21559, +21603,21582,21598,21574,21576,21610,21626,21638,21658,21660, +21661,21663,21668,21669,21673,21687,21681,21682,21683,21704, +21700,21714,21729,21723,21725,21737,21739,21754,21763,21764, +21773,21779,21766,21767,21777,23849,23850,23851,23852,23853, +12866,6246,17064,7055,6257,5909,6213,16924,16925,9888, +5946,4048,10251,12768,9563,3570,1394,14823,17309,4758, +21018,21024,18434,18435,2824,6691,16095,18964,18965,7337, +1068,6313,4323,2777,7355,8746,5066,8310,4842,16897, +1695,21184,7260,4692,16926,1858,16549,6554,3637,21600, +4696,19059,971,12303,11506,12266,5437,11508,19538,11382, +15005,6546,8747,6113,975,9506,11663,1425,19689,7261, +16033,10826,16927,19049,8332,2769,15429,6527,8484,1299, +20624,19863,4993,1942,5406,15591,18949,6006,16258,12432, +6893,4529,15390,5645,20242,20952,2817,6927,16768,5073, +11736,13984,12244,5322,2492,5276,11580,4342,5794,19576, +12420,1404,16107,18527,18539,20788,3641,17661,19206,8968, +19762,5197,15583,21221,7034,11534,11212,6933,12658,11087, +1806,14078,5526,20268,14336,3250,18312,8430,14942,18704, +18403,4538,12518,5745,8999,1571,20253,5586,19497,3501, +18883,16585,8008,8816,5766,8560,9118,6945,14219,16230, +8859,12385,8436,13064,6865,19019,8074,16322,13714,3874, +20491,9367,13976,18886,11451,13739,19654,12329,18155,16209, +16732,2260,2002,8640,21240,11843,8547,19434,18898,5413, +4419,21274,14659,1472,21509,4421,5776,12379,1572,10720, +3345,14502,8935,4634,15814,18811,2603,10873,6145,1346, +10424,10014,6777,5067,12371,21510,7298,17900,20278,7673, +5068,20174,7493,19246,18132,20717,14326,1696,1697,13408, +14327,2886,20176,21108,9174,20151,3055,2401,14275,15757, +12143,5343,17216,10735,7507,15213,5025,15461,3107,3108, +20993,6981,20515,4066,7955,11260,2972,20078,1255,20119, +9176,4795,2024,6998,14509,913,21334,5030,5460,14011, +20263,9889,19054,1135,2443,16301,21011,21392,1643,19998, +20308,3448,20159,18413,12589,14245,15896,16133,11672,5039, +7035,4415,19521,8851,8599,21161,18910,15765,2149,7649, +11867,11414,2717,18306,9599,13377,9551,19660,12452,19402, +14988,4787,12968,13961,12015,21412,14732,10637,16631,1416, +15680,5610,8774,8291,4710,18311,17528,7151,16346,21611, +10274,15519,1688,11938,2655,16889,8018,7496,7621,8158, +15919,17940,3386,15894,16104,14330,12852,21684,19976,3150, +3615,16818,18128,6267,5855,2242,8986,1219,12574,6206, +4899,4855,15103,14979,15952,18304,1819,5795,10869,17583, +10535,12546,1751,19308,10643,9399,1725,6406,9916,17230, +16303,19330,7964,5409,17225,20177,1540,4049,14772,18420, +18421,18003,10272,5151,20179,19855,1473,21105,4791,19995, +16865,15916,17039,2473,2482,17106,15507,21657,9606,14222, +13314,13224,17240,21495,8426,13225,2601,3002,2450,3847, +3604,17033,20400,8434,7068,2605,2783,5572,18045,15806, +4217,5130,15267,3137,16961,20555,15137,19192,8235,7508, +13630,2989,3187,10440,3491,13354,21522,15655,13456,2671, +6649,13111,13082,7727,20223,15706,4410,20148,16687,8677, +8427,2436,4549,19963,1099,12694,16183,18978,7490,10072, +10961,8825,3041,12830,21275,8201,15023,11106,21057,11297, +18241,7764,6273,14215,11967,8274,11620,5499,6066,3643, +20539,13427,18775,8898,9416,5588,7775,6680,14374,5440, +13542,20775,6851,17850,13120,5229,8911,16836,21640,21436, +16437,19585,14420,2226,15198,2419,7480,18044,18684,4314, +19728,17926,931,3687,21494,12378,11328,3466,15120,14658, +11122,20585,7428,20284,13097,8439,18397,20403,2457,7759, +7896,4977,16773,12844,8007,1155,3748,21768,1283,17700, +5054,20925,11767,21642,2919,12298,16349,6615,16445,16965, +5914,13307,8919,10791,16678,4540,1736,12249,1300,18670, +15815,12038,8306,11659,18816,7170,4238,4239,21177,13568, +21300,17356,2658,1383,20971,7280,1954,3294,8234,14753, +16008,2839,8063,11780,17432,1925,3222,11449,14754,7677, +13066,11051,7509,12727,16645,16473,7814,7080,11784,8208, +11785,10594,10441,9467,16286,13573,21677,13164,12651,3140, +21597,12238,20757,19636,4180,2973,19426,3712,20353,2442, +16156,15504,4940,21678,11951,2132,16073,13018,20441,3724, +15659,7089,10195,20156,1524,2692,10456,9890,15471,3358, +15153,17003,8997,7204,20861,13020,20862,12050,21601,9754, +20193,11733,16068,8242,17171,21052,3644,15349,7267,20915, +21163,8867,17019,6532,20057,9608,19333,5230,16837,4889, +12297,15404,18316,8375,18228,19160,20473,12514,14229,21651, +10098,4761,2771,6571,10724,13465,14311,6077,5306,11033, +17880,17541,15080,17610,8469,19177,12946,3475,2320,14919, +1581,1352,13396,1354,4301,4435,14769,6984,19377,6154, +16380,16673,5241,20698,8920,12330,18769,9587,12661,1156, +5100,10259,3749,10324,2379,3647,16136,11644,11456,988, +18194,3825,3951,8561,14177,14271,11601,5055,19138,2508, +14573,5820,18050,9924,19922,20840,957,18953,12300,11739, +1801,3148,8466,10022,15304,13083,13084,9852,4156,5634, +3303,1537,1538,8334,13137,4160,2746,7010,16767,19983, +11734,20864,9699,21021,2801,4107,16536,10252,10024,17179, +16538,9230,13682,17623,11811,15339,13500,7098,3155,21696, +17008,8990,8485,10025,3375,4660,15672,4218,5385,9291, +13735,10641,883,6982,8236,8781,8782,18338,10948,8634, +13458,10295,9366,4222,20863,18414,15674,3551,19279,19817, +2366,20336,5752,8493,19959,17665,3337,17924,4525,13760, +14185,8912,14742,16097,2420,3343,4315,11507,12695,10836, +13917,8913,12923,21319,6208,6336,12197,16027,14069,3338, +8822,3838,19108,9462,6312,5285,19881,10772,19369,9821, +2608,17651,12325,19076,2039,7604,11520,4068,12850,6939, +16246,17738,12761,17319,4861,18247,20009,4863,7132,9589, +4294,8280,12287,20879,13940,17268,2282,3060,13189,16779, +12965,12665,14172,1586,21246,8791,18851,11365,5102,12421, +10209,1077,11459,8179,13667,13281,2591,4874,10040,11748, +19204,10854,19285,13310,11243,14305,12967,18791,13694,1447, +3011,8255,15902,6725,21165,15852,13089,4888,13727,17723, +13546,6751,18086,11296,12799,7612,2679,7541,10652,19287, +13478,8936,3659,10073,3346,991,20688,4530,8907,18506, +12185,1322,5479,5480,12113,21276,13832,4324,1085,21120, +20895,18556,8683,18979,13256,14669,12488,4386,5401,8230, +7714,5684,10426,8572,13569,21106,20123,20972,14325,9848, +19768,14297,19485,6567,13641,20587,16285,4972,13260,21109, +11664,10082,20590,20459,9850,21518,6711,16333,2990,5869, +8609,18869,12216,12985,5808,11730,12493,5630,1333,10595, +12022,9825,13926,13847,7087,18485,17218,2876,3122,2944, +5297,19490,6215,14757,5028,21523,4941,16550,1360,20442, +19640,16551,8610,5492,20664,17108,12913,5324,7928,10719, +15231,6238,21141,8601,1401,14575,16633,19503,4260,10901, +19467,9620,15991,17148,4897,15172,19469,3621,17638,16267, +9275,19225,2953,7985,12693,16864,15028,7899,11532,12634, +1082,14741,2266,15812,19589,6539,1458,4910,16028,3424, +3201,18222,21664,3482,7335,16276,19292,5475,5965,12828, +4746,13765,17330,16359,2231,8568,12810,9006,16986,4322, +1246,12002,15858,10278,12028,17933,7251,20648,14533,13904, +11387,4361,1327,16621,6012,7066,9498,1212,7354,14910, +9309,19302,19755,15135,11007,3980,16990,9773,3135,10015, +19903,10457,7641,2351,21321,16529,6849,18033,20598,7728, +20465,1892,9355,4697,4470,9984,5302,14101,8613,6560, +18877,7093,21393,4392,19806,7533,6218,9405,12162,9700, +9703,10358,10026,3321,21095,9818,16546,3016,21726,1600, +9126,3025,18008,1182,1604,1607,1154,3034,1609,1610, +11872,11874,20695,2978,18729,13774,4513,14557,13897,2162, +5095,19546,18846,12617,20310,16338,16024,21396,3275,5997, +3276,4254,21031,2380,11694,2643,2409,21252,15559,16140, +13517,6726,3960,19533,11525,18793,7779,9923,18121,4168, +8089,19470,13386,3678,8045,18860,13479,8811,17917,9899, +6790,18134,8450,13932,21728,7079,11010,4493,12726,6265, +17608,6214,16370,19036,16626,15085,1517,6014,15365,13879, +18064,17254,5222,9523,6917,13488,6195,4506,11802,11079, +5393,18929,8916,9713,3265,18926,16840,20182,12111,19451, +9903,5049,5111,14700,10972,16036,2393,4955,1589,1022, +7776,7651,20091,18940,10605,8520,15760,18650,867,11504, +7110,5845,1116,8194,12545,9928,12921,5643,3841,20318, +18204,13238,19601,960,17932,1771,8970,19926,14747,4364, +2852,7346,14909,20431,11946,14044,10659,19239,20850,5974, +20610,16790,9719,15289,6729,5507,9158,1344,3256,8428, +1382,19476,21101,7935,19729,2984,15688,3289,19914,11945, +3485,15185,18326,2604,15643,14578,20640,19479,20066,4325, +5873,3293,16405,11551,18564,2762,18130,15319,3697,2606, +19915,15129,10690,5651,20481,14676,1935,2663,15138,4176, +3706,10285,2611,3230,13708,12888,17976,19777,18823,4338, +9873,14684,10736,6552,20408,15607,4409,1559,1562,9524, +19907,19493,10629,9573,15848,12757,14166,19560,13860,16260, +4814,8642,1684,17628,14411,19856,3214,6876,1191,8281, +1435,16210,8899,5703,14517,8818,20586,17542,10318,21750, +3151,5132,6598,12337,17718,21461,6868,21706,11576,18882, +15589,3326,14655,1895,2637,6931,8799,3502,9370,20309, +850,18528,4815,4950,18900,3314,9586,4292,1409,1123, +5818,13233,19180,20090,8543,17061,5581,10117,3920,11820, +4183,11582,19435,14925,8901,6943,14417,6681,3264,9910, +18784,17400,1442,2999,5673,6747,17758,18738,12025,8868, +4210,7137,11214,11052,20359,11868,5321,11412,10702,2555, +9320,5347,16709,20315,15274,20211,16839,21776,6946,4782, +20238,11943,11187,9954,21323,20528,15565,6332,3197,14146, +5053,6082,7036,6304,17702,16949,5718,11935,9289,18254, +2499,3995,10489,4958,16708,9272,7269,5346,1818,17024, +13518,17466,12627,13250,21096,21641,12465,9149,11651,19471, +1926,17322,8225,19380,13058,18742,10905,13963,1316,14743, +19672,20060,6311,8966,17325,17326,15059,15483,11301,16880, +13894,2835,21505,21647,18689,16691,17331,20019,13059,19367, +10874,2343,4840,9898,21306,6425,13062,10771,13063,17859, +3585,1529,18097,1502,20291,16409,20782,10882,9965,3384, +11013,18703,2046,8876,4755,11014,8939,9778,20154,2198, +19444,6999,18407,2206,20157,6522,19358,3419,1787,3901, +9268,9621,14832,2855,3837,3268,11550,9488,8969,7742, +19393,9001,8117,15060,19107,2652,7743,10276,8839,16639, +6762,13205,996,15121,4019,8730,11777,6072,2397,15262, +5284,855,11638,6020,3714,880,897,14908,5881,15890, +2566,12158,9460,2030,12411,12642,19238,1370,15082,3605, +11126,12188,8388,9863,12568,2856,7720,11960,13209,10317, +2082,3571,6013,7952,8453,18754,14004,12276,13875,1930, +6913,11565,16377,7396,11538,10575,6346,10031,19526,19664, +13251,19669,19897,16382,20910,12149,15515,2718,20239,5844, +16941,20162,9694,19586,18317,21721,10837,3376,4004,20636, +19871,4833,15711,12831,12507,2732,20129,2987,19540,19211, +12582,21727,5888,16412,10443,9242,18234,15575,20439,15418, +21388,17219,4021,15445,13412,2964,20079,4431,8698,15074, +2757,3234,20080,19431,986,20372,7599,12405,2244,19800, +9521,20194,18761,7601,15430,12509,11883,19069,18416,19070, +11745,13887,2747,18424,10104,11081,11082,11746,17673,7732, +14551,11084,18430,1587,14653,14692,9525,7875,5043,18856, +9897,3508,20527,3884,12504,13388,1081,20632,20839,1067, +10559,4961,11527,3807,14187,13116,16394,16658,10774,20514, +4934,4464,7027,12759,12853,12662,13426,18156,17267,1028, +2078,9189,1057,6413,8709,3921,7266,17785,3324,5427, +10852,11237,18914,3953,7703,18081,20732,9321,9145,15025, +18219,5548,17467,5824,8776,8417,13797,18606,16225,20122, +16399,19599,3237,10299,21498,10908,14503,15029,7114,20513, +9968,3588,1704,18831,3725,2636,4562,3128,18119,18466, +6307,9146,16981,2288,6622,18559,20756,7684,13499,14165, +13587,13368,964,5690,10683,11857,20039,17075,12106,4623, +13787,8869,14707,15230,1450,8369,9615,19584,17237,19143, +8806,2885,21551,4488,19590,16690,5966,5171,12696,10810, +13781,3688,15000,17028,18967,2147,14525,16022,16866,11918, +12871,13394,7481,12267,18653,19185,1092,4550,2423,17712, +3993,19967,12874,4837,1922,11509,17641,4265,8435,4172, +5418,19186,12925,1165,13989,13722,2336,11864,4662,20045, +18865,13202,12268,5827,6253,19156,8500,3809,18980,21043, +16987,5083,13782,6878,15380,8649,19877,10336,11639,16569, +4202,21515,11660,16003,14670,11257,5484,8689,10076,1752, +3020,5523,1837,12269,19757,15006,21762,1889,19483,3763, +7299,20649,14607,14671,15818,8307,15157,18740,5859,10610, +11656,14322,3131,11059,6361,2123,16451,16504,10911,11588, +20478,8061,8447,9871,17605,18063,6525,2877,6880,15233, +19161,20865,14554,15476,16094,17014,13753,19703,2641,18783, +17361,1786,19587,6844,2107,15068,11330,17768,7911,14030, +21331,11571,12328,16736,5743,12105,17759,17350,16170,929, +19670,1455,5338,999,7906,2191,17602,10000,19257,17626, +3504,3224,2251,16738,20904,11993,2677,16737,8579,2316, +2906,15016,1582,11854,6414,2821,12176,3279,18517,21771, +11645,4868,2330,18916,18778,15943,18213,2053,8562,18082, +12926,14535,15302,17994,20529,1269,6115,1489,14477,2784, +14583,1838,21279,2659,20096,12522,15918,12927,4925,20385, +10859,12879,4926,9645,19969,12270,18447,1180,1794,7803, +5420,14817,20753,11448,11683,11779,3698,7256,11473,15440, +14409,18866,14939,8937,8551,1296,15921,17713,6259,7678, +2633,4405,5315,1753,14587,11421,5877,19165,8506,21107, +2708,17365,15922,11389,9448,6972,19769,17908,13724,21753, +20984,14226,2664,16991,17714,13571,12271,15820,21181,6292, +11308,8854,18571,17157,17209,17770,8507,2108,9351,7073, +12334,13871,11101,18752,19120,5685,8722,20058,1309,15037, +12864,8953,9061,18939,15681,13532,13153,17727,4611,2308, +16323,2720,6333,3199,20064,9003,4320,9472,21377,13117, +1466,15125,12951,19371,8020,13100,2688,2844,10002,11041, +15741,6714,14842,18244,16385,6228,11267,8646,15315,10475, +9063,8115,9297,19730,2267,17029,16568,6834,4317,13520, +13617,6116,15731,13622,8618,21353,12035,12992,14874,12786, +14975,2136,4727,19859,11454,11163,4164,11108,5498,1585, +16600,6010,16383,9376,5101,14798,10208,10326,18441,14985, +4227,10038,10853,10648,17980,12057,16138,6230,11269,7970, +963,3917,19512,14087,8662,12931,14947,11640,3812,5979, +13947,14678,8765,13411,17437,20591,17797,20187,15627,3261, +5575,6279,19375,4009,10504,10925,9292,16298,17646,20030, +1334,15144,19778,2189,15882,1850,5980,7282,6263,8347, +4756,2170,16287,20995,14957,8348,6468,19685,15784,8938, +21458,10568,17715,13230,14452,5939,10569,18654,2790,20305, +8209,17303,4271,10814,12570,9512,12067,13948,2532,5239, +9565,15596,1733,21286,20718,15979,10183,21732,8328,2315, +19847,7369,5177,3817,15577,2298,10597,8737,10087,12277, +10447,9518,13017,12144,8362,11261,6534,16432,9921,7238, +20621,19092,6724,21164,7141,17873,6748,15561,18083,7586, +10124,6392,18084,13899,15108,16713,9147,16392,21434,8342, +2080,1190,16848,10940,6577,21228,12689,16857,15027,4026, +21416,12342,14482,5143,4601,3099,14423,5644,10407,14846, +17587,18224,11174,7664,15064,6625,17892,12169,7338,17990, +16660,10909,18389,13207,8732,14351,10821,19301,12599,9642, +13902,15301,6858,1477,17791,4969,15487,12077,11303,6632, +19303,17430,9240,2032,6340,10660,6594,9798,21179,18750, +10430,17967,5129,14822,14953,14196,14320,15925,2193,9175, +21733,12219,977,12278,17307,18149,21369,9452,854,8783, +15330,9054,4034,16521,2928,21524,20759,1348,11791,21636, +2965,15422,3910,12729,12936,21389,6991,19785,7914,5632, +10845,2273,15758,16918,9802,15578,5559,3262,14826,20663, +10448,11040,10449,6452,1659,5046,9164,8749,4551,16762, +11537,16300,6399,3563,17164,17165,6866,9851,4451,10981, +8575,18450,3609,9804,5835,17255,4081,16011,16414,16288, +5031,13848,7090,4348,8510,20665,15660,20344,6435,18486, +4105,17109,19641,8766,14479,6646,16479,5032,20532,2112, +13167,14545,6217,8983,11953,13078,15179,9567,3440,20406, +9743,13878,12585,1522,6030,21464,5990,17616,19322,19978, +4719,6061,1107,11143,5740,3477,11110,19528,2411,11846, +12880,12883,16804,9865,12889,6549,7441,7440,2977,18191, +16739,8086,20235,18782,4397,7235,8035,3328,6309,12082, +1886,9557,13387,17410,15683,13640,8965,16347,6583,10410, +2870,6627,13401,17094,1003,5453,15320,10137,17159,9971, +8327,17609,11205,15222,9110,7121,6759,16053,20957,8651, +20883,6948,4250,2176,16988,8319,2257,8033,11909,11090, +4909,1464,19811,2377,14901,4577,18246,16735,19701,1410, +13079,6297,15951,21624,6555,18714,11263,7523,4089,7516, +14960,8984,6381,17949,20606,7821,20666,1560,21050,21527, +17773,18655,10949,12029,865,5072,12938,10928,2113,3302, +1218,17111,9756,15284,8587,18584,18718,11898,16614,13825, +15510,15285,13021,5300,14916,2929,1863,12051,3273,1397, +14048,5178,21528,16699,19260,6677,15790,10162,8576,15250, +14138,15075,16302,5225,20722,20723,9293,19055,19905,15523, +11796,16968,7262,5266,10694,8350,15056,21691,15286,15287, +4759,16553,11489,10388,15288,11982,21680,16047,17777,5656, +18002,9805,14721,10766,11405,10623,7921,21540,5700,11850, +19563,14980,3278,21118,14174,13145,18195,13703,14730,9784, +7608,12424,2141,9554,12448,16195,17193,15255,3676,16433, +4281,8047,1655,7786,2263,1454,2174,11911,1024,19925, +15854,16794,5449,11329,12345,899,12434,2567,9500,18229, +13027,12412,2295,9389,20474,16902,14233,1512,11757,10674, +14853,5047,5042,4859,11903,21497,7761,8395,1222,20180, +14987,4988,21639,18924,11904,15343,17402,6457,12366,9483, +12697,8728,21366,1966,20962,16799,1036,10139,14227,1627, +3075,20460,7215,17339,14920,19544,21130,5243,16245,8921, +1534,16530,10165,3611,14036,21625,18838,10462,8767,13022, +3183,12656,2303,15472,10788,19385,2246,4760,8071,1644, +14827,10315,17801,3090,10234,20160,7530,2038,9529,17131, +16935,8635,14869,1388,20487,12897,2488,10467,6470,7094, +12591,6820,13023,12510,9987,14102,17802,17315,2489,9025, +14965,10167,11598,6651,12422,15226,4507,13112,13538,18489, +15473,17392,8471,7642,21744,9892,13169,9336,4139,17656, +20136,7007,7452,21053,3593,18153,19347,4118,8472,11899, +15705,12610,15822,15823,20499,3893,14246,8558,7453,4644, +15228,10390,8352,6823,19807,9762,20008,12248,14725,5140, +17567,4872,21135,4873,2823,3327,8834,6001,7587,5351, +17408,15631,10062,12774,4584,14283,5797,4215,14712,10178, +13593,16274,21493,8729,17329,15641,11201,6766,14935,1597, +5417,21379,11252,7937,20690,13903,5214,9496,18989,7353, +1692,12388,10778,9390,11322,14057,17545,9872,20294,7553, +12958,13076,6551,21699,18526,6977,2858,20111,19363,3877, +6937,16431,4653,11242,8408,8672,10212,3753,3334,12530, +11244,7239,4402,5400,17813,18160,6187,18549,10655,16980, +6690,9767,12703,19234,12702,6395,9040,18325,3100,16279, +21468,13085,12901,21472,9404,1541,15824,6562,17553,4207, +5871,2491,8337,4698,3304,19073,921,21609,18136,3819, +21292,6196,21394,7016,11691,6135,6924,13263,1710,19275, +9027,11838,17842,7534,7535,12961,2134,21023,11231,9541, +9407,7018,21695,8949,14276,12230,9139,4052,14918,2997, +10529,1652,1281,10391,17226,8888,10253,4356,10359,7536, +9232,1872,7394,18640,2218,17345,7537,16947,5664,2023, +11812,9438,3156,13502,12070,10633,21697,10553,20196,11814, +8486,15529,21220,9233,13985,18463,17706,1265,17711,10811, +18146,20953,17150,19675,12711,2272,2396,8198,10879,19615, +19927,17097,11610,904,15493,7913,6636,19248,3186,3081, +17969,20484,12584,1997,13484,10450,1528,20161,16609,16463, +20070,15549,16778,1613,12764,2098,10698,9593,12289,11196, +18594,13941,7398,2802,2497,3062,17397,4543,12003,21248, +11530,20922,20608,10211,8148,12468,10328,17078,17401,19462, +20886,16180,20799,10043,5430,3652,9601,16142,2464,8658, +9346,18143,13696,20930,20627,5678,12625,15873,9082,8151, +6479,6185,6755,7781,10533,8368,927,17852,4526,5549, +4900,8420,21550,15259,10057,2806,4679,4027,12974,20547, +20973,19237,6634,21516,1851,15522,13815,1386,10153,6556, +9136,2215,2283,2284,8140,1025,3852,8457,9901,11080, +10975,10700,14844,14209,6889,10976,18265,1460,5967,1461, +14188,8557,8650,1367,6254,13953,14039,17204,7492,7344, +11278,17066,14877,4006,20342,11616,20402,12186,17115,10077, +1599,1490,13954,6119,5615,5291,5260,4445,2840,6275, +5721,11282,14113,9073,9304,10477,15862,14156,8237,19970, +19971,2239,13523,10019,2274,14137,9074,18235,16578,18280, +4346,6841,19786,16579,6280,1231,6281,13525,18611,16581, +1168,944,16415,19129,9095,13632,10614,2923,9817,5862, +7484,3690,8197,3119,14448,11553,20321,9795,9239,7065, +12444,8260,13347,4096,2925,2451,10476,2125,8259,17993, +10914,19300,20651,4614,15322,15247,17594,5196,3178,5216, +14912,1693,13808,21178,17593,7912,13029,12645,2768,15496, +21182,6370,5131,19973,13279,16159,8455,13103,13214,10381, +21740,16907,8238,19898,9394,18282,10005,1879,2130,19482, +1001,11363,3129,14254,15742,20043,9788,12402,3379,7059, +1714,19028,13751,4298,5468,8675,10330,20889,18936,20677, +6330,9607,18546,14648,20936,13549,10402,20580,11726,16329, +9210,4022,13576,12241,15738,11797,15335,8577,6129,13634, +2904,5619,4012,12782,8959,15512,5621,12401,8621,17058, +6821,2247,12283,3499,6561,15337,16583,16584,5952,8563, +4018,6768,15321,6548,9368,17659,18890,20900,19087,18454, +3986,4291,14456,12134,5157,20036,20871,12286,2461,4295, +13428,3645,10110,16135,1737,4228,14729,4229,4374,5747, +19548,8517,13121,17707,2949,4997,17081,14208,14469,12564, +20703,17276,3514,12136,18950,4127,10581,19100,8189,2415, +10403,14471,17239,19105,21227,18473,13777,17091,2696,18378, +19106,19591,3602,16348,11774,4128,2986,21504,3121,10442, +9976,16496,7315,12993,7273,7113,7056,8595,3581,5084, +7431,20175,11970,10045,1921,1385,20306,12353,12556,5038, +9111,5136,6037,15401,5210,20272,17633,20010,5770,6084, +20140,10855,19707,2307,11695,12679,14495,18678,2339,18370, +6688,1888,5927,5757,17935,8974,903,11306,16089,18065, +18630,16938,11575,1341,14641,8928,18792,20935,21488,5060, +7933,20710,9170,13393,6962,15454,5020,2163,7149,16953, +3624,19618,5457,7950,13521,7466,7597,12446,10832,5503, +16749,5550,6959,8305,7340,12362,8661,13151,15258,1110, +959,7741,5064,18327,6697,20046,16797,15489,7171,3523, +995,17040,19188,13991,13704,9966,16060,3586,12314,15187, +19770,17250,4683,11687,4388,6992,3528,19195,20999,10262, +16936,9658,9665,6141,20812,18968,13203,12875,6543,5454, +8379,6341,20103,19629,2737,15181,5989,6909,14852,5655, +2797,20106,19384,7002,16929,10197,9526,11556,18027,20108, +7099,7100,11492,4810,14081,11466,4663,12076,20020,2660, +18448,953,11006,3764,3486,6337,3813,11478,2429,20343, +10083,12653,21110,6266,20409,19125,21290,16101,10088,3973, +19252,16810,10094,10095,6268,19130,5288,1878,10868,11430, +3202,7485,14018,14748,2314,10473,12604,13494,12415,3506, +17140,2860,3925,18199,19099,8727,20022,12557,2649,7669, +4028,3851,19514,19862,5854,19945,16652,13785,6606,8013, +13913,15374,5373,21397,11498,18542,12948,10213,3959,8549, +10329,7290,14439,21140,21775,5566,20676,13467,20804,8038, +5681,3963,18217,8870,13987,5885,12367,20706,11095,16096, +10611,3247,12101,16275,11759,7988,18225,4603,19607,21584, +3904,7487,3120,11561,11177,16217,4331,14816,2525,19352, +5290,10501,1715,15606,20991,20371,5534,11020,14059,14201, +10737,10738,20051,10196,11049,1707,16812,16531,9099,16969, +19060,3449,15620,19808,10235,3360,7095,12079,18491,16420, +16421,17059,7222,11050,11029,9408,9706,6925,890,4645, +3363,10254,10105,923,4765,9708,1259,6160,6161,6163, +1774,13244,15712,20650,2476,13296,8066,8069,15714,4588, +11180,1271,15759,6824,18721,3885,2124,7345,13766,3625, +4077,16798,13767,13208,11865,19189,13981,11512,11390,21690, +1181,19004,18625,15574,1133,7754,6260,12114,1754,19123, +5293,15576,7081,940,6171,5402,12832,15842,19354,15180, +15785,17998,8788,1379,15334,20498,9753,10018,19566,16856, +18746,14151,17644,16909,1616,13986,8308,15069,1634,1635, +14723,5450,5483,6380,4612,6983,9203,19569,12152,10834, +20393,7981,11680,10134,18868,18458,16430,4165,13050,14569, +6329,21258,17982,15353,18680,18470,16792,5930,10984,2334, +18383,6365,19751,16364,4097,1227,17936,1552,16077,10120, +10781,14265,20072,19010,19782,4495,15215,17256,8474,3169, +1612,3536,17897,16911,9592,6415,8077,6422,4586,14611, +14982,17142,20881,13436,6418,4886,21774,11056,20800,3010, +20631,15769,12704,2179,17037,21454,16997,13679,15588,15434, +1525,9096,9140,17615,1196,4365,13357,13358,6130,13136, +11480,7371,3610,11966,15555,15336,17551,12052,5303,1535, +9100,15474,10297,5791,13113,18009,7011,7390,7563,2258, +3305,6440,17263,12905,4053,16220,7395,9234,16390,13768, +4933,10965,13602,5294,16474,13133,5940,2327,9097,13856, +20083,14356,16482,5301,1136,15556,5426,20084,5205,1536, +16485,6825,4050,16221,4054,4890,8141,17160,17600,17168, +7004,20102,9381,12220,6650,19258,20086,12226,949,19131, +17372,6441,18676,3888,13285,8967,17384,14890,5907,17822, +18817,17825,5557,15053,8995,12712,4126,7271,6753,11920, +13757,18519,21565,13612,12877,11279,15595,12819,4132,10884, +10988,5185,11762,19698,3280,18018,11199,6940,5139,3478, +17809,2368,4167,18197,21431,1547,4734,4450,894,9617, +10215,20349,15907,3654,9112,16143,4896,17709,10809,17087, +13057,20387,3966,11586,5312,16662,12811,4129,1325,3905, +2438,21121,7807,3703,17995,1574,20589,5806,14045,13298, +13481,4154,3590,7560,1933,11024,1871,8592,20896,4946, +4976,17807,11167,8792,4158,11197,3369,14491,19829,18799, +15174,21569,2561,11419,9171,7417,3691,15261,18169,11706, +6009,19758,16259,1148,4174,3631,3385,12066,12538,10113, +2386,8065,9449,6123,13070,4339,4272,16475,7815,9091, +14427,18828,18829,8697,4116,1603,12457,9450,15808,7283, +15957,6800,8980,7284,10606,15883,2483,19344,19996,6379, +5985,8028,16062,16063,12436,9177,16064,21529,21530,2930, +3912,9178,15424,5986,12891,8699,3212,8103,13184,18833, +14006,15663,4275,4351,18283,16608,8611,19395,21315,18284, +17257,17672,18876,19934,14049,3726,3727,7579,8960,9456, +9337,12407,16227,10740,3149,18588,6062,13114,5562,18135, +18352,6827,2259,13888,11031,1711,15177,12348,13946,15083, +8978,10880,8694,11310,12403,2481,8619,9978,5538,15835, +1439,13591,15719,4523,20678,14324,16281,16052,4887,5168, +5505,9636,18330,12311,9241,9517,6997,20300,6095,5653, +8353,7872,5041,18847,12499,20520,9896,16021,2884,14176, +10974,2146,11916,1913,15375,8289,1162,12914,4545,8648, +3989,6877,1091,19716,20738,5508,8678,12520,1887,1824, +19960,11463,15437,3754,14904,14650,17986,15298,1453,11652, +12262,4194,8660,9349,4403,19507,2516,7275,11587,18651, +2470,3808,19104,8564,21173,15877,3915,6459,13556,5876, +17264,12442,10360,10008,11813,13586,15879,8094,12541,19337, +19394,9455,4735,3916,5571,4927,17069,20437,1626,13993, +1086,15360,9939,5576,17999,14300,8330,1637,14963,16483, +18488,18586,15077,8578,14061,4471,10166,16971,10198,12396, +12397,10169,1647,1648,1649,9894,1650,14104,4766,17778, +18464,20425,14940,18572,10142,4579,4473,4599,14565,1965, +6951,3900,14997,16128,20397,16098,13769,19746,8382,2654, +19190,4531,4532,15237,19187,21280,18819,21782,1491,7834, +15550,1248,3026,15828,15007,1249,14672,4241,5895,13771, +15755,7679,7281,1755,18573,15923,14128,15803,20746,14080, +2706,15463,958,13867,9325,9162,15594,8762,20304,9560, +5234,4266,3258,10564,10179,8556,7421,9285,13227,8202, +853,13008,11947,1347,3559,8733,9043,5556,6864,12140, +8360,15411,21512,13161,8574,14948,4335,2109,15071,6547, +864,10312,13015,4636,10923,11397,5292,8349,11488,10147, +19015,7258,1698,1633,15470,10784,10619,19381,21679,17997, +3607,2199,8460,12588,10383,4135,9209,12607,3152,13019, +3591,6912,21467,19056,2133,1646,21046,14418,3241,20974, +1415,21546,11374,14765,10495,6956,4835,9284,8687,13733, +3027,17366,18510,8385,4406,9387,16898,1799,11629,4341, +1891,8535,4010,15145,19630,16905,18580,6847,5870,14685, +7517,21390,1756,17308,1928,18709,3442,4594,20485,16522, +5633,4347,11931,20081,6382,6647,6807,7372,6298,914, +15509,4665,16526,5535,2114,15055,15511,1864,5203,17055, +9021,10163,15076,15581,18719,16554,11344,15513,10752,1530, +19803,17776,7916,14037,9026,21336,14247,2672,3450,19071, +7008,13700,2490,16534,17373,20416,4666,5899,11030,18425, +11351,2219,17374,10634,20170,11573,3896,16112,4230,6090, +9386,16838,3999,8523,5861,5520,20691,7184,14094,11721, +5035,13681,5704,7659,6048,16886,12515,3831,6423,19398, +8112,19824,1241,20704,5472,3927,10332,13472,2559,14931, +4383,20954,5567,17765,10534,1833,9491,5521,19748,17205, +15644,16755,11192,937,1291,2960,6369,4336,3023,10924, +16807,18627,7365,19254,20615,10194,9882,7638,8164,19794, +6437,10459,5662,11619,3879,7734,9595,14217,9602,19463, +5105,8676,3401,20365,12120,21260,17961,7243,18179,18803, +20960,9324,16796,3239,17202,14129,21206,4635,5554,16460, +19681,19555,3380,9123,19000,6290,2159,10311,7302,14070, +18693,1839,4682,1847,11684,1503,1854,16010,5911,4595, +7373,945,918,17170,19997,4699,12428,17653,10687,19747, +4774,5973,3699,16153,16129,2607,18096,21281,20822,12159, +17670,13783,13992,20049,16573,20851,3405,10478,19486,1848, +1251,8440,16155,19005,13448,12567,13452,8080,12523,20530, +19846,12189,21151,8316,21287,11906,8210,12274,20181,7313, +10084,20692,15346,5026,18511,14608,1509,16157,16158,15009, +10148,10709,12375,15579,21000,13820,15610,3972,18060,13536, +14401,8081,4407,5896,1855,21185,19126,10663,21111,3443, +5897,10156,8240,15046,13185,10815,2666,11394,1149,7076, +6640,1632,10642,19342,20390,10225,19194,2712,1153,9179, +19051,3771,12339,3728,13497,18959,15040,16830,13309,21398, +1570,18602,15797,4007,8688,19621,18055,8314,19684,18730, +2131,11500,13756,7880,10956,12063,3453,7248,5252,8752, +9722,2524,9769,7419,1656,2809,15693,1486,8203,4190, +3269,1330,1250,10503,1576,9201,2634,20605,13048,13883, +12069,18173,17810,8498,3216,7877,9415,21547,2362,14999, +6863,9359,15520,11990,10288,7576,11895,11410,3844,3882, +3374,10065,11824,5826,9015,1010,15408,5903,12684,6005, +9294,5987,16012,17950,16081,8538,4284,2549,17693,15012, +10458,21370,21116,14357,12376,9057,15582,9165,21602,8739, +12738,12739,18408,4596,14062,18409,5304,18612,16815,12383, +3091,12384,12942,4597,6652,12940,6869,19648,15666,13537, +17113,21604,8985,13851,14964,5578,16163,5735,15078,12900, +2541,21015,10168,12228,15614,16972,2044,4045,18417,19908, +21655,14063,14248,12751,21019,14856,10468,16973,10626,20488, +11407,1046,1973,1651,3092,13461,1542,21020,19810,17841, +6471,1802,15154,17462,9989,20467,4157,10172,16165,2087, +3773,7643,15825,18426,10635,20418,7794,6109,19336,8684, +5972,4340,21311,11792,10739,14047,6060,13886,12441,6320, +12916,13374,7107,2156,6686,5310,10996,4898,12296,13942, +17238,6017,7856,5377,3991,19182,2558,5905,5476,6104, +9629,19474,13657,20366,13344,10068,2469,19536,13320,7277, +11589,20961,14936,13444,15859,9087,12705,7619,18477,10839, +14450,20562,14296,16721,9499,2782,4923,13007,13259,12722, +16895,19767,4591,5867,5834,19003,12313,15783,13570,16236, +9290,11039,2942,13813,11562,4936,8979,8696,5024,15073, +19627,19488,10289,13410,1557,10843,13217,1011,10763,10822, +8003,19078,18722,16131,12429,21158,18431,10255,10485,15619, +17346,7226,14862,8249,16976,6529,9544,1653,13779,19096, +1617,17678,13176,21577,15116,8972,14854,16446,16454,16455, +19609,5146,18981,980,1272,1332,3005,15673,13071,8858, +16074,5357,12373,19644,15191,1867,17455,12096,1868,3235, +11348,9893,10298,17459,20178,15675,1723,8889,10361,5192, +13128,8652,13118,9338,14073,9041,3627,4573,17771,13659, +3435,9050,1716,4429,12275,4455,15697,1274,1510,10844, +4937,4389,13821,13454,5389,9092,12221,21297,14301,15271, +15700,9666,1718,15703,12224,15035,10680,19901,16916,2574, +15503,12087,14687,6645,2037,12394,15506,16923,17391,21049, +20486,14840,10846,12223,6813,12049,14242,6918,11042,2205, +9759,11229,9536,4083,13501,4805,19244,13301,17129,14647, +21197,19577,7044,4059,6950,7405,20544,21549,6419,13313, +12521,3288,14472,20240,5434,9625,14998,15778,7245,1548, +2562,8808,1470,17241,18269,13559,20749,8502,14666,5183, +12008,14294,17474,13295,20248,13159,21283,13970,12930,16185, +1498,3382,8780,19843,17431,20658,9014,6637,6293,5423, +4618,9657,1514,2612,15150,11227,3982,10451,4104,5763, +20760,21605,14896,7447,4223,6384,9133,12750,9761,20696, +12229,10711,14023,10754,10755,14112,17843,9947,12902,12903, +11570,9101,11839,1724,13683,4000,4008,11617,6282,17056, +4014,5947,4015,4016,8125,19818,19819,18404,4974,17655, +5734,21606,10199,5737,14269,10962,12713,12714,5050,17829, +19793,16065,12655,9838,5117,12398,1539,12752,17840,2759, +18356,20419,19594,3510,13723,7804,1070,6261,16130,3632, +7116,19631,4274,13162,14135,5994,16100,11398,7866,14428, +1167,19896,12315,10379,16574,6375,10338,20097,4559,4687, +11513,19489,12382,11337,6127,17107,3772,20134,3576,1876, +9183,21155,19571,19578,2683,17032,11770,11922,2865,14181, +18854,1420,21040,1164,4571,5307,10334,21205,20241,16879, +14295,16462,11038,14704,2036,2691,11026,13175,11750,7247, +13405,14132,1532,3601,13042,15263,7812,15467,16915,17146, +11092,1063,9627,15802,16876,21502,1992,9964,21632,14028, +6294,20133,3024,17860,13844,13420,7600,5323,7173,18934, +10064,16877,21284,4615,7434,12364,6125,19046,11107,20846, +12718,12778,18581,3553,4834,13459,8114,8200,9937,21511, +20147,11557,20604,7544,2628,3883,5106,21144,18802,5482, +13455,5912,12279,10089,16160,1102,13413,12495,4942,1520, +7201,16523,8211,3791,1856,19491,5810,12317,11718,17690, +15362,1276,5029,20354,8321,5490,14590,3936,3352,15309, +7822,14759,6316,17370,4390,946,16416,20558,21186,19216, +9941,10664,15935,18834,19050,1773,16480,7636,8828,5730, +17169,5298,6734,9354,4945,8665,17774,4206,8511,15664, +11179,14302,20355,15272,13186,19645,11630,20597,5811,5358, +15096,16725,13415,14202,12572,6602,15789,9569,14139,14140, +8666,11025,2538,9527,21659,16930,19427,14403,21531,12742, +13262,17371,11631,2966,7216,3795,3133,16151,17152,11317, +20897,18395,14537,2531,16009,9447,9053,12133,6378,15657, +17861,5889,15508,9335,1893,7729,16934,8335,9571,18073, +14598,3244,4159,13304,18021,3145,1679,1264,15297,7412, +4832,13000,20847,4836,14189,9637,16150,7253,1874,15356, +8994,13061,1487,17247,17151,6967,7620,9823,7180,2975, +6503,2610,20994,3743,1849,20855,7510,3861,2857,21066, +8266,4205,3233,12374,13846,11793,12047,12654,2799,8465, +12609,4503,3147,21210,10023,2214,9946,21694,17625,20906, +3785,11388,17767,11402,12320,6354,8424,14257,5478,21508, +13168,5561,21129,3938,9166,4598,11667,19061,9058,10463, +8165,2276,7998,10598,10099,21653,9530,11043,21607,21016, +11722,6400,19649,3662,14546,14405,6603,15667,6299,17695, +21193,9137,21608,7205,1564,1565,6604,13581,20281,16375, +16376,19650,2946,13852,3865,6653,9807,18344,13360,13361, +7448,1399,4353,18490,5036,14007,7383,17072,16178,6385, +14693,13973,17957,16555,7387,6063,16700,12091,14064,10170, +10696,14594,14547,5622,21534,15616,15312,18589,5305,19396, +12945,12753,16556,13974,14410,9763,1017,9385,6716,11290, +7223,15792,13462,7391,14406,10756,5384,15136,20992,21555, +13289,8057,19593,9638,16570,15863,7181,12161,4592,14157, +19173,889,17316,10717,2448,8262,1228,15781,21517,19166, +19686,2991,16670,11164,19878,16164,21364,15244,8371,8204, +10662,8331,2743,13305,10537,16808,20153,11424,1045,10161, +1338,17652,19480,4558,1100,12489,11717,10337,15093,5017, +6314,15357,5722,7810,16468,4387,7182,7624,17367,18098, +5356,9513,9742,7363,14589,15787,5809,14136,6597,7186, +13261,10090,21652,4593,9055,2275,5560,11666,11719,3792, +14543,21526,4718,3862,4349,13355,5033,6648,1561,14060, +16975,13418,1664,7224,7220,21211,7564,13363,21316,19390, +20489,8636,18035,1667,19813,13463,17393,1803,7700,18109, +15155,6654,21746,14251,14252,4474,5792,9991,18110,11195, +17005,20303,17344,4720,5624,6317,8883,20282,14065,20420, +5135,5793,14489,9574,2304,9410,14791,922,13889,7225, +17916,6442,14793,9707,9949,10668,11232,20668,17375,4358, +10362,5666,9545,17181,3509,7111,16099,1069,6117,19484, +20351,1840,12310,8663,15924,20279,6315,8873,20352,8508, +19425,12730,14402,1396,2302,15661,16552,16372,13577,7558, +12088,7377,16532,16970,6439,5134,1015,12740,15310,5620, +18585,9384,1663,18034,10753,11288,19386,5790,14249,21745, +9572,3296,18449,3298,13102,10751,7376,8214,13849,5425, +1337,7862,15955,8827,5493,3661,6296,5295,8700,1526, +10296,12841,8887,1721,4051,10966,1087,18336,9837,17442, +16335,2578,17363,18398,15829,15557,19389,1618,9044,10842, +13661,15786,7194,21525,17772,13578,8124,1722,6563,9948, +11335,6712,11068,7115,8509,21235,11070,12745,1016,14361, +9990,3356,2849,19516,17112,18762,13460,4046,9532,13280, +1989,978,4693,19542,16726,18357,16943,13414,5913,20330, +20417,5635,11751,18867,4928,9646,8121,1900,18390,4891, +3787,6968,4792,13905,5114,14538,4793,11309,1252,19844, +20823,6433,13212,4845,4688,16575,7364,14541,19779,4811, +18537,8451,8452,12336,6519,20721,1254,18399,18148,20784, +4552,4794,16576,11978,3353,5261,13874,10091,11223,4938, +16161,11262,9659,1578,21001,5262,19848,3031,13483,17443, +2575,3444,8212,18610,5491,21048,19787,18451,19788,18150, +15821,19789,15736,19253,4117,16698,4391,5577,915,20825, +18406,6193,17450,7285,9942,21187,18487,15662,6269,10453, +13880,11425,5265,13725,7637,17775,22349,22350,22351,22352, +22353,22354,22355,22356,22357,22358,22359,22360,22361,22362, +22363,22364,22365,22366,22367,22368,22369,22370,22371,22372, +22373,22374,22375,22376,22377,22378,22379,22380,22381,22382, +22383,22384,22385,22386,22387,22388,22389,22390,22391,22392, +22393,22394,22395,22396,22397,22398,22399,22400,22401,22402, +22403,22404,22405,22406,22407,22408,22409,22410,22411,22412, +22413,22414,22415,22416,22417,22418,22419,22420,22421,22422, +22423,22424,22425,22426,22427,22428,22429,22430,22431,22432, +22433,22434,22435,22436,22437,22438,22439,22440,22441,22442, +21115,2576,10665,6194,11720,4285,10538,7286,7206,16013, +6521,16177,1902,16724,8351,19801,1865,8539,8540,1398, +16931,8541,8241,15980,7997,15665,4276,4277,8915,5539, +16766,14404,9180,7693,12068,10464,12323,14763,4948,948, +21469,12227,13416,12898,1293,3796,10465,13635,7381,8243, +16029,18152,19850,12743,9531,18720,21371,8784,4246,9059, +14481,12744,7999,19062,19063,8000,21532,9167,3939,12657, +2967,5345,8215,8467,19064,21743,7005,14828,14829,2673, +11194,13853,950,13362,15668,6386,15669,4354,7758,10847, +4949,2947,16014,18345,6133,19909,22443,22444,22445,22446, +22447,22448,22449,22450,22451,22452,22453,22454,22455,22456, +22457,22458,22459,22460,22461,22462,22463,22464,22465,22466, +22467,22468,22469,22470,22471,22472,22473,22474,22475,22476, +22477,22478,22479,22480,22481,22482,22483,22484,22485,22486, +22487,22488,22489,22490,22491,22492,22493,22494,22495,22496, +22497,22498,22499,22500,22501,22502,22503,22504,22505,22506, +22507,22508,22509,22510,22511,22512,22513,22514,22515,22516, +22517,22518,22519,22520,22521,22522,22523,22524,22525,22526, +22527,22528,22529,22530,22531,22532,22533,22534,22535,22536, +12365,9060,10932,6387,19262,2887,16816,8246,3940,2018, +4574,6388,19274,19910,17177,16615,14548,6158,2800,15514, +17114,13975,10171,7096,5494,7388,15251,5992,3035,3036, +19074,18638,18418,7012,9695,15739,8814,15628,15629,19075, +16015,10695,17460,5206,15740,2435,7097,16049,20617,1018, +18614,18764,11983,2674,21022,10200,19391,10484,1543,14859, +21474,19651,16727,8480,19176,15433,14966,7644,19079,6472, +1544,19278,15156,6655,4509,7645,9895,18427,5208,8169, +17227,17228,16016,10723,21747,19814,19280,10472,16050,17229, +18028,19081,12356,14792,10631,16945,22537,22538,22539,22540, +22541,22542,22543,22544,22545,22546,22547,22548,22549,22550, +22551,22552,22553,22554,22555,22556,22557,22558,22559,22560, +22561,22562,22563,22564,22565,22566,22567,22568,22569,22570, +22571,22572,22573,22574,22575,22576,22577,22578,22579,22580, +22581,22582,22583,22584,22585,22586,22587,22588,22589,22590, +22591,22592,22593,22594,22595,22596,22597,22598,22599,22600, +22601,22602,22603,22604,22605,22606,22607,22608,22609,22610, +22611,22612,22613,22614,22615,22616,22617,22618,22619,22620, +22621,22622,22623,22624,22625,22626,22627,22628,22629,22630, +18842,7021,20267,19652,20421,18723,18492,12357,11840,6443, +11083,19281,11032,3640,19985,19815,9439,1903,10363,6162, +10256,14863,19988,19282,5665,13503,9546,10556,14518,2005, +17411,10053,18020,6189,21102,16718,9045,12881,5339,19842, +15130,6120,13349,19016,16612,10149,7082,19017,18757,6557, +20413,11027,14860,10370,7892,10092,7449,17223,3245,7454, +7457,18298,19440,3125,1631,3126,12116,21291,7374,11069, +19691,10164,2433,8512,9983,11668,8166,8513,8001,9682, +17340,18290,7263,11074,9696,20490,8004,12755,10108,18299, +3127,10732,6121,2358,4846,11183,22631,22632,22633,22634, +22635,22636,22637,22638,22639,22640,22641,22642,22643,22644, +22645,22646,22647,22648,22649,22650,22651,22652,22653,22654, +22655,22656,22657,22658,22659,22660,22661,22662,22663,22664, +22665,22666,22667,22668,22669,22670,22671,22672,22673,22674, +22675,22676,22677,22678,22679,22680,22681,22682,22683,22684, +22685,22686,22687,22688,22689,22690,22691,22692,22693,22694, +22695,22696,22697,22698,22699,22700,22701,22702,22703,22704, +22705,22706,22707,22708,22709,22710,22711,22712,22713,22714, +22715,22716,22717,22718,22719,22720,22721,22722,22723,22724, +11184,4848,12124,13524,13457,11426,4849,17310,9168,11186, +2581,4767,13453,11185,11334,11354,21654,11933,4700,6616, +7893,5686,15713,15963,6494,8941,6270,2583,6164,19018, +3408,17051,16090,11399,12939,3744,18341,10950,18346,19980, +3469,18240,18350,18351,20724,20697,3362,1990,18765,10934, +20444,18359,4055,10364,4703,11281,19904,3146,13528,2352, +16206,21192,20828,11044,1019,1668,16166,1545,2344,11133, +3891,21519,5525,3937,4695,19852,2277,5207,2048,19853, +15475,15599,14778,4641,16582,1089,3794,16162,21051,13487, +14480,14591,14593,15867,8247,8002,22725,22726,22727,22728, +22729,22730,22731,22732,22733,22734,22735,22736,22737,22738, +22739,22740,22741,22742,22743,22744,22745,22746,22747,22748, +22749,22750,22751,22752,22753,22754,22755,22756,22757,22758, +22759,22760,22761,22762,22763,22764,22765,22766,22767,22768, +22769,22770,22771,22772,22773,22774,22775,22776,22777,22778, +22779,22780,22781,22782,22783,22784,22785,22786,22787,22788, +22789,22790,22791,22792,22793,22794,22795,22796,22797,22798, +22799,22800,22801,22802,22803,22804,22805,22806,22807,22808, +22809,22810,22811,22812,22813,22814,22815,22816,22817,22818, +6850,8248,18353,15981,14967,17317,9413,18629,16811,16813, +6283,17622,6159,17803,16629,20331,11890,11579,12723,20381, +7207,21533,7013,7019,2635,2453,2454,6131,18172,19174, +17620,1233,20265,14694,21535,2579,18347,8269,15791,10102, +10096,2770,13583,17621,19175,11804,8168,18613,2996,20052, +19693,2815,18878,11669,20266,2998,13512,20053,18358,11984, +4357,16671,19083,3246,21656,3733,2816,7965,18211,6105, +19157,10228,12089,5391,12090,18348,10245,10250,5392,8596, +3306,10109,3307,5731,13364,1670,2914,6136,8483,17557, +19987,9271,9814,5122,9564,9967,22819,22820,22821,22822, +22823,22824,22825,22826,22827,22828,22829,22830,22831,22832, +22833,22834,22835,22836,22837,22838,22839,22840,22841,22842, +22843,22844,22845,22846,22847,22848,22849,22850,22851,22852, +22853,22854,22855,22856,22857,22858,22859,22860,22861,22862, +22863,22864,22865,22866,22867,22868,22869,22870,22871,22872, +22873,22874,22875,22876,22877,22878,22879,22880,22881,22882, +22883,22884,22885,22886,22887,22888,22889,22890,22891,22892, +22893,22894,22895,22896,22897,22898,22899,22900,22901,22902, +22903,22904,22905,22906,22907,22908,22909,22910,22911,22912, +16769,6900,14850,19718,12706,4918,8263,9548,886,5739, +14473,3992,7037,17500,17731,3521,23854,23855,23856,23857, +23858,23859,23860,23861,23862,23863,23864,23865,23866,23867, +23868,23869,23870,23871,23872,23873,23874,23875,23876,23877, +23878,23879,23880,23881,23882,23883,23884,23885,23886,23887, +23888,23889,23890,23891,23892,23893,23894,23895,23896,23897, +23898,23899,23900,23901,23902,23903,23904,23905,23906,23907, +23908,23909,23910,23911,23912,23913,23914,23915,23916,23917, +23918,23919,23920,23921,23922,23923,23924,23925,23926,23927, +23928,23929,23930,23931,23932,23933,22913,22914,22915,22916, +22917,22918,22919,22920,22921,22922,22923,22924,22925,22926, +22927,22928,22929,22930,22931,22932,22933,22934,22935,22936, +22937,22938,22939,22940,22941,22942,22943,22944,22945,22946, +22947,22948,22949,22950,22951,22952,22953,22954,22955,22956, +22957,22958,22959,22960,22961,22962,22963,22964,22965,22966, +22967,22968,22969,22970,22971,22972,22973,22974,22975,22976, +22977,22978,22979,22980,22981,22982,22983,22984,22985,22986, +22987,22988,22989,22990,22991,22992,22993,22994,22995,22996, +22997,22998,22999,23000,23001,23002,23003,23004,23005,23006 +}; + +static uint16 gbksortorder(uint16 i) +{ + uint idx=gbktail(i); + if (idx>0x7f) idx-=0x41; + else idx-=0x40; + idx+=(gbkhead(i)-0x81)*0xbe; + return 0x8100+gbk_order[idx]; +} + + +int my_strnncoll_gbk(const uchar * s1, int len1, const uchar * s2, int len2) +{ + uint len,c1,c2; + + len = min(len1,len2); + while (len--) + { + if ((len > 0) && isgbkcode(*s1,*(s1+1)) && isgbkcode(*s2, *(s2+1))) + { + c1=gbkcode(*s1,*(s1+1)); + c2=gbkcode(*s2,*(s2+1)); + if (c1!=c2) + return ((int) gbksortorder((uint16) c1) - + (int) gbksortorder((uint16) c2)); + s1+=2; + s2+=2; + --len; + } else if (sort_order_gbk[(uchar) *s1++] != sort_order_gbk[(uchar) *s2++]) + return ((int) sort_order_gbk[(uchar) s1[-1]] - + (int) sort_order_gbk[(uchar) s2[-1]]); + } + return (int) (len1-len2); +} + +int my_strcoll_gbk(const uchar * s1, const uchar * s2) +{ + return my_strnncoll_gbk(s1, (uint) strlen((char*) s1), + s2, (uint) strlen((char*) s2)); +} + +int my_strnxfrm_gbk(uchar * dest, uchar * src, int len, int srclen) +{ + uint16 e; + + len = srclen; + while (len--) + { + if ((len > 0) && isgbkcode(*src, *(src+1))) + { + e = gbksortorder((uint16) gbkcode(*src, *(src+1))); + *dest++ = gbkhead(e); + *dest++ = gbktail(e); + src+=2; + len--; + } else + *dest++ = sort_order_gbk[(uchar) *src++]; + } + return srclen; +} + +int my_strxfrm_gbk(uchar * dest, uchar * src, int len) +{ + return my_strnxfrm_gbk(dest,src,len,(uint) strlen((char*) src)); +} + +/* +** Calculate min_str and max_str that ranges a LIKE string. +** Arguments: +** ptr Pointer to LIKE string. +** ptr_length Length of LIKE string. +** escape Escape character in LIKE. (Normally '\'). +** All escape characters should be removed from min_str and max_str +** res_length Length of min_str and max_str. +** min_str Smallest case sensitive string that ranges LIKE. +** Should be space padded to res_length. +** max_str Largest case sensitive string that ranges LIKE. +** Normally padded with the biggest character sort value. +** +** The function should return 0 if ok and 1 if the LIKE string can't be +** optimized ! +*/ + +#define max_sort_char ((uchar) 255) +#define wild_one '_' +#define wild_many '%' + +extern my_bool my_like_range_gbk(const char *ptr,uint ptr_length,pchar escape, + uint res_length, char *min_str,char *max_str, + uint *min_length,uint *max_length) +{ + const char *end=ptr+ptr_length; + char *min_org=min_str; + char *min_end=min_str+res_length; + + for (; ptr != end && min_str != min_end ; ptr++) + { + if (ptr+1 != end && isgbkcode(ptr[0],ptr[1])) + { + *min_str++= *max_str++ = *ptr++; + *min_str++= *max_str++ = *ptr; + continue; + } + if (*ptr == escape && ptr+1 != end) + { + ptr++; /* Skipp escape */ + *min_str++= *max_str++ = *ptr; + continue; + } + if (*ptr == wild_one) /* '_' in SQL */ + { + *min_str++='\0'; /* This should be min char */ + *max_str++=max_sort_char; + continue; + } + if (*ptr == wild_many) /* '%' in SQL */ + { + *min_length= (uint) (min_str - min_org); + *max_length= res_length; + do { + *min_str++ = '\0'; /* Because if key compression */ + *max_str++ = max_sort_char; + } while (min_str != min_end); + return 0; + } + *min_str++= *max_str++ = *ptr; + } + *min_length= *max_length = (uint) (min_str - min_org); + while (min_str != min_end) + { + *min_str++ = ' '; /* Because if key compression */ + *max_str++ = ' '; + } + return 0; +} + + +int ismbchar_gbk(const char* p, const char *e) +{ + return (isgbkhead(*(p)) && (e)-(p)>1 && isgbktail(*((p)+1))? 2: 0); +} + +my_bool ismbhead_gbk(uint c) +{ + return isgbkhead(c); +} + +int mbcharlen_gbk(uint c) +{ + return (isgbkhead(c)? 2:0); +} diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c new file mode 100644 index 00000000000..e59a6f59dbb --- /dev/null +++ b/strings/ctype-sjis.c @@ -0,0 +1,317 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* This file is for Shift JIS charset, and created by tommy@valley.ne.jp. + */ + +#include <global.h> +#include "m_string.h" +#include "m_ctype.h" + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. strxfrm_multiply_sjis=1 + * .configure. mbmaxlen_sjis=2 + */ + +uchar NEAR ctype_sjis[257] = +{ + 0, /* For standard library */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* NUL ^A - ^G */ + 0040, 0050, 0050, 0050, 0050, 0050, 0040, 0040, /* ^H - ^O */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* ^P - ^W */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* ^X - ^Z ^[ ^\ ^] ^^ ^_ */ + 0110, 0020, 0020, 0020, 0020, 0020, 0020, 0020, /* SPC ! " # $ % ^ ' */ + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, /* ( ) * + , - . / */ + 0204, 0204, 0204, 0204, 0204, 0204, 0204, 0204, /* 0 1 2 3 4 5 6 7 */ + 0204, 0204, 0020, 0020, 0020, 0020, 0020, 0020, /* 8 9 : ; < = > ? */ + 0020, 0201, 0201, 0201, 0201, 0201, 0201, 0001, /* @ A B C D E F G */ + 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, /* H I J K L M N O */ + 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, /* P Q R S T U V W */ + 0001, 0001, 0001, 0020, 0020, 0020, 0020, 0020, /* X Y Z [ \ ] ^ _ */ + 0020, 0202, 0202, 0202, 0202, 0202, 0202, 0002, /* ` a b c d e f g */ + 0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, /* h i j k l m n o */ + 0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, /* p q r s t u v w */ + 0002, 0002, 0002, 0020, 0020, 0020, 0020, 0040, /* x y z { | } + DEL */ + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0000, 0000, 0000 +}; + +uchar NEAR to_lower_sjis[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377' +}; + +uchar NEAR to_upper_sjis[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377' +}; + +uchar NEAR sort_order_sjis[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377' +}; + +#define issjishead(c) ((0x81<=(c) && (c)<=0x9f) || \ + ((0xe0<=(c)) && (c)<=0xfc)) +#define issjistail(c) ((0x40<=(c) && (c)<=0x7e) || \ + (0x80<=(c) && (c)<=0xfc)) + + +int ismbchar_sjis(const char* p, const char *e) +{ + return (issjishead((uchar) *p) && (e-p)>1 && issjistail((uchar)p[1]) ? 2: 0); +} + +my_bool ismbhead_sjis(uint c) +{ + return issjishead((uchar) c); +} + +int mbcharlen_sjis(uint c) +{ + return (issjishead((uchar) c) ? 2: 0); +} + + +#define sjiscode(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d)) + +int my_strnncoll_sjis(const uchar *s1, int len1, const uchar *s2, int len2) +{ + const uchar *e1 = s1 + len1; + const uchar *e2 = s2 + len2; + while (s1 < e1 && s2 < e2) { + if (ismbchar_sjis((char*) s1, (char*) e1) && + ismbchar_sjis((char*) s2, (char*) e2)) { + uint c1 = sjiscode(*s1, *(s1+1)); + uint c2 = sjiscode(*s2, *(s2+1)); + if (c1 != c2) + return c1 - c2; + s1 += 2; + s2 += 2; + } else { + if (sort_order_sjis[(uchar)*s1] != sort_order_sjis[(uchar)*s2]) + return sort_order_sjis[(uchar)*s1] - sort_order_sjis[(uchar)*s2]; + s1++; + s2++; + } + } + return len1 - len2; +} + +int my_strcoll_sjis(const uchar *s1, const uchar *s2) +{ + return my_strnncoll_sjis(s1, strlen(s1), s2, strlen(s2)); +} + +int my_strnxfrm_sjis(uchar *dest, uchar *src, int len, int srclen) +{ + uchar *d_end = dest + len; + uchar *s_end = src + srclen; + while (dest < d_end && src < s_end) { + if (ismbchar_sjis((char*) src, (char*) s_end)) { + *dest++ = *src++; + if (dest < d_end && src < s_end) + *dest++ = *src++; + } else { + *dest++ = sort_order_sjis[(uchar)*src++]; + } + } + return srclen; +} + +int my_strxfrm_sjis(uchar *dest, uchar *src, int len) +{ + return my_strnxfrm_sjis(dest, src, len, strlen(src)); +} + + +/* +** Calculate min_str and max_str that ranges a LIKE string. +** Arguments: +** ptr Pointer to LIKE string. +** ptr_length Length of LIKE string. +** escape Escape character in LIKE. (Normally '\'). +** All escape characters should be removed from min_str and max_str +** res_length Length of min_str and max_str. +** min_str Smallest case sensitive string that ranges LIKE. +** Should be space padded to res_length. +** max_str Largest case sensitive string that ranges LIKE. +** Normally padded with the biggest character sort value. +** +** The function should return 0 if ok and 1 if the LIKE string can't be +** optimized ! +*/ + +#define max_sort_char ((char) 255) +#define wild_one '_' +#define wild_many '%' + +my_bool my_like_range_sjis(const char *ptr,uint ptr_length,pchar escape, + uint res_length, char *min_str,char *max_str, + uint *min_length,uint *max_length) +{ + const char *end=ptr+ptr_length; + char *min_org=min_str; + char *min_end=min_str+res_length; + + while (ptr < end && min_str < min_end) { + if (ismbchar_sjis(ptr, end)) { + *min_str++ = *max_str++ = *ptr++; + if (min_str < min_end) + *min_str++ = *max_str++ = *ptr++; + continue; + } + if (*ptr == escape && ptr+1 < end) { + ptr++; /* Skip escape */ + if (ismbchar_sjis(ptr, end)) + *min_str++ = *max_str++ = *ptr++; + if (min_str < min_end) + *min_str++ = *max_str++ = *ptr++; + continue; + } + if (*ptr == wild_one) { /* '_' in SQL */ + *min_str++ = '\0'; /* This should be min char */ + *max_str++ = max_sort_char; + ptr++; + continue; + } + if (*ptr == wild_many) { /* '%' in SQL */ + *min_length = (uint)(min_str - min_org); + *max_length = res_length; + do { + *min_str++ = ' '; /* Because if key compression */ + *max_str++ = max_sort_char; + } while (min_str < min_end); + return 0; + } + *min_str++ = *max_str++ = *ptr++; + } + *min_length = *max_length = (uint)(min_str - min_org); + while (min_str < min_end) + *min_str++ = *max_str++ = ' '; /* Because if key compression */ + return 0; +} diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c new file mode 100644 index 00000000000..bc80819c2a9 --- /dev/null +++ b/strings/ctype-tis620.c @@ -0,0 +1,656 @@ +/* + Copyright (C) 1998, 1999 by Pruet Boonma <pruet@eng.cmu.ac.th> + Copyright (C) 1998 by Theppitak Karoonboonyanan <thep@links.nectec.or.th> + Copyright (C) 1989, 1991 by Samphan Raruenrom <samphan@thai.com> + + Permission to use, copy, modify, distribute and sell this software + and its documentation for any purpose is hereby granted without fee, + provided that the above copyright notice appear in all copies. + Smaphan Raruenrom , Theppitak Karoonboonyanan and Pruet Boonma makes + no representations about the suitability of this software for any + purpose. It is provided "as is" without express or implied warranty. +*/ + + +/* $Id$ + This file is basicly tis620 character sets with some extra functions + for tis-620 handling +*/ + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. strxfrm_multiply_tis620=4 + */ + +#include <global.h> +#include <my_sys.h> +#include "m_string.h" +#include "m_ctype.h" +#include "t_ctype.h" + +static uchar* thai2sortable(const uchar *tstr,uint len); + +#define BUFFER_MULTIPLY 4 +#define buffsize(s) (BUFFER_MULTIPLY * (strlen(s) + 1)) +#define M L_MIDDLE +#define U L_UPPER +#define L L_LOWER +#define UU L_UPRUPR +#define X L_MIDDLE + + +int t_ctype[][TOT_LEVELS] = { + /*0x00*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x01*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x02*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x03*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x04*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x05*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x06*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x07*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x08*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x09*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x0A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x0B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x0C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x0D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x0E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x0F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x10*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x11*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x12*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x13*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x14*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x15*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x16*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x17*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x18*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x19*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x1A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x1B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x1C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x1D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x1E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x1F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x20*/ { IGNORE, IGNORE, L3_SPACE, IGNORE, M}, + /*0x21*/ { IGNORE, IGNORE, L3_EXCLAMATION, IGNORE, M }, + /*0x22*/ { IGNORE, IGNORE, L3_QUOTATION, IGNORE, M }, + /*0x23*/ { IGNORE, IGNORE, L3_NUMBER, IGNORE, M }, + /*0x24*/ { IGNORE, IGNORE, L3_DOLLAR, IGNORE, M }, + /*0x25*/ { IGNORE, IGNORE, L3_PERCENT, IGNORE, M }, + /*0x26*/ { IGNORE, IGNORE, L3_AMPERSAND, IGNORE, M }, + /*0x27*/ { IGNORE, IGNORE, L3_APOSTROPHE, IGNORE, M }, + /*0x28*/ { IGNORE, IGNORE, L3_L_PARANTHESIS, IGNORE, M }, + /*0x29*/ { IGNORE, IGNORE, L3_R_PARENTHESIS, IGNORE, M }, + /*0x2A*/ { IGNORE, IGNORE, L3_ASTERISK, IGNORE, M }, + /*0x2B*/ { IGNORE, IGNORE, L3_PLUS, IGNORE, M }, + /*0x2C*/ { IGNORE, IGNORE, L3_COMMA, IGNORE, M }, + /*0x2D*/ { IGNORE, IGNORE, L3_HYPHEN, IGNORE, M }, + /*0x2E*/ { IGNORE, IGNORE, L3_FULL_STOP, IGNORE, M }, + /*0x2F*/ { IGNORE, IGNORE, L3_SOLIDUS, IGNORE, M }, + /*0x30*/ { L1_08, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x31*/ { L1_18, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x32*/ { L1_28, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x33*/ { L1_38, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x34*/ { L1_48, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x35*/ { L1_58, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x36*/ { L1_68, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x37*/ { L1_78, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x38*/ { L1_88, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x39*/ { L1_98, L2_BLANK, L3_BLANK, L4_BLANK, M }, + /*0x3A*/ { IGNORE, IGNORE, L3_COLON, IGNORE, M }, + /*0x3B*/ { IGNORE, IGNORE, L3_SEMICOLON, IGNORE, M }, + /*0x3C*/ { IGNORE, IGNORE, L3_LESS_THAN, IGNORE, M }, + /*0x3D*/ { IGNORE, IGNORE, L3_EQUAL, IGNORE, M }, + /*0x3E*/ { IGNORE, IGNORE, L3_GREATER_THAN, IGNORE, M }, + /*0x3F*/ { IGNORE, IGNORE, L3_QUESTION, IGNORE, M }, + /*0x40*/ { IGNORE, IGNORE, L3_AT, IGNORE, M }, + /*0x41*/ { L1_A8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x42*/ { L1_B8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x43*/ { L1_C8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x44*/ { L1_D8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x45*/ { L1_E8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x46*/ { L1_F8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x47*/ { L1_G8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x48*/ { L1_H8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x49*/ { L1_I8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x4A*/ { L1_J8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x4B*/ { L1_K8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x4C*/ { L1_L8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x4D*/ { L1_M8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x4E*/ { L1_N8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x4F*/ { L1_O8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x50*/ { L1_P8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x51*/ { L1_Q8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x52*/ { L1_R8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x53*/ { L1_S8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x54*/ { L1_T8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x55*/ { L1_U8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x56*/ { L1_V8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x57*/ { L1_W8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x58*/ { L1_X8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x59*/ { L1_Y8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x5A*/ { L1_Z8, L2_BLANK, L3_BLANK, L4_CAP, M }, + /*0x5B*/ { IGNORE, IGNORE, L3_L_BRACKET, IGNORE, M }, + /*0x5C*/ { IGNORE, IGNORE, L3_BK_SOLIDUS, IGNORE, M }, + /*0x5D*/ { IGNORE, IGNORE, L3_R_BRACKET, IGNORE, M }, + /*0x5E*/ { IGNORE, IGNORE, L3_CIRCUMFLEX, IGNORE, M }, + /*0x5F*/ { IGNORE, IGNORE, L3_LOW_LINE, IGNORE, M }, + /*0x60*/ { IGNORE, IGNORE, L3_GRAVE, IGNORE, M }, + /*0x61*/ { L1_A8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x62*/ { L1_B8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x63*/ { L1_C8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x64*/ { L1_D8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x65*/ { L1_E8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x66*/ { L1_F8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x67*/ { L1_G8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x68*/ { L1_H8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x69*/ { L1_I8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x6A*/ { L1_J8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x6B*/ { L1_K8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x6C*/ { L1_L8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x6D*/ { L1_M8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x6E*/ { L1_N8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x6F*/ { L1_O8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x70*/ { L1_P8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x71*/ { L1_Q8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x72*/ { L1_R8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x73*/ { L1_S8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x74*/ { L1_T8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x75*/ { L1_U8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x76*/ { L1_V8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x77*/ { L1_W8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x78*/ { L1_X8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x79*/ { L1_Y8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x7A*/ { L1_Z8, L2_BLANK, L3_BLANK, L4_MIN, M }, + /*0x7B*/ { IGNORE, IGNORE, L3_L_BRACE, IGNORE, M }, + /*0x7C*/ { IGNORE, IGNORE, L3_V_LINE, IGNORE, M }, + /*0x7D*/ { IGNORE, IGNORE, L3_R_BRACE, IGNORE, M }, + /*0x7E*/ { IGNORE, IGNORE, L3_TILDE, IGNORE, M }, + /*0x7F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x80*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x81*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x82*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x83*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x84*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x85*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x86*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x87*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x88*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x89*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x8A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x8B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x8C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x8D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x8E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x8F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x90*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x91*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x92*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x93*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x94*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x95*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x96*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x97*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x98*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x99*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x9A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x9B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x9C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x9D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x9E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0x9F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0xA0*/ { IGNORE, IGNORE, L3_NB_SACE, IGNORE, X }, + /*0xA1*/ { L1_KO_KAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xA2*/ { L1_KHO_KHAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xA3*/ { L1_KHO_KHUAT, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xA4*/ { L1_KHO_KHWAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xA5*/ { L1_KHO_KHON, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xA6*/ { L1_KHO_RAKHANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xA7*/ { L1_NGO_NGU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xA8*/ { L1_CHO_CHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xA9*/ { L1_CHO_CHING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xAA*/ { L1_CHO_CHANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xAB*/ { L1_SO_SO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xAC*/ { L1_CHO_CHOE, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xAD*/ { L1_YO_YING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xAE*/ { L1_DO_CHADA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xAF*/ { L1_TO_PATAK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB0*/ { L1_THO_THAN, L2_BLANK,L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB1*/ { L1_THO_NANGMONTHO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB2*/ { L1_THO_PHUTHAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB3*/ { L1_NO_NEN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB4*/ { L1_DO_DEK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB5*/ { L1_TO_TAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB6*/ { L1_THO_THUNG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB7*/ { L1_THO_THAHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB8*/ { L1_THO_THONG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xB9*/ { L1_NO_NU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xBA*/ { L1_BO_BAIMAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xBB*/ { L1_PO_PLA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xBC*/ { L1_PHO_PHUNG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xBD*/ { L1_FO_FA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xBE*/ { L1_PHO_PHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xBF*/ { L1_FO_FAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC0*/ { L1_PHO_SAMPHAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC1*/ { L1_MO_MA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC2*/ { L1_YO_YAK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC3*/ { L1_RO_RUA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC4*/ { L1_RU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC5*/ { L1_LO_LING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC6*/ { L1_LU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC7*/ { L1_WO_WAEN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC8*/ { L1_SO_SALA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xC9*/ { L1_SO_RUSI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xCA*/ { L1_SO_SUA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xCB*/ { L1_HO_HIP, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xCC*/ { L1_LO_CHULA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xCD*/ { L1_O_ANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xCE*/ { L1_HO_NOKHUK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, + /*0xCF*/ { IGNORE, IGNORE, L3_PAIYAN_NOI, IGNORE, M}, + /*0xD0*/ { L1_SARA_A, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel}, + /*0xD1*/ { L1_MAI_HAN_AKAT, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel}, + /*0xD2*/ { L1_SARA_AA, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel}, + /*0xD3*/ { L1_SARA_AM, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel}, + /*0xD4*/ { L1_SARA_I, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel}, + /*0xD5*/ { L1_SARA_II, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel}, + /*0xD6*/ { L1_SARA_UE, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel}, + /*0xD7*/ { L1_SARA_UEE, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel}, + /*0xD8*/ { L1_SARA_U, L2_BLANK, L3_BLANK, L4_BLANK, L | _lwrvowel}, + /*0xD9*/ { L1_SARA_UU, L2_BLANK, L3_BLANK, L4_BLANK, L | _lwrvowel}, + /*0xDA*/ { IGNORE, L2_PINTHU, L3_BLANK, L4_BLANK, L }, + /*0xDB*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0xDC*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0xDD*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0xDE*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0xDF*/ { IGNORE, IGNORE, L3_BAHT, IGNORE, M}, + /*0xE0*/ { L1_SARA_E, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel }, + /*0xE1*/ { L1_SARA_AE, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel }, + /*0xE2*/ { L1_SARA_O, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel }, + /*0xE3*/ { L1_SARA_AI_MAIMUAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel }, + /*0xE4*/ { L1_SARA_AI_MAIMALAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel }, + /*0xE5*/ { L1_SARA_AA, L2_BLANK, L3_BLANK, L4_EXT, M | _fllwvowel }, + /*0xE6*/ { IGNORE, IGNORE, L3_MAI_YAMOK, IGNORE, M | _stone }, + /*0xE7*/ { IGNORE, L2_TYKHU, L3_BLANK, L4_BLANK, U | _diacrt1 | _stone }, + /*0xE8*/ { IGNORE, L2_TONE1, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone }, + /*0xE9*/ { IGNORE, L2_TONE2, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone }, + /*0xEA*/ { IGNORE, L2_TONE3, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone }, + /*0xEB*/ { IGNORE, L2_TONE4, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone }, + /*0xEC*/ { IGNORE, L2_GARAN, L3_BLANK, L4_BLANK, UU | _diacrt2 | _combine | _stone }, + /*0xED*/ { L1_NKHIT, L2_BLANK, L3_BLANK, L4_BLANK, U | _diacrt1 }, + /*0xEE*/ { IGNORE, L2_YAMAK, L3_BLANK, L4_BLANK, U | _diacrt1 }, + /*0xEF*/ { IGNORE, IGNORE, L3_FONGMAN, IGNORE, M }, + /*0xF0*/ { L1_08, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF1*/ { L1_18, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF2*/ { L1_28, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF3*/ { L1_38, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF4*/ { L1_48, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF5*/ { L1_58, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF6*/ { L1_68, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF7*/ { L1_78, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF8*/ { L1_88, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xF9*/ { L1_98, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, + /*0xFA*/ { IGNORE, IGNORE, L3_ANGKHANKHU, IGNORE, X }, + /*0xFB*/ { IGNORE, IGNORE, L3_KHOMUT, IGNORE, X }, + /*0xFC*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0xFD*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0xFE*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, + /*0xFF*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, +}; + +uchar NEAR ctype_tis620[257] = +{ + 0, /* For standard library */ + 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, + 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, + 72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16, + 16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16, + 16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + +uchar NEAR to_lower_tis620[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR to_upper_tis620[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +uchar NEAR sort_order_tis620[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '\\', ']', '[', '^', '_', + 'E', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', 'Y', '\177', + (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207', + (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217', + (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227', + (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237', + (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247', + (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257', + (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267', + (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277', + (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307', + (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317', + (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327', + (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337', + (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347', + (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357', + (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367', + (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', +}; + +/* Convert thai string to "Standard C String Function" sortable string + Arg: const source string and length of converted string + Ret: Sortable string +*/ + +static uchar* thai2sortable(const uchar * tstr,uint len) +{ + const uchar* p = tstr; + uchar *outBuf; + uchar *pRight1, *pRight2, *pRight3, *pRight4; + uchar *pLeft1, *pLeft2, *pLeft3, *pLeft4; + uint bufSize; + + len = (uint) strnlen((char*) tstr,len); + bufSize = buffsize((char*) tstr); + if(!(pRight1 = (uchar *)malloc(sizeof(uchar) * bufSize))) { + return( (uchar*) tstr); + } + pLeft1 = pRight1; + outBuf = pRight1; + if(!(pRight2 = (uchar *)malloc(sizeof(uchar) * (len + 1)))) { + free(pRight1); + return((uchar*) tstr); + } + pLeft2 = pRight2; + if(!(pRight3 = (uchar *)malloc(sizeof(uchar) * (len + 1)))) { + free(pRight1); + free(pRight2); + return((uchar*) tstr); + } + pLeft3 = pRight3; + if(!(pRight4 = (uchar *)malloc(sizeof(uchar) * (len + 1)))) { + free(pRight1); + free(pRight2); + free(pRight3); + return((uchar*) tstr); + } + pLeft4 = pRight4; + while(len--) { + if(isldvowel(*p) && isconsnt(p[1])) { + *pRight1++ = t_ctype[p[1]][0]; + *pRight2++ = t_ctype[p[1]][1]; + *pRight3++ = t_ctype[p[1]][2]; + *pRight4++ = t_ctype[p[1]][3]; + *pRight1++ = t_ctype[*p][0]; + *pRight2++ = t_ctype[*p][1]; + *pRight3++ = t_ctype[*p][2]; + *pRight4++ = t_ctype[*p][3]; + len--; + p += 2; + } else { + *pRight1 = t_ctype[*p][0]; + if(*pRight1 != IGNORE) pRight1++; + *pRight2 = t_ctype[*p][1]; + if(*pRight2 != IGNORE) pRight2++; + *pRight3 = t_ctype[*p][2]; + if(*pRight3 != IGNORE) pRight3++; + *pRight4 = t_ctype[*p][3]; + if(*pRight4 != IGNORE) pRight4++; + p++; + } + } + *pRight1++ = L2_BLANK; + *pRight2++ = L3_BLANK; + *pRight3++ = L4_BLANK; + *pRight4++ = '\0'; + memcpy(pRight1, pLeft2, pRight2 - pLeft2); + pRight1 += pRight2 - pLeft2; + memcpy(pRight1, pLeft3, pRight3 - pLeft3); + pRight1 += pRight3 - pLeft3; + memcpy(pRight1, pLeft4, pRight4 - pLeft4); + free(pLeft2); + free(pLeft3); + free(pLeft4); + return(outBuf); +} + +/* strncoll() replacement, compare 2 string, both are conveted to sortable string + Arg: 2 Strings and it compare length + Ret: strcmp result +*/ +int my_strnncoll_tis620(const uchar * s1, int len1, const uchar * s2, int len2) +{ + uchar *tc1, *tc2; + int i; + tc1 = thai2sortable(s1, len1); + tc2 = thai2sortable(s2, len2); + i = strcmp((char*)tc1, (char*)tc2); + free(tc1); + free(tc2); + return(i); +} + +/* strnxfrm replacment, convert Thai string to sortable string + Arg: Destination buffer, source string, dest length and source length + Ret: Conveted string size +*/ +int my_strnxfrm_tis620(uchar * dest, uchar * src, int len, int srclen) +{ + uint bufSize; + uchar *tmp; + bufSize = buffsize((char*)src); + tmp = thai2sortable(src,srclen); + set_if_smaller(bufSize,(uint) len); + memcpy((uchar *)dest, tmp, bufSize); + free(tmp); + return (int) bufSize; +} + +/* strcoll replacment, compare 2 strings + Arg: 2 strings + Ret: strcmp result +*/ +int my_strcoll_tis620(const uchar * s1, const uchar * s2) +{ + uchar *tc1, *tc2; + int i; + tc1 = thai2sortable(s1, (uint) strlen((char*)s1)); + tc2 = thai2sortable(s2, (uint) strlen((char*)s2)); + i = strcmp((char*)tc1, (char*)tc2); + free(tc1); + free(tc2); + return(i); +} + +/* strxfrm replacment, convert Thai string to sortable string + Arg: Destination buffer, String and dest buffer size + Ret: Converting string size +*/ +int my_strxfrm_tis620(uchar * dest, uchar * src, int len) +{ + uint bufSize; + uchar *tmp; + + bufSize = buffsize((char*) src); + tmp = thai2sortable(src, len); + memcpy((uchar *) dest, tmp, bufSize); + free(tmp); + return bufSize; +} + +/* Convert SQL like string to C string + Arg: String, its length, escape character, resource length, minimal string and maximum string + Ret: Alway 0 +*/ +my_bool my_like_range_tis620(const char *ptr, uint ptr_length, pchar escape, + uint res_length, char *min_str, char *max_str, + uint *min_length,uint *max_length) +{ + char *end; + char *min_org= min_str; + char *min_end = min_str + res_length; + char *tbuff; + uchar *tc; + uint tbuff_length; + + tbuff = (char*) (tc=thai2sortable((uchar*) ptr, ptr_length)); + tbuff_length = buffsize(ptr); + end = tbuff + tbuff_length; + for(;tbuff != end && min_str != min_end; tbuff++) + { + if(*tbuff == escape && tbuff + 1 != end) + { + tbuff++; + *min_str++ = *max_str++ = *tbuff; + continue; + } + if(*tbuff == '_') + { + *min_str++ = '\0'; + *max_str++ = '\255'; + continue; + } + if(*tbuff == '%') + { + *min_length= (uint) (min_str - min_org); + *max_length= res_length; + do + { + *min_str++ = ' '; + *max_str++ = '\255'; + } while(min_str != min_end); + free(tc); + return(0); + } + *min_str++ = *max_str++ = *tbuff; + } + *min_length= *max_length = (uint) (min_str - min_org); + while(min_str != min_end) + { + *min_str++ = *max_str++ = ' '; + } + free(tc); + return(0); +} + +/* Thai normalization for input sub system + Arg: Buffer, 's length, String, 'length + Ret: Void +*/ +void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length) +{ + const uchar* fr = from; + uchar* p = ptr; + + if(length > field_length) { + length = field_length; + } + while (length--) + { + if((istone(*fr) || isdiacrt1(*fr)) && + (islwrvowel(fr[1]) || isuprvowel(fr[1]))) + { + *p = fr[1]; + p[1] = *fr; + fr += 2; + p += 2; + length--; + } + else + { + *p++ = *fr++; + } + } +} diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c new file mode 100644 index 00000000000..a29a61bf2c0 --- /dev/null +++ b/strings/ctype-ujis.c @@ -0,0 +1,183 @@ +/* This file is for Japanese EUC charset, and created by tommy@valley.ne.jp. + */ + +/* + * This comment is parsed by configure to create ctype.c, + * so don't change it unless you know what you are doing. + * + * .configure. mbmaxlen_ujis=3 + */ + +#include <global.h> +#include "m_string.h" + +uchar NEAR ctype_ujis[257] = +{ + 0, /* For standard library */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* NUL ^A - ^G */ + 0040, 0050, 0050, 0050, 0050, 0050, 0040, 0040, /* ^H - ^O */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* ^P - ^W */ + 0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* ^X - ^Z ^[ ^\ ^] ^^ ^_ */ + 0110, 0020, 0020, 0020, 0020, 0020, 0020, 0020, /* SPC ! " # $ % ^ ' */ + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, /* ( ) * + , - . / */ + 0204, 0204, 0204, 0204, 0204, 0204, 0204, 0204, /* 0 1 2 3 4 5 6 7 */ + 0204, 0204, 0020, 0020, 0020, 0020, 0020, 0020, /* 8 9 : ; < = > ? */ + 0020, 0201, 0201, 0201, 0201, 0201, 0201, 0001, /* @ A B C D E F G */ + 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, /* H I J K L M N O */ + 0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, /* P Q R S T U V W */ + 0001, 0001, 0001, 0020, 0020, 0020, 0020, 0020, /* X Y Z [ \ ] ^ _ */ + 0020, 0202, 0202, 0202, 0202, 0202, 0202, 0002, /* ` a b c d e f g */ + 0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, /* h i j k l m n o */ + 0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, /* p q r s t u v w */ + 0002, 0002, 0002, 0020, 0020, 0020, 0020, 0040, /* x y z { | } + DEL */ + 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, + 0000, 0000, 0000, 0000, 0000, 0000, 0020, 0020, + 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, + 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000, + 0000, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, + 0020, 0020, 0020, 0020, 0020, 0020, 0020, 0000, +}; + +uchar NEAR to_lower_ujis[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377', +}; + +uchar NEAR to_upper_ujis[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377', +}; + +uchar NEAR sort_order_ujis[]= +{ + '\000','\001','\002','\003','\004','\005','\006','\007', + '\010','\011','\012','\013','\014','\015','\016','\017', + '\020','\021','\022','\023','\024','\025','\026','\027', + '\030','\031','\032','\033','\034','\035','\036','\037', + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', + '\200','\201','\202','\203','\204','\205','\206','\207', + '\210','\211','\212','\213','\214','\215','\216','\217', + '\220','\221','\222','\223','\224','\225','\226','\227', + '\230','\231','\232','\233','\234','\235','\236','\237', + '\240','\241','\242','\243','\244','\245','\246','\247', + '\250','\251','\252','\253','\254','\255','\256','\257', + '\260','\261','\262','\263','\264','\265','\266','\267', + '\270','\271','\272','\273','\274','\275','\276','\277', + '\300','\301','\302','\303','\304','\305','\306','\307', + '\310','\311','\312','\313','\314','\315','\316','\317', + '\320','\321','\322','\323','\324','\325','\326','\327', + '\330','\331','\332','\333','\334','\335','\336','\337', + '\340','\341','\342','\343','\344','\345','\346','\347', + '\350','\351','\352','\353','\354','\355','\356','\357', + '\360','\361','\362','\363','\364','\365','\366','\367', + '\370','\371','\372','\373','\374','\375','\376','\377', +}; + + +#define isujis(c) ((0xa1<=((c)&0xff) && ((c)&0xff)<=0xfe)) +#define iskata(c) ((0xa1<=((c)&0xff) && ((c)&0xff)<=0xdf)) +#define isujis_ss2(c) (((c)&0xff) == 0x8e) +#define isujis_ss3(c) (((c)&0xff) == 0x8f) + + +int ismbchar_ujis(const char* p, const char *e) +{ + return ((*(uchar*)(p)<0x80)? 0:\ + isujis(*(p)) && (e)-(p)>1 && isujis(*((p)+1))? 2:\ + isujis_ss2(*(p)) && (e)-(p)>1 && iskata(*((p)+1))? 2:\ + isujis_ss3(*(p)) && (e)-(p)>2 && isujis(*((p)+1)) && isujis(*((p)+2))? 3:\ + 0); +} + +my_bool ismbhead_ujis(uint c) +{ + return (isujis(c) || isujis_ss2(c) || isujis_ss3(c)); +} + +int mbcharlen_ujis(uint c) +{ + return (isujis(c)? 2: isujis_ss2(c)? 2: isujis_ss3(c)? 3: 0); +} diff --git a/strings/ctype.c b/strings/ctype.c new file mode 100644 index 00000000000..16b652d42f1 --- /dev/null +++ b/strings/ctype.c @@ -0,0 +1,68 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +#include <global.h> + +#include <m_ctype.h> + +/* generated by make, using conf_to_src */ +#include "ctype_extra_sources.c" + +/* generated by configure */ +#include "ctype_autoconf.c" + +CHARSET_INFO *default_charset_info = &compiled_charsets[0]; + +CHARSET_INFO *find_compiled_charset(uint cs_number) +{ + CHARSET_INFO *cs; + for (cs = compiled_charsets; cs->number > 0; cs++) + if (cs->number == cs_number) + return cs; + + return NULL; +} + +CHARSET_INFO *find_compiled_charset_by_name(const char *name) +{ + CHARSET_INFO *cs; + for (cs = compiled_charsets; cs->number > 0; cs++) + if (!strcmp(cs->name, name)) + return cs; + + return NULL; +} + +uint8 compiled_charset_number(const char *name) +{ + CHARSET_INFO *cs; + for (cs = compiled_charsets; cs->number > 0; cs++) + if (!strcmp(cs->name, name)) + return cs->number; + + return 0; /* this mimics find_type() */ +} + +const char *compiled_charset_name(uint8 charset_number) +{ + CHARSET_INFO *cs; + for (cs = compiled_charsets; cs->number > 0; cs++) + if (cs->number == charset_number) + return cs->name; + + return "?"; /* this mimics get_type() */ +} diff --git a/strings/do_ctype.c b/strings/do_ctype.c new file mode 100644 index 00000000000..e05926bf8d3 --- /dev/null +++ b/strings/do_ctype.c @@ -0,0 +1,200 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* Prints case-convert and sort-convert tabell on stdout. This is used to + make _ctype.c easyer */ + +#ifdef DBUG_OFF +#undef DBUG_OFF +#endif + +#include <global.h> +#include <ctype.h> +#include <my_sys.h> +#include "m_string.h" + +uchar NEAR to_upper[256]; +uchar NEAR to_lower[256],NEAR sort_order[256]; + +static int ascii_output=1; +static string tab_names[]={ "to_lower[]={","to_upper[]={","sort_order[]={" }; +static uchar* tabell[]= {to_lower,to_upper,sort_order}; + +void get_options(),init_case_convert(); + +main(argc,argv) +int argc; +char *argv[]; +{ + int i,j,ch; + DBUG_ENTER ("main"); + DBUG_PROCESS (argv[0]); + + get_options(&argc,&argv); + init_case_convert(); + puts("Tabells for caseconverts and sorttest of characters\n"); + for (i=0 ; i < 3 ; i++) + { + printf("uchar NEAR %s\n",tab_names[i]); + for (j=0 ; j <= 255 ; j++) + { + ch=(int) tabell[i][j]; + if (ascii_output && isprint(ch) && ! (ch & 128)) + { + if (strchr("\\'",(char) ch)) + printf("'\\%c', ",ch); + else + printf("'%c', ",ch); + } + else + printf("'\\%03o',",ch); + if ((j+1 & 7) == 0) + puts(""); + } + puts("};\n"); + } + DBUG_RETURN(0); +} /* main */ + + /* Read options */ + +void get_options(argc,argv) +register int *argc; +register char **argv[]; +{ + int help,version; + char *pos,*progname; + + progname= (*argv)[0]; + help=0; ascii_output=1; + while (--*argc >0 && *(pos = *(++*argv)) == '-' ) + { + while (*++pos) + { + version=0; + switch(*pos) { + case 'n': /* Numeric output */ + ascii_output=0; + break; + case '#': + DBUG_PUSH (++pos); + *(pos--) = '\0'; /* Skippa argument */ + break; + case 'V': + version=1; + case 'I': + case '?': + printf("%s Ver 1.0\n",progname); + if (version) + break; + puts("Output tabells of to_lower[], to_upper[] and sortorder[]\n"); + printf("Usage: %s [-n?I]\n",progname); + puts("Options: -? or -I \"Info\" -n \"numeric output\""); + break; + default: + fprintf(stderr,"illegal option: -%c\n",*pos); + break; + } + } + } + return; +} /* get_options */ + + + /* set up max character for which isupper() and toupper() gives */ + /* right answer. Is usually 127 or 255 */ + +#ifdef USE_INTERNAL_CTYPE +#define MAX_CHAR_OK CHAR_MAX /* All chars is right */ +#else +#define MAX_CHAR_OK 127 /* 7 Bit ascii */ +#endif + + /* Initiate arrays for case-conversation */ + +void init_case_convert() +{ + reg1 int16 i; + reg2 uchar *higher_pos,*lower_pos; + DBUG_ENTER("init_case_convert"); + + for (i=0 ; i <= MAX_CHAR_OK ; i++) + { + to_upper[i]= sort_order[i]= (islower(i) ? toupper(i) : (char) i); + to_lower[i]= (isupper(i) ? tolower(i) : (char) i); + } +#if MAX_CHAR_OK != 255 + for (i--; i++ < 255 ;) + to_upper[i]= sort_order[i]= to_lower[i]= (char) i; +#endif + +#ifdef MSDOS + higher_pos= (uchar * ) "\217\216\231\232\220"; /* Extra chars to konv. */ + lower_pos= (uchar * ) "\206\204\224\201\202"; +#else +#if defined(HPUX) && ASCII_BITS_USED == 8 + higher_pos= (uchar * ) "\xd0\xd8\xda\xdb\xdc\xd3"; + lower_pos= (uchar * ) "\xd4\xcc\xce\xdf\xc9\xd7"; +#else +#ifdef USE_INTERNAL_CTYPE + higher_pos=lower_pos= (uchar* ) ""; /* System converts chars */ +#else +#if defined(DEC_MULTINATIONAL_CHAR) || defined(HP_MULTINATIONAL_CHAR) + higher_pos= (uchar * ) "\305\304\326\311\334"; + lower_pos= (uchar * ) "\345\344\366\351\374"; +#else + higher_pos= (uchar * ) "[]\\@^"; + lower_pos= (uchar * ) "{}|`~"; +#endif +#endif /* USE_INTERNAL_CTYPE */ +#endif /* HPUX */ +#endif /* MSDOS */ + + while (*higher_pos) + { + to_upper[ *lower_pos ] = sort_order[ *lower_pos ] = (char) *higher_pos; + to_lower[ *higher_pos++ ] = (char) *lower_pos++; + } + + /* sets upp sortorder; higer_pos character (upper and lower) is */ + /* changed to lower_pos character */ + +#ifdef MSDOS + higher_pos= (uchar *) "\217\216\231\232\220"; + lower_pos= (uchar *) "\216\217\231YE"; +#else +#if defined(HPUX) && ASCII_BITS_USED == 8 + higher_pos= lower_pos= (uchar *) ""; /* Tecknen i r{tt ordning */ +#else +#ifdef USE_ISO_8859_1 /* As in USG5 ICL-386 */ + higher_pos= (uchar *) "\305\304\326\334\311"; + lower_pos= (uchar *) "\304\305\326YE"; +#else + higher_pos= (uchar *) "][\\~`"; /* R{tt ordning p} tecknen */ + lower_pos= (uchar *) "[\\]YE"; /* Ordning enligt ascii */ +#endif /* USE_ISO_8859_1 */ +#endif /* HPUX */ +#endif /* MSDOS */ + + while (*higher_pos) + { + sort_order[ *higher_pos ] = + sort_order[(uchar)to_lower[*higher_pos]] = *lower_pos; + higher_pos++; lower_pos++; + } + DBUG_VOID_RETURN; +} /* init_case_convert */ diff --git a/strings/int2str.c b/strings/int2str.c new file mode 100644 index 00000000000..4003e8a6167 --- /dev/null +++ b/strings/int2str.c @@ -0,0 +1,155 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + Defines: int2str(), itoa(), ltoa() + + int2str(dst, radix, val) + converts the (long) integer "val" to character form and moves it to + the destination string "dst" followed by a terminating NUL. The + result is normally a pointer to this NUL character, but if the radix + is dud the result will be NullS and nothing will be changed. + + If radix is -2..-36, val is taken to be SIGNED. + If radix is 2.. 36, val is taken to be UNSIGNED. + That is, val is signed if and only if radix is. You will normally + use radix -10 only through itoa and ltoa, for radix 2, 8, or 16 + unsigned is what you generally want. + + _dig_vec is public just in case someone has a use for it. + The definitions of itoa and ltoa are actually macros in m_string.h, + but this is where the code is. + + Note: The standard itoa() returns a pointer to the argument, when int2str + returns the pointer to the end-null. + itoa assumes that 10 -base numbers are allways signed and other arn't. +*/ + +#include <global.h> +#include "m_string.h" + +char NEAR _dig_vec[] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + +char *int2str(register long int val, register char *dst, register int radix) +{ + char buffer[65]; + register char *p; + long int new_val; + + if (radix < 0) { + if (radix < -36 || radix > -2) return NullS; + if (val < 0) { + *dst++ = '-'; + val = -val; + } + radix = -radix; + } else { + if (radix > 36 || radix < 2) return NullS; + } + /* The slightly contorted code which follows is due to the + fact that few machines directly support unsigned long / and %. + Certainly the VAX C compiler generates a subroutine call. In + the interests of efficiency (hollow laugh) I let this happen + for the first digit only; after that "val" will be in range so + that signed integer division will do. Sorry 'bout that. + CHECK THE CODE PRODUCED BY YOUR C COMPILER. The first % and / + should be unsigned, the second % and / signed, but C compilers + tend to be extraordinarily sensitive to minor details of style. + This works on a VAX, that's all I claim for it. + */ + p = &buffer[sizeof(buffer)-1]; + *p = '\0'; + new_val=(ulong) val / (ulong) radix; + *--p = _dig_vec[(uchar) ((ulong) val- (ulong) new_val*(ulong) radix)]; + val = new_val; +#ifdef HAVE_LDIV + while (val != 0) + { + ldiv_t res; + res=ldiv(val,radix); + *--p = _dig_vec[res.rem]; + val= res.quot; + } +#else + while (val != 0) + { + new_val=val/radix; + *--p = _dig_vec[(uchar) (val-new_val*radix)]; + val= new_val; + } +#endif + while ((*dst++ = *p++) != 0) ; + return dst-1; +} + + +/* + This is a faster version of the above optimized for the normal case of + radix 10 / -10 +*/ + +char *int10_to_str(long int val,char *dst,int radix) +{ + char buffer[65]; + register char *p; + long int new_val; + + if (radix < 0) /* -10 */ + { + if (val < 0) + { + *dst++ = '-'; + val = -val; + } + } + + p = &buffer[sizeof(buffer)-1]; + *p = '\0'; + new_val= (long) ((unsigned long int) val / 10); + *--p = '0'+ (char) ((unsigned long int) val - (unsigned long) new_val * 10); + val = new_val; + + while (val != 0) + { + new_val=val/10; + *--p = '0' + (char) (val-new_val*10); + val= new_val; + } + while ((*dst++ = *p++) != 0) ; + return dst-1; +} + + +#ifdef USE_MY_ITOA + + /* Change to less general itoa interface */ + +char *my_itoa(int val, char *dst, int radix) +{ + VOID(int2str((long) val,dst,(radix == 10 ? -10 : radix))); + return dst; +} + +char *my_ltoa(long int val, char *dst, int radix) +{ + VOID(int2str((long) val,dst,(radix == 10 ? -10 : radix))); + return dst; +} + +#endif diff --git a/strings/is_prefix.c b/strings/is_prefix.c new file mode 100644 index 00000000000..d3f2b148de2 --- /dev/null +++ b/strings/is_prefix.c @@ -0,0 +1,34 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : is_prefix.c + Author : Michael Widenius + Defines: is_prefix() + + is_prefix(s, t) returns 1 if s starts with t. + A empty t is allways a prefix. +*/ + +#include <global.h> +#include "m_string.h" + +int is_prefix(register const char *s, register const char *t) +{ + while (*t) + if (*s++ != *t++) return 0; + return 1; /* WRONG */ +} diff --git a/strings/latin2.def b/strings/latin2.def new file mode 100644 index 00000000000..159d01894f3 --- /dev/null +++ b/strings/latin2.def @@ -0,0 +1,478 @@ +; Character code definition file for latin2 languages (for use with cset) +; it's written for Czech, but may be used generally; works +; minimum for Slovenian alphabet too (or at least I hope so) +; +; Written by Jaromir Dolecek <dolecek@ics.muni.cz> +; +; Notes of defined sorting order: +; Upper/Lower case is ignored +; All characters with the accents are sorted after appropriate +; character without accent in order: +; Xacute, Xring , Xcaron, Xslash, Xcedilla, Xogonek, Xcircumflex, +; Xbreve, Xhungarumlaut, Xdieresis, Xdotaccent +; +latin2 +*** +NUL 0 C +SOH C +STX C +ETX C +EOT C +ENQ C +ACK C +BEL C +BS C +HT CS +LF CS +VT CS +FF CS +CR CS +SO C +SI C +DLE C +DC1 C +DC2 C +DC3 C +DC4 C +NAK C +SYN C +ETB C +CAN C +EM C +SUB C +ESC C +FS C +GS C +RS C +US C +/space BS +/exclam P +/quotedbl P +/numbersign P +/dollar P +/percent P +/ampersand P +/quoteright P +/parenleft P +/parenright P +/asterisk P +/plus P +/comma P +/minus P +/period P +/slash P +/zero NX +/one NX +/two NX +/three NX +/four NX +/five NX +/six NX +/seven NX +/eight NX +/nine NX +/colon P +/semicolon P +/less P +/equal P +/greater P +/question P +/at P +/A UX +/B UX +/C UX +/D UX +/E UX +/F UX +/G U +/H U +/I U +/J U +/K U +/L U +/M U +/N U +/O U +/P U +/Q U +/R U +/S U +/T U +/U U +/V U +/W U +/X U +/Y U +/Z U +/bracketleft P +/backslash P +/bracketright P +/asciicircum P +/underscore P +/quoteleft P +/a LX +/b LX +/c LX +/d LX +/e LX +/f LX +/g L +/h L +/i L +/j L +/k L +/l L +/m L +/n L +/o L +/p L +/q L +/r L +/s L +/t L +/u L +/v L +/w L +/x L +/y L +/z L +/braceleft P +/bar P +/braceright P +/tilde P +NUL_ C +SOH_ C +STX_ C +ETX_ C +EOT_ C +ENQ_ C +ACK_ C +BEL_ C +BS_ C +HT_ CS +LF_ CS +VT_ CS +FF_ CS +CR_ CS +SO_ C +SI_ C +DLE_ C +DC1_ C +DC2_ C +DC3_ C +DC4_ C +NAK_ C +SYN_ C +ETB_ C +CAN_ C +EM_ C +SUB_ C +ESC_ C +FS_ C +GS_ C +RS_ C +US_ C +/space_ SB +/Aogonek U +/breve P +/Lslash U +/currency P +/Lcaron U +/Sacute U +/dieresis P +/Scaron 169 U +/Scedilla U +/Tcaron U +/Zacute U +/hyphen P +/Zcaron U +/Zdotaccent U +/degree P +/aogonek L +/ogonek P +/lslash L +/acute P +/lcaron L +/sacute L +/caron P +/cedilla P +/scaron L +/scedilla L +/tcaron L +/zacute L +/hungarumlaut P +/zcaron L +/zdotaccent L +/Racute U +/Aacute U +/Acircumflex U +/Abreve U +/Adieresis U +/Lacute U +/Cacute U +/Ccedilla U +/Ccaron U +/Eacute U +/Eogonek U +/Edieresis U +/Ecaron U +/Iacute U +/Icircumflex U +/Dcaron U +/Eth P +/Nacute U +/Ncaron U +/Oacute U +/Ocircumflex U +/Ohungarumlaut U +/Odieresis U +/multiply P +/Rcaron U +/Uring U +/Uacute U +/Uhungarumlaut U +/Udieresis U +/Yacute U +/Tcedilla U +/germandbls P +/racute L +/aacute L +/acircumflex L +/abreve L +/adieresis L +/lacute L +/cacute L +/ccedilla L +/ccaron L +/eacute L +/eogonek L +/edieresis L +/ecaron L +/iacute L +/icircumflex L +/dcaron L +/dbar L +/nacute L +/ncaron L +/oacute L +/ocircumflex L +/ohungarumlaut L +/odieresis L +/divide P +/rcaron L +/uring L +/uacute L +/uhungarumlaut L +/udieresis L +/yacute L +/tcedilla L +/dotaccent P +*** +/A /a +/B /b +/C /c +/D /d +/E /e +/F /f +/G /g +/H /h +/I /i +/J /j +/K /k +/L /l +/M /m +/N /n +/O /o +/P /p +/Q /q +/R /r +/S /s +/T /t +/U /u +/V /v +/W /w +/X /x +/Y /y +/Z /z +/Aogonek /aogonek +/Lslash /lslash +/Lcaron /lcaron +/Sacute /sacute +/Scaron /scaron +/Scedilla /scedilla +/Tcaron /tcaron +/Zacute /zacute +/Zcaron /zcaron +/Zdotaccent /zdotaccent +/Racute /racute +/Aacute /aacute +/Acircumflex /acircumflex +/Abreve /abreve +/Adieresis /adieresis +/Lacute /lacute +/Cacute /cacute +/Ccedilla /ccedilla +/Ccaron /ccaron +/Eacute /eacute +/Eogonek /eogonek +/Edieresis /edieresis +/Ecaron /ecaron +/Iacute /iacute +/Icircumflex /icircumflex +/Dcaron /dcaron +/Nacute /nacute +/Ncaron /ncaron +/Oacute /oacute +/Ocircumflex /ocircumflex +/Ohungarumlaut /ohungarumlaut +/Odieresis /odieresis +/Rcaron /rcaron +/Uring /uring +/Uacute /uacute +/Uhungarumlaut /uhungarumlaut +/Udieresis /udieresis +/Yacute /yacute +/Tcedilla /tcedilla +*** +NUL NUL_ +SOH SOH_ +STX STX_ +ETX ETX_ +EOT EOT_ +ENQ ENQ_ +ACK ACK_ +BEL BEL_ +BS BS_ +HT HT_ +LF LF_ +VT VT_ +FF FF_ +CR CR_ +SO SO_ +SI SI_ +DLE DLE_ +DC1 DC1_ +DC2 DC2_ +DC3 DC3_ +DC4 DC4_ +NAK NAK_ +SYN SYN_ +ETB ETB_ +CAN CAN_ +EM EM_ +SUB SUB_ +ESC ESC_ +FS FS_ +GS GS_ +RS RS_ +US US_ +/space +/exclam +/quotedbl +/numbersign +/dollar +/percent +/ampersand +/quoteright +/parenleft +/parenright +/asterisk +/plus +/comma +/minus +/period +/slash +/zero +/one +/two +/three +/four +/five +/six +/seven +/eight +/nine +/colon +/semicolon +/less +/equal +/greater +/question +/at +/A /a +/Aogonek /aogonek +/Aacute /aacute +/Acircumflex /acircumflex +/Abreve /abreve +/Adieresis /adieresis +/B /b +/C /c +/Cacute /cacute +/Ccaron /ccaron +/Ccedilla /ccedilla +/D /d +/Dcaron /dcaron +/E /e +/Eacute /eacute +/Ecaron /ecaron +/Eogonek /eogonek +/Edieresis /edieresis +/F /f +/G /g +/H /h +/I /i +/Icircumflex +/icircumflex +/Iacute /iacute +/J /j +/K /k +/L /l +/Lslash /lslash +/Lcaron /lcaron +/Lacute /lacute +/M /m +/N /n +/Nacute /nacute +/Ncaron /ncaron +/O /o +/Oacute /oacute +/Ocircumflex /ocircumflex +/Ohungarumlaut /ohungarumlaut +/Odieresis /odieresis +/P /p +/Q /q +/R /r +/Racute /racute +/Rcaron /rcaron +/S /s +/Sacute /sacute +/Scaron /scaron +/Scedilla /scedilla +/T /t +/Tcaron /tcaron +/Tcedilla /tcedilla +/U /u +/Uacute /uacute +/Uring /uring +/Uhungarumlaut /uhungarumlaut +/Udieresis /udieresis +/V /v +/W /w +/X /x +/Y /y +/Yacute /yacute +/Z /z +/Zacute /zacute +/Zcaron /zcaron +/Zdotaccent /zdotaccent +/bracketleft +/backslash +/bracketright +/asciicircum +/underscore +/quoteleft +/braceleft +/bar +/braceright +/tilde +*** diff --git a/strings/llstr.c b/strings/llstr.c new file mode 100644 index 00000000000..a8514d7e369 --- /dev/null +++ b/strings/llstr.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + Defines: llstr(); + + llstr(value, buff); + + This function saves a longlong value in a buffer and returns the pointer to + the buffer. This is useful when trying to portable print longlong + variables with printf() as there is no usable printf() standard one can use. +*/ + + +#include <global.h> +#include "m_string.h" + +char *llstr(longlong value,char *buff) +{ + longlong2str(value,buff,10); + return buff; +} diff --git a/strings/longlong2str-x86.s b/strings/longlong2str-x86.s new file mode 100644 index 00000000000..8ce711f812e --- /dev/null +++ b/strings/longlong2str-x86.s @@ -0,0 +1,141 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Optimized longlong2str function for Intel 80x86 (gcc/gas syntax) */ +/* Some set sequences are optimized for pentuimpro II */ + + .file "longlong2str.s" + .version "1.01" + +.text + .align 4 + +.globl longlong2str + .type longlong2str,@function + +longlong2str: + subl $80,%esp + pushl %ebp + pushl %esi + pushl %edi + pushl %ebx + movl 100(%esp),%esi /* Lower part of val */ + movl 104(%esp),%ebp /* Higher part of val */ + movl 108(%esp),%edi /* get dst */ + movl 112(%esp),%ebx /* Radix */ + movl %ebx,%eax + testl %eax,%eax + jge .L144 + + addl $36,%eax + cmpl $34,%eax + ja .Lerror /* Wrong radix */ + testl %ebp,%ebp + jge .L146 + movb $45,(%edi) /* Add sign */ + incl %edi /* Change sign of val */ + negl %esi + adcl $0,%ebp + negl %ebp +.L146: + negl %ebx /* Change radix to positive */ + jmp .L148 + .p2align 4,,7 +.L144: + addl $-2,%eax + cmpl $34,%eax + ja .Lerror /* Radix in range */ + +.L148: + movl %esi,%eax /* Test if zero (for easy loop) */ + orl %ebp,%eax + jne .L150 + movb $48,(%edi) + incl %edi + jmp .L164 + .p2align 4,,7 + +.L150: + leal 92(%esp),%ecx /* End of buffer */ + jmp .L155 + .p2align 4,,7 + +.L153: + /* val is stored in in ebp:esi */ + + movl %ebp,%eax /* High part of value */ + xorl %edx,%edx + divl %ebx + movl %eax,%ebp + movl %esi,%eax + divl %ebx + movl %eax,%esi /* quotent in ebp:esi */ + movb _dig_vec(%edx),%al /* al is faster than dl */ + decl %ecx + movb %al,(%ecx) /* store value in buff */ + .p2align 4,,7 +.L155: + testl %ebp,%ebp + ja .L153 + testl %esi,%esi /* rest value */ + jl .L153 + je .L160 /* Ready */ + movl %esi,%eax + movl $_dig_vec,%ebp + .p2align 4,,7 + +.L154: /* Do rest with integer precision */ + cltd + divl %ebx + decl %ecx + movb (%edx,%ebp),%dl /* bh is always zero as ebx=radix < 36 */ + testl %eax,%eax + movb %dl,(%ecx) + jne .L154 + +.L160: + movl %ecx,%esi + leal 92(%esp),%ecx /* End of buffer */ + subl %esi,%ecx + rep + movsb + +.L164: + movl %edi,%eax /* Pointer to end null */ + movb $0,(%edi) /* Store the end null */ + +.L165: + popl %ebx + popl %edi + popl %esi + popl %ebp + addl $80,%esp + ret + +.Lerror: + xorl %eax,%eax /* Wrong radix */ + jmp .L165 + +.Lfe3: + .size longlong2str,.Lfe3-longlong2str + +.globl longlong10_to_str + .type longlong10_str,@function +longlong10_to_str: + jmp longlong2str + +.L10end: + .size longlong10_to_str,.L10end-longlong10_to_str diff --git a/strings/longlong2str.c b/strings/longlong2str.c new file mode 100644 index 00000000000..5c4eaf98c85 --- /dev/null +++ b/strings/longlong2str.c @@ -0,0 +1,143 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + Defines: longlong2str(); + + longlong2str(dst, radix, val) + converts the (longlong) integer "val" to character form and moves it to + the destination string "dst" followed by a terminating NUL. The + result is normally a pointer to this NUL character, but if the radix + is dud the result will be NullS and nothing will be changed. + + If radix is -2..-36, val is taken to be SIGNED. + If radix is 2.. 36, val is taken to be UNSIGNED. + That is, val is signed if and only if radix is. You will normally + use radix -10 only through itoa and ltoa, for radix 2, 8, or 16 + unsigned is what you generally want. + + _dig_vec is public just in case someone has a use for it. + The definitions of itoa and ltoa are actually macros in m_string.h, + but this is where the code is. + + Note: The standard itoa() returns a pointer to the argument, when int2str + returns the pointer to the end-null. + itoa assumes that 10 -base numbers are allways signed and other arn't. +*/ + +#include <global.h> +#include "m_string.h" + +#if defined(HAVE_LONG_LONG) && !defined(longlong2str) && !defined(HAVE_LONGLONG2STR) + +extern char NEAR _dig_vec[]; + +/* + This assumes that longlong multiplication is faster than longlong division. +*/ + +char *longlong2str(longlong val,char *dst,int radix) +{ + char buffer[65]; + register char *p; + long long_val; + + if (radix < 0) + { + if (radix < -36 || radix > -2) return (char*) 0; + if (val < 0) { + *dst++ = '-'; + val = -val; + } + radix = -radix; + } + else + { + if (radix > 36 || radix < 2) return (char*) 0; + } + if (val == 0) + { + *dst++='0'; + *dst='\0'; + return dst; + } + p = &buffer[sizeof(buffer)-1]; + *p = '\0'; + + while ((ulonglong) val > (ulonglong) LONG_MAX) + { + ulonglong quo=(ulonglong) val/(uint) radix; + uint rem= (uint) (val- quo* (uint) radix); + *--p = _dig_vec[rem]; + val= quo; + } + long_val= (long) val; + while (long_val != 0) + { + long quo= long_val/radix; + *--p = _dig_vec[(uchar) (long_val - quo*radix)]; + long_val= quo; + } + while ((*dst++ = *p++) != 0) ; + return dst-1; +} + +#endif + +#ifndef longlong10_to_str +char *longlong10_to_str(longlong val,char *dst,int radix) +{ + char buffer[65]; + register char *p; + long long_val; + + if (radix < 0) + { + if (val < 0) + { + *dst++ = '-'; + val = -val; + } + } + + if (val == 0) + { + *dst++='0'; + *dst='\0'; + return dst; + } + p = &buffer[sizeof(buffer)-1]; + *p = '\0'; + + while ((ulonglong) val > (ulonglong) LONG_MAX) + { + ulonglong quo=(ulonglong) val/(uint) 10; + uint rem= (uint) (val- quo* (uint) 10); + *--p = _dig_vec[rem]; + val= quo; + } + long_val= (long) val; + while (long_val != 0) + { + long quo= long_val/10; + *--p = _dig_vec[(uchar) (long_val - quo*10)]; + long_val= quo; + } + while ((*dst++ = *p++) != 0) ; + return dst-1; +} +#endif diff --git a/strings/macros.asm b/strings/macros.asm new file mode 100644 index 00000000000..4cd5397fbaa --- /dev/null +++ b/strings/macros.asm @@ -0,0 +1,147 @@ +; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +; +; This library is free software; you can redistribute it and/or +; modify it under the terms of the GNU Library General Public +; License as published by the Free Software Foundation; either +; version 2 of the License, or (at your option) any later version. +; +; This library is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; Library General Public License for more details. +; +; You should have received a copy of the GNU Library General Public +; License along with this library; if not, write to the Free +; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +; MA 02111-1307, USA + +; Some useful macros
+
+ .386P
+ .387
+
+_FLAT equ 0 ;FLAT memory model
+_STDCALL equ 0 ;default to _stdcall
+I386 equ 1
+
+begcode macro module
+ if _FLAT
+_TEXT segment dword use32 public 'CODE'
+ assume CS:FLAT,DS:FLAT,SS:FLAT
+ else
+_TEXT segment dword public 'CODE'
+ assume CS:_TEXT
+ endif
+ endm
+
+endcode macro module
+_TEXT ENDS
+ endm
+
+begdata macro
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Set up segments for data
+; Regular initialized data goes in _DATA
+
+_DATA segment dword public 'DATA'
+_DATA ends
+
+;Function pointers to constructors
+XIB segment dword public 'DATA'
+XIB ends
+XI segment dword public 'DATA'
+XI ends
+XIE segment dword public 'DATA'
+XIE ends
+
+;Function pointers to destructors
+XCB segment dword public 'DATA'
+XCB ends
+XC segment dword public 'DATA'
+XC ends
+XCE segment dword public 'DATA'
+XCE ends
+
+;Constant data, such as switch tables, go here.
+
+CONST segment dword public 'CONST'
+CONST ends
+
+;Segment for uninitialized data. This is set to 0 by the startup code/OS,
+;so it does not consume room in the executable file.
+
+_BSS segment dword public 'BSS'
+_BSS ends
+
+HUGE_BSS segment dword public 'HUGE_BSS'
+HUGE_BSS ends
+
+EEND segment dword public 'ENDBSS'
+EEND ends
+
+STACK segment para stack 'STACK'
+STACK ends
+DGROUP group _DATA,XIB,XI,XIE,XCB,XC,XCE,CONST,_BSS,EEND,STACK
+
+_DATA segment
+ if _FLAT
+ assume DS:FLAT
+ else
+ assume DS:DGROUP
+ endif
+ endm
+
+enddata macro
+_DATA ends
+ endm
+
+P equ 8 ; Offset of start of parameters on the stack frame
+ ; From EBP assuming EBP was pushed.
+PS equ 4 ; Offset of start of parameters on the stack frame
+ ; From ESP assuming EBP was NOT pushed.
+ESeqDS equ 0
+FSeqDS equ 0
+GSeqDS equ 0
+SSeqDS equ 1
+SIZEPTR equ 4 ; Size of a pointer
+LPTR equ 0
+SPTR equ 1
+LCODE equ 0
+
+func macro name
+_&name proc near
+ ifndef name
+name equ _&name
+ endif
+ endm
+
+callm macro name
+ call _&name
+ endm
+
+;Macros to replace public, extrn, and endp for C-callable assembly routines,
+; and to define labels: c_label defines labels,
+; c_public replaces public, c_extrn replaces extrn, and c_endp replaces endp
+
+c_name macro name
+ name equ _&name
+ endm
+
+c_label macro name
+_&name:
+ endm
+
+c_endp macro name
+_&name ENDP
+ endm
+
+clr macro list ;clear a register
+ irp reg,<list>
+ xor reg,reg
+ endm
+ endm
+
+jmps macro lbl
+ jmp short lbl
+ endm
diff --git a/strings/make-ccc b/strings/make-ccc new file mode 100755 index 00000000000..78d5ad1ce42 --- /dev/null +++ b/strings/make-ccc @@ -0,0 +1,3 @@ +ccc -DHAVE_CONFIG_H -I. -I. -I.. -I./../include -I../include -O -DDBUG_OFF -fast -O3 -fomit-frame-pointer -c atof.c bchange.c bcmp.c bfill.c bmove.c bmove512.c bmove_upp.c ct_init.c ctype-latin1.c int2str.c is_prefix.c llstr.c longlong2str.c r_strinstr.c str2int.c strappend.c strcend.c strcont.c strend.c strfill.c strinstr.c strmake.c strmov.c strnmov.c strstr.c strtol.c strtoll.c strtoul.c strtoull.c strxmov.c strxnmov.c +rm libmystrings.a +ar -cr libmystrings.a atof.o diff --git a/strings/memcmp.c b/strings/memcmp.c new file mode 100644 index 00000000000..1bb8deaeac0 --- /dev/null +++ b/strings/memcmp.c @@ -0,0 +1,46 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* memcmp(lhs, rhs, len) + compares the two memory areas lhs[0..len-1] ?? rhs[0..len-1]. It + returns an integer less than, equal to, or greater than 0 according + as lhs[-] is lexicographically less than, equal to, or greater than + rhs[-]. Note that this is not at all the same as bcmp, which tells + you *where* the difference is but not what. + + Note: suppose we have int x, y; then memcmp(&x, &y, sizeof x) need + not bear any relation to x-y. This is because byte order is machine + dependent, and also, some machines have integer representations that + are shorter than a machine word and two equal integers might have + different values in the spare bits. On a ones complement machine, + -0 == 0, but the bit patterns are different. +*/ + +#include "strings.h" + +#if !defined(HAVE_MEMCPY) + +int memcmp(lhs, rhs, len) + register char *lhs, *rhs; + register int len; +{ + while (--len >= 0) + if (*lhs++ != *rhs++) return (uchar) lhs[-1] - (uchar) rhs[-1]; + return 0; +} + +#endif diff --git a/strings/memcpy.c b/strings/memcpy.c new file mode 100644 index 00000000000..4fc84fb6052 --- /dev/null +++ b/strings/memcpy.c @@ -0,0 +1,35 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + memcpy(dst, src, len) + moves len bytes from src to dst. The result is dst. This is not + the same as strncpy or strnmov, while move a maximum of len bytes + and stop early if they hit a NUL character. This moves len bytes + exactly, no more, no less. See also bcopy() and bmove() which do + not return a value but otherwise do the same job. +*/ + +#include "strings.h" + +char *memcpy(char *dst, register char *src, register int len) +{ + register char *d; + + for (d = dst; --len >= 0; *d++ = *src++) ; + return dst; +} diff --git a/strings/memset.c b/strings/memset.c new file mode 100644 index 00000000000..57c8fea5ebe --- /dev/null +++ b/strings/memset.c @@ -0,0 +1,35 @@ +/* File : memset.c + Author : Richard A. O'Keefe. + Updated: 25 May 1984 + Defines: memset() + + memset(dst, chr, len) + fills the memory area dst[0..len-1] with len bytes all equal to chr. + The result is dst. See also bfill(), which has no return value and + puts the last two arguments the other way around. + + Note: the VAX assembly code version can only handle 0 <= len < 2^16. + It is presented for your interest and amusement. +*/ + +#include "strings.h" + +#if VaxAsm + +char *memset(char *dst,int chr, int len) +{ + asm("movc5 $0,*4(ap),8(ap),12(ap),*4(ap)"); + return dst; +} + +#else ~VaxAsm + +char *memset(char *dst, register pchar chr, register int len) +{ + register char *d; + + for (d = dst; --len >= 0; *d++ = chr) ; + return dst; +} + +#endif VaxAsm diff --git a/strings/ptr_cmp.asm b/strings/ptr_cmp.asm new file mode 100644 index 00000000000..6106016ee32 --- /dev/null +++ b/strings/ptr_cmp.asm @@ -0,0 +1,180 @@ +; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +; +; This library is free software; you can redistribute it and/or +; modify it under the terms of the GNU Library General Public +; License as published by the Free Software Foundation; either +; version 2 of the License, or (at your option) any later version. +; +; This library is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; Library General Public License for more details. +; +; You should have received a copy of the GNU Library General Public +; License along with this library; if not, write to the Free +; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +; MA 02111-1307, USA + + TITLE Optimized cmp of pointer to strings of unsigned chars + +ifndef M_I386 + .8087 + DOSSEG + .MODEL LARGE + .DATA +compare_length dw 0 + .CODE STRINGS + + PUBLIC _get_ptr_compare +_get_ptr_compare PROC + mov bx,sp + mov cx,ss:[BX+4] + mov compare_length,cx + mov dx,seg strings:_ptr_cmp + mov ax,offset _ptr_cmp_0 + jcxz @F + mov ax,offset _ptr_cmp_1 + dec cx + jz @F + mov ax,offset _ptr_cmp +@@: ret +_get_ptr_compare ENDP + +_ptr_cmp_0 PROC + mov AX,0 ; Emptyt strings are always equal + ret +_ptr_cmp_0 ENDP + + +_ptr_cmp_1 PROC + mov bx,sp + mov dx,si ; Save si and ds + mov cx,ds + lds si,DWORD PTR ss:[bx+4] ; s1 + lds si,DWORD PTR ds:[si] + mov al,ds:[si] + xor ah,ah + lds si,DWORD PTR ss:[bx+8] ; s2 + lds si,DWORD PTR ds:[si] + mov bl,ds:[si] + mov bh,ah + sub ax,bx + mov ds,cx ; restore si and ds + mov si,dx + ret +_ptr_cmp_1 ENDP + +_ptr_cmp PROC + mov bx,bp ; Save bp + mov dx,di ; Save di + mov bp,sp + push ds + push si + mov cx,compare_length ; Length of memory-area + lds si,DWORD PTR [bp+4] ; s1 + lds si,DWORD PTR ds:[si] + les di,DWORD PTR [bp+8] ; s2 + les di,DWORD PTR es:[di] +; cld ; Work uppward + xor ax,ax + repe cmpsb ; Compare strings + je @F ; Strings are equal + sbb ax,ax + cmc + adc ax,0 + +@@: pop si + pop ds + mov di,dx + mov bp,bx + ret +_ptr_cmp ENDP + +else + +include macros.asm + +fix_es MACRO fix_cld ; Load ES if neaded + ife ESeqDS + mov ax,ds + mov es,ax + endif + ifnb <fix_cld> + cld + endif + ENDM + + begdata +compare_length dd 0 ; Length of strings + enddata + + begcode get_ptr_compare + public _get_ptr_compare +_get_ptr_compare proc near + mov ecx,P-SIZEPTR[esp] + mov compare_length,ecx + mov eax,offset _TEXT:_ptr_cmp_0 + jecxz @F + mov eax,offset _TEXT:_ptr_cmp_1 + dec ecx + jz @F + mov eax,offset _TEXT:_ptr_cmp +@@: ret +_get_ptr_compare endp + endcode _get_ptr_compare + + + begcode ptr_cmp_0 +_ptr_cmp_0 PROC + mov EAX,0 ; Emptyt strings are always equal + ret +_ptr_cmp_0 ENDP + endcode ptr_cmp_0 + + + begcode ptr_cmp_1 +_ptr_cmp_1 proc near + mov edx,esi ; Save esi + mov esi,P-SIZEPTR[esp] ; *s1 + mov esi,[esi] + movzx eax,[esi] + mov esi,P[esp] ; *s2 + mov esi,[esi] + movzx ecx,[esi] + sub eax,ecx + mov esi,edx ; Restore esi + ret +_ptr_cmp_1 ENDP + endcode ptr_cmp_1 + + + begcode ptr_cmp +_ptr_cmp proc near + fix_es 1 + push ebp + mov ebp,esp + mov edx,edi ; Save esi + push esi + mov esi,P[ebp] ; *s1 + mov esi,[esi] + mov edi,P+SIZEPTR[ebp] ; *s2 + mov edi,[edi] + mov ecx,compare_length ; Length of memory-area + xor eax,eax + repe cmpsb ; Compare strings + je @F ; Strings are equal + + sbb eax,eax + cmc + adc eax,0 + +@@: pop esi + mov edi,edx + pop ebp + ret +_ptr_cmp ENDP + endcode ptr_cmp + +endif + + END diff --git a/strings/r_strinstr.c b/strings/r_strinstr.c new file mode 100644 index 00000000000..882a4eda412 --- /dev/null +++ b/strings/r_strinstr.c @@ -0,0 +1,52 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + Author : David + strintstr(src, from, pat) looks for an instance of pat in src + backwards from pos from. pat is not a regex(3) pattern, it is a literal + string which must be matched exactly. + The result 0 if the pattern was not found else it is the start char of + the pattern counted from the begining of the string. +*/ + +#include <global.h> +#include "m_string.h" + +uint r_strinstr(reg1 my_string str,int from, reg4 my_string search) +{ + reg2 my_string i, j; + uint len = (uint) strlen(search); + /* pointer to the last char of buff */ + my_string start = str + from - 1; + /* pointer to the last char of search */ + my_string search_end = search + len - 1; + + skipp: + while (start >= str) /* Cant be != because the first char */ + { + if (*start-- == *search_end) + { + i = start; j = search_end - 1; + while (j >= search && start > str) + if (*i-- != *j--) + goto skipp; + return (uint) ((start - len) - str + 3); + } + } + return (0); +} diff --git a/strings/str2int.c b/strings/str2int.c new file mode 100644 index 00000000000..55fcd56adb9 --- /dev/null +++ b/strings/str2int.c @@ -0,0 +1,202 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + str2int(src, radix, lower, upper, &val) + converts the string pointed to by src to an integer and stores it in + val. It skips leading spaces and tabs (but not newlines, formfeeds, + backspaces), then it accepts an optional sign and a sequence of digits + in the specified radix. The result should satisfy lower <= *val <= upper. + The result is a pointer to the first character after the number; + trailing spaces will NOT be skipped. + + If an error is detected, the result will be NullS, the value put + in val will be 0, and errno will be set to + EDOM if there are no digits + ERANGE if the result would overflow or otherwise fail to lie + within the specified bounds. + Check that the bounds are right for your machine. + This looks amazingly complicated for what you probably thought was an + easy task. Coping with integer overflow and the asymmetric range of + twos complement machines is anything but easy. + + So that users of atoi and atol can check whether an error occured, + I have taken a wholly unprecedented step: errno is CLEARED if this + call has no problems. +*/ + +#include <global.h> +#include "m_string.h" +#include "m_ctype.h" +#include "my_sys.h" /* defines errno */ +#include <errno.h> + +#define char_val(X) (X >= '0' && X <= '9' ? X-'0' :\ + X >= 'A' && X <= 'Z' ? X-'A'+10 :\ + X >= 'a' && X <= 'z' ? X-'a'+10 :\ + '\177') + +char *str2int(register const char *src, register int radix, long int lower, long int upper, long int *val) +{ + int sign; /* is number negative (+1) or positive (-1) */ + int n; /* number of digits yet to be converted */ + long limit; /* "largest" possible valid input */ + long scale; /* the amount to multiply next digit by */ + long sofar; /* the running value */ + register int d; /* (negative of) next digit */ + char *start; + int digits[32]; /* Room for numbers */ + + /* Make sure *val is sensible in case of error */ + + *val = 0; + + /* Check that the radix is in the range 2..36 */ + +#ifndef DBUG_OFF + if (radix < 2 || radix > 36) { + errno=EDOM; + return NullS; + } +#endif + + /* The basic problem is: how do we handle the conversion of + a number without resorting to machine-specific code to + check for overflow? Obviously, we have to ensure that + no calculation can overflow. We are guaranteed that the + "lower" and "upper" arguments are valid machine integers. + On sign-and-magnitude, twos-complement, and ones-complement + machines all, if +|n| is representable, so is -|n|, but on + twos complement machines the converse is not true. So the + "maximum" representable number has a negative representative. + Limit is set to min(-|lower|,-|upper|); this is the "largest" + number we are concerned with. */ + + /* Calculate Limit using Scale as a scratch variable */ + + if ((limit = lower) > 0) limit = -limit; + if ((scale = upper) > 0) scale = -scale; + if (scale < limit) limit = scale; + + /* Skip leading spaces and check for a sign. + Note: because on a 2s complement machine MinLong is a valid + integer but |MinLong| is not, we have to keep the current + converted value (and the scale!) as *negative* numbers, + so the sign is the opposite of what you might expect. + */ + while (isspace(*src)) src++; + sign = -1; + if (*src == '+') src++; else + if (*src == '-') src++, sign = 1; + + /* Skip leading zeros so that we never compute a power of radix + in scale that we won't have a need for. Otherwise sticking + enough 0s in front of a number could cause the multiplication + to overflow when it neededn't. + */ + start=(char*) src; + while (*src == '0') src++; + + /* Move over the remaining digits. We have to convert from left + to left in order to avoid overflow. Answer is after last digit. + */ + + for (n = 0; (digits[n]=char_val(*src)) < radix && n < 20; n++,src++) ; + + /* Check that there is at least one digit */ + + if (start == src) { + errno=EDOM; + return NullS; + } + + /* The invariant we want to maintain is that src is just + to the right of n digits, we've converted k digits to + sofar, scale = -radix**k, and scale < sofar < 0. Now + if the final number is to be within the original + Limit, we must have (to the left)*scale+sofar >= Limit, + or (to the left)*scale >= Limit-sofar, i.e. the digits + to the left of src must form an integer <= (Limit-sofar)/(scale). + In particular, this is true of the next digit. In our + incremental calculation of Limit, + + IT IS VITAL that (-|N|)/(-|D|) = |N|/|D| + */ + + for (sofar = 0, scale = -1; --n >= 1;) + { + if ((long) -(d=digits[n]) < limit) { + errno=ERANGE; + return NullS; + } + limit = (limit+d)/radix, sofar += d*scale; scale *= radix; + } + if (n == 0) + { + if ((long) -(d=digits[n]) < limit) /* get last digit */ + { + errno=ERANGE; + return NullS; + } + sofar+=d*scale; + } + + /* Now it might still happen that sofar = -32768 or its equivalent, + so we can't just multiply by the sign and check that the result + is in the range lower..upper. All of this caution is a right + pain in the neck. If only there were a standard routine which + says generate thus and such a signal on integer overflow... + But not enough machines can do it *SIGH*. + */ + if (sign < 0) + { + if (sofar < -LONG_MAX || (sofar= -sofar) > upper) + { + errno=ERANGE; + return NullS; + } + } + else if (sofar < lower) + { + errno=ERANGE; + return NullS; + } + *val = sofar; + errno=0; /* indicate that all went well */ + return (char*) src; +} + + /* Theese are so slow compared with ordinary, optimized atoi */ + +#ifdef WANT_OUR_ATOI + +int atoi(const char *src) +{ + long val; + str2int(src, 10, (long) INT_MIN, (long) INT_MAX, &val); + return (int) val; +} + + +long atol(const char *src) +{ + long val; + str2int(src, 10, LONG_MIN, LONG_MAX, &val); + return val; +} + +#endif /* WANT_OUR_ATOI */ diff --git a/strings/str_test.c b/strings/str_test.c new file mode 100644 index 00000000000..069e7a5b487 --- /dev/null +++ b/strings/str_test.c @@ -0,0 +1,270 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* Test of all stringfunktions that is coded in assembler */ + +#include <global.h> +#include <stdarg.h> +#include "m_string.h" + +#define F_LEN 8 +#define F_CHAR 'A' +#define F_FILL 'B' +#define T_LEN 15 +#define T_CHAR 'D' +#define T_FILL 'E' +#define F_PREFILL '0' +#define T_PREFILL '1' + +static char from_buff[100],to_buff[100]; +static my_string from,to; +static int errors,tests; +static int test_strarg(char *name,...); +static void init_strings (void); /* Init from and to */ +void test_arg (my_string message,long func_value,long value); +int compare_buff (my_string message,my_string b1,my_string b2,int length, + pchar fill, pchar prefill); + +int my_test(int a) +{ + return a ? 1 : 0; +} + +int main(void) +{ + static char v1[]="Monty",v2[]="on",v3[]="Montys",v4[]="ty",v5[]="gr", + v6[]="hohohoo",v7[]="hohoo",v8[]="hohooo",v9[]="t", + cont[]="qwet"; + errors=tests=0; + init_strings(); + + test_arg("bcmp(from,to,5)",(long) my_test(bcmp(from,to,5)),1L); + test_arg("bcmp(from,from,5)",(long) bcmp(from,from,5),0L); + + test_arg("bcmp(from,to,0)",(long) bcmp(from,to,0),0L); + test_arg("strend(from)",(long) strend(from),(long) from+F_LEN); + test_arg("strchr(v1,'M')",(long) strchr(v1,'M'),(long) v1); + test_arg("strchr(v1,'y')",(long) strchr(v1,'y'),(long) v1+4); + test_arg("strchr(v1,'x')",(long) strchr(v1,'x'),0L); + test_arg("strcont(v1,cont)",(long) strcont(v1,cont),(long) v1+3); + test_arg("strcont(v1,v2)",(long) strcont(v1,v2),(long) v1+1); + test_arg("strcont(v1,v5)",(long) strcont(v1,v5),0L); + test_arg("is_prefix(v3,v1)",(long) is_prefix(v3,v1),1L); + test_arg("is_prefix(v1,v3)",(long) is_prefix(v1,v3),0L); + test_arg("is_prefix(v3,v4)",(long) is_prefix(v3,v4),0L); + test_arg("strstr(v1,v1)",(long) strstr(v1,v1),(long) v1); + test_arg("strstr(v1,v2)",(long) strstr(v1,v2),(long) v1+1); + test_arg("strstr(v1,v4)",(long) strstr(v1,v4),(long) v1+3); + test_arg("strstr(v6,v7)",(long) strstr(v6,v7),(long) v6+2); + test_arg("strstr(v1,v9)",(long) strstr(v1,v9),(long) v1+3); + test_arg("strstr(v1,v3)",(long) strstr(v1,v3),0L); + test_arg("strstr(v1,v5)",(long) strstr(v1,v5),0L); + test_arg("strstr(v6,v8)",(long) strstr(v6,v8),0L); + + test_arg("strinstr(v1,v4)",(long) strinstr(v1,v4),4L); + test_arg("strinstr(v1,v5)",(long) strinstr(v1,v5),0L); + test_arg("strlen(from)",(long) strlen(from),(long) F_LEN); + test_arg("strlen(\"\")",(long) strlen(""),0L); +#ifdef HAVE_STRNLEN + test_arg("strnlen(from,3)",(long) strnlen(from,3),3L); + test_arg("strnlen(from,0)",(long) strnlen(from,0),0L); + test_arg("strnlen(from,1000)",(long) strnlen(from,1000),(long) F_LEN); +#endif + + test_strarg("bfill(to,4,' ')",(bfill(to,4,' '),0L),INT_MAX32,4,' ',0,0); + test_strarg("bfill(from,0,' ')",(bfill(from,0,' '),0L),INT_MAX32,0,0); + test_strarg("bzero(to,3)",(bzero(to,3),0L),INT_MAX32,3,0,0,0); + test_strarg("bzero(to,0)",(bzero(to,0),0L),INT_MAX32,0,0); + test_strarg("bmove(to,from,4)",(bmove(to,from,4),0L),INT_MAX32,4,F_CHAR, + 0,0); + test_strarg("bmove(to,from,0)",(bmove(to,from,0),0L),INT_MAX32,0,0); + test_strarg("bmove_upp(to+6,from+6,3)",(bmove_upp(to+6,from+6,3),0L),INT_MAX32, + 3,T_CHAR,3,F_CHAR,0,0); + test_strarg("bmove_upp(to,from,0)",(bmove_upp(to,from,0),0L),INT_MAX32,0,0); + test_strarg("strappend(to,3,' ')",(strappend(to,3,' '),0L),INT_MAX32, + 3,T_CHAR,1,0,T_LEN-4,T_CHAR,1,0,0,0); + test_strarg("strappend(to,T_LEN+5,' ')",(strappend(to,T_LEN+5,' '),0L),INT_MAX32, + T_LEN,T_CHAR,5,' ',1,0,0,0); + test_strarg("strcat(to,from)",strcat(to,from),to,T_LEN,T_CHAR, + F_LEN,F_CHAR,1,0,0,0); + test_strarg("strcat(to,\"\")",strcat(to,""),INT_MAX32,0,0); + test_strarg("strfill(to,4,' ')",strfill(to,4,' '),to+4,4,' ',1,0,0,0); + test_strarg("strfill(from,0,' ')",strfill(from,0,' '),from,0,1,0,0); + test_strarg("strmake(to,from,4)",strmake(to,from,4),to+4,4,F_CHAR, + 1,0,0,0); + test_strarg("strmake(to,from,0)",strmake(to,from,0),to+0,1,0,0,0); + test_strarg("strmov(to,from)",strmov(to,from),to+F_LEN,F_LEN,F_CHAR,0,0); + test_strarg("strmov(to,\"\")",strmov(to,""),to,1,0,0,0); + test_strarg("strnmov(to,from,2)",strnmov(to,from,2),to+2,2,F_CHAR,0,0); + test_strarg("strnmov(to,from,F_LEN+5)",strnmov(to,from,F_LEN+5),to+F_LEN, + F_LEN,F_CHAR,1,0,0,0); + test_strarg("strnmov(to,\"\",2)",strnmov(to,"",2),to,1,0,0,0); + test_strarg("strxmov(to,from,\"!!\",NullS)",strxmov(to,from,"!!",NullS),to+F_LEN+2,F_LEN,F_CHAR,2,'!',0,0,0); + test_strarg("strxmov(to,NullS)",strxmov(to,NullS),to,1,0,0,0); + test_strarg("strxmov(to,from,from,from,from,from,'!!',from,NullS)",strxmov(to,from,from,from,from,from,"!!",from,NullS),to+F_LEN*6+2,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,F_LEN,F_CHAR,2,'!',F_LEN,F_CHAR,1,0,0,0); + test_strarg("bchange(to,2,from,4,6)",(bchange(to,2,from,4,6),0L),INT_MAX32, + 4,F_CHAR,2,T_CHAR,0,0); + + printf("tests: %d errors: %d\n",tests,errors); + if (errors) + fputs("--- Some functions doesn't work!! Fix them\n",stderr); + return(errors > 0); + + fputs("Fatal error\n",stderr); + return(2); +} /* main */ + + + /* Init strings */ + +void init_strings(void) +{ + reg1 int i; + reg2 char *pos; + + from=from_buff+3; to=to_buff+3; + + pos=from_buff; *pos++= F_FILL; *pos++=F_FILL; *pos++=F_PREFILL; + for (i=0 ; i < F_LEN ; i++) + *pos++=F_CHAR; + *pos++=0; + for (i=0; i<50 ; i++) + *pos++= F_FILL; + + pos=to_buff; *pos++= T_FILL; *pos++=T_FILL; *pos++=T_PREFILL; + for (i=0 ; i < T_LEN ; i++) + *pos++=T_CHAR; + *pos++=0; + for (i=0; i<50 ; i++) + *pos++= T_FILL; +} /* init_strings */ + + + /* Test that function return rigth value */ + +void test_arg(my_string message, long int func_value, long int value) +{ + tests++; + printf("testing '%s'\n",message); + if (func_value != value) + { + printf("func: '%s' = %ld Should be: %ld\n",message,func_value,value); + errors++; + } +} /* test_arg */ + + /* Test function return value and from and to arrays */ + +static int test_strarg(char *message,...) +{ + long func_value,value; + int error,length; + char chr,cmp_buff[100],*pos,*pos2; + va_list pvar; + + tests++; + va_start(pvar,message); + func_value=va_arg(pvar,long); + value=va_arg(pvar,long); + + printf("testing '%s'\n",message); + if (func_value != value && value != INT_MAX32) + { + printf("func: '%s' = %ld Should be: %ld\n",message,func_value,value); + errors++; + } + pos= cmp_buff; + while ((length = va_arg(pvar, int)) != 0) + { + chr= (char) (va_arg(pvar, int)); + while (length--) + *pos++=chr; + } + pos2=to+ (int)(pos-cmp_buff); + while (pos <= cmp_buff+T_LEN) + *pos++= *pos2++; + if (compare_buff(message,to,cmp_buff,(int) (pos-cmp_buff),T_FILL,T_PREFILL)) + { + init_strings(); + va_end(pvar); + return 1; + } + + pos= cmp_buff; + while ((length = va_arg(pvar, int)) != 0) + { + chr= (char) (va_arg(pvar, int)); + while (length--) + *pos++=chr; + } + pos2=from+ (int)(pos-cmp_buff); + while (pos <= cmp_buff+F_LEN) + *pos++= *pos2++; + error=compare_buff(message,from,cmp_buff,(int) (pos-cmp_buff),F_FILL,F_PREFILL); + init_strings(); + va_end(pvar); + return (error != 0); +} /* test_strarg */ + + + /* test if function made right value */ + +int compare_buff(my_string message, my_string b1, my_string b2, int length, + pchar fill, pchar prefill) +{ + int i,error=0; + + if (bcmp(b1,b2,length)) + { + errors++; + printf("func: '%s' Buffers differ\nIs: ",message); + for (i=0 ; i<length ; i++) + printf("%3d ",b1[i]); + printf("\nShould be: "); + for (i=0 ; i<length ; i++) + printf("%3d ",b2[i]); + puts(""); + } + else if (b1[-1] != prefill || b1[-2] != fill || b1[-3] != fill) + { + printf("func: '%s' Chars before buffer is changed\n",message); + errors++; + error=1; + } + else if (b1[length] != fill || b1[length+1] != fill) + { + printf("func: '%s' Chars after buffer is changed\n",message); + errors++; + error=1; + } + return error; +} /* compare_buff */ + + /* These are here to be loaded and examined */ + +void dummy_functions(void) +{ + VOID(memchr(from,'a',5)); + VOID(memcmp(from,to,5)); + VOID(memcpy(from,to,5)); + VOID(memset(from,' ',5)); + VOID(strcmp(from,to)); + VOID(strcpy(from,to)); + VOID(strstr(from,to)); + VOID(strrchr(from,'a')); + return; +} diff --git a/strings/strappend-sparc.s b/strings/strappend-sparc.s new file mode 100644 index 00000000000..69bb555aa47 --- /dev/null +++ b/strings/strappend-sparc.s @@ -0,0 +1,49 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "strappend-sparc.s" +.section ".text" + .align 4 + .global strappend + .type strappend,#function + .proc 020 +strappend: + add %o0, %o1, %g3 ! g3 = endpos + ldsb [%o0], %g2 +.loop1: + add %o0, 1, %o0 ! find end of str + cmp %g2, 0 + bne,a .loop1 + ldsb [%o0], %g2 + + sub %o0, 1, %o0 + cmp %o0, %g3 + bgeu .end + nop + + stb %o2, [%o0] +.loop2: + add %o0, 1, %o0 + cmp %o0, %g3 + blu,a .loop2 + stb %o2, [%o0] +.end: + retl + stb %g0, [%g3] +.strappend_end: + .size strappend,.strappend_end-strappend + .ident "Matt Wagner & Monty" diff --git a/strings/strappend.c b/strings/strappend.c new file mode 100644 index 00000000000..d5defaeb0bf --- /dev/null +++ b/strings/strappend.c @@ -0,0 +1,43 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : strappend.c + Author : Monty + Updated: 1987.02.07 + Defines: strappend() + + strappend(dest, len, fill) appends fill-characters to a string so that + the result length == len. If the string is longer than len it's + trunked. The des+len character is allways set to NULL. +*/ + +#include <global.h> +#include "m_string.h" + + +void strappend(register char *s, uint len, pchar fill) +{ + register char *endpos; + + endpos = s+len; + while (*s++); + s--; + while (s<endpos) *(s++) = fill; + *(endpos) = '\0'; +} /* strappend */ + + diff --git a/strings/strcat.c b/strings/strcat.c new file mode 100644 index 00000000000..699729cd7b5 --- /dev/null +++ b/strings/strcat.c @@ -0,0 +1,25 @@ +/* File : strcat.c + Author : Richard A. O'Keefe. + Updated: 10 April 1984 + Defines: strcat() + + strcat(s, t) concatenates t on the end of s. There had better be + enough room in the space s points to; strcat has no way to tell. + Note that strcat has to search for the end of s, so if you are doing + a lot of concatenating it may be better to use strmov, e.g. + strmov(strmov(strmov(strmov(s,a),b),c),d) + rather than + strcat(strcat(strcat(strcpy(s,a),b),c),d). + strcat returns the old value of s. +*/ + +#include "strings.h" + +char *strcat(register char *s, register const char *t) +{ + char *save; + + for (save = s; *s++; ) ; + for (--s; *s++ = *t++; ) ; + return save; + } diff --git a/strings/strcend.c b/strings/strcend.c new file mode 100644 index 00000000000..246b81d7f7b --- /dev/null +++ b/strings/strcend.c @@ -0,0 +1,56 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : strcend.c + Author : Michael Widenius: ifdef MC68000 + Updated: 20 April 1984 + Defines: strcend() + + strcend(s, c) returns a pointer to the first place in s where c + occurs, or a pointer to the end-null of s if c does not occur in s. +*/ + +#include <global.h> +#include "m_string.h" + +#if defined(MC68000) && defined(DS90) + +char *strcend(const char *s, pchar c) +{ +asm(" movl 4(a7),a0 "); +asm(" movl 8(a7),d1 "); +asm(".L2: movb (a0)+,d0 "); +asm(" cmpb d0,d1 "); +asm(" beq .L1 "); +asm(" tstb d0 "); +asm(" bne .L2 "); +asm(".L1: movl a0,d0 "); +asm(" subql #1,d0 "); +} + +#else + +char *strcend(register const char *s, register pchar c) +{ + for (;;) + { + if (*s == (char) c) return (char*) s; + if (!*s++) return (char*) s-1; + } +} + +#endif diff --git a/strings/strchr.c b/strings/strchr.c new file mode 100644 index 00000000000..ef117d85635 --- /dev/null +++ b/strings/strchr.c @@ -0,0 +1,46 @@ +/* File : strchr.c + Author : Richard A. O'Keefe. + Michael Widenius: ifdef MC68000 + Updated: 20 April 1984 + Defines: strchr(), index() + + strchr(s, c) returns a pointer to the first place in s where c + occurs, or NullS if c does not occur in s. This function is called + index in V7 and 4.?bsd systems; while not ideal the name is clearer + than strchr, so index remains in strings.h as a macro. NB: strchr + looks for single characters, not for sets or strings. To find the + NUL character which closes s, use strchr(s, '\0') or strend(s). The + parameter 'c' is declared 'int' so it will go in a register; if your + C compiler is happy with register _char_ change it to that. +*/ + +#include "strings.h" + +#if defined(MC68000) && defined(DS90) + +char* strchr(char *s, pchar c) +{ +asm(" movl 4(a7),a0 "); +asm(" movl 8(a7),d1 "); +asm(".L2: movb (a0)+,d0 "); +asm(" cmpb d0,d1 "); +asm(" beq .L1 "); +asm(" tstb d0 "); +asm(" bne .L2 "); +asm(" moveq #0,d0 "); +asm(" rts "); +asm(".L1: movl a0,d0 "); +asm(" subql #1,d0 "); +} +#else + +char *strchr(register const char *s, register pchar c) +{ + for (;;) + { + if (*s == (char) c) return (char*) s; + if (!*s++) return NullS; + } +} + +#endif diff --git a/strings/strcmp.c b/strings/strcmp.c new file mode 100644 index 00000000000..d911b2daa17 --- /dev/null +++ b/strings/strcmp.c @@ -0,0 +1,20 @@ +/* File : strcmp.c + Author : Richard A. O'Keefe. + Updated: 10 April 1984 + Defines: strcmp() + + strcmp(s, t) returns > 0, = 0, or < 0 when s > t, s = t, or s < t + according to the ordinary lexicographical order. To test for + equality, the macro streql(s,t) is clearer than !strcmp(s,t). Note + that if the string contains characters outside the range 0..127 the + result is machine-dependent; PDP-11s and VAXen use signed bytes, + some other machines use unsigned bytes. +*/ + +#include "strings.h" + +int strcmp(register const char *s, register const char *t) +{ + while (*s == *t++) if (!*s++) return 0; + return s[0]-t[-1]; +} diff --git a/strings/strcont.c b/strings/strcont.c new file mode 100644 index 00000000000..5c7d5d2e55f --- /dev/null +++ b/strings/strcont.c @@ -0,0 +1,46 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : strcont.c + Author : Monty + Updated: 1988.07.27 + Defines: strcont() + + strcont(str, set) if str contanies any character in the string set. + The result is the position of the first found character in str, or NullS + if there isn't anything found. + +*/ + +#include <global.h> +#include "m_string.h" + +my_string strcont(reg1 const char *str,reg2 const char *set) +{ + reg3 my_string start = (my_string) set; + + while (*str) + { + while (*set) + { + if (*set++ == *str) + return ((char*) str); + } + set=start; str++; + } + return (NullS); +} /* strcont */ diff --git a/strings/strend-sparc.s b/strings/strend-sparc.s new file mode 100644 index 00000000000..fd1dba4d36f --- /dev/null +++ b/strings/strend-sparc.s @@ -0,0 +1,35 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "strend-sparc.s" +.section ".text" + .align 4 + .global strend + .type strend,#function + .proc 0102 +strend: + ldsb [%o0], %g2 ! Handle first char differently to make +.loop: ! a faster loop + add %o0, 1, %o0 + cmp %g2, 0 + bne,a .loop + ldsb [%o0], %g2 + retl + sub %o0,1,%o0 +.strend_end: + .size strend,.strend_end-strend + .ident "Matt Wagner & Monty" diff --git a/strings/strend.c b/strings/strend.c new file mode 100644 index 00000000000..18b9d1fbd0d --- /dev/null +++ b/strings/strend.c @@ -0,0 +1,33 @@ +/* File : strend.c + Author : Richard A. O'Keefe. + Updated: 23 April 1984 + Defines: strend() + + strend(s) returns a character pointer to the NUL which ends s. That + is, strend(s)-s == strlen(s). This is useful for adding things at + the end of strings. It is redundant, because strchr(s,'\0') could + be used instead, but this is clearer and faster. + Beware: the asm version works only if strlen(s) < 65535. +*/ + +#include <global.h> +#include "m_string.h" + +#if VaxAsm + +char *strend(s) +const char *s; +{ + asm("locc $0,$65535,*4(ap)"); + asm("movl r1,r0"); +} + +#else /* ~VaxAsm */ + +char *strend(register const char *s) +{ + while (*s++); + return (char*) (s-1); +} + +#endif /* VaxAsm */ diff --git a/strings/strfill.c b/strings/strfill.c new file mode 100644 index 00000000000..ef0ccb567d1 --- /dev/null +++ b/strings/strfill.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : strfill.c + Author : Monty + Updated: 1987.04.16 + Defines: strfill() + + strfill(dest, len, fill) makes a string of fill-characters. The result + string is of length == len. The des+len character is allways set to NULL. + strfill() returns pointer to dest+len; +*/ + +#include <global.h> +#include "m_string.h" + +my_string strfill(my_string s,uint len,pchar fill) +{ + while (len--) *s++ = fill; + *(s) = '\0'; + return(s); +} /* strfill */ diff --git a/strings/string.doc b/strings/string.doc new file mode 100644 index 00000000000..954f7226759 --- /dev/null +++ b/strings/string.doc @@ -0,0 +1,155 @@ +Speciella användbara nya string-rutiner: + + bcmp(s1, s2, len) returns 0 if the "len" bytes starting at "s1" are + identical to the "len" bytes starting at "s2", non-zero if they are + different. + + bfill(dst, len, fill) moves "len" fill characters to "dst". + Thus to set a buffer to 80 spaces, do bfill(buff, 80, ' '). + + bmove(dst, src, len) moves exactly "len" bytes from the source "src" + to the destination "dst". It does not check for NUL characters as + strncpy() and strnmov() do. + + bmove_upp(dst, src, len) moves exactly "len" bytes from the source + "src-len" to the destination "dst-len" counting downwards. + + bzero(dst, len) moves "len" 0 bytes to "dst". + Thus to clear a disc buffer to 0s do bzero(buffer, BUFSIZ). + + int2str(dst, radix, val) + converts the (long) integer "val" to character form and moves it to + the destination string "dst" followed by a terminating NUL. The + result is normally a pointer to this NUL character, but if the radix + is dud the result will be NullS and nothing will be changed. + If radix is -2..-36, val is taken to be SIGNED. + If radix is 2.. 36, val is taken to be UNSIGNED. + That is, val is signed if and only if radix is. You will normally + use radix -10 only through itoa and ltoa, for radix 2, 8, or 16 + unsigned is what you generally want. + + m_ctype.h + A better inplementation of the UNIX ctype(3) library. + Notes: global.h should be included before ctype.h + - Se efter i filen \c\local\include\m_ctype.h + - Används istället för ctype.h för att klara internationella karakterer. + + m_string.h + Använd instället för string.h för att supporta snabbare strängfunktioner. + + strintstr(src, from, pat) looks for an instance of pat in src + backwards from pos from. pat is not a regex(3) pattern, it is a literal + string which must be matched exactly. + The result 0 if the pattern was not found else it is the start char of + the pattern counted from the begining of the string. + + strappend(dest, len, fill) appends fill-characters to a string so that + the result length == len. If the string is longer than len it's + trunked. The des+len character is allways set to NULL. + + strcat(s, t) concatenates t on the end of s. There had better be + enough room in the space s points to; strcat has no way to tell. + Note that strcat has to search for the end of s, so if you are doing + a lot of concatenating it may be better to use strmov, e.g. + strmov(strmov(strmov(strmov(s,a),b),c),d) + rather than + strcat(strcat(strcat(strcpy(s,a),b),c),d). + strcat returns the old value of s. + - Använd inte strcat, använd strmov (se ovan). + + strcend(s, c) returns a pointer to the first place in s where c + occurs, or a pointer to the end-null of s if c does not occur in s. + + strcont(str, set) if str contanies any character in the string set. + The result is the position of the first found character in str, or NullS + if there isn't anything found. + + strend(s) returns a character pointer to the NUL which ends s. That + is, strend(s)-s == strlen(s). This is useful for adding things at + the end of strings. It is redundant, because strchr(s,'\0') could + + strfill(dest, len, fill) makes a string of fill-characters. The result + string is of length == len. The des+len character is allways set to NULL. + strfill() returns pointer to dest+len; + + strfind(src, pat) looks for an instance of pat in src. pat is not a + regex(3) pattern, it is a literal string which must be matched exactly. + The result is a pointer to the first character of the located instance, + or NullS if pat does not occur in src. + + strinstr(src, pat) looks for an instance of pat in src. pat is not a + regex(3) pattern, it is a literal string which must be matched exactly. + The result 0 if the pattern was not found else it is the start char of + the pattern counted from the begining of the string. + + strmake(dst,src,length) moves length characters, or until end, of src to + dst and appends a closing NUL to dst. + strmake() returns pointer to closing null; + + strmov(dst, src) moves all the characters of src (including the + closing NUL) to dst, and returns a pointer to the new closing NUL in + dst. The similar UNIX routine strcpy returns the old value of dst, + which I have never found useful. strmov(strmov(dst,a),b) moves a//b + into dst, which seems useful. + + strnmov(dst,src,length) moves length characters, or until end, of src to + dst and appends a closing NUL to dst if src is shorter than length. + The result is a pointer to the first NUL in dst, or is dst+n if dst was + truncated. + + strrchr(s, c) returns a pointer to the last place in s where c + occurs, or NullS if c does not occur in s. This function is called + rindex in V7 and 4.?bsd systems. + strrchr looks for single characters, not for sets or strings. + + strxmov(dst, src1, ..., srcn, NullS) + moves the concatenation of src1,...,srcn to dst, terminates it + with a NUL character, and returns a pointer to the terminating NUL. + It is just like strmov except that it concatenates multiple sources. + Beware: the last argument should be the null character pointer. + Take VERY great care not to omit it! Also be careful to use NullS + and NOT to use 0, as on some machines 0 is not the same size as a + character pointer, or not the same bit pattern as NullS. + + strxnmov(dst, len, src1, ..., srcn, NullS) + moves the first len characters of the concatenation of src1,...,srcn + to dst. If there aren't that many characters, a NUL character will + be added to the end of dst to terminate it properly. This gives the + same effect as calling strxcpy(buff, src1, ..., srcn, NullS) with a + large enough buffer, and then calling strnmov(dst, buff, len). + It is just like strnmov except that it concatenates multiple sources. + Beware: the last argument should be the null character pointer. + Take VERY great care not to omit it! Also be careful to use NullS + and NOT to use 0, as on some machines 0 is not the same size as a + character pointer, or not the same bit pattern as NullS. + + Note: strxnmov is like strnmov in that it always moves EXACTLY len + characters; dst will be padded on the right with NUL characters as + needed. strxncpy does the same. strxncat, like strncat, does NOT. + + +I mysys: + + stripp_sp(string str) + Strips end-space from string and returns new length. + + strlength(const string str) + Return length of string with end-space:s not counted. + + void caseup _A((string str,uint length)); + void casedn _A((string str,uint length)); + void caseup_str _A((string str)); + void casedn_str _A((string str)); + Converts strings or part of string to upper or lower-case. + + void case_sort _A((string str,uint length)); + Converts string to a string with can be compared with strcmp() to + get strings in rigth order. + + string strcfind(str,search) + find string in another with no case_sensivity + + my_strcasecmp(s,t) + Compare strings without regarding to case + - For many strings it quicker to forst use case_sort on all strings and + then compare them with strcmp(). diff --git a/strings/strings-not-used.h b/strings/strings-not-used.h new file mode 100644 index 00000000000..fa4dff318f5 --- /dev/null +++ b/strings/strings-not-used.h @@ -0,0 +1,22 @@ +/* File : strings.h + Author : Richard A. O'Keefe. + Updated: 1 June 1984 + Purpose: Header file for the "string(3C)" package. + + All the routines in this package are the original work of + R.A.O'Keefe. Any resemblance between them and any routines in + licensed software is due entirely to these routines having been + written using the "man 3 string" UNIX manual page, or in some cases + the "man 1 sort" manual page as a specification. See the READ-ME to + find the conditions under which these routines may be used & copied. +*/ + +#ifndef NullS + +#include <global.h> /* Define standar vars */ +#include "m_string.h" + +#define NUL '\0' +#define _AlphabetSize 256 + +#endif /* NullS */ diff --git a/strings/strings-x86.s b/strings/strings-x86.s new file mode 100644 index 00000000000..5d7cbde1b38 --- /dev/null +++ b/strings/strings-x86.s @@ -0,0 +1,406 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* Optimized string functions Intel 80x86 (gcc/gas syntax) */ + + .file "strings.s" + .version "1.00" + +.text + + /* Move a alligned, not overlapped, by (long) divided memory area */ + /* Args: to,from,length */ + +.globl bmove_allign + .type bmove_allign,@function +bmove_allign: + movl %edi,%edx + movl %esi,%eax + movl 4(%esp),%edi /* to */ + movl 8(%esp),%esi /* from */ + movl 12(%esp),%ecx /* length */ + addw $3,%cx /* fix if not divisible with long */ + shrw $2,%cx + rep + movsl + movl %eax,%esi + movl %edx,%edi + ret +.end: + .size bmove_allign,.end-bmove_allign + + /* Move a string from higher to lower */ + /* Arg from+1,to+1,length */ + +.globl bmove_upp + .type bmove_upp,@function +bmove_upp: + std /* Work downward */ + movl %edi,%edx + movl %esi,%eax + movl 4(%esp),%edi /* p1 */ + movl 8(%esp),%esi /* p2 */ + movl 12(%esp),%ecx /* length */ + decl %edi /* Don't move last arg */ + decl %esi + rep + movsb /* One byte a time because overlap */ + cld /* C library wants cld */ + movl %eax,%esi + movl %edx,%edi + ret +.bmove_upp_end: + .size bmove_upp,.bmove_upp_end-bmove_upp + + /* Append fillchars to string */ + /* Args: dest,len,fill */ + +.globl strappend + .type strappend,@function +strappend: + pushl %edi + movl 8(%esp),%edi /* Memory pointer */ + movl 12(%esp),%ecx /* Length */ + clrl %eax /* Find end of string */ + repne + scasb + jnz sa_99 /* String to long, shorten it */ + movzb 16(%esp),%eax /* Fillchar */ + decl %edi /* Point at end null */ + incl %ecx /* rep made one dec for null-char */ + + movb %al,%ah /* (2) Set up a 32 bit pattern. */ + movw %ax,%dx /* (2) */ + shll $16,%eax /* (3) */ + movw %dx,%ax /* (2) %eax has the 32 bit pattern. */ + + movl %ecx,%edx /* (2) Save the count of bytes. */ + shrl $2,%ecx /* (2) Number of dwords. */ + rep + stosl /* (5 + 5n) */ + movb $3,%cl /* (2) */ + and %edx,%ecx /* (2) Fill in the odd bytes*/ + rep + stosb /* Move last bytes if any */ + +sa_99: movb $0,(%edi) /* End of string */ + popl %edi + ret +.strappend_end: + .size strappend,.strappend_end-strappend + + /* Find if string contains any char in another string */ + /* Arg: str,set */ + /* Ret: Pointer to first found char in str */ + +.globl strcont + .type strcont,@function +strcont: + movl %edi,%edx + pushl %esi + movl 8(%esp),%esi /* str */ + movl 12(%esp),%ecx /* set */ + clrb %ah /* For endtest */ + jmp sc_60 + +sc_10: scasb + jz sc_fo /* Found char */ +sc_20: cmp (%edi),%ah /* Test if null */ + jnz sc_10 /* Not end of set yet */ + incl %esi /* Next char in str */ +sc_60: movl %ecx,%edi /* %edi = Set */ + movb (%esi),%al /* Test if this char exist */ + andb %al,%al + jnz sc_20 /* Not end of string */ + clrl %esi /* Return Null */ +sc_fo: movl %esi,%eax /* Char found here */ + movl %edx,%edi /* Restore */ + popl %esi + ret +.strcont_end: + .size strcont,.strcont_end-strcont + + /* Find end of string */ + /* Arg: str */ + /* ret: Pointer to end null */ + +.globl strend + .type strend,@function +strend: + movl %edi,%edx /* Save */ + movl 4(%esp),%edi /* str */ + clrl %eax /* Find end of string */ + movl %eax,%ecx + decl %ecx /* ECX = -1 */ + repne + scasb + movl %edi,%eax + decl %eax /* End of string */ + movl %edx,%edi /* Restore */ + ret +.strend_end: + .size strend,.strend_end-strend + + /* Make a string with len fill-chars and endnull */ + /* Args: dest,len,fill */ + /* Ret: dest+len */ + +.globl strfill + .type strfill,@function +strfill: + pushl %edi + movl 8(%esp),%edi /* Memory pointer */ + movl 12(%esp),%ecx /* Length */ + movzb 16(%esp),%eax /* Fill */ + + movb %al,%ah /* (2) Set up a 32 bit pattern */ + movw %ax,%dx /* (2) */ + shll $16,%eax /* (3) */ + movw %dx,%ax /* (2) %eax has the 32 bit pattern. */ + + movl %ecx,%edx /* (2) Save the count of bytes. */ + shrl $2,%ecx /* (2) Number of dwords. */ + rep + stosl /* (5 + 5n) */ + movb $3,%cl /* (2) */ + and %edx,%ecx /* (2) Fill in the odd bytes */ + rep + stosb /* Move last bytes if any */ + + movb %cl,(%edi) /* End NULL */ + movl %edi,%eax /* End i %eax */ + popl %edi + ret +.strfill_end: + .size strfill,.strfill_end-strfill + + + /* Find a char in or end of a string */ + /* Arg: str,char */ + /* Ret: pointer to found char or NullS */ + +.globl strcend + .type strcend,@function +strcend: + movl %edi,%edx + movl 4(%esp),%edi /* str */ + movb 8(%esp),%ah /* search */ + clrb %al /* for scasb to find end */ + +se_10: cmpb (%edi),%ah + jz se_20 /* Found char */ + scasb + jnz se_10 /* Not end */ + dec %edi /* Not found, point at end of string */ +se_20: movl %edi,%eax + movl %edx,%edi /* Restore */ + ret +.strcend_end: + .size strcend,.strcend_end-strcend + + /* Test if string has a given suffix */ + +.globl is_prefix + .type is_prefix,@function +is_prefix: + movl %edi,%edx /* Save %edi */ + pushl %esi /* and %esi */ + movl 12(%esp),%esi /* get suffix */ + movl 8(%esp),%edi /* s1 */ + movl $1,%eax /* Ok and zero-test */ +ip_10: cmpb (%esi),%ah + jz suf_ok /* End of string/ found suffix */ + cmpsb /* Compare strings */ + jz ip_10 /* Same, possible prefix */ + xor %eax,%eax /* Not suffix */ +suf_ok: popl %esi + movl %edx,%edi + ret +.is_prefix_end: + .size is_prefix,.is_prefix_end-is_prefix + + /* Find a substring in string */ + /* Arg: str,search */ + +.globl strstr + .type strstr,@function + +strstr: + pushl %edi + pushl %esi + movl 12(%esp),%esi /* str */ + movl 16(%esp),%edi /* search */ + movl %edi,%ecx + incl %ecx /* %ecx = search+1 */ + movb (%edi),%ah /* %ah = First char in search */ + jmp sf_10 + +sf_00: movl %edx,%esi /* si = Current str-pos */ +sf_10: movb (%esi),%al /* Test if this char exist */ + andb %al,%al + jz sf_90 /* End of string, didn't find search */ + incl %esi + cmpb %al,%ah + jnz sf_10 /* Didn't find first char, continue */ + movl %esi,%edx /* Save str-pos in %edx */ + movl %ecx,%edi +sf_20: cmpb $0,(%edi) + jz sf_fo /* Found substring */ + cmpsb + jz sf_20 /* Char ok */ + jmp sf_00 /* Next str-pos */ + +sf_90: movl $1,%edx /* Return Null */ +sf_fo: movl %edx,%eax /* Char found here */ + decl %eax /* Pointed one after */ + popl %esi + popl %edi + ret +.strstr_end: + .size strstr,.strstr_end-strstr + + + /* Find a substring in string, return index */ + /* Arg: str,search */ + +.globl strinstr + .type strinstr,@function + +strinstr: + pushl %ebp + movl %esp,%ebp + pushl 12(%ebp) /* search */ + pushl 8(%ebp) /* str */ + call strstr + add $8,%esp + or %eax,%eax + jz si_99 /* Not found, return NULL */ + sub 8(%ebp),%eax /* Pos from start */ + inc %eax /* And first pos = 1 */ +si_99: popl %ebp + ret +.strinstr_end: + .size strinstr,.strinstr_end-strinstr + + /* Make a string of len length from another string */ + /* Arg: dst,src,length */ + /* ret: end of dst */ + +.globl strmake + .type strmake,@function + +strmake: + pushl %edi + pushl %esi + movl 12(%esp),%edi /* dst */ + movl 16(%esp),%esi /* src */ + movl 20(%esp),%ecx /* Length of memory-area */ + clrb %al /* For test of end-null */ + jecxz sm_90 /* Nothing to move, put zero at end. */ + +sm_10: cmpb (%esi),%al /* Next char to move */ + movsb /* move arg */ + jz sm_99 /* last char, we are ready */ + loop sm_10 /* Continue moving */ +sm_90: movb %al,(%edi) /* Set end pos */ + incl %edi /* Fix that di points at end null */ +sm_99: decl %edi /* di points now at end null */ + movl %edi,%eax /* Ret value.p $ */ + popl %esi + popl %edi + ret +.strmake_end: + .size strmake,.strmake_end-strmake + + /* Move a string with max len chars */ + /* arg: dst,src,len */ + /* ret: pos to first null or dst+len */ + +.globl strnmov + .type strnmov,@function +strnmov: + pushl %edi + pushl %esi + movl 12(%esp),%edi /* dst */ + movl 16(%esp),%esi /* src */ + movl 20(%esp),%ecx /* Length of memory-area */ + jecxz snm_99 /* Nothing to do */ + clrb %al /* For test of end-null */ + +snm_10: cmpb (%esi),%al /* Next char to move */ + movsb /* move arg */ + jz snm_20 /* last char, fill with null */ + loop snm_10 /* Continue moving */ + incl %edi /* Point two after last */ +snm_20: decl %edi /* Point at first null (or last+1) */ +snm_99: movl %edi,%eax /* Pointer at last char */ + popl %esi + popl %edi + ret +.strnmov_end: + .size strnmov,.strnmov_end-strnmov + + +.globl strmov + .type strmov,@function +strmov: + movl %esi,%ecx /* Save old %esi and %edi */ + movl %edi,%edx + movl 8(%esp),%esi /* get source pointer (s2) */ + movl 4(%esp),%edi /* %edi -> s1 */ +smo_10: movb (%esi),%al + movsb /* move arg */ + andb %al,%al + jnz smo_10 /* Not last */ + movl %edi,%eax + dec %eax + movl %ecx,%esi /* Restore */ + movl %edx,%edi + ret +.strmov_end: + .size strmov,.strmov_end-strmov + +.globl strxmov + .type strxmov,@function +strxmov: + movl %ebx,%edx /* Save %ebx, %esi and %edi */ + mov %esi,%ecx + push %edi + leal 8(%esp),%ebx /* Get destination */ + movl (%ebx),%edi + xorb %al,%al + jmp next_str /* Handle source ebx+4 */ + +start_str: + movsb + cmpb -1(%edi),%al + jne start_str + decl %edi /* Don't copy last null */ + +next_str: + addl $4,%ebx + movl (%ebx),%esi + orl %esi,%esi + jne start_str + movb %al,0(%edi) /* Force last to ASCII 0 */ + + movl %edi,%eax /* Return ptr to ASCII 0 */ + pop %edi /* Restore registers */ + movl %ecx,%esi + movl %edx,%ebx + ret +.strxmov_end: + .size strxmov,strxmov_end-strxmov diff --git a/strings/strings.asm b/strings/strings.asm new file mode 100644 index 00000000000..43bc23fa965 --- /dev/null +++ b/strings/strings.asm @@ -0,0 +1,1060 @@ +; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +; +; This library is free software; you can redistribute it and/or +; modify it under the terms of the GNU Library General Public +; License as published by the Free Software Foundation; either +; version 2 of the License, or (at your option) any later version. +; +; This library is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; Library General Public License for more details. +; +; You should have received a copy of the GNU Library General Public +; License along with this library; if not, write to the Free +; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +; MA 02111-1307, USA + +; Note that if you don't have a macro assembler (like MASM) to compile +; this file, you can instead compile all *.c files in the string +; directory. + + TITLE Stringfunctions that we use often at MSDOS / Intel 8086 + +ifndef M_I386 + .8087 + DOSSEG + .MODEL LARGE + .CODE + + ; + ; Some macros + ; + +q_movs MACRO ; as rep movsb but quicker + shr cx,1 + rep movsw ; Move 2 bytes at a time + adc cx,cx + rep movsb ; Move last byte if any + ENDM + +q_stos MACRO ; as rep stosb but quicker + mov ah,al ; For word store + shr cx,1 + rep stosw ; Move 2 bytes at a time + adc cx,cx + rep stosb ; Move last byte if any + ENDM + +ifndef ZTC ; If not using ZORTECH compiler + ; + ; Compare memory + ; Args: s1,s2,length + ; + + PUBLIC _bcmp +_bcmp PROC + mov bx,bp ; Save bp + mov dx,di ; Save di + mov bp,sp + push ds + push si + les di,DWORD PTR [bp+8] ; s2 + lds si,DWORD PTR [bp+4] ; s1 + mov cx,WORD PTR [bp+12] ; Length of memory-area + jcxz @F ; Length = 0, return same +; cld ; Work uppward + repe cmpsb ; Compare strings + jz @F ; Match found + inc cx ; return matchpoint +1 +@@: mov ax,cx ; Return 0 if match, else pos from end + pop si + pop ds + mov di,dx + mov bp,bx + ret +_bcmp ENDP + + ; + ; Find a char in a string + ; Arg: str,char + ; Ret: pointer to found char or NullS + ; + +ifdef better_stringfunctions ; Breaks window linkage (broken linking) + + PUBLIC _strchr +_strchr PROC + mov bx,bp ; Save bp and di + mov dx,di + mov bp,sp + les di,DWORD PTR [bp+4] ; str + mov ah,BYTE PTR [bp+8] ; search + xor al,al ; for scasb to find end + +@@: cmp ah,es:[di] + jz @F ; Found char + scasb + jnz @B ; Not end + xor di,di ; Not found + mov es,di +@@: mov ax,di + mov di,dx ; Restore + mov dx,es ; Seg adr + mov bp,bx ; Restore + ret +_strchr ENDP + + ; + ; Find length of string + ; arg: str + ; ret: length + ; + + PUBLIC _strlen +_strlen PROC + mov bx,sp + mov dx,di + les di,DWORD PTR ss:[bx+4] ; Str + xor al,al ; Find end of string + mov cx,-1 +; cld + repne scasb ; Find strend or length + inc cx ; Calc strlength + not cx + mov ax,cx + mov di,dx ; Restore register + ret +_strlen ENDP + +endif + + ; + ; Move a string + ; arg: dst,src + ; ret: end-null of to + ; + + PUBLIC _strmov +_strmov PROC + mov bx,bp + mov cx,si + mov bp,sp + push ds + push di + les di,DWORD PTR [bp+4] ; dst + lds si,DWORD PTR [bp+8] ; src +; cld +@@: mov al,ds:[si] + movsb ; move arg + and al,al + jnz @B ; Not last + lea ax,WORD PTR [di-1] ; Set DX:AX to point at last null + mov dx,es + pop di + pop ds + mov si,cx + mov bp,bx + ret +_strmov ENDP + + ; + ; Fill a area of memory with a walue + ; Args: to,length,fillchar + ; + + PUBLIC _bfill +_bfill PROC + mov bx,sp ; Get args through BX + mov al,BYTE PTR ss:[bx+10] ; Fill +bfill_10: + mov dx,di ; Save di + les di,DWORD PTR ss:[bx+4] ; Memory pointer + mov cx,WORD PTR ss:[bx+8] ; Length +; cld + q_stos + mov di,dx + ret +_bfill ENDP + + ; + ; Fill a area with null + ; Args: to,length + + PUBLIC _bzero +_bzero PROC + mov bx,sp ; Get args through BX + mov al,0 ; Fill with null + jmp short bfill_10 +_bzero ENDP + +endif ; ZTC + + ; + ; Move a memory area + ; Args: to,from,length + ; + + PUBLIC _bmove +_bmove PROC + mov bx,bp + mov dx,di + mov ax,si + mov bp,sp + push ds + lds si,DWORD PTR [bp+8] ; from + les di,DWORD PTR [bp+4] ; to + mov cx,WORD PTR [bp+12] ; Length of memory-area +; cld ; Work uppward + rep movsb ; Not q_movs because overlap ? + pop ds + mov si,ax + mov di,dx + mov bp,bx + ret +_bmove ENDP + + ; + ; Move a alligned, not overlapped, by (long) divided memory area + ; Args: to,from,length + ; + + PUBLIC _bmove_allign +_bmove_allign PROC + mov bx,bp + mov dx,di + mov ax,si + mov bp,sp + push ds + lds si,DWORD PTR [bp+8] ; from + les di,DWORD PTR [bp+4] ; to + mov cx,WORD PTR [bp+12] ; Length of memory-area +; cld ; Work uppward + inc cx ; fix if not divisible with word + shr cx,1 + rep movsw ; Move 2 bytes at a time + pop ds + mov si,ax + mov di,dx + mov bp,bx + ret +_bmove_allign ENDP + + ; + ; Move a string from higher to lower + ; Arg from+1,to+1,length + ; + + PUBLIC _bmove_upp +_bmove_upp PROC + mov bx,bp + mov dx,di + mov ax,si + mov bp,sp + push ds + lds si,DWORD PTR [bp+8] ; from + les di,DWORD PTR [bp+4] ; to + mov cx,WORD PTR [bp+12] ; Length of memory-area + dec di ; Don't move last arg + dec si + std ; Work downward + rep movsb ; Not q_movs because overlap ? + cld ; C compilator want cld + pop ds + mov si,ax + mov di,dx + mov bp,bx + ret +_bmove_upp ENDP + + ; + ; Append fillchars to string + ; Args: dest,len,fill + ; + + PUBLIC _strappend +_strappend PROC + mov bx,bp + mov dx,di + mov bp,sp + les di,DWORD PTR [bp+4] ; Memory pointer + mov cx,WORD PTR [bp+8] ; Length + sub al,al ; Find end of string +; cld + repne scasb + jnz sa_99 ; String to long, shorten it + mov al,BYTE PTR [bp+10] ; Fillchar + dec di ; Point at end null + inc cx ; rep made one dec for null-char + q_stos ; Store al in string +sa_99: mov BYTE PTR es:[di],0 ; End of string + mov di,dx + mov bp,bx + ret +_strappend ENDP + + ; + ; Find if string contains any char in another string + ; Arg: str,set + ; Ret: Pointer to first found char in str + ; + + PUBLIC _strcont +_strcont PROC + mov bx,bp ; Save bp and di in regs + mov dx,di + mov bp,sp + push ds + push si + lds si,DWORD PTR [bp+4] ; str + les di,DWORD PTR [bp+8] ; Set + mov cx,di ; Save for loop + xor ah,ah ; For endtest + jmp sc_60 + +sc_10: scasb + jz sc_fo ; Found char +sc_20: cmp ah,es:[di] ; Test if null + jnz sc_10 ; Not end of set yet + inc si ; Next char in str + mov di,cx ; es:di = Set +sc_60: mov al,ds:[si] ; Test if this char exist + and al,al + jnz sc_20 ; Not end of string + sub si,si ; Return Null + mov ds,si +sc_fo: mov ax,si ; Char found here + mov di,dx ; Restore + mov dx,ds ; Seg of found char + pop si + pop ds + mov bp,bx + ret +_strcont ENDP + + ; + ; Found end of string + ; Arg: str + ; ret: Pointer to end null + ; + + PUBLIC _strend +_strend PROC + mov bx,sp + mov dx,di ; Save + les di,DWORD PTR ss:[bx+4] ; str + mov cx,-1 + sub al,al ; Find end of string +; cld + repne scasb + lea ax,WORD PTR [di-1] ; Endpos i DX:AX + mov di,dx ; Restore + mov dx,es + ret +_strend ENDP + + ; + ; Make a string with len fill-chars and endnull + ; Args: dest,len,fill + ; Ret: dest+len + ; + + PUBLIC _strfill +_strfill PROC + mov bx,bp ; Save sp + mov bp,sp + push di + les di,DWORD PTR [bp+4] ; Memory pointer + mov cx,WORD PTR [bp+8] ; Length + mov al,BYTE PTR [bp+10] ; Fill +; cld + q_stos + mov BYTE PTR es:[di],0 ; End NULL + mov ax,di ; End i DX:AX + mov dx,es + pop di + mov bp,bx + ret +_strfill ENDP + + ; + ; Find a char in or end of a string + ; Arg: str,char + ; Ret: pointer to found char or NullS + ; + + PUBLIC _strcend +_strcend PROC + mov bx,bp ; Save bp and di + mov dx,di + mov bp,sp + les di,DWORD PTR [bp+4] ; str + mov ah,BYTE PTR [bp+8] ; search + xor al,al ; for scasb to find end + +@@: cmp ah,es:[di] + jz @F ; Found char + scasb + jnz @B ; Not end + dec di ; Not found, point at end of string +@@: mov ax,di + mov di,dx ; Restore + mov dx,es ; Seg adr + mov bp,bx ; Restore + ret +_strcend ENDP + + ; + ; Test if string has a given suffix + ; + +PUBLIC _is_prefix +_is_prefix PROC + mov dx,di ; Save di + mov bx,sp ; Arguments through bx + push ds + push si + les di,DWORD PTR ss:[bx+8] ; s2 + lds si,DWORD PTR ss:[bx+4] ; s1 + mov ax,1 ; Ok and zero-test +; cld ; Work uppward +@@: cmp ah,es:[di] + jz suf_ok ; End of string; found suffix + cmpsb ; Compare strings + jz @B ; Same, possible prefix + xor ax,ax ; Not suffix +suf_ok: pop si + pop ds + mov di,dx + ret +_is_prefix ENDP + + ; + ; Find a substring in string + ; Arg: str,search + ; + + PUBLIC _strstr +_strstr PROC + mov bx,bp + mov bp,sp + push ds + push di + push si + lds si,DWORD PTR [bp+4] ; str + les di,DWORD PTR [bp+8] ; search + mov cx,di + inc cx ; CX = search+1 + mov ah,es:[di] ; AH = First char in search + jmp sf_10 + +sf_00: mov si,dx ; si = Current str-pos +sf_10: mov al,ds:[si] ; Test if this char exist + and al,al + jz sf_90 ; End of string, didn't find search + inc si + cmp al,ah + jnz sf_10 ; Didn't find first char, continue + mov dx,si ; Save str-pos in DX + mov di,cx +sf_20: cmp BYTE PTR es:[di],0 + jz sf_fo ; Found substring + cmpsb + jz sf_20 ; Char ok + jmp sf_00 ; Next str-pos + +sf_90: sub dx,dx ; Return Null + mov ds,dx + inc dx ; Because of following dec +sf_fo: mov ax,dx ; Char found here + dec ax ; Pointed one after + mov dx,ds + pop si + pop di ; End + pop ds + mov bp,bx + ret +_strstr ENDP + + ; + ; Find a substring in string, return index + ; Arg: str,search + ; + + PUBLIC _strinstr +_strinstr PROC + push bp + mov bp,sp + push di + les di,DWORD PTR [bp+10] ; search + push es + push di + les di,DWORD PTR [bp+6] ; str + push es + push di + call _strstr + mov cx,ax + or cx,dx + jz si_99 + sub ax,di ; Pos from start + inc ax ; And first pos = 1 +si_99: add sp,8 + pop di + pop bp + ret +_strinstr ENDP + + ; + ; Make a string of len length from another string + ; Arg: dst,src,length + ; ret: end of dst + ; + + PUBLIC _strmake +_strmake PROC + mov bx,bp + mov bp,sp + push ds + push di + push si + les di,DWORD PTR [bp+4] ; dst + lds si,DWORD PTR [bp+8] ; src + mov cx,WORD PTR [bp+12] ; Length of memory-area + xor al,al ; For test of end-null + jcxz sm_90 ; Nothing to move, put zero at end. +; cld ; Work uppward + +@@: cmp al,ds:[si] ; Next char to move + movsb ; move arg + jz sm_99 ; last char, we are ready + loop @B ; Continue moving +sm_90: mov BYTE PTR es:[di],al ; Set end pos + inc di ; Fix that di points at end null +sm_99: dec di ; di points now at end null + mov ax,di ; Ret value in DX:AX + mov dx,es + pop si + pop di + pop ds + mov bp,bx + ret +_strmake ENDP + + ; + ; Find length of string with maxlength + ; arg: str,maxlength + ; ret: length + ; + + PUBLIC _strnlen +_strnlen PROC + mov bx,bp + mov bp,sp + push di + les di,DWORD PTR [bp+4] ; Str + mov cx,WORD PTR [bp+8] ; length + mov dx,di ; Save str to calc length + jcxz sn_10 ; Length = 0 + xor al,al ; Find end of string +; cld + repne scasb ; Find strend or length + jnz sn_10 + dec di ; DI points at last null +sn_10: mov ax,di + sub ax,dx ; Ax = length + pop di + mov bp,bx + ret +_strnlen ENDP + + ; + ; Move a string with max len chars + ; arg: dst,src,len + ; ret: pos to first null or dst+len + + PUBLIC _strnmov +_strnmov PROC + mov bx,bp + mov bp,sp + push ds + push di + push si + les di,DWORD PTR [bp+4] ; dst + lds si,DWORD PTR [bp+8] ; src + mov cx,WORD PTR [bp+12] ; length + jcxz snm_99 ; Nothing to do + xor al,al ; For test of end-null +; cld + +@@: cmp al,ds:[si] ; Next char to move + movsb ; move arg + jz snm_20 ; last char, fill with null + loop @B ; Continue moving + inc di ; Point two after last +snm_20: dec di ; Point at first null (or last+1) +snm_99: mov ax,di ; Pointer at last char + mov dx,es ; To-segment + pop si + pop di + pop ds + mov bp,bx ; Restore + ret +_strnmov ENDP + +else ; M_I386 + +include macros.asm + +q_stos MACRO ; as rep stosb but quicker, Uses edx + mov ah,al ;(2) Set up a 32 bit pattern. + mov edx,eax ;(2) + shl edx,16 ;(3) + or eax,edx ;(2) EAX has the 32 bit pattern. + + mov edx,ecx ;(2) Save the count of bytes. + shr ecx,2 ;(2) Number of dwords. + rep stosd ;(5 + 5n) + mov cl,3 ;(2) + and ecx,edx ;(2) Fill in the remaining odd bytes. + rep stosb ; Move last bytes if any + ENDM + +fix_es MACRO fix_cld ; Load ES if neaded + ife ESeqDS + mov ax,ds + mov es,ax + endif + ifnb <fix_cld> + cld + endif + ENDM + + ; + ; Move a memory area + ; Args: to,from,length + ; Acts as one byte was moved a-time from dst to source. + ; + + begcode bmove + public _bmove +_bmove proc near + fix_es 1 + mov edx,edi + mov eax,esi + mov edi,P-SIZEPTR[esp] ;p1 + mov esi,P[esp] ;p2 + mov ecx,P+SIZEPTR[esp] + rep movsb ; Not q_movs because overlap ? + mov esi,eax + mov edi,edx + ret +_bmove ENDP + endcode bmove + + ; + ; Move a alligned, not overlapped, by (long) divided memory area + ; Args: to,from,length + ; + + begcode bmove_allign + public _bmove_allign +_bmove_allign proc near + fix_es 1 + mov edx,edi + mov eax,esi + mov edi,P-SIZEPTR[esp] ;to + mov esi,P[esp] ;from + mov ecx,P+SIZEPTR[esp] ;length + add cx,3 ;fix if not divisible with long + shr cx,2 + rep movsd + mov esi,eax + mov edi,edx + ret +_bmove_allign ENDP + endcode bmove_allign + + ; + ; Move a string from higher to lower + ; Arg from+1,to+1,length + ; + + begcode bmove_upp + public _bmove_upp +_bmove_upp proc near + fix_es + std ; Work downward + mov edx,edi + mov eax,esi + mov edi,P-SIZEPTR[esp] ;p1 + mov esi,P[esp] ;p2 + mov ecx,P+SIZEPTR[esp] + dec edi ; Don't move last arg + dec esi + rep movsb ; One byte a time because overlap ! + cld ; C compilator wants cld + mov esi,eax + mov edi,edx + ret +_bmove_upp ENDP + endcode bmove_upp + + ; + ; Append fillchars to string + ; Args: dest,len,fill + ; + + begcode strappend + public _strappend +_strappend proc near + push ebp + mov ebp,esp + fix_es 1 + push edi + mov edi,P[ebp] ; Memory pointer + mov ecx,P+SIZEPTR[ebp] ; Length + clr eax ; Find end of string + repne scasb + jnz sa_99 ; String to long, shorten it + movzx eax,byte ptr P+(2*SIZEPTR)[ebp] ; Fillchar + dec edi ; Point at end null + inc ecx ; rep made one dec for null-char + q_stos ; Store al in string +sa_99: mov BYTE PTR [edi],0 ; End of string + pop edi + pop ebp + ret +_strappend ENDP + endcode strappend + + ; + ; Find if string contains any char in another string + ; Arg: str,set + ; Ret: Pointer to first found char in str + ; + + begcode strcont + PUBLIC _strcont +_strcont proc near + push ebp + mov ebp,esp + fix_es 1 + mov edx,edi + push esi + mov esi,P[ebp] ; str + mov ecx,P+SIZEPTR[ebp] ; Set + clr ah ; For endtest + jmps sc_60 + +sc_10: scasb + jz sc_fo ; Found char +sc_20: cmp ah,[edi] ; Test if null + jnz sc_10 ; Not end of set yet + inc esi ; Next char in str +sc_60: mov edi,ecx ; edi = Set + mov al,[esi] ; Test if this char exist + and al,al + jnz sc_20 ; Not end of string + clr esi ; Return Null +sc_fo: mov eax,esi ; Char found here + mov edi,edx ; Restore + pop esi + pop ebp + ret +_strcont ENDP + endcode strcont + + ; + ; Found end of string + ; Arg: str + ; ret: Pointer to end null + ; + + begcode strend + public _strend +_strend proc near + fix_es 1 + mov edx,edi ; Save + mov edi,P-SIZEPTR[esp] ; str + clr eax ; Find end of string + mov ecx,eax + dec ecx ; ECX = -1 + repne scasb + mov eax,edi + dec eax + mov edi,edx ; Restore + ret +_strend endp + endcode strend + + ; + ; Make a string with len fill-chars and endnull + ; Args: dest,len,fill + ; Ret: dest+len + ; + + begcode strfill + public _strfill +_strfill proc near + push ebp + mov ebp,esp + fix_es 1 + push edi + mov edi,P[ebp] ; Memory pointer + mov ecx,P+SIZEPTR[ebp] ; Length + movzx eax,byte ptr P+(2*SIZEPTR)[ebp] ; Fill + q_stos + mov BYTE PTR [edi],0 ; End NULL + mov eax,edi ; End i DX:AX + pop edi + pop ebp + ret +_strfill endp + endcode strfill + + ; + ; Find a char in or end of a string + ; Arg: str,char + ; Ret: pointer to found char or NullS + ; + + begcode strcend + public _strcend +_strcend proc near + push ebp + mov ebp,esp + fix_es 1 + mov edx,edi + mov edi,P[ebp] ; str + mov ah,P+SIZEPTR[ebp] ; search + clr al ; for scasb to find end + +@@: cmp ah,[edi] + jz @F ; Found char + scasb + jnz @B ; Not end + dec edi ; Not found, point at end of string +@@: mov eax,edi + mov edi,edx ; Restore + pop ebp + ret +_strcend ENDP + endcode strcend + + ; + ; Test if string has a given suffix + ; + + begcode is_prefix + public _is_prefix +_is_prefix proc near + fix_es 1 + mov edx,edi ; Save edi + mov eax,esi ; Save esi + mov esi,P[esp] ; get suffix + mov edi,P-SIZEPTR[esp] ; s1 + push eax ; push esi + mov eax,1 ; Ok and zero-test +@@: cmp ah,[esi] + jz suf_ok ; End of string; found suffix + cmpsb ; Compare strings + jz @B ; Same, possible prefix + xor eax,eax ; Not suffix +suf_ok: pop esi + mov edi,edx + ret +_is_prefix endp + endcode _is_prefix + + ; + ; Find a substring in string + ; Arg: str,search + ; + + begcode strstr + public _strstr +_strstr proc near + push ebp + mov ebp,esp + fix_es 1 + push EDI + push ESI + mov esi,P[ebp] ; str + mov edi,P+SIZEPTR[ebp] ; search + mov ecx,edi + inc ecx ; ECX = search+1 + mov ah,[edi] ; AH = First char in search + jmps sf_10 + +sf_00: mov esi,edx ; si = Current str-pos +sf_10: mov al,[esi] ; Test if this char exist + and al,al + jz sf_90 ; End of string, didn't find search + inc esi + cmp al,ah + jnz sf_10 ; Didn't find first char, continue + mov edx,esi ; Save str-pos in EDX + mov edi,ecx +sf_20: cmp BYTE PTR [edi],0 + jz sf_fo ; Found substring + cmpsb + jz sf_20 ; Char ok + jmps sf_00 ; Next str-pos + +sf_90: mov edx,1 ; Return Null +sf_fo: mov eax,edx ; Char found here + dec eax ; Pointed one after + pop ESI + pop EDI + pop ebp + ret +_strstr endp + endcode strstr + + ; + ; Find a substring in string, return index + ; Arg: str,search + ; + + begcode strinstr + public _strinstr +_strinstr proc near + push ebp + mov ebp,esp + push P+SIZEPTR[ebp] ; search + push P[ebp] ; str + call _strstr + add esp,SIZEPTR*2 + or eax,eax + jz si_99 ; Not found, return NULL + sub eax,P[ebp] ; Pos from start + inc eax ; And first pos = 1 +si_99: pop ebp + ret +_strinstr endp + endcode strinstr + + ; + ; Make a string of len length from another string + ; Arg: dst,src,length + ; ret: end of dst + ; + + begcode strmake + public _strmake +_strmake proc near + push ebp + mov ebp,esp + fix_es 1 + push EDI + push ESI + mov edi,P[ebp] ; dst + mov esi,P+SIZEPTR[ebp] ; src + mov ecx,P+SIZEPTR*2[ebp] ; Length of memory-area + clr al ; For test of end-null + jcxz sm_90 ; Nothing to move, put zero at end. + +@@: cmp al,[esi] ; Next char to move + movsb ; move arg + jz sm_99 ; last char, we are ready + loop @B ; Continue moving +sm_90: mov BYTE PTR [edi],al ; Set end pos + inc edi ; Fix that di points at end null +sm_99: dec edi ; di points now at end null + mov eax,edi ; Ret value in DX:AX + pop ESI + pop EDI + pop ebp + ret +_strmake ENDP + endcode strmake + + ; + ; Find length of string with maxlength + ; arg: str,maxlength + ; ret: length + ; + + begcode strnlen + public _strnlen +_strnlen proc near + push ebp + mov ebp,esp + fix_es 1 + push edi + mov edi,P[ebp] ; Str + mov ecx,P+SIZEPTR[ebp] ; length + mov edx,edi ; Save str to calc length + jcxz sn_10 ; Length = 0 + clr al ; Find end of string + repne scasb ; Find strend or length + jnz sn_10 + dec edi ; DI points at last null +sn_10: mov eax,edi + sub eax,edx ; Ax = length + pop edi + pop ebp + ret +_strnlen ENDP + endcode strnlen + + ; + ; Move a string with max len chars + ; arg: dst,src,len + ; ret: pos to first null or dst+len + + begcode strnmov + public _strnmov +_strnmov PROC near + push ebp + mov ebp,esp + fix_es 1 + push EDI + push ESI + mov edi,P[ebp] ; dst + mov esi,P+SIZEPTR[ebp] ; src + mov ecx,P+(SIZEPTR*2)[ebp] ; length + jcxz snm_99 ; Nothing to do + clr al ; For test of end-null + +@@: cmp al,[esi] ; Next char to move + movsb ; move arg + jz snm_20 ; last char, fill with null + loop @B ; Continue moving + inc edi ; Point two after last +snm_20: dec edi ; Point at first null (or last+1) +snm_99: mov eax,edi ; Pointer at last char + pop ESI + pop EDI + pop ebp + ret +_strnmov ENDP + endcode strnmov + +; +; Zortech has this one in standard library +; + + begcode strmov + public _strmov +_strmov proc near + mov ecx,esi ; Save old esi and edi + mov edx,edi + mov esi,P[esp] ; get source pointer (s2) + mov edi,P-SIZEPTR[esp] ; EDI -> s1 + fix_es 1 +@@: mov al,[esi] + movsb ; move arg + and al,al + jnz @B ; Not last + mov eax,edi + dec eax + mov esi,ecx ; Restore args + mov edi,edx + ret +_strmov endp + endcode strmov + +endif ; M_I386 + + END diff --git a/strings/strinstr-sparc.s b/strings/strinstr-sparc.s new file mode 100644 index 00000000000..b9881743683 --- /dev/null +++ b/strings/strinstr-sparc.s @@ -0,0 +1,43 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "strinstr-sparc.s" +.section ".text" + .align 4 + .global strinstr + .type strinstr,#function + .proc 0102 +strinstr: + save %sp,-96,%sp + or %g0,%i1,%o1 + call strstr,2 ! Result = %o0 + or %g0,%i0,%o0 + orcc %g0,%o0,%o0 + bne .end + sub %o0,%i0,%i0 + ret + restore %g0,%g0,%o0 +.end: + ret + restore %i0,1,%o0 ! Offset for return value is from 1 + +.strinstr_end: + .size strinstr,.strinstr_end-strinstr + .ident "Matt Wagner & Monty" + + + diff --git a/strings/strinstr.c b/strings/strinstr.c new file mode 100644 index 00000000000..e1d502f4004 --- /dev/null +++ b/strings/strinstr.c @@ -0,0 +1,50 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : strinstr.c + Author : Monty & David + Updated: 1986.12.08 + Defines: strinstr() + + strinstr(src, pat) looks for an instance of pat in src. pat is not a + regex(3) pattern, it is a literal string which must be matched exactly. + The result 0 if the pattern was not found else it is the start char of + the pattern counted from the beginning of the string, where the first + char is 1. +*/ + +#include <global.h> +#include "m_string.h" + +uint strinstr(reg1 const char *str,reg4 const char *search) +{ + reg2 my_string i,j; + my_string start = (my_string) str; + + skipp: + while (*str != '\0') + { + if (*str++ == *search) + { + i=(my_string) str; j= (my_string) search+1; + while (*j) + if (*i++ != *j++) goto skipp; + return ((uint) (str - start)); + } + } + return (0); +} diff --git a/strings/strlen.c b/strings/strlen.c new file mode 100644 index 00000000000..c142a7f2b14 --- /dev/null +++ b/strings/strlen.c @@ -0,0 +1,50 @@ +/* File : strlen.c + Author : Richard A. O'Keefe. / Monty + Michael Widenius; ifdef MC68000 + Updated: 1986-11-30 + Defines: strlen() + + strlen(s) returns the number of characters in s, that is, the number + of non-NUL characters found before the closing NULEosCh. Note: some + non-standard C compilers for 32-bit machines take int to be 16 bits, + either put up with short strings or change int to long throughout + this package. Better yet, BOYCOTT such shoddy compilers. + Beware: the asm version works only if strlen(s) < 65536. +*/ + +#include "strings.h" + +#if VaxAsm + +size_s strlen(char *s) +{ + asm("locc $0,$65535,*4(ap)"); + asm("subl3 r0,$65535,r0"); +} + +#else +#if defined(MC68000) && defined(DS90) + +size_s strlen(char *s) +{ +asm(" movl 4(a7),a0 "); +asm(" movl a0,a1 "); +asm(".L4: tstb (a0)+ "); +asm(" jne .L4 "); +asm(" movl a0,d0 "); +asm(" subl a1,d0 "); +asm(" subql #1,d0 "); +} +#else + +size_s strlen(register char *s) +{ + register char *startpos; + + startpos = s; + while (*s++); + return ((size_s) (s-startpos-1)); +} + +#endif +#endif diff --git a/strings/strmake-sparc.s b/strings/strmake-sparc.s new file mode 100644 index 00000000000..9fe72a9f9a2 --- /dev/null +++ b/strings/strmake-sparc.s @@ -0,0 +1,43 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "strmake-sparc.s" +.section ".text" + .align 4 + .global strmake + .type strmake,#function + .proc 0102 +strmake: + orcc %g0,%o2,%g0 + be,a .end + nop + ldsb [%o1],%g2 +.loop: + stb %g2,[%o0] + cmp %g2,0 + be .end ! Jump to end on end of string + add %o1,1,%o1 + add %o0,1,%o0 + subcc %o2,1,%o2 + bne,a .loop + ldsb [%o1],%g2 +.end: + retl + stb %g0,[%o0] +.strmake_end: + .size strmake,.strmake_end-strmake + .ident "Matt Wagner & Monty" diff --git a/strings/strmake.c b/strings/strmake.c new file mode 100644 index 00000000000..d4edce689a5 --- /dev/null +++ b/strings/strmake.c @@ -0,0 +1,53 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : strmake.c + Author : Michael Widenius + Updated: 20 Jul 1984 + Defines: strmake() + + strmake(dst,src,length) moves length characters, or until end, of src to + dst and appends a closing NUL to dst. + strmake() returns pointer to closing null; +*/ + +#include <global.h> +#include "m_string.h" + +#ifdef BAD_STRING_COMPILER + +char *strmake(char *dst,const char *src,uint length) +{ + reg1 char *res; + + if ((res=memccpy(dst,src,0,length))) + return res-1; + dst[length]=0; + return dst+length; +} + +#define strmake strmake_overlapp /* Use orginal for overlapping str */ +#endif + +char *strmake(register char *dst, register const char *src, uint length) +{ + while (length--) + if (! (*dst++ = *src++)) + return dst-1; + *dst=0; + return dst; +} diff --git a/strings/strmov-sparc.s b/strings/strmov-sparc.s new file mode 100644 index 00000000000..6114b0bf6e2 --- /dev/null +++ b/strings/strmov-sparc.s @@ -0,0 +1,36 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "strmov-sparc.s" +.section ".text" + .align 4 + .global strmov + .type strmov,#function + .proc 0102 +strmov: +.loop: + ldub [%o1], %g2 + stb %g2, [%o0] + add %o1, 1, %o1 + cmp %g2, 0 + bne,a .loop + add %o0, 1, %o0 + retl + nop +.strmov_end: + .size strmov,.strmov_end-strmov + .ident "Matt Wagner" diff --git a/strings/strmov.c b/strings/strmov.c new file mode 100644 index 00000000000..8f5beb41f41 --- /dev/null +++ b/strings/strmov.c @@ -0,0 +1,59 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + strmov(dst, src) moves all the characters of src (including the + closing NUL) to dst, and returns a pointer to the new closing NUL in + dst. The similar UNIX routine strcpy returns the old value of dst, + which I have never found useful. strmov(strmov(dst,a),b) moves a//b + into dst, which seems useful. +*/ + +#include <global.h> +#include "m_string.h" + +#ifdef BAD_STRING_COMPILER +#undef strmov +#define strmov strmov_overlapp +#endif + +#ifndef strmov + +#if !defined(MC68000) && !defined(DS90) + +char *strmov(register char *dst, register const char *src) +{ + while ((*dst++ = *src++)) ; + return dst-1; +} + +#else + +char *strmov(dst, src) + char *dst, *src; +{ + asm(" movl 4(a7),a1 "); + asm(" movl 8(a7),a0 "); + asm(".L4: movb (a0)+,(a1)+ "); + asm(" jne .L4 "); + asm(" movl a1,d0 "); + asm(" subql #1,d0 "); +} + +#endif + +#endif /* strmov */ diff --git a/strings/strnlen.c b/strings/strnlen.c new file mode 100644 index 00000000000..6eb872ee08d --- /dev/null +++ b/strings/strnlen.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* File : strnlen.c + Author : Michael Widenius + Updated: 20 April 1984 + Defines: strnlen. + strnlen(s, len) returns the length of s or len if s is longer than len. +*/ + +#include <global.h> +#include "m_string.h" + +#ifndef HAVE_STRNLEN + +uint strnlen(register const char *s, register uint maxlen) +{ + const char *end= memchr(s, '\0', maxlen); + return end ? (uint) (end - s) : maxlen; +} + +#endif diff --git a/strings/strnmov-sparc.s b/strings/strnmov-sparc.s new file mode 100644 index 00000000000..2dfcb95ab76 --- /dev/null +++ b/strings/strnmov-sparc.s @@ -0,0 +1,43 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "strnmov-sparc.s" +.section ".text" + .align 4 + .global strnmov + .type strnmov,#function + .proc 0102 +strnmov: + orcc %g0,%o2,%g0 + be,a .end + nop + ldsb [%o1],%g2 +.loop: + stb %g2,[%o0] + cmp %g2,0 + be .end ! Jump to end on end of string + add %o1,1,%o1 + add %o0,1,%o0 + subcc %o2,1,%o2 + bne,a .loop + ldsb [%o1],%g2 +.end: + retl + nop +.strnmov_end: + .size strnmov,.strnmov_end-strnmov + .ident "Matt Wagner" diff --git a/strings/strnmov.c b/strings/strnmov.c new file mode 100644 index 00000000000..ffc4a62f75e --- /dev/null +++ b/strings/strnmov.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + strnmov(dst,src,length) moves length characters, or until end, of src to + dst and appends a closing NUL to dst if src is shorter than length. + The result is a pointer to the first NUL in dst, or is dst+n if dst was + truncated. +*/ + +#include <global.h> +#include "m_string.h" + +char *strnmov(register char *dst, register const char *src, uint n) +{ + while (n-- != 0) { + if (!(*dst++ = *src++)) { + return (char*) dst-1; + } + } + return dst; +} diff --git a/strings/strrchr.c b/strings/strrchr.c new file mode 100644 index 00000000000..5a045ac3740 --- /dev/null +++ b/strings/strrchr.c @@ -0,0 +1,24 @@ +/* File : strrchr.c + Author : Richard A. O'Keefe. + Updated: 10 April 1984 + Defines: strrchr(), rindex() + + strrchr(s, c) returns a pointer to the last place in s where c + occurs, or NullS if c does not occur in s. This function is called + rindex in V7 and 4.?bsd systems; while not ideal the name is clearer + than strrchr, so rindex remains in strings.h as a macro. NB: + strrchr looks for single characters, not for sets or strings. The + parameter 'c' is declared 'int' so it will go in a register; if your + C compiler is happy with register char change it to that. +*/ + +#include "strings.h" + +char *strrchr(register const char *s, register pchar c) +{ + reg3 char *t; + + t = NullS; + do if (*s == (char) c) t = (char*) s; while (*s++); + return (char*) t; +} diff --git a/strings/strstr-sparc.s b/strings/strstr-sparc.s new file mode 100644 index 00000000000..d0d3659b1f8 --- /dev/null +++ b/strings/strstr-sparc.s @@ -0,0 +1,75 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "strstr-sparc.s" +.section ".text" + .align 4 + .global strstr + .type strstr,#function + .proc 0102 +strstr: + +!char *strstr(register const char *str,const char *search) +!{ +! register char *i,*j; +!skipp: +! while (*str != '\0') { +! if (*str++ == *search) { +! i=(char*) str; j=(char*) search+1; + + ldsb [%o1],%g6 ! g6= First char of search +.top: + ldsb [%o0],%g3 ! g3= First char of rest of str + cmp %g3,0 + be .abort ! Found end null ; + cmp %g3,%g6 + bne .top + add %o0,1,%o0 + +.outloop1: + +! while (*j) +! if (*i++ != *j++) goto skipp; + + or %g0,%o0,%g2 + add %o1,1,%g3 ! g3= search+1 + ldsb [%o0],%o5 ! o5= [current_str+1] + +.loop2: + ldsb [%g3],%g4 + add %g3,1,%g3 + cmp %g4,0 + be .end + cmp %o5,%g4 + bne .top + add %g2,1,%g2 + ba .loop2 + ldsb [%g2],%o5 + +.end: + retl + sub %o0,1,%o0 +.abort: + retl + or %g0,0,%o0 + +.strstr_end: + .size strstr,.strstr_end-strstr + .ident "Matt Wagner & Monty" + + + diff --git a/strings/strstr.c b/strings/strstr.c new file mode 100644 index 00000000000..572bf88c95c --- /dev/null +++ b/strings/strstr.c @@ -0,0 +1,35 @@ +/* File : strstr.c + Author : Monty + Updated: 1986.11.24 + Defines: strstr() + + strstr(src, pat) looks for an instance of pat in src. pat is not a + regex(3) pattern, it is a literal string which must be matched exactly. + The result is a pointer to the first character of the located instance, + or NullS if pat does not occur in src. + +*/ + +#include <global.h> +#include "m_string.h" + +#ifndef HAVE_STRSTR + +char *strstr(register const char *str,const char *search) +{ + register char *i,*j; + register char first= *search; + +skipp: + while (*str != '\0') { + if (*str++ == first) { + i=(char*) str; j=(char*) search+1; + while (*j) + if (*i++ != *j++) goto skipp; + return ((char*) str-1); + } + } + return ((char*) 0); +} /* strstr */ + +#endif diff --git a/strings/strto.c b/strings/strto.c new file mode 100644 index 00000000000..eb8caab2ab6 --- /dev/null +++ b/strings/strto.c @@ -0,0 +1,204 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* + strtol,strtoul,strtoll,strtoull + convert string to long, unsigned long, long long or unsigned long long. + strtoxx(char *src,char **ptr,int base) + converts the string pointed to by src to an long of appropriate long and + returnes it. It skips leading spaces and tabs (but not newlines, formfeeds, + backspaces), then it accepts an optional sign and a sequence of digits + in the specified radix. + If the value of ptr is not (char **)NULL, a pointer to the character + terminating the scan is returned in the location pointed to by ptr. + Trailing spaces will NOT be skipped. + + If an error is detected, the result will be LONG_MIN, 0 or LONG_MAX, + (or LONGLONG..) and errno will be set to + EDOM if there are no digits + ERANGE if the result would overflow. + the ptr will be set to src. + This file is based on the strtol from the the GNU C Library. + it can be compiled with the UNSIGNED and/or LONGLONG flag set +*/ + +#include <global.h> +#include "m_string.h" +#include "m_ctype.h" +#include "my_sys.h" /* defines errno */ +#include <errno.h> + +#ifdef LONGLONG +#define UTYPE_MAX (~(ulonglong) 0) +#define TYPE_MIN LONGLONG_MIN +#define TYPE_MAX LONGLONG_MAX +#define longtype longlong +#define ulongtype ulonglong +#ifdef UNSIGNED +#define function ulongtype strtoull +#else +#define function longtype strtoll +#endif +#else +#define UTYPE_MAX (ulong) ~0L +#define TYPE_MIN LONG_MIN +#define TYPE_MAX LONG_MAX +#define longtype long +#define ulongtype unsigned long +#ifdef UNSIGNED +#define function ulongtype strtoul +#else +#define function longtype strtol +#endif +#endif + + +/* Convert NPTR to an `unsigned long int' or `long int' in base BASE. + If BASE is 0 the base is determined by the presence of a leading + zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal. + If BASE is < 2 or > 36, it is reset to 10. + If ENDPTR is not NULL, a pointer to the character after the last + one converted is stored in *ENDPTR. */ + + +function (const char *nptr,char **endptr,int base) +{ + int negative; + register ulongtype cutoff; + register unsigned int cutlim; + register ulongtype i; + register const char *s; + register unsigned char c; + const char *save; + int overflow; + + if (base < 0 || base == 1 || base > 36) + base = 10; + + s = nptr; + + /* Skip white space. */ + while (isspace (*s)) + ++s; + if (*s == '\0') + { + goto noconv; + } + + /* Check for a sign. */ + if (*s == '-') + { + negative = 1; + ++s; + } + else if (*s == '+') + { + negative = 0; + ++s; + } + else + negative = 0; + + if (base == 16 && s[0] == '0' && toupper (s[1]) == 'X') + s += 2; + + /* If BASE is zero, figure it out ourselves. */ + if (base == 0) + { + if (*s == '0') + { + if (toupper (s[1]) == 'X') + { + s += 2; + base = 16; + } + else + base = 8; + } + else + base = 10; + } + + /* Save the pointer so we can check later if anything happened. */ + save = s; + + cutoff = UTYPE_MAX / (unsigned long int) base; + cutlim = (uint) (UTYPE_MAX % (unsigned long int) base); + + overflow = 0; + i = 0; + for (c = *s; c != '\0'; c = *++s) + { + if (isdigit (c)) + c -= '0'; + else if (isalpha (c)) + c = toupper (c) - 'A' + 10; + else + break; + if (c >= base) + break; + /* Check for overflow. */ + if (i > cutoff || (i == cutoff && c > cutlim)) + overflow = 1; + else + { + i *= (ulongtype) base; + i += c; + } + } + + /* Check if anything actually happened. */ + if (s == save) + goto noconv; + + /* Store in ENDPTR the address of one character + past the last character we converted. */ + if (endptr != NULL) + *endptr = (char *) s; + +#ifndef UNSIGNED + /* Check for a value that is within the range of + `unsigned long int', but outside the range of `long int'. */ + if (negative) + { + if (i > (ulongtype) TYPE_MIN) + overflow = 1; + } + else if (i > (ulongtype) TYPE_MAX) + overflow = 1; +#endif + + if (overflow) + { + my_errno=ERANGE; +#ifdef UNSIGNED + return UTYPE_MAX; +#else + return negative ? TYPE_MIN : TYPE_MAX; +#endif + } + + /* Return the result of the appropriate sign. */ + return (negative ? -((longtype) i) : i); + +noconv: + /* There was no number to convert. */ + my_errno=EDOM; + if (endptr != NULL) + *endptr = (char *) nptr; + return 0L; +} diff --git a/strings/strtol.c b/strings/strtol.c new file mode 100644 index 00000000000..ae3fdd0e2b3 --- /dev/null +++ b/strings/strtol.c @@ -0,0 +1,23 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* This defines strtol() if neaded */ + +#include <global.h> +#if !defined(MSDOS) && !defined(HAVE_STRTOUL) && !defined(__WIN__) +#include "strto.c" +#endif diff --git a/strings/strtoll.c b/strings/strtoll.c new file mode 100644 index 00000000000..f43dae726f5 --- /dev/null +++ b/strings/strtoll.c @@ -0,0 +1,25 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* This is defines strtoll() if neaded */ + +#include <global.h> +#include <m_string.h> +#if !defined(HAVE_STRTOULL) && defined(HAVE_LONG_LONG) +#define LONGLONG +#include "strto.c" +#endif diff --git a/strings/strtoul.c b/strings/strtoul.c new file mode 100644 index 00000000000..bbfaa6ad22a --- /dev/null +++ b/strings/strtoul.c @@ -0,0 +1,24 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* This is defines strtoul() if neaded */ + +#include <global.h> +#if !defined(MSDOS) && !defined(HAVE_STRTOUL) +#define UNSIGNED +#include "strto.c" +#endif diff --git a/strings/strtoull.c b/strings/strtoull.c new file mode 100644 index 00000000000..42ce5ea4177 --- /dev/null +++ b/strings/strtoull.c @@ -0,0 +1,26 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* This is defines strtoull() */ + +#include <global.h> +#include <m_string.h> +#if !defined(HAVE_STRTOULL) && defined(HAVE_LONG_LONG) +#define UNSIGNED +#define LONGLONG +#include "strto.c" +#endif diff --git a/strings/strxmov-sparc.s b/strings/strxmov-sparc.s new file mode 100644 index 00000000000..e65b56d317d --- /dev/null +++ b/strings/strxmov-sparc.s @@ -0,0 +1,49 @@ +! Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +! +! This library is free software; you can redistribute it and/or +! modify it under the terms of the GNU Library General Public +! License as published by the Free Software Foundation; either +! version 2 of the License, or (at your option) any later version. +! +! This library is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +! Library General Public License for more details. +! +! You should have received a copy of the GNU Library General Public +! License along with this library; if not, write to the Free +! Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA + + .file "strxmov-sparc.s" +.section ".text" + .align 4 + .global strxmov + .type strxmov,#function + .proc 0102 +strxmov: + st %o2, [%sp+76] ! store 3rd param before other params + st %o3, [%sp+80] ! store 4th param " " + cmp %o1, 0 ! check if no from args + st %o4, [%sp+84] ! store 5th param + be .end + st %o5, [%sp+88] ! store last + add %sp, 76, %g2 ! put pointer to 3rd arg +.loop: + ldub [%o1], %g1 ! set values of src (o1) + add %o1, 1, %o1 ! inc src + stb %g1, [%o0] ! and dst (o2) equal + cmp %g1, 0 ! second while cmp + bne,a .loop + add %o0, 1, %o0 ! inc dst + ld [%g2], %o1 ! get next param + cmp %o1, 0 ! check if last param + bne .loop + add %g2, 4, %g2 ! advance to next param +.end: + retl + stb %g0, [%o0] +.strxmov_end: + .size strxmov,.strxmov_end-strxmov + .ident "Matt Wagner & Monty" + diff --git a/strings/strxmov.asm b/strings/strxmov.asm new file mode 100644 index 00000000000..9b027ad4276 --- /dev/null +++ b/strings/strxmov.asm @@ -0,0 +1,103 @@ +; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +; +; This library is free software; you can redistribute it and/or +; modify it under the terms of the GNU Library General Public +; License as published by the Free Software Foundation; either +; version 2 of the License, or (at your option) any later version. +; +; This library is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +; Library General Public License for more details. +; +; You should have received a copy of the GNU Library General Public +; License along with this library; if not, write to the Free +; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +; MA 02111-1307, USA + + TITLE Optimized strxmov for MSDOS / Intel 8086 + +ifndef M_I386 + .8087 + DOSSEG + .MODEL LARGE + .CODE + + PUBLIC _strxmov +_strxmov PROC + mov bx,sp + add bx,4 + push si + push di + mov cx,ds ; Save ds +ASSUME DS: NOTHING +ASSUME ES: NOTHING + les di,DWORD PTR ss:[bx] ; dst + jmp next_str + +start_str: + mov al,ds:[si] + movsb ; move arg + and al,al + jnz start_str ; Not last + dec di + +next_str: + add bx,4 + lds si,DWORD PTR ss:[bx] + mov ax,ds + or ax,si + jnz start_str + + mov byte ptr es:[di],0 ; Force end null (if no source) + mov ds,cx + mov ax,di ; Return ptr to last 0 + mov dx,es + pop di + pop si + ret +_strxmov ENDP + +else + +include macros.asm + + begcode strxmov + public _strxmov + +_strxmov PROC near +ASSUME DS: NOTHING +ASSUME ES: NOTHING + push EBP + mov EBP,ESP + mov EDX,EBX ; Save EBX + mov ECX,ESI ; Save ESI + push EDI + mov EDI,8[EBP] ; Get destination + lea EBX,8[EBP] ; Get adress to first source - 4 + xor al,al + jmp next_str + +start_str: movsb + cmp AL,[EDI-1] + jne start_str + dec EDI ; Don't copy last null + +next_str: add EBX,4 + mov ESI,[EBX] + or ESI,ESI + jne start_str + mov byte ptr [EDI],0 ; Force last null + + mov EAX,EDI ; Return ptr to null + pop EDI + mov ESI,ECX + mov EBX,EDX + pop EBP + ret +_strxmov endp + endcode strxmov + +endif + + END diff --git a/strings/strxmov.c b/strings/strxmov.c new file mode 100644 index 00000000000..7ee1d303ee8 --- /dev/null +++ b/strings/strxmov.c @@ -0,0 +1,33 @@ +/* File : strxmov.c + Author : Richard A. O'Keefe. + Updated: 25 may 1984 + Defines: strxmov() + + strxmov(dst, src1, ..., srcn, NullS) + moves the concatenation of src1,...,srcn to dst, terminates it + with a NUL character, and returns a pointer to the terminating NUL. + It is just like strmov except that it concatenates multiple sources. + Beware: the last argument should be the null character pointer. + Take VERY great care not to omit it! Also be careful to use NullS + and NOT to use 0, as on some machines 0 is not the same size as a + character pointer, or not the same bit pattern as NullS. +*/ + +#include <global.h> +#include "m_string.h" +#include <stdarg.h> + +char *strxmov(char *dst,const char *src, ...) +{ + va_list pvar; + + va_start(pvar,src); + while (src != NullS) { + while ((*dst++ = *src++)) ; + dst--; + src = va_arg(pvar, char *); + } + va_end(pvar); + *dst = 0; /* there might have been no sources! */ + return dst; +} diff --git a/strings/strxnmov.c b/strings/strxnmov.c new file mode 100644 index 00000000000..494b227209f --- /dev/null +++ b/strings/strxnmov.c @@ -0,0 +1,46 @@ +/* File : strxnmov.c + Author : Richard A. O'Keefe. + Updated: 2 June 1984 + Defines: strxnmov() + + strxnmov(dst, len, src1, ..., srcn, NullS) + moves the first len characters of the concatenation of src1,...,srcn + to dst. If there aren't that many characters, a NUL character will + be added to the end of dst to terminate it properly. This gives the + same effect as calling strxcpy(buff, src1, ..., srcn, NullS) with a + large enough buffer, and then calling strnmov(dst, buff, len). + It is just like strnmov except that it concatenates multiple sources. + Beware: the last argument should be the null character pointer. + Take VERY great care not to omit it! Also be careful to use NullS + and NOT to use 0, as on some machines 0 is not the same size as a + character pointer, or not the same bit pattern as NullS. + + Note: strxnmov is like strnmov in that it always moves EXACTLY len + characters; dst will be padded on the right with NUL characters as + needed. strxncpy does the same. strxncat, like strncat, does NOT. +*/ + +#include <global.h> +#include "m_string.h" +#include <stdarg.h> + +char *strxnmov(char *dst,uint len, const char *src, ...) +{ + va_list pvar; + char *result; + + va_start(pvar,src); + while (src != NullS) { + do if (len-- == 0) + { + va_end(pvar); + return dst; + } + while ((*dst++ = *src++) != 0); + dst--; + src = va_arg(pvar, char *); + } + for (result= dst; len-- != 0; *dst++ = 0) ; + va_end(pvar); + return result; +} diff --git a/strings/t_ctype.h b/strings/t_ctype.h new file mode 100644 index 00000000000..f60e6d98272 --- /dev/null +++ b/strings/t_ctype.h @@ -0,0 +1,243 @@ +/* + Copyright (C) 1998, 1999 by Pruet Boonma, all rights reserved. + Copyright (C) 1998 by Theppitak Karoonboonyanan, all rights reserved. + Permission to use, copy, modify, distribute and sell this software + and its documentation for any purpose is hereby granted without fee, + provided that the above copyright notice appear in all copies. + Smaphan Raruenrom and Pruet Boonma makes no representations about + the suitability of this software for any purpose. It is provided + "as is" without express or implied warranty. +*/ + +/* $Id$ + LC_COLLATE category + Level information +*/ + +#ifndef _t_ctype_h +#define _t_ctype_h + +typedef unsigned char tchar; + +#define TOT_LEVELS 5 +#define LAST_LEVEL 4 /* TOT_LEVELS - 1 */ + +#define IGNORE 0 + + +// level 1 symbols & order +enum l1_symbols { + L1_08 = TOT_LEVELS, + L1_18, + L1_28, + L1_38, + L1_48, + L1_58, + L1_68, + L1_78, + L1_88, + L1_98, + L1_A8, + L1_B8, + L1_C8, + L1_D8, + L1_E8, + L1_F8, + L1_G8, + L1_H8, + L1_I8, + L1_J8, + L1_K8, + L1_L8, + L1_M8, + L1_N8, + L1_O8, + L1_P8, + L1_Q8, + L1_R8, + L1_S8, + L1_T8, + L1_U8, + L1_V8, + L1_W8, + L1_X8, + L1_Y8, + L1_Z8, + L1_KO_KAI, + L1_KHO_KHAI, + L1_KHO_KHUAT, + L1_KHO_KHWAI, + L1_KHO_KHON, + L1_KHO_RAKHANG, + L1_NGO_NGU, + L1_CHO_CHAN, + L1_CHO_CHING, + L1_CHO_CHANG, + L1_SO_SO, + L1_CHO_CHOE, + L1_YO_YING, + L1_DO_CHADA, + L1_TO_PATAK, + L1_THO_THAN, + L1_THO_NANGMONTHO, + L1_THO_PHUTHAO, + L1_NO_NEN, + L1_DO_DEK, + L1_TO_TAO, + L1_THO_THUNG, + L1_THO_THAHAN, + L1_THO_THONG, + L1_NO_NU, + L1_BO_BAIMAI, + L1_PO_PLA, + L1_PHO_PHUNG, + L1_FO_FA, + L1_PHO_PHAN, + L1_FO_FAN, + L1_PHO_SAMPHAO, + L1_MO_MA, + L1_YO_YAK, + L1_RO_RUA, + L1_RU, + L1_LO_LING, + L1_LU, + L1_WO_WAEN, + L1_SO_SALA, + L1_SO_RUSI, + L1_SO_SUA, + L1_HO_HIP, + L1_LO_CHULA, + L1_O_ANG, + L1_HO_NOKHUK, + L1_NKHIT, + L1_SARA_A, + L1_MAI_HAN_AKAT, + L1_SARA_AA, + L1_SARA_AM, + L1_SARA_I, + L1_SARA_II, + L1_SARA_UE, + L1_SARA_UEE, + L1_SARA_U, + L1_SARA_UU, + L1_SARA_E, + L1_SARA_AE, + L1_SARA_O, + L1_SARA_AI_MAIMUAN, + L1_SARA_AI_MAIMALAI, +}; + +// level 2 symbols & order +enum l2_symbols { + L2_BLANK = TOT_LEVELS, + L2_THAII, + L2_YAMAK, + L2_PINTHU, + L2_GARAN, + L2_TYKHU, + L2_TONE1, + L2_TONE2, + L2_TONE3, + L2_TONE4, +}; + +// level 3 symbols & order +enum l3_symbols { + L3_BLANK = TOT_LEVELS, + L3_SPACE, + L3_NB_SACE, + L3_LOW_LINE, + L3_HYPHEN, + L3_COMMA, + L3_SEMICOLON, + L3_COLON, + L3_EXCLAMATION, + L3_QUESTION, + L3_SOLIDUS, + L3_FULL_STOP, + L3_PAIYAN_NOI, + L3_MAI_YAMOK, + L3_GRAVE, + L3_CIRCUMFLEX, + L3_TILDE, + L3_APOSTROPHE, + L3_QUOTATION, + L3_L_PARANTHESIS, + L3_L_BRACKET, + L3_L_BRACE, + L3_R_BRACE, + L3_R_BRACKET, + L3_R_PARENTHESIS, + L3_AT, + L3_BAHT, + L3_DOLLAR, + L3_FONGMAN, + L3_ANGKHANKHU, + L3_KHOMUT, + L3_ASTERISK, + L3_BK_SOLIDUS, + L3_AMPERSAND, + L3_NUMBER, + L3_PERCENT, + L3_PLUS, + L3_LESS_THAN, + L3_EQUAL, + L3_GREATER_THAN, + L3_V_LINE, +}; + +// level 4 symbols & order +enum l4_symbols { + L4_BLANK = TOT_LEVELS, + L4_MIN, + L4_CAP, + L4_EXT, +}; + +enum level_symbols { + L_UPRUPR = TOT_LEVELS, + L_UPPER, + L_MIDDLE, + L_LOWER +}; + +#define _is(c) (t_ctype[(c)][LAST_LEVEL]) +#define _level 8 +#define _consnt 16 +#define _ldvowel 32 +#define _fllwvowel 64 +#define _uprvowel 128 +#define _lwrvowel 256 +#define _tone 512 +#define _diacrt1 1024 +#define _diacrt2 2048 +#define _combine 4096 +#define _stone 8192 +#define _tdig 16384 +#define _rearvowel (_fllwvowel | _uprvowel | _lwrvowel) +#define _diacrt (_diacrt1 | _diacrt2) +#define levelof(c) ( _is(c) & _level ) +#define isthai(c) ( (c) >= 128 ) +#define istalpha(c) ( _is(c) & (_consnt|_ldvowel|_rearvowel|\ + _tone|_diacrt1|_diacrt2) ) +#define isconsnt(c) ( _is(c) & _consnt ) +#define isldvowel(c) ( _is(c) & _ldvowel ) +#define isfllwvowel(c) ( _is(c) & _fllwvowel ) +#define ismidvowel(c) ( _is(c) & (_ldvowel|_fllwvowel) ) +#define isuprvowel(c) ( _is(c) & _uprvowel ) +#define islwrvowel(c) ( _is(c) & _lwrvowel ) +#define isuprlwrvowel(c) ( _is(c) & (_lwrvowel | _uprvowel)) +#define isrearvowel(c) ( _is(c) & _rearvowel ) +#define isvowel(c) ( _is(c) & (_ldvowel|_rearvowel) ) +#define istone(c) ( _is(c) & _tone ) +#define isunldable(c) ( _is(c) & (_rearvowel|_tone|_diacrt1|_diacrt2) ) +#define iscombinable(c) ( _is(c) & _combine ) +#define istdigit(c) ( _is(c) & _tdig ) +#define isstone(c) ( _is(c) & _stone ) +#define isdiacrt1(c) ( _is(c) & _diacrt1) +#define isdiacrt2(c) ( _is(c) & _diacrt2) +#define isdiacrt(c) ( _is(c) & _diacrt) + +/* Function prototype called by sql/field.cc */ +void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length); + +#endif diff --git a/strings/udiv.c b/strings/udiv.c new file mode 100644 index 00000000000..07af323a706 --- /dev/null +++ b/strings/udiv.c @@ -0,0 +1,38 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* Do udiv and urem if machine dosn't have it */ + +#include <global.h> +#include <math.h> + +unsigned long udiv(long unsigned int a, long unsigned int b) +{ + if (a < INT_MAX32 && b < INT_MAX32) + return (unsigned long) ((long) a / (long) b); + if (!(b & 1)) + return (unsigned long) ((long) (a >> 1) / (long) (b >> 1)); + + return (unsigned long) floor(((double) a / (double) b)); +} + +unsigned long urem(long unsigned int a, long unsigned int b) +{ + if (a < INT_MAX32 && b < INT_MAX32) + return (unsigned long) ((long) a % (long) b); + return a-udiv(a,b)*b; +} |