From 169c97d10a6a072902340286adde52edaa2c2855 Mon Sep 17 00:00:00 2001 From: cxl Date: Mon, 22 Sep 2008 16:38:35 +0000 Subject: [PATCH] Various A++/T++ fixes, Alt+F10 in T++ invokes 'fix current topic' hidden function git-svn-id: svn://ultimatepp.org/upp/trunk@473 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/Log.cpp | 4 +- uppsrc/Core/Uuid.cpp | 30 + uppsrc/Core/Uuid.h | 1 + uppsrc/Core/src.tpp/AMap$en-us.tpp | 981 ++++++++++---- uppsrc/Core/src.tpp/CParser$en-us.tpp | 370 +++++- uppsrc/Core/src.tpp/util$en-us.tpp | 71 +- uppsrc/CppBase/Base.cpp | 47 +- uppsrc/CppBase/CppBase.h | 29 +- uppsrc/CppBase/CppBase.upp | 1 + uppsrc/CppBase/Parser.cpp | 112 +- uppsrc/CppBase/Parser2.cpp | 1447 +++++++++++++++++++++ uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp | 3 +- uppsrc/CtrlLib/src.tpp/FileList$en-us.tpp | 372 +++++- uppsrc/CtrlLib/src.tpp/FileSel$en-us.tpp | 3 +- uppsrc/RichText/ParseQtf.cpp | 17 +- uppsrc/RichText/Txt.h | 15 +- uppsrc/RichText/TxtData.cpp | 6 + uppsrc/ide/Browser/Base.cpp | 2 +- uppsrc/ide/Browser/Browser.h | 9 +- uppsrc/ide/Browser/Browser.upp | 1 + uppsrc/ide/Browser/IdeTopic.cpp | 171 ++- uppsrc/ide/Browser/Item.cpp | 127 ++ uppsrc/ide/Browser/ItemList.cpp | 118 +- uppsrc/ide/Browser/Topic.lay | 1 + uppsrc/ide/Browser/TopicWin.cpp | 3 + uppsrc/ide/Browser/init | 2 +- uppsrc/ide/Debuggers/Visualise.cpp | 6 +- uppsrc/ide/Help.cpp | 10 +- 28 files changed, 3278 insertions(+), 681 deletions(-) create mode 100644 uppsrc/CppBase/Parser2.cpp create mode 100644 uppsrc/ide/Browser/Item.cpp diff --git a/uppsrc/Core/Log.cpp b/uppsrc/Core/Log.cpp index 5bca610b9..845ca9ee5 100644 --- a/uppsrc/Core/Log.cpp +++ b/uppsrc/Core/Log.cpp @@ -198,10 +198,10 @@ void LogStream::Flush() void LogStream::Put0(int w) { if(w == LOG_BEGIN) - depth++; + depth = min(depth + 1, 20); else if(w == LOG_END) - depth--; + depth = max(depth - 1, 0); else { if(bol) { bol = false; diff --git a/uppsrc/Core/Uuid.cpp b/uppsrc/Core/Uuid.cpp index 8e4874448..bb7e1bab8 100644 --- a/uppsrc/Core/Uuid.cpp +++ b/uppsrc/Core/Uuid.cpp @@ -22,6 +22,36 @@ String Format(const Uuid& id) { return Sprintf("%08X%08X%08X%08X", id.a, id.b, id.c, id.d); } +dword scanX(const char *s) +{ + dword r = 0; + for(int i = 0; i < 8; i++) { + r = (r << 4) | (*s >= '0' && *s <= '9' ? *s - '0' : + *s >= 'A' && *s <= 'F' ? *s - 'A' : + *s >= 'a' && *s <= 'f' ? *s - 'a' : 0); + s++; + } + return r; +} + +Uuid ScanUuid(const char *s) +{ + Uuid id; + String xu; + while(*s) { + if(IsXDigit(*s)) + xu.Cat(*s); + s++; + } + if(xu.GetCount() < 32) + return Null; + id.a = scanX(~xu); + id.b = scanX(~xu + 8); + id.c = scanX(~xu + 16); + id.d = scanX(~xu + 24); + return id; +} + String Uuid::ToString() const { return Format(*this); diff --git a/uppsrc/Core/Uuid.h b/uppsrc/Core/Uuid.h index 396ccdd25..0a70c0c96 100644 --- a/uppsrc/Core/Uuid.h +++ b/uppsrc/Core/Uuid.h @@ -19,6 +19,7 @@ struct Uuid : AssignValueTypeNo > { }; String Format(const Uuid& id); +Uuid ScanUuid(const char *s); inline bool operator==(const Uuid& u, const Uuid& w) { return ((u.a ^ w.a) | (u.b ^ w.b) | (u.c ^ w.c) | (u.d ^ w.d)) == 0; diff --git a/uppsrc/Core/src.tpp/AMap$en-us.tpp b/uppsrc/Core/src.tpp/AMap$en-us.tpp index e3f0c5dee..e165169b1 100644 --- a/uppsrc/Core/src.tpp/AMap$en-us.tpp +++ b/uppsrc/Core/src.tpp/AMap$en-us.tpp @@ -1,288 +1,693 @@ -TITLE("AMap") -COMPRESSED -120,156,237,93,109,115,218,72,18,254,43,83,181,187,41,59, -139,109,33,192,96,59,155,186,188,237,94,202,73,54,101,19, -239,7,23,54,50,26,140,206,66,210,105,132,109,238,246,246, -183,95,247,140,222,223,65,194,134,44,249,16,3,26,245,76, -119,63,221,211,211,211,26,93,202,228,199,31,165,134,244,131, -84,240,239,248,61,29,43,51,221,25,92,106,237,118,239,68, -145,59,39,119,167,191,31,157,188,252,199,206,97,123,23,136, -52,129,72,171,219,108,245,58,173,102,91,62,132,255,154,173, -166,220,145,91,237,102,79,62,106,247,90,173,158,116,60,210, -21,198,6,151,186,220,235,157,96,207,50,220,36,119,59,114, -179,219,238,181,123,205,86,183,39,195,189,178,36,201,82,87, -238,52,219,173,158,220,57,86,41,27,13,46,149,94,235,228, -229,217,33,220,212,194,158,128,184,212,60,148,219,221,182,44, -181,36,185,13,93,53,123,189,118,179,219,233,181,142,14,15, -143,71,138,229,104,166,225,246,165,53,155,114,243,228,166,217, -61,129,33,255,245,215,95,251,205,182,36,70,208,6,98,77, -169,13,67,109,194,111,82,91,238,54,59,71,210,81,167,215, -236,73,45,32,222,233,74,157,99,75,177,149,105,58,231,72, -163,83,200,122,87,58,214,28,10,36,94,254,220,108,118,225, -150,195,198,225,15,205,118,23,24,237,181,218,157,94,87,130, -206,101,89,110,181,228,102,75,62,58,146,59,135,157,238,241, -132,42,42,181,93,22,20,24,252,203,38,220,218,109,116,127, -128,27,165,118,167,37,183,143,80,88,45,232,73,150,15,59, -71,205,78,91,234,28,2,165,99,155,254,123,166,217,116,74, -13,208,216,127,175,255,247,211,135,47,123,223,206,201,37,235, -156,156,254,67,34,151,63,73,210,158,36,9,221,193,192,44, -93,113,232,245,171,129,255,187,180,47,237,203,157,206,46,113, -53,22,110,127,237,127,109,147,211,232,165,6,89,156,68,191, -58,137,139,234,36,254,169,176,201,175,70,244,250,235,235,235, -5,9,145,55,159,21,107,240,98,112,201,36,132,217,97,251, -196,151,46,121,197,111,36,151,47,185,216,26,36,244,181,31, -253,122,17,253,234,14,237,181,32,219,34,248,119,171,198,167, -82,35,113,255,92,190,124,199,5,181,247,103,127,110,81,98, -142,201,29,157,179,125,114,74,166,51,230,144,137,114,79,137, -74,169,69,70,166,53,135,255,12,230,216,179,145,99,218,13, -114,67,225,238,131,43,213,178,134,199,195,131,225,193,185,57, -179,71,244,189,57,26,30,188,51,13,71,209,12,106,179,225, -193,103,243,158,42,55,58,189,34,83,247,211,128,40,134,26, -162,15,99,32,166,69,109,5,200,14,127,25,254,50,128,30, -199,112,183,186,31,25,100,63,52,200,123,69,159,81,24,102, -95,144,97,138,163,177,241,156,132,252,3,35,99,211,198,1, -139,129,144,177,174,220,195,15,154,10,215,180,177,70,85,114, -51,39,220,3,82,7,46,95,68,251,186,8,245,117,163,48, -109,68,108,24,179,57,37,202,104,68,1,193,62,221,232,109, -174,158,246,254,196,15,154,113,43,212,177,79,62,135,100,201, -57,227,60,207,12,166,221,226,23,143,249,157,221,29,46,97, -114,58,124,65,30,119,7,4,198,54,49,85,96,203,153,217, -6,210,155,0,93,193,60,103,143,234,130,215,125,223,54,247, -219,205,195,19,174,104,162,49,162,184,6,231,76,20,7,198, -60,189,129,190,25,249,104,168,244,209,83,53,121,208,156,73, -62,143,129,192,27,216,235,20,7,50,133,14,132,72,129,189, -143,14,118,54,99,192,138,194,144,22,117,251,117,85,48,2, -6,104,248,150,6,240,79,46,40,226,8,33,201,191,190,177, -109,101,142,223,56,58,224,135,115,122,235,94,143,179,247,73, -187,163,208,106,78,76,103,2,195,251,210,255,20,12,182,225, -51,143,224,116,76,75,27,9,120,190,51,109,58,60,96,246, -72,69,132,122,168,28,254,72,141,225,222,140,133,208,9,247, -17,50,112,80,251,92,54,185,116,224,231,187,225,117,64,5, -191,115,6,76,62,81,43,122,96,61,3,226,128,128,217,24, -70,204,232,84,1,24,142,64,16,138,14,42,158,221,78,64, -71,20,228,54,166,10,232,26,148,164,216,32,49,232,138,104, -83,203,180,29,104,78,52,3,136,217,218,61,136,217,23,170, -198,117,233,105,194,5,227,103,58,189,1,219,139,121,86,146, -244,22,247,166,166,250,222,33,112,39,224,41,212,224,247,157, -52,55,131,48,13,238,4,188,6,119,183,200,157,127,37,221, -217,69,111,238,71,111,126,244,175,236,114,95,37,159,224,104, -16,203,0,87,46,90,129,127,75,209,108,226,152,40,55,174, -114,206,124,247,4,208,13,215,53,21,166,12,70,32,58,225, -134,197,176,225,27,142,123,175,89,191,200,193,21,211,203,232, -212,166,160,98,106,128,13,97,43,238,78,11,91,249,182,224, -121,54,188,163,45,220,10,202,115,239,207,83,58,143,254,248, -8,63,94,96,227,253,106,122,254,10,136,173,73,215,194,24, -106,83,40,225,236,161,41,123,134,227,122,109,180,177,144,166, -208,48,116,243,65,252,132,134,226,104,83,10,243,211,204,225, -180,24,159,151,220,78,128,24,4,222,142,109,206,221,233,37, -6,133,56,237,77,64,65,1,14,72,68,31,245,217,118,154, -54,67,234,227,154,21,51,23,94,245,57,245,218,140,76,27, -252,156,101,26,42,206,39,170,88,135,5,162,167,46,44,210, -237,53,214,120,189,245,116,64,206,184,24,68,107,184,122,22, -150,197,125,73,27,214,12,39,213,132,127,133,41,96,65,149, -166,133,200,164,80,205,192,132,173,209,123,20,1,168,207,50, -153,134,51,28,6,7,99,205,6,213,184,193,136,152,52,185, -225,89,116,36,66,45,132,6,24,41,234,160,1,113,2,42, -92,33,150,77,33,36,177,102,168,234,32,174,129,152,14,169, -167,94,19,16,128,184,147,83,135,200,13,195,13,252,28,106, -194,67,157,7,115,166,171,94,67,64,25,130,5,198,41,194, -51,136,87,198,64,73,119,180,225,30,14,204,180,113,86,133, -33,129,111,48,76,160,111,155,119,212,16,49,42,78,192,64, -17,184,52,104,10,131,56,4,209,45,125,212,24,196,156,62, -147,120,25,124,18,184,154,64,82,26,226,72,200,80,229,131, -192,70,30,81,213,164,162,123,78,41,32,164,16,131,222,66, -120,11,176,55,102,56,173,187,100,0,79,72,229,155,161,107, -198,29,72,201,11,5,121,224,0,97,37,140,92,77,186,138, -83,97,163,16,131,198,46,78,224,226,215,116,133,100,227,248, -107,8,3,30,31,224,142,67,67,118,157,110,112,217,149,177, -203,94,28,246,33,200,122,240,11,193,62,190,46,18,216,143, -94,245,209,31,197,188,123,107,150,47,19,151,119,175,99,55, -215,10,252,45,236,98,176,251,222,225,20,196,190,254,74,47, -171,107,180,191,138,80,52,232,99,26,18,17,42,60,204,98, -254,69,197,137,129,212,35,83,23,66,161,131,242,232,188,181, -97,197,3,240,226,196,130,49,33,217,48,112,201,14,51,5, -105,239,78,70,110,113,76,115,194,102,55,12,214,253,56,128, -145,162,235,124,134,70,77,126,65,137,112,88,194,152,217,136, -138,64,131,51,181,187,79,254,152,0,43,184,124,164,188,141, -97,10,158,124,60,115,94,220,124,2,183,227,70,109,22,161, -165,99,189,164,101,36,21,29,248,131,58,12,224,147,18,199, -249,250,26,65,216,0,116,101,27,131,36,205,77,152,87,238, -116,176,6,83,193,102,71,32,245,90,204,226,174,127,1,228, -175,26,119,60,197,178,166,200,251,224,246,182,33,129,8,216, -194,125,22,170,114,110,198,233,165,34,158,192,241,221,107,230, -140,109,66,56,145,68,25,6,24,171,14,39,112,239,182,122, -60,81,31,188,171,69,20,233,250,206,142,42,190,223,228,196, -147,76,203,245,172,207,48,231,102,208,135,212,196,89,204,52, -41,110,71,140,147,73,57,205,97,33,99,45,134,219,38,102, -225,150,244,246,59,84,227,91,75,99,115,134,194,179,81,222, -84,221,93,99,75,40,179,211,146,182,175,29,35,168,25,154, -179,209,214,85,156,1,201,7,250,194,6,232,54,108,164,237, -34,65,39,99,219,156,114,212,113,201,54,22,178,201,205,221, -170,74,15,241,185,8,220,221,10,108,1,50,196,24,138,67, -36,18,63,145,57,45,59,121,173,214,98,191,206,156,69,247, -199,22,180,90,119,207,108,107,154,171,52,205,232,174,94,253, -86,185,254,187,134,155,100,144,153,187,213,2,30,185,198,152, -110,204,161,69,81,96,57,130,90,169,133,140,143,75,44,119, -36,204,81,230,62,172,249,54,51,8,203,5,41,174,32,176, -50,5,157,135,91,215,227,97,166,40,90,71,5,204,120,71, -21,156,22,56,172,117,15,49,82,234,1,132,97,187,75,39, -20,223,44,225,8,124,235,70,175,99,242,246,83,225,61,44, -93,25,9,193,39,220,219,65,80,89,176,31,116,162,9,183, -146,232,67,120,168,232,109,188,49,2,215,219,182,246,92,132, -40,162,18,121,68,172,94,130,208,46,189,96,65,52,201,157, -183,151,154,224,83,188,245,250,185,157,229,75,86,114,0,190, -54,51,242,58,32,217,64,42,241,78,242,145,28,155,236,22, -68,114,214,92,183,232,124,248,93,226,55,11,43,171,117,204, -73,244,161,174,83,192,23,96,79,115,10,33,231,70,64,177, -178,29,191,140,42,72,84,149,128,163,27,81,148,196,31,25, -96,215,177,154,161,226,122,161,139,196,208,150,207,90,108,24, -58,243,75,140,146,229,86,117,228,245,158,4,209,117,45,111, -234,89,89,88,51,167,56,235,6,50,19,88,8,48,141,162, -202,73,189,109,147,107,245,44,213,215,61,242,93,237,10,190, -102,136,151,203,107,121,11,232,74,80,223,166,180,182,41,173, -13,50,136,172,108,210,214,22,214,198,22,226,53,239,191,209, -133,38,135,226,154,247,0,163,41,165,237,101,96,250,108,25, -215,80,197,66,249,204,235,89,104,227,218,175,128,10,22,178, -168,154,7,141,81,119,89,161,155,183,218,136,80,219,6,61, -237,40,140,81,27,173,132,239,155,223,204,110,129,31,149,238, -46,27,80,156,101,175,9,202,150,192,165,213,228,100,227,229, -41,42,122,148,224,217,149,16,152,38,116,139,166,45,154,114, -42,42,11,187,110,17,181,22,40,10,60,136,92,213,119,136, -71,55,18,8,87,231,132,102,44,239,129,166,70,170,145,154, -49,230,19,249,17,32,193,28,170,168,11,76,164,106,120,22, -189,161,33,82,145,217,148,207,133,101,193,45,38,206,80,53, -27,155,89,150,238,143,120,137,140,22,160,250,137,75,123,254, -166,216,44,196,101,29,197,64,177,48,70,115,190,231,146,159, -69,221,254,243,91,195,234,246,222,138,162,144,239,53,164,93, -200,176,74,38,67,30,7,13,248,159,12,234,177,181,13,94, -10,62,150,90,7,62,135,133,174,77,238,99,107,138,21,77, -49,51,13,83,167,21,110,106,101,207,154,26,224,19,239,25, -109,3,198,116,99,42,191,143,229,221,147,147,212,220,70,142, -107,109,22,207,22,57,174,167,157,61,189,141,45,24,59,214, -108,118,219,32,114,5,198,186,193,65,228,214,42,23,8,35, -235,157,3,183,177,228,162,118,88,162,38,252,156,58,48,240, -92,99,44,174,9,47,51,71,150,217,19,228,213,116,140,11, -39,180,119,153,93,88,30,221,62,45,122,136,211,83,212,23, -128,47,118,145,43,59,210,191,30,190,140,111,253,59,246,234, -118,65,45,19,228,76,109,255,72,171,13,125,4,165,100,85, -192,151,111,159,62,249,44,47,251,216,238,34,101,84,113,225, -218,177,33,84,120,20,61,117,27,41,23,61,79,188,39,186, -133,214,70,64,107,129,66,36,193,73,145,227,174,116,202,104, -252,184,153,244,147,102,146,143,3,41,186,30,123,106,63,137, -43,183,18,62,118,90,201,112,79,120,228,20,61,225,35,67, -193,1,25,252,153,161,144,234,210,31,26,98,79,113,12,77, -22,104,66,15,34,85,59,161,229,139,56,217,32,152,207,152, -95,30,190,54,248,89,6,3,245,105,185,172,10,170,136,54, -197,235,223,152,166,30,115,217,33,1,127,100,30,123,89,62, -191,142,51,72,250,20,93,232,195,132,242,218,174,194,120,137, -159,50,29,230,48,53,118,202,145,24,4,222,241,83,91,138, -192,24,175,36,251,104,96,1,202,90,196,155,98,40,248,164, -71,209,60,136,51,91,230,9,171,121,15,62,246,39,248,104, -35,78,198,12,79,216,245,81,219,32,148,55,7,67,153,163, -254,12,239,116,113,85,12,1,113,206,168,98,143,38,113,164, -119,79,188,242,31,6,139,35,128,249,6,164,7,17,93,66, -216,25,161,123,200,106,53,222,174,202,138,230,249,17,86,207, -169,221,139,193,83,64,49,251,248,132,199,193,122,224,116,189, -243,105,75,34,53,125,169,95,29,202,103,20,79,213,175,8, -229,208,106,19,169,177,72,16,253,212,152,88,19,29,103,60, -62,110,115,9,173,88,99,89,185,205,12,157,134,214,145,45, -208,68,190,147,201,66,131,145,141,6,35,25,5,113,167,33, -22,126,125,109,202,151,139,190,38,97,93,7,106,103,186,118, -59,113,224,131,74,45,106,168,12,126,229,56,10,136,9,81, -6,193,221,223,29,79,126,115,80,97,100,209,168,224,123,59, -188,132,114,112,154,154,127,119,35,229,252,213,40,69,35,61, -150,13,250,39,207,2,232,171,225,241,240,88,136,238,202,21, -161,223,200,127,25,209,21,200,225,42,2,219,215,209,137,49, -132,248,5,161,123,238,174,234,68,235,29,102,98,221,243,240, -90,215,152,211,32,225,111,251,191,81,231,157,57,51,156,157, -221,221,53,194,21,7,202,57,31,167,219,146,31,54,151,68, -72,133,117,160,144,205,130,235,192,133,118,99,18,74,43,90, -27,222,123,39,200,214,237,45,210,230,240,116,1,46,87,165, -238,191,130,233,114,56,88,229,162,239,204,223,51,201,174,113, -170,144,58,207,89,254,189,171,216,95,137,229,97,154,16,171, -199,61,153,47,209,88,123,57,45,122,242,169,231,202,98,0, -44,194,82,116,238,142,31,181,145,195,234,155,145,51,83,244, -148,123,107,200,160,124,152,90,206,188,36,35,209,76,136,247, -10,43,138,20,130,153,32,240,243,4,223,147,70,164,18,169, -142,8,169,6,25,43,58,163,193,35,54,85,66,197,119,58, -184,169,0,227,249,142,50,152,215,170,236,245,77,236,200,249, -79,126,151,159,53,67,155,106,255,193,115,27,160,115,91,172, -206,102,83,203,11,105,196,65,77,24,237,141,108,170,240,228, -45,63,19,65,177,148,145,230,248,175,173,41,70,193,98,145, -7,44,159,150,92,253,60,58,182,146,230,8,56,69,230,15, -60,249,232,138,207,18,168,60,114,180,254,104,102,219,226,76, -91,209,160,17,105,170,25,92,48,193,49,71,62,193,88,126, -215,139,215,206,226,29,214,96,248,111,116,221,28,45,97,248, -113,214,184,198,49,42,205,115,113,169,109,151,212,244,123,219, -180,150,82,115,176,172,185,30,254,18,190,208,76,42,31,59, -97,49,175,155,226,242,162,69,175,94,233,66,153,128,187,236, -20,215,15,51,91,102,146,138,148,156,68,14,43,119,77,179, -108,233,64,46,177,186,134,159,29,148,60,15,31,37,131,185, -211,4,151,161,168,184,164,49,229,49,239,214,52,212,193,122, -6,169,76,5,158,70,206,81,138,48,22,210,96,96,31,105, -227,139,84,235,196,6,161,194,157,86,176,212,207,97,229,52, -184,201,223,197,117,111,78,22,155,215,163,200,223,34,245,45, -207,21,143,87,175,104,89,42,220,188,163,149,252,242,57,181, -97,157,5,113,65,210,57,243,197,253,185,3,147,222,244,138, -136,191,25,75,65,150,116,197,62,93,119,254,49,13,39,12, -53,199,60,224,225,142,32,187,79,254,48,237,59,38,242,78, -16,144,225,219,74,67,111,75,181,20,155,223,249,237,235,87, -151,213,180,188,51,115,123,116,83,88,238,34,35,242,158,220, -96,221,141,239,174,85,236,91,234,28,184,175,62,100,98,32, -203,225,49,34,49,190,177,121,37,174,240,207,209,198,65,90, -228,212,109,148,249,10,230,43,177,3,237,54,75,125,193,113, -194,16,82,122,172,228,211,120,14,11,223,209,26,121,35,238, -82,72,77,82,72,193,108,72,132,81,233,69,4,23,74,74, -36,197,21,147,20,121,29,241,141,218,232,46,74,23,196,35, -138,73,227,98,137,142,151,188,23,239,196,100,126,164,140,119, -121,103,158,165,203,34,151,227,101,176,229,166,218,196,165,104, -190,173,36,186,146,136,1,215,201,106,4,76,144,198,90,26, -40,41,36,178,144,82,152,123,140,96,37,129,132,48,239,217, -64,136,141,103,25,36,228,179,84,18,10,23,9,221,241,125, -168,58,181,87,242,37,215,97,25,184,133,28,101,164,144,173, -242,178,253,102,197,63,23,113,205,70,37,147,173,219,213,50, -252,118,9,182,164,147,99,68,54,98,203,255,187,51,220,61, -230,7,63,194,151,193,206,174,203,195,187,208,254,106,240,69, -236,38,99,42,35,25,98,165,210,230,104,240,191,190,24,54, -192,231,71,250,227,13,252,175,195,23,240,145,207,161,188,246, -219,27,204,239,137,151,121,167,237,255,150,221,47,198,10,187, -228,235,193,19,20,197,132,206,167,243,115,49,143,151,99,217, -125,37,185,55,213,12,95,157,14,27,98,214,24,190,70,9, -136,235,4,12,46,34,8,247,103,126,207,171,211,215,158,36, -12,21,235,224,131,123,196,175,160,218,129,39,28,158,233,198, -247,194,163,206,67,76,0,26,196,203,121,226,174,36,246,2, -122,140,204,75,35,245,173,233,76,130,43,44,84,93,207,139, -224,50,50,56,193,202,87,117,223,65,22,251,29,249,113,119, -190,75,0,54,144,176,112,125,40,226,18,162,21,141,87,44, -219,168,51,94,111,225,226,236,32,145,136,131,119,230,176,152, -162,227,235,96,205,71,128,96,31,126,245,51,165,162,5,14, -227,20,69,131,145,52,127,198,3,220,130,174,224,102,147,162, -223,154,182,230,76,166,165,123,195,191,6,176,248,156,193,238, -241,49,247,114,31,221,205,186,8,255,145,43,158,32,112,49, -234,109,237,113,78,138,103,222,171,48,150,227,116,61,38,226, -221,101,166,236,160,229,91,122,171,25,203,79,209,193,240,195, -143,182,135,43,183,75,204,183,119,33,57,60,131,8,62,36, -222,25,91,65,0,200,203,191,68,101,239,220,4,211,245,211, -25,155,37,19,92,171,65,187,165,178,22,150,25,139,249,42, -138,51,167,66,200,219,87,1,71,237,97,25,183,86,126,38, -218,64,212,94,223,80,3,86,216,142,200,249,104,184,187,224, -76,76,149,31,139,142,181,213,112,31,142,150,23,233,43,198, -45,37,163,9,29,221,197,15,39,139,21,89,107,225,236,121, -50,111,178,164,78,51,28,91,63,144,29,247,191,25,142,180, -191,58,71,122,129,152,74,3,212,69,220,227,101,64,130,164, -58,63,95,42,34,143,154,239,7,23,27,108,202,56,139,134, -24,31,221,69,241,160,82,109,207,239,154,196,123,140,88,88, -196,235,166,37,177,141,12,207,234,10,171,208,143,68,199,95, -231,208,67,222,50,63,251,30,103,64,12,189,130,111,92,29, -79,49,111,183,208,14,80,200,219,165,108,248,39,245,88,88, -177,29,242,105,43,115,104,149,252,89,190,30,10,38,167,52, -71,82,114,90,90,73,168,82,214,160,50,220,213,211,113,95, -107,148,146,99,139,27,35,144,117,9,81,42,24,244,219,84, -99,102,190,53,71,140,54,211,182,171,89,115,190,30,221,37, -52,25,219,26,110,140,225,70,13,142,227,252,1,87,197,34, -35,35,214,188,10,172,131,195,223,111,252,21,240,185,40,150, -243,183,62,196,238,219,45,176,110,195,162,214,35,198,227,23, -183,108,18,190,51,183,42,21,36,192,52,136,102,104,32,127, -135,23,4,167,191,152,75,1,134,126,229,118,237,238,227,16, -246,16,223,59,191,193,116,12,29,33,232,35,141,6,255,7, -77,177,185,80, \ No newline at end of file +topic "AMap"; +[2 $$0,0#00000000000000000000000000000000:Default] +[i448;a25;kKO9;*@(64)2 $$1,0#37138531426314131252341829483380:class] +[l288;2 $$2,0#27521748481378242620020725143825:desc] +[a83;*R6 $$3,0#31310162474203024125188417583966:caption] +[l288;i1121;b17;O9;~~~.1408;2 $$4,0#10431211400427159095818037425705:param] +[i448;a25;kKO9;*@(64)2 $$5,0#37138531426314131252341829483370:item] +[*+117 $$6,6#14700283458701402223321329925657:header] +[l288;a17;*1 $$7,7#70004532496200323422659154056402:requirement] +[{_}%EN-US +[s5;K%- template_<[@(0.0.255) class]_[@4 K], [@(0.0.255) class]_[@4 T], [@(0.0.255) class]_[@4 V], + [@(0.0.255) class]_[@4 HashFn]>__[@(0.0.255) class]_[@0 AMap]&] +[s0;~~~64; template &] +[s0;3 &] +[s5;K%- template_<[@(0.0.255) class]_[@4 K], [@(0.0.255) class]_[@4 T], [@(0.0.255) class]_[@4 V], + [@(0.0.255) class]_[@4 HashFn]>__[@(0.0.255) class]_[@0 AMap]&] +[s0; &] +[s0; [*C@4 K]-|Type of keys. K must have deep copy constructor, be [*/^dpp`:`/`/SourceDoc`/Containers`/Moveable^ m +oveable] and must have [*C operator`=`=] defined.&] +[s0; [*C@4 T]-|Type of values. T must satisfy requirements for container +flavor identified by parameter V.&] +[s0; [*C@4 V]-|Type of basic random access container.&] +[s0; [*C@4 HashFn]-|Hashing class. Must have defined [*C unsigned operator()(const +K`& x)] method returning hash value for elements.&] +[s0;~~~.416; AMap is a class that combines Index of keys with basic +random access container of values, forming map flavors. It is +used as base class for concrete map flavors, [* VectorMap], [* ArrayMap] +and [* SegtorMap].&] +[s0;~~~.416; Like any other NTL container, AMap is [*/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ m +oveable][*/ ]type with [*/^topic`:`/`/Core`/srcdoc`/pick`_`$en`-us^ pick +and optional deep copy] transfer semantics, although these features +are more important in derived concrete index flavors.&] +[s0; Members&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Add]([@(0.0.255) const]_K`&_[@3 k], [@(0.0.255) const]_T`&_[@3 x])&] +[s2; Adds a key and value pair to the AMap.&] +[s7; Invalidates iterators to AIndex.&] +[s7; T must have deep copy constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key.&] +[s4; [*C@3 x]-|Value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 AddPick]([@(0.0.255) const]_K`&_[@3 k], pick`__T`&_[@3 x])&] +[s2; Adds a key and value pair to the AMap. Value is transfered by +pick constructor in low constant time, but the source value is +destroyed.&] +[s7; T must have pick constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key.&] +[s4; [*C@3 x]-|-|Value.&] +[s0;3 &] +[s5;K%- T`&_[@0 Add]([@(0.0.255) const]_K`&_[@3 k])&] +[s2; Adds a key to the AMap and returns a reference to the corresponding +default constructed value.&] +[s7; T must have default constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key.&] +[s4; [*/ Return value]-|Reference to value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindAdd]([@(0.0.255) const]_[@4 K]`&_[@3 k])&] +[s2; Retrieves the position of first element with the specified key +in AMap, using a precomputed hash value. The precomputed hash +value must be the same as the hash value that would be the result +of HashFn. If multi`-key ordering is not broken and more than +one element with the same value exists in AMap, the lowest position +is retrieved. If the element does not exist in AMap, a negative +number is returned. Unlinked elements are ignored.&] +[s4; [*C@3 x]-|Key to find.&] +[s4; [*C@3 h]-|Precomputed hash value.&] +[s4; [*/ Return value]-|Position of element or a negative value if element +is not in AMap.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 Find]([@(0.0.255) const]_K`&_[@3 k])_[@(0.0.255) const]&] +[s2; Retrieves the position of first element with the specified key +in AMap. If multi`-key ordering is not broken and more than one +element with the same value exists in AMap, the lowest position +is retrieved. If the element does not exist in AMap, a negative +number is returned. Unlinked elements are ignored.&] +[s4; [*C@3 x]-|Key to find.&] +[s4; [*/ Return value]-|Position of element or a negative value if element +is not in AMap.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 Find]([@(0.0.255) const]_K`&_[@3 k], [@(0.0.255) unsigned]_[@3 h])_[@(0.0.255) c +onst]&] +[s2; Retrieves the position of next element with the same key as +element at the specified position. If multi`-key ordering is +not broken and more than one element with that value exists in +AMap, the lowest position greater than specified one is retrieved +(so that positions got by subsequent calls to FindNext are in +ascending order). When there are no more elements with required +key, negative number is returned. Unlinked elements are ignored.&] +[s4; [*C@3 i]-|Position of element.&] +[s4; [*/ Return value]-|Position of next element with same value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindLast]([@(0.0.255) const]_K`&_[@3 k], [@(0.0.255) unsigned]_[@3 h +])_[@(0.0.255) const]&] +[s2; Retrieves position of last element with the specified key in +AMap, using a precomputed hash value. The precomputed hash value +must be the same as the hash value that would be the result of +HashFn. If multi`-key ordering is not broken and more than one +element with the same value exists in AMap, the greatest position +is retrieved. If element does not exist in AMap, a negative number +is returned. Unlinked elements are ignored.&] +[s4; [*C@3 x]-|Key to find.&] +[s4; [*C@3 h]-|Precomputed hash value.&] +[s4; [*/ Return value]-|Position of element or a negative value if element +is not in AMap.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindLast]([@(0.0.255) const]_K`&_[@3 k])_[@(0.0.255) const]&] +[s2; Retrieves the position of last element with the specified key +in AMap. If multi`-key ordering is not broken and more than one +element with the same value exists in AIndex, the greatest position +is retrieved. If element does not exist in AMap, a negative number +is returned. Unlinked elements are ignored.&] +[s4; [*C@3 x]-|Element to find.&] +[s4; [*/ Return value]-|Position of element or a negative value if element +is not in AMap.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindPrev]([@(0.0.255) int]_[@3 i])_[@(0.0.255) const]&] +[s2; Retrieves the position of previous element with the same key +as element at the specified position. If multi`-key ordering +is not broken and more than one element with that value exists +in AMap, the greatest position lower than specified one is retrieved +(so that positions got by subsequent calls to FindNext are in +descending order). When there are no more elements with required +key, a negative number is returned. Unlinked elements are ignored.&] +[s4; [*C@3 i]-|Position of element.&] +[s4; [*/ Return value]-|Position of previous element with same value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindAdd]([@(0.0.255) const]_[@4 K]`&_[@3 k])&] +[s2; Retrieves the position of first element with the specified key +in AMap. If multi`-key ordering is not broken and more than one +element with the same value exists in AMap, lowest position is +retrieved. If the element does not exist in AMap, adds new default +constructed element at the end of AMap and returns its position. +Unlinked elements are ignored.&] +[s7; T must have default constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*/ Return value]-|Position of element (either found or added).&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindAdd]([@(0.0.255) const]_[@4 K]`&_[@3 k], [@(0.0.255) const]_[@4 T]`& +_[@3 init])&] +[s2; Retrieves the position of first element with the specified key +in AMap. If multi`-key ordering is not broken and more than one +element with the same value exists in AMap, the lowest position +is retrieved. Unlinked elements are ignored. If the element does +not exist in AMap, adds new element, deep copy constructed from +[*/ init], at the end of AMap and returns its position.&] +[s7; T must have deep copy constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 init]-|Value to add if key is not in AMap yet.&] +[s4; [*/ Return value]-|Position of element (either found or added).&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindPutPick]([@(0.0.255) const]_[@4 K]`&_[@3 k], +pick`__[@4 T]`&_[@3 init])&] +[s2; Retrieves the position of first element with the specified key +in AMap. If multi`-key ordering is not broken and more than one +element with the same value exists in AMap, the lowest position +is retrieved. Unlinked elements are ignored. If the element does +not exist in AMap, adds new element, pick constructed from [*/ init], +at the end of AMap and returns its position.&] +[s7; T must have pick constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 init]-|Value to add if key is not in AMap yet.&] +[s4; [*/ Return value]-|Position of element (either found or added).&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Unlink]([@(0.0.255) int]_[@3 i])&] +[s2; Unlinks element at the specified position. Unlinked item stays +in AMap but is ignored by any Find operation.&] +[s4; [*C@3 i]-|Position of element to unlink.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 Put]([@(0.0.255) const]_[@4 K]`&_[@3 k], [@(0.0.255) const]_[@4 T]`&_[@3 x +])&] +[s2; If there are any unlinked elements in AMap, one of them is replaced +by the specified key/value pair. If there is are unlinked elements, +the key/value pair is added to the end of AIndex using [* Add]. +Value is transfered using deep copy constructor.&] +[s7; T must have deep copy constructor.&] +[s7; Invalidates multi`-key ordering.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key.&] +[s4; [*C@3 x]-|Value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 PutPick]([@(0.0.255) const]_[@4 K]`&_[@3 k], pick`__[@4 T]`&_[@3 x])&] +[s2; If there are any unlinked elements in AMap, one of them is replaced +by the specified key/value pair. If there is none unlinked element, +the key/value pair is added at the end of AIndex using [* Add]. +Value is transfered using pick constructor.&] +[s7; T must have pick constructor.&] +[s7; Invalidates multi`-key ordering.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key.&] +[s4; [*C@3 x]-|Value.&] +[s0;3 &] +[s5;K%- [@4 T]`&_[@0 Put]([@(0.0.255) const]_[@4 K]`&_[@3 k])&] +[s2; If there is any unlinked element in AMap, it is replaced by +the specified key and reference to the value is returned. If +there is none unlinked element, key is added at the end of AIndex +using [* Add ]and a reference to corresponding default constructed +Value is returned.&] +[s7; T must have default constructor.&] +[s7; Invalidates multi`-key ordering.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key.&] +[s4; [*/ Return value]-|Reference to the corresponding value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindPut]([@(0.0.255) const]_[@4 K]`&_[@3 k])&] +[s2; Retrieves the position of first element with the specified key +in AMap. Unlinked elements are ignored. If the element does not +exist in AMap, puts new default constructed element into AMap +using [* Put] and returns its position. &] +[s7; T must have default constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*/ Return value]-|Position of element (either found or added).&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindPut]([@(0.0.255) const]_[@4 K]`&_[@3 k], [@(0.0.255) const]_[@4 T]`& +_[@3 init])&] +[s2; Retrieves the position of first element with the specified key +in AMap. Unlinked elements are ignored. If the element does not +exist in AMap, puts new element, deep copy constructed from [* init], +using [* Put] and returns its position. &] +[s7; T must have deep copy constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 init]-|Value to add if key is not in AMap yet.&] +[s4; [*/ Return value]-|Position of element (either found or added).&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 FindPutPick]([@(0.0.255) const]_[@4 K]`&_[@3 k], +pick`__[@4 T]`&_[@3 init])&] +[s2; Retrieves the position of first element with the specified key +in AMap. Unlinked elements are ignored. If the element does not +exist in AMap, puts new element, pick constructed from [* init], +using [* Put] and returns its position. &] +[s7; T must have deep copy constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 init]-|Value to add if key is not in AMap yet.&] +[s4; [*/ Return value]-|Position of element (either found or added).&] +[s0;3 &] +[s5;K%- T`&_[@0 Get]([@(0.0.255) const]_K`&_[@3 k])&] +[s2; Retrieves a reference to the first element with the specified +key. If multi`-key ordering is not broken and more than one element +with the same value exists in AMap, the lowest position element +is retrieved. Unlinked elements are ignored. Required key must +be in AMap, otherwise it is logic error (asserted in debug mode).&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*/ Return value]-|Reference to corresponding value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_T`&_[@0 Get]([@(0.0.255) const]_K`&_[@3 k])_[@(0.0.255) const]&] +[s2; Retrieves a constant reference the the first element with the +specified key. If multi`-key ordering is not broken and more +than one element with the same value exists in AMap, the lowest +position element is retrieved. Unlinked elements are ignored. +Required key must be in AMap, otherwise it is logic error (asserted +in debug mode).&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*/ Return value]-|Reference to corresponding value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_T`&_[@0 Get]([@(0.0.255) const]_K`&_[@3 k], [@(0.0.255) const]_T`&_[@3 d +])_[@(0.0.255) const]&] +[s2; Retrieves a constant reference value of the first element with +the specified key. If multi`-key ordering is not broken and more +than one element with the same value exists in AMap, the lowest +position element is retrieved. Unlinked elements are ignored. +If the required key is not in the AMap, constant reference to +the specified value is returned instead.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 d]-|Value to be returned if key is not found.&] +[s4; [*/ Return value]-|Reference to found element or supplied value.&] +[s0;3 &] +[s5;K%- [@4 T]`&_[@0 GetAdd]([@(0.0.255) const]_[@4 K]`&_[@3 k])&] +[s2; Retrieves a constant reference value of the first element with +the specified key. If multi`-key ordering is not broken and more +than one element with the same value exists in AMap, the lowest +position element is retrieved. Unlinked elements are ignored. +If required key is not in the AMap, adds new default constructed +element at the end of AMap and returns a reference to it.&] +[s7; T must have default constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*/ Return value]-|Reference to corresponding value.&] +[s0;3 &] +[s5;K%- [@4 T]`&_[@0 GetAdd]([@(0.0.255) const]_[@4 K]`&_[@3 k], [@(0.0.255) const]_[@4 T]`&_[@3 x])&] +[s2; Retrieves a constant reference to the first element with the +specified key. If multi`-key ordering is not broken and more +than one element with the same value exists in AMap, the lowest +position element is retrieved. Unlinked elements are ignored. +If required key is not in the AMap, adds new element, deep copy +constructed from [* x],[* ]at the end of AMap and returns a reference +to it.&] +[s7; T must have deep copy constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 x]-|Value to add if key is not in AMap.&] +[s4; [*/ Return value]-|Reference to corresponding value.&] +[s0;3 &] +[s5;K%- [@4 T]`&_[@0 GetAddPick]([@(0.0.255) const]_[@4 K]`&_[@3 k], pick`__[@4 T]`&_[@3 x])&] +[s2; Retrieves a constant reference to the first element with the +specified key. If multi`-key ordering is not broken and more +than one element with the same value exists in AMap, the lowest +position element is retrieved. Unlinked elements are ignored. +If required key is not in the AMap, adds new element, pick constructed +from [* x],[* ]at the end of AMap and returns a reference to it.&] +[s7; T must have pick constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 x]-|Value to add if key is not in AMap.&] +[s4; [*/ Return value]-|Reference to corresponding value.&] +[s0;3 &] +[s5;K%- [@4 T]`&_[@0 GetPut]([@(0.0.255) const]_[@4 K]`&_[@3 k])&] +[s2; Retrieves a constant reference value of the first element with +the specified key. If multi`-key ordering is not broken and more +than one element with the same value exists in AMap, the lowest +position element is retrieved. Unlinked elements are ignored. +If required key is not in the AMap, puts new default constructed +element into the AMap using [* Put] and returns a reference to +it.&] +[s7; T must have default constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*/ Return value]-|Reference to corresponding value.&] +[s0;3 &] +[s5;K%- [@4 T]`&_[@0 GetPut]([@(0.0.255) const]_[@4 K]`&_[@3 k], [@(0.0.255) const]_[@4 T]`&_[@3 x])&] +[s2; Retrieves a constant reference value of the first element with +the specified key. If multi`-key ordering is not broken and more +than one element with the same value exists in AMap, lowest position +element is retrieved. Unlinked elements are ignored. If required +key is not in the AMap, puts new element, deep copy constructed +from [* x],[* ]into the AMap using [* Put] and returns a reference +to it.&] +[s7; T must have deep copy constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 x]-|Value to add if key is not in AMap.&] +[s4; [*/ Return value]-|Reference to corresponding value.&] +[s0;3 &] +[s5;K%- [@4 T]`&_[@0 GetPutPick]([@(0.0.255) const]_[@4 K]`&_[@3 k], pick`__[@4 T]`&_[@3 x])&] +[s2; Retrieves a constant reference value of the first element with +the specified key. If multi`-key ordering is not broken and more +than one element with the same value exists in AMap, lowest position +element is retrieved. Unlinked elements are ignored. If required +key is not in the AMap, puts new element, pick constructed from +[* x], into the AMap using [* Put] and returns a reference to it.&] +[s7; T must have pick constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*C@3 x]-|Value to add if key is not in AMap.&] +[s4; [*/ Return value]-|Reference to corresponding value.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 SetKey]([@(0.0.255) int]_[@3 i], [@(0.0.255) const]_K`&_[@3 k])&] +[s2; Replaces key of element at the specified position.&] +[s4; [*C@3 i]-|Position of element.&] +[s4; [*C@3 k]-|New key value.&] +[s0;3 &] +[s5;K%- T_`*[@0 FindPtr]([@(0.0.255) const]_K`&_[@3 k])&] +[s2; Retrieves a pointer to value of first element with the specified +key in AMap. If multi`-key ordering is not broken and more than +one element with the same value exists in AMap, the lowest position +is retrieved. If the element does not exist in AMap, NULL pointer +is returned. Unlinked elements are ignored.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*/ Return value]-|Pointer to value or NULL pointer if element +is not in AMap.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_T_`*[@0 FindPtr]([@(0.0.255) const]_K`&_[@3 k])_[@(0.0.255) const]&] +[s2; Retrieves a constant pointer to value of first element with +the specified key in AMap. If multi`-key ordering is not broken +and more than one element with the same value exists in AMap, +the lowest position is retrieved. If the element does not exist +in AMap, NULL pointer is returned. Unlinked elements are ignored.&] +[s4; [*C@3 k]-|Key to find.&] +[s4; [*/ Return value]-|Pointer to value or NULL pointer if element +is not in AMap.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 UnlinkKey]([@(0.0.255) const]_K`&_[@3 k], [@(0.0.255) unsigned]_[@3 h +])&] +[s2; Unlinks all elements with the specified key using precomputed +hash`-value. Unlinked elements stay in AIndex but are ignored +by any Find operations. The precomputed hash value must be the +same as the hash value that would be the result of HashFn. &] +[s4; [*C@3 k]-|Key to unlink.&] +[s4; [*C@3 h]-|Precomputed hash value.&] +[s4; [*/ Return value]-|Number of elements unlinked.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 UnlinkKey]([@(0.0.255) const]_K`&_[@3 k])&] +[s2; Unlinks all elements with the specified key. Unlinked elements +stay in AIndex but are ignored by any Find operations.&] +[s4; [*C@3 k]-|Key to unlink.&] +[s4; [*/ Return value]-|Number of elements unlinked.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsUnlinked]([@(0.0.255) int]_[@3 i])_[@(0.0.255) const]&] +[s2; Tests whether element at the specified position is unlinked.&] +[s4; [*C@3 i]-|Position.&] +[s4; [*/ Return value]-|true if element is unlinked.&] +[s0;3 &] +[s5;K%- T`&_[@0 Insert]([@(0.0.255) int]_[@3 i], [@(0.0.255) const]_K`&_[@3 k])&] +[s2; Inserts an element with the specified key and default constructed +value at the specified position. This is a slow operation, especially +when combined with any search operations.&] +[s7; Requires T to have default constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 i]-|Insert position.&] +[s4; [*C@3 k]-|Key to insert.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Insert]([@(0.0.255) int]_[@3 i], [@(0.0.255) const]_K`&_[@3 k], +[@(0.0.255) const]_T`&_[@3 x])&] +[s2; Inserts an element with the specified key and value copy constructed +from [*/ x] at the specified position. This is a slow operation, +especially when combined with any search operations.&] +[s7; Requires T to have deep copy constructor.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 i]-|Insert position.&] +[s4; [*C@3 k]-|Key to insert.&] +[s4; [*C@3 x]-|Value to insert.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Remove]([@(0.0.255) int]_[@3 i])&] +[s2; Removes the element at the specified position. This is a slow +operation, especially when combined with any search operations.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 i]-|Position of element to remove.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Remove]([@(0.0.255) const]_[@(0.0.255) int]_`*[@3 sl], +[@(0.0.255) int]_[@3 n])&] +[s2; Removes number of elements from AMap. Time of operation only +slightly depends on the number of removed elements. This is a +slow operation, especially when combined with any search operations.&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 i]-|Position of element to remove.&] +[s4; [*C@3 sl]-|Pointer to array of the positions to remove, in ascending +order.&] +[s4; [*C@3 n]-|Number of elements to remove. &] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Remove]([@(0.0.255) const]_[^`:`:Vector^ Vector]<[^int^ int]>`&_[@3 s +l])&] +[s2; Removes number of elements from AMap. Same as Remove(sorted`_list, +sorted`_list.GetCount()).&] +[s7; Invalidates iterators to AMap.&] +[s7; Invalidates references to keys.&] +[s7; Invalidates references to VectorMap values.&] +[s4; [*C@3 sl]-|Sorted Vector of positions to remove.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 RemoveKey]([@(0.0.255) const]_[@4 K]`&_[@3 k])&] +[s2; Removes all elements with the specified value. This is a slow +operation, especially when combined with any search operations.&] +[s4; [*C@3 k]-|Key to remove.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_T`&_[@0 operator`[`]]([@(0.0.255) int]_[@3 i])_[@(0.0.255) const]&] +[s2; Returns a constant reference to the element at the specified +position.&] +[s4; [*C@3 i]-|Position.&] +[s4; [*/ Return value]-|Constant reference to the element at the specified +position.&] +[s0;3 &] +[s5;K%- T`&_[@0 operator`[`]]([@(0.0.255) int]_[@3 i])&] +[s2; Returns a reference to the element at the specified position.&] +[s4; [*C@3 i]-|Position.&] +[s4; [*/ Return value]-|Constant reference to the element at the specified +position.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 GetCount]()_[@(0.0.255) const]&] +[s2; Returns the number of elements in AMap.&] +[s4; [*/ Return value]-|Actual number of elements.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsEmpty]()_[@(0.0.255) const]&] +[s2; Tests whether AMap is empty. Same as GetCount() `=`= 0.&] +[s4; [*/ Return value]-|true if AMap is empty, false otherwise.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Clear]()&] +[s2; Removes all elements from AMap.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Shrink]()&] +[s2; Minimizes memory consumption of AMap by decreasing the capacity +to the number of elements.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Reserve]([@(0.0.255) int]_[@3 xtra])&] +[s2; Reserves capacity. If the required capacity is greater than +current capacity, capacity is increased to the required value.&] +[s4; [*C@3 n]-|Required capacity.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 GetAlloc]()_[@(0.0.255) const]&] +[s2; Returns the current capacity of Array.&] +[s4; [*/ Return value]-|Capacity of Array.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Drop]([@(0.0.255) int]_[@3 n]_`=_[@3 1])&] +[s2; Drops the specified number of elements at the end of the AMap.&] +[s4; [*C@3 n]-|Number of elements.&] +[s0;3 &] +[s5;K%- T`&_[@0 Top]()&] +[s2; Returns a reference to the value of the last element of AMap.&] +[s4; [*/ Return value]-|Reference to the value of the last element.&] +[s0;3 &] +[s5;K%- T`&_[@0 Top]()&] +[s2; Returns a constant reference to the value of the last element +of AMap.&] +[s4; [*/ Return value]-|Reference to the value of the last element.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_K`&_[@0 TopKey]()_[@(0.0.255) const]&] +[s2; Returns a constant reference to the key of the last element +of AMap.&] +[s4; [*/ Return value]-|Reference to the key of the last element.&] +[s0;3 &] +[s5;K%- K_[@0 PopKey]()&] +[s2; Drops the last element of AMap and returns the key of the dropped +element.&] +[s4; [*/ Return value]-|Key of the element dropped at the end of AMap.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_K`&_[@0 GetKey]([@(0.0.255) int]_[@3 i])_[@(0.0.255) const]&] +[s2; Returns a constant reference to the key of element at the specified +position.&] +[s4; [*C@3 i]-|Position.&] +[s4; [*/ Return value]-|Constant reference to the key.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 Serialize]([^`:`:Stream^ Stream]`&_[@3 s])&] +[s2; Serializes the content of AMap to/from Stream. Works only if +NTL is used as part of UPP.&] +[s0; Requires T to have serialization operator defined.&] +[s4; [*C@3 s]-|Target/source stream.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_[^`:`:Index^ Index]<[^K^ K], [^HashFn^ HashFn]>`&_[@0 GetIndex]()_[@(0.0.255) c +onst]&] +[s2; Returns a constant reference to the internal Index of keys.&] +[s4; [*/ Return value]-|Constant reference to the Index of keys.&] +[s0;3 &] +[s5;K%- [^`:`:Index^ Index]<[^K^ K], [^HashFn^ HashFn]>_[@0 PickIndex]()_pick`_&] +[s2; Returns Index of keys. Destroys AMap by picking.&] +[s4; [*/ Return value]-|Index of keys.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_[^`:`:Vector^ Vector]<[^K^ K]>`&_[@0 GetKeys]()_[@(0.0.255) const]&] +[s2; Returns a constant reference to the Vector of keys.&] +[s4; [*/ Return value]-|Constant reference to the Vector of keys.&] +[s0;3 &] +[s5;K%- [^`:`:Vector^ Vector]<[^K^ K]>_[@0 PickKeys]()_pick`_&] +[s2; Returns Vector of keys. Destroys AMap by picking.&] +[s4; [*/ Return value]-|Vector of keys.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_V`&_[@0 GetValues]()_[@(0.0.255) const]&] +[s2; Returns a constant reference to the basic random access container +of values. Destroys AIndex by picking.&] +[s4; [*/ Return value]-|Constant reference to the basic random access +container of values.&] +[s0;3 &] +[s5;K%- V_[@0 PickValues]()_pick`_&] +[s2; Returns basic random access container of values. Destroys AIndex +by picking.&] +[s4; [*/ Return value]-|Basic random access container of values.&] +[s0;3 &] +[s0;:`:`:AMap`:`:AMap`(`): [* AMap]()&] +[s2; Constructor. Constructs an empty AMap.&] +[s0;3 &] +[s0;:`:`:AMap`:`:AMap`(const`:`:AMap`&`,int`): [* AMap](const [* AMap]`& +[*@3 s], int)&] +[s2; Optional deep copy constructor.&] +[s7; Requires T to have deep copy constructor or optional deep copy +constructor.&] +[s4; [*C s]-|Source AMap.&] +[s0;3 &] +[s0;:`:`:AMap`:`:AMap`(pick`_`:`:Index``&`,pick`_ V`&`): [* AMap](pick`_ +Index`& [*@3 ndx], pick`_ V`& [*@3 val])&] +[s2; This form of constructors creates AMap by picking Index of keys +and basic random access container of values. Both containers +must have same number of elements.&] +[s4; [*C@3 ndx]-|Keys.&] +[s4; [*C@3 val]-|Values.&] +[s0;3 &] +[s0;:`:`:AMap`:`:AMap`(pick`_`:`:Vector``&`,pick`_ V`&`): [* AMap](pick`_ +Vector`& [*@3 ndx], pick`_ V`& [*@3 val])&] +[s2; This form of constructors creates AMap by picking Vector of +keys and basic random access container of values. Both containers +must have same number of elements.&] +[s4; [*C@3 ndx]-|Keys.&] +[s4; [*C@3 val]-|Values.&] +[s0;3 &] +[s5;K%- typedef_K_[@0 KeyType]&] +[s2; Typedef of K for use in templated algorithms.&] +[s0;3 &] +[s5;K%- typedef_typename_[^`:`:Index^ Index]<[^K^ K], [^HashFn^ HashFn]>`::ConstIterator_[@0 K +eyConstIterator]&] +[s2; Key iterator type.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:KeyConstIterator^ KeyConstIterator]_[@0 KeyBegin]()_[@(0.0.255) const +]&] +[s2; Returns a constant iterator to the first key in AMap.&] +[s4; [*/ Return value]-|Constant key iterator.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:KeyConstIterator^ KeyConstIterator]_[@0 KeyEnd]()_[@(0.0.255) const]&] +[s2; Returns a constant iterator to the key just beyond the last +key in AMap.&] +[s4; [*/ Return value]-|Constant key iterator.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:KeyConstIterator^ KeyConstIterator]_[@0 KeyGetIter]([@(0.0.255) int]_ +[@3 pos])_[@(0.0.255) const]&] +[s2; Returns a constant iterator to the key at the specified position. +Same as [* KeyBegin() `+ i]. The benefit of this method is that +[* pos] is range checked in debug mode. &] +[s4; [*C@3 i]-|Required position.&] +[s4; [*/ Return value]-|Constant key iterator.&] +[s0;3 &] +[s5;K%- typedef_T_[@0 ValueType]&] +[s2; Typedef of T for use in templated algorithms.&] +[s0;3 &] +[s5;K%- typedef_typename_[^V`:`:ConstIterator^ V`::ConstIterator]_[@0 ConstIterator]&] +[s2; Constant value iterator type.&] +[s0;3 &] +[s5;K%- typedef_typename_[^V`:`:Iterator^ V`::Iterator]_[@0 Iterator]&] +[s2; Value iterator type.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:Iterator^ Iterator]_[@0 Begin]()&] +[s2; Returns an iterator to the first value in AMap.&] +[s4; [*/ Return value]-|Value iterator.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:Iterator^ Iterator]_[@0 End]()&] +[s2; Returns a constant iterator to the value just beyond the last +key in AMap.&] +[s4; [*/ Return value]-|Value iterator.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:Iterator^ Iterator]_[@0 GetIter]([@(0.0.255) int]_[@3 pos])&] +[s2; Returns an iterator to the value at the specified position. +Same as [* Begin() `+ i]. The benefit of this method is that [* pos] +is range checked in debug mode.&] +[s4; [*C@3 i]-|Required position.&] +[s4; [*/ Return value]-|Value iterator.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:ConstIterator^ ConstIterator]_[@0 Begin]()_[@(0.0.255) const]&] +[s2; Returns a constant iterator to the first value in AMap.&] +[s4; [*/ Return value]-|Constant value iterator.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:ConstIterator^ ConstIterator]_[@0 End]()_[@(0.0.255) const]&] +[s2; Returns a constant iterator to the value just beyond the last +value in AMap.&] +[s4; [*/ Return value]-|Constant value iterator.&] +[s0;3 &] +[s5;K%- [^`:`:AMap`:`:ConstIterator^ ConstIterator]_[@0 GetIter]([@(0.0.255) int]_[@3 pos])_[@(0.0.255) c +onst]&] +[s2; Returns a constant iterator to the value at the specified position. +Same as [* Begin() `+ i]. Benefit of this methods is that in debug +mode [* pos] is range checked.&] +[s4; [*C@3 i]-|Required position.&] +[s4; [*/ Return value]-|Constant value iterator.&] +[s0; &] +[s0; friend void [* Swap](AMap`& [*@3 a], AMap`& [*@3 b])&] +[s2; Specialization of the generic [* Swap] for AMap. Swaps array in +simple constant time operation.&] +[s4; [*C@3 a]-|First AMap to swap.&] +[s0; [*C@3 b]-|Second AMap to swap.] \ No newline at end of file diff --git a/uppsrc/Core/src.tpp/CParser$en-us.tpp b/uppsrc/Core/src.tpp/CParser$en-us.tpp index 13290061d..d4ae603a4 100644 --- a/uppsrc/Core/src.tpp/CParser$en-us.tpp +++ b/uppsrc/Core/src.tpp/CParser$en-us.tpp @@ -1,18 +1,352 @@ -TITLE("CParser") -COMPRESSED -120,156,237,92,9,115,219,54,22,254,43,216,94,150,28,73,229,33,89,178,60,59,147,212,73,59,158,166,110,166,78,103,119,214,181,45,136,132,100,212,20,201,37,72,31,93,111,127,251,190,7,144,34,72,145,162,36,59,219,244,200,97,73,20,240,240,206,15,15,192,131,207,45,242,217,103,70,199,248,212,104,248,51,126,205,102,52,241,226,139,115,222,239,143,142,168,53,56,186,249,246,251,195,163,253,151,173,131,126,27,169,152,64,197,30,154,246,104,96,155,125,235,0,126,152,182,105,13,44,187,111,142,172,195,254,200,182,71,198,216,241,168,16,23,231,158,53,26,29,97,39,11,58,89,195,129,101,14,251,163,254,200,180,135,35,11,250,90,134,97,25,67,107,96,246,237,145,53,24,187,76,56,23,231,116,100,31,237,255,112,0,157,108,28,9,136,27,230,129,213,31,246,45,195,54,172,62,12,101,142,70,125,115,56,24,217,135,7,7,99,135,134,49,15,252,116,44,110,154,150,121,52,53,135,71,192,243,175,191,254,218,51,251,134,226,160,15,196,76,163,15,172,154,240,204,232, -91,67,115,112,104,28,14,70,230,200,176,129,248,96,104,12,198,33,141,232,162,94,244,65,163,232,67,99,204,99,6,36,246,95,152,230,16,186,28,116,14,62,53,251,67,16,116,100,247,7,163,161,1,131,91,150,101,219,150,105,91,135,135,214,224,96,48,28,95,51,234,178,40,21,129,2,243,251,38,116,29,118,134,159,66,71,163,63,176,173,254,33,42,203,134,145,44,235,96,112,104,14,250,198,224,0,40,141,35,246,239,132,71,108,193,124,48,217,127,174,254,251,249,155,211,238,143,103,228,92,12,142,190,29,79,224,239,241,59,26,9,22,225,91,105,148,241,75,131,156,127,110,24,93,195,120,217,50,122,70,207,26,12,218,36,181,87,246,28,228,37,87,217,71,146,146,184,248,226,226,92,24,71,4,95,172,163,236,41,225,130,8,190,8,61,70,30,88,76,110,89,244,64,18,193,102,137,71,60,118,207,29,234,17,234,83,239,225,23,104,42,18,30,211,41,180,156,5,17,153,38,220,115,185,63,39,104,118,96,159,132,146,158,32,193,140,120,212,159,39,116,206,4,185,227,241, -53,57,158,116,61,126,195,136,120,240,99,122,223,43,49,112,23,68,55,208,203,39,147,189,201,79,198,100,143,196,44,90,112,159,198,204,133,183,247,49,225,62,89,176,69,0,140,181,252,32,38,103,113,196,232,162,221,33,34,32,113,160,134,37,241,53,112,197,81,136,32,33,215,244,150,225,87,94,64,93,194,145,0,124,192,22,41,153,25,143,68,220,35,239,145,248,53,21,216,20,68,21,49,113,147,8,37,194,166,49,95,48,217,87,144,48,10,28,38,4,176,51,125,88,114,13,172,16,39,8,31,176,193,2,204,223,206,196,250,142,250,121,171,5,139,175,3,87,16,135,250,64,53,10,238,200,210,158,227,55,81,4,106,100,247,14,147,17,128,92,112,223,5,141,199,169,56,148,123,73,196,114,25,83,95,113,65,143,139,105,224,245,200,63,174,153,15,198,66,150,179,1,161,177,52,12,240,230,59,17,3,82,202,44,157,84,22,39,88,44,212,88,137,212,26,60,202,57,104,133,17,155,177,8,76,252,64,110,57,37,239,145,99,197,166,18,164,93,96,146,225,55,130,128,2,239, -152,231,149,205,26,76,127,102,78,44,69,71,171,77,97,180,136,250,2,232,131,4,45,80,29,103,238,82,105,202,53,109,249,90,225,249,146,7,124,35,226,40,113,226,241,165,124,120,239,92,102,161,112,121,169,5,131,106,116,177,252,42,15,5,104,102,16,73,76,255,118,172,127,159,147,9,147,169,199,157,42,50,4,134,78,163,105,63,11,167,247,15,33,67,157,186,168,143,76,7,75,213,246,200,113,0,190,207,125,12,54,127,14,126,10,94,140,118,147,241,33,21,41,227,40,226,170,121,65,45,18,86,52,145,191,4,94,94,179,136,223,194,96,179,40,0,180,130,7,164,130,57,91,39,80,171,83,245,6,44,226,67,4,56,215,52,154,236,79,218,227,76,179,251,69,125,17,213,238,10,219,93,77,246,179,199,251,47,109,178,196,31,210,190,80,252,123,136,195,40,185,178,72,16,73,185,250,233,243,172,235,177,236,219,125,204,28,77,8,64,142,13,29,227,93,32,52,183,168,132,198,162,55,148,177,17,8,92,104,67,193,11,60,225,50,26,0,118,100,236,40,20,234,109,160,210, -148,27,124,41,170,179,3,8,52,233,224,119,202,236,5,253,34,11,205,218,13,227,220,6,87,147,191,95,157,254,248,246,109,7,145,237,74,111,229,113,159,21,154,45,229,182,137,185,252,162,147,122,95,161,235,204,47,210,79,60,47,183,227,200,168,182,35,62,215,237,136,92,118,31,223,5,192,151,2,35,4,178,80,211,40,126,230,126,152,196,10,218,235,232,72,57,186,143,111,225,133,248,201,98,202,234,135,4,190,187,143,95,3,244,251,116,193,122,69,127,145,86,170,115,26,224,181,102,50,69,65,107,28,70,111,6,70,42,181,202,77,38,53,161,107,111,59,157,108,40,2,170,169,90,6,238,215,186,188,212,173,206,90,89,203,27,14,62,243,181,161,47,115,231,190,84,3,170,15,117,76,128,213,116,22,10,246,43,133,189,177,18,103,217,219,122,204,202,82,158,237,226,42,243,247,220,213,133,52,78,74,45,117,193,102,135,207,141,217,219,69,144,206,42,118,60,93,182,14,169,109,166,69,254,174,136,210,160,185,142,154,231,168,235,74,167,135,156,146,251,144,67,46,168,12,1, -204,38,101,202,133,10,131,164,131,149,27,202,244,105,154,78,175,119,152,244,68,44,12,162,24,39,80,57,119,238,106,153,126,5,148,224,248,232,138,152,199,202,140,178,5,33,58,163,78,220,201,216,128,4,15,18,39,127,222,33,183,212,75,24,166,85,63,39,96,48,1,200,152,229,52,253,74,60,251,26,19,79,249,161,42,222,214,248,199,122,7,104,242,91,114,146,163,75,154,239,162,24,66,240,185,15,26,85,25,36,118,56,99,49,4,119,154,236,149,176,224,219,10,148,185,13,184,155,59,199,210,51,12,45,115,204,185,172,130,80,29,105,27,65,86,199,215,202,124,67,13,43,202,57,118,149,65,170,19,142,29,165,61,13,206,110,120,120,22,82,88,38,84,88,5,180,42,244,4,93,174,68,2,151,161,43,71,248,19,150,156,147,174,144,221,9,133,39,152,47,211,36,14,48,62,96,1,6,217,184,0,250,33,115,59,144,220,199,203,229,13,216,48,125,142,11,19,53,252,51,216,238,121,101,169,148,163,71,84,36,224,71,185,194,98,17,194,65,22,221,250,228,168,77,140,92, -228,62,139,203,19,39,79,72,8,252,83,206,219,65,150,212,156,186,74,157,206,16,11,112,129,150,46,161,154,213,52,13,2,175,90,77,181,42,130,97,69,81,19,75,15,220,255,146,252,192,226,36,242,21,116,128,19,130,0,128,32,51,100,24,245,87,86,34,234,24,229,216,128,211,98,168,104,156,190,99,236,230,88,255,50,231,85,49,163,208,194,73,162,8,215,241,233,2,5,201,1,234,105,211,222,42,243,199,105,151,98,219,29,217,252,134,197,53,92,190,114,111,169,143,14,213,144,57,65,20,4,254,134,156,103,109,8,141,115,146,83,6,142,130,211,15,142,135,160,200,227,167,184,200,137,40,10,212,136,111,26,186,57,21,232,198,68,140,142,197,208,87,82,135,193,152,32,34,100,14,159,113,39,151,28,165,210,109,154,73,88,5,133,78,65,29,24,211,48,78,147,199,130,178,32,170,157,235,167,171,199,218,81,63,250,114,102,171,142,214,211,52,27,82,190,157,122,205,229,196,159,19,129,220,2,233,84,182,183,160,253,25,3,112,115,215,116,248,224,102,177,127,59,179,108,217, -209,174,182,167,76,43,43,45,8,11,147,208,99,241,115,24,49,37,181,149,29,215,245,177,101,2,202,163,134,46,31,208,250,31,0,177,82,67,148,166,149,90,245,147,147,89,30,130,82,158,142,6,250,34,69,103,230,126,84,88,246,113,33,153,210,248,134,152,181,169,190,113,122,141,239,130,156,172,248,67,192,221,31,2,236,86,77,222,4,114,91,89,253,58,98,108,71,187,127,212,8,169,169,124,135,133,210,59,88,141,60,11,92,94,201,163,161,150,92,143,230,107,121,88,48,9,233,157,45,167,45,205,197,99,18,165,249,250,140,122,130,117,212,145,146,168,223,3,169,135,195,29,215,134,153,200,191,37,212,53,104,203,106,57,102,7,58,236,172,179,103,7,176,39,234,250,119,9,78,27,26,9,254,219,13,134,66,244,170,221,198,249,136,80,167,126,23,239,196,173,221,169,150,211,82,190,223,74,78,114,87,216,230,160,77,155,3,230,252,150,249,203,19,119,238,2,232,67,250,43,55,1,87,1,159,102,11,235,124,5,252,128,7,102,30,243,91,162,221,128,248,184,133,118,146,211, -127,190,169,122,109,68,232,26,250,128,59,138,149,254,123,226,223,6,55,233,54,196,137,155,110,181,169,173,109,121,12,46,203,79,88,156,42,123,55,143,174,208,234,206,235,56,93,87,141,107,93,172,90,88,241,154,198,53,82,211,134,22,80,230,141,210,232,135,71,165,115,163,130,68,63,48,234,22,100,170,180,18,182,18,85,178,224,89,249,6,201,144,31,248,96,43,234,43,27,225,19,57,202,58,153,155,13,182,157,136,113,147,140,103,184,170,165,30,48,16,113,10,146,0,22,169,158,192,43,152,12,163,0,4,143,4,113,249,12,43,46,160,9,136,53,233,82,47,188,166,126,178,96,145,190,34,206,78,4,228,246,26,141,36,57,221,7,4,241,2,127,142,175,208,226,1,97,102,1,250,125,49,121,1,68,163,5,176,129,7,56,108,17,122,88,21,50,165,242,200,252,33,100,79,82,216,134,30,238,199,53,46,46,193,16,207,126,230,202,139,203,54,39,147,110,106,114,198,101,36,44,240,8,7,148,224,242,57,143,59,40,210,100,15,100,220,75,223,117,225,29,238,61,3,93,207, -11,238,84,98,140,65,163,14,114,80,101,217,174,55,76,44,146,200,86,65,162,56,221,64,27,218,201,238,170,231,248,141,158,163,162,67,109,156,42,229,172,15,11,169,99,228,176,136,97,89,120,172,179,241,198,34,173,49,240,169,212,110,45,140,161,145,209,42,16,236,76,136,204,22,107,205,93,176,115,85,211,109,204,86,121,106,254,68,17,43,230,172,106,155,219,50,214,214,37,3,171,170,145,147,149,202,17,176,115,157,90,160,47,228,53,152,229,76,246,94,129,231,67,179,201,222,191,178,96,160,217,147,95,38,123,157,244,228,39,162,254,92,170,196,227,11,46,183,226,169,147,196,128,13,114,152,22,235,205,123,170,108,16,63,154,86,74,94,100,212,212,40,123,83,249,243,43,248,41,207,142,84,164,85,158,168,74,209,187,143,167,41,150,225,199,237,13,167,171,195,47,83,170,67,241,4,172,97,91,151,68,189,214,198,226,115,153,181,124,230,110,52,36,41,42,192,105,65,66,140,238,10,41,85,124,43,70,91,248,164,189,65,160,239,108,131,211,103,136,149,215,65,50,245,216,58, -200,159,121,1,149,133,1,33,158,252,111,132,8,31,197,4,32,43,62,171,120,223,64,97,110,81,43,101,79,92,81,218,90,191,169,86,160,170,227,77,39,247,172,48,56,74,188,181,103,155,95,239,40,207,26,7,40,165,78,85,243,193,178,218,88,85,88,122,28,112,6,171,152,235,54,194,206,176,216,3,114,27,117,238,209,194,42,228,201,39,147,189,246,81,131,245,238,210,115,102,101,191,226,104,207,145,6,126,239,179,178,180,21,24,82,163,43,88,179,94,223,48,223,45,192,136,140,236,77,146,230,146,234,100,134,176,18,63,45,21,8,224,21,5,127,192,18,34,199,75,100,105,56,19,14,13,65,231,129,203,4,44,243,223,42,122,178,216,59,79,76,177,28,38,175,123,192,186,101,72,35,85,249,119,43,241,37,63,199,149,83,64,42,97,247,81,214,65,167,176,85,208,156,92,234,226,137,110,136,37,229,66,0,4,162,165,113,222,71,214,5,73,124,173,216,188,40,181,64,128,16,75,50,178,170,0,158,6,196,101,114,138,83,0,0,12,200,130,119,44,233,145,89,240,253,186, -168,63,123,118,39,249,147,121,72,209,59,208,148,254,95,206,241,68,4,169,203,66,164,40,235,183,2,127,63,174,165,38,176,220,165,50,59,225,14,8,85,87,79,16,244,159,29,163,148,18,187,143,175,179,241,254,242,213,157,129,236,79,225,168,189,103,243,212,205,177,242,79,237,164,155,150,68,190,7,214,43,242,78,85,237,183,44,111,200,174,102,189,102,14,199,157,49,149,243,162,185,151,59,94,106,129,80,22,31,45,150,85,115,226,141,170,235,96,73,13,122,7,152,103,222,113,145,149,187,213,157,212,154,219,149,226,237,190,89,46,203,245,222,197,85,59,51,223,96,137,40,85,57,127,94,36,186,197,46,139,86,179,93,217,171,14,105,138,87,20,46,11,23,107,74,133,134,133,59,55,69,206,171,152,237,108,80,3,169,237,154,201,25,66,221,246,82,21,139,74,158,244,162,92,186,143,170,151,129,75,143,200,174,48,86,220,99,217,206,89,75,226,109,126,74,82,169,197,188,152,90,167,58,249,66,71,209,112,117,19,234,172,78,151,149,181,250,1,30,123,156,178,187,138,229,217, -177,42,186,231,58,200,201,106,79,9,135,97,196,110,121,144,8,239,65,221,14,64,140,211,110,107,104,42,212,196,207,152,213,103,133,242,61,31,92,108,190,9,102,197,175,97,233,188,148,84,233,176,188,253,128,18,167,40,85,113,215,96,221,74,114,101,230,144,5,136,149,244,72,43,187,42,187,140,246,118,179,184,74,132,0,192,153,198,65,148,11,178,170,133,106,49,171,5,248,155,84,83,43,27,127,141,182,235,175,36,169,152,124,171,221,52,217,158,143,44,12,49,170,154,117,177,229,117,37,197,32,94,82,58,133,224,220,157,201,87,78,156,96,166,80,140,114,178,238,165,46,217,144,183,103,112,115,165,216,252,149,56,78,167,189,40,72,98,153,11,132,81,224,38,14,91,82,90,78,57,45,39,88,132,52,230,120,163,91,237,239,168,200,105,167,169,204,242,164,219,165,49,29,87,156,113,47,7,107,190,192,84,122,132,62,167,31,131,151,239,35,230,114,108,117,30,190,230,146,147,158,229,85,223,114,90,208,251,66,30,120,114,250,126,114,245,221,171,127,174,33,138,221,194,89,177, -155,186,152,89,60,215,71,38,23,52,138,11,13,85,158,185,172,141,136,24,164,69,162,108,165,186,35,98,125,142,92,123,74,175,114,182,55,10,66,180,19,63,26,69,244,161,2,72,132,190,243,14,122,194,115,68,233,0,181,247,154,80,111,221,199,239,232,189,76,120,192,179,231,224,74,105,150,150,158,172,226,1,151,186,104,206,92,188,197,2,76,161,139,66,30,139,185,236,79,254,228,19,57,3,158,107,42,85,135,98,224,141,152,250,225,151,153,231,227,212,202,253,132,201,188,23,225,209,135,105,99,25,245,21,252,33,181,130,194,126,97,81,48,233,150,127,203,128,58,2,205,135,84,219,133,83,54,231,190,143,204,6,179,124,214,206,182,254,212,167,84,100,77,194,74,171,73,7,72,17,31,84,205,111,165,189,229,99,224,107,10,246,191,145,217,47,254,178,2,149,197,67,74,44,31,11,228,70,187,83,163,174,233,71,218,56,21,120,88,225,71,155,134,239,255,51,96,127,55,145,168,64,17,125,71,255,5,21,69,144,204,55,147,151,234,104,157,75,129,59,68,189,146,201,139,172, -192,70,61,104,119,150,110,143,98,119,10,65,144,246,146,12,183,55,49,161,118,197,252,139,103,182,99,70,246,234,15,98,73,37,79,47,251,69,12,120,183,51,205,218,149,145,53,88,173,181,106,239,43,132,135,86,59,179,110,15,112,182,181,181,69,201,197,255,0,72,113,3,148, - +topic "CParser"; +[2 $$0,0#00000000000000000000000000000000:Default] +[i448;a25;kKO9;*@(64)2 $$1,0#37138531426314131252341829483380:class] +[l288;2 $$2,0#27521748481378242620020725143825:desc] +[a83;*R6 $$3,0#31310162474203024125188417583966:caption] +[l288;i1121;b17;O9;~~~.1408;2 $$4,0#10431211400427159095818037425705:param] +[i448;a25;kKO9;*@(64)2 $$5,0#37138531426314131252341829483370:item] +[*+117 $$6,6#14700283458701402223321329925657:header] +[l288;a17;*1 $$7,7#70004532496200323422659154056402:requirement] +[{_}%EN-US +[s5;K:`:`:CParser`:`:class:%- [@(0.0.255) class]_[@0 CParser]&] +[s0; &] +[s2; CParser is simple yet very useful lexical analyzer suitable +for building descent parsers of languages with C`-like syntax.&] +[s2; CParser works on `'`\0`' terminated text in memory (not Stream), +so to parse the file you have to load it into the memory first. +Text has to exist during the time it is processed by CParser +(no copy is made).&] +[s2; Many CParser methods can throw CParser`::Error exception to indicate +the failure to parse required symbol. When using CParser to build +concrete parser, it is common to use this exception (preferably +via ThrowError method) to indicate errors as well.&] +[s2; CParser objects cannot be transfered (copied).&] +[s2; &] +[s0;3 &] +[s5;K:`:`:CParser`:`:Error`:`:struct:%- [@(0.0.255) struct]_[@0 Error]_:_[@(0.0.255) public]_ +[^`:`:Exc^ Exc]&] +[s0;* &] +[s2; Type used as CParser exception. Contains single String with +error description.&] +[s2; &] +[s0;l288;%- [%%/ Derived from][%% ][^`:`:Exc^ Exc]&] +[s0;3 &] +[s0;l288;:`:`:CParser`:`:Error`:`:Error`(const char`*`):%- [* Error](const_char_`*[*@3 s]) +&] +[s2;l448; Constructor.&] +[s4;l448; [%-*C@3 s]-|Error message.&] +[s2; &] +[s0;3 &] +[s5;K:`:`:CParser`:`:Pos`:`:struct:%- [@(0.0.255) struct]_[@0 Pos]&] +[s2; &] +[s2; Position in parsed text.&] +[s0;3 &] +[s0;l288;:`:`:CParser`:`:Pos`:`:Pos`(const char`*`,int`,`:`:String`):%- [* Pos](const_c +har_`*[*@3 ptr]_`=_NULL, int_[*@3 line]_`=_[@3 1], String_[*@3 fn]_`=_Null)&] +[s2;l480; Constructor.&] +[s4;l480; [%-*C@3 ptr]-|Pointer to the position in the input text &] +[s4;l480; [%-*C@3 line]-|Line number.&] +[s4;l480; [%-*C@3 fn]-|Filename.&] +[s0;3 &] +[s5;l288;K:`:`:CParser`:`:Pos`:`:ptr:%- [@(0.0.255) const]_[@(0.0.255) char]_`*[@0 ptr]&] +[s2;l480; Pointer to the position in the input text &] +[s0;3 &] +[s5;l288;K:`:`:CParser`:`:Pos`:`:line:%- [@(0.0.255) int]_[@0 line]&] +[s2;l480; Line number.&] +[s0;3 &] +[s5;l288;K:`:`:CParser`:`:Pos`:`:fn:%- [^`:`:String^ String]_[@0 fn]&] +[s2;l480; Filename.&] +[s2; &] +[s0;3 &] +[s0;:`:`:CParser`:`:CParser`(const char`*`):%- [* CParser](const_char_`*[*@3 ptr])&] +[s2; Constructs the CParser.&] +[s4; [%-*C@3 ptr]-|Pointer to the input text.&] +[s0;3 &] +[s0;:`:`:CParser`:`:CParser`(const char`*`,const char`*`,int`):%- [* CParser](const_cha +r_`*[*@3 ptr], const_char_`*[*@3 fn], int_[*@3 line]_`=_[@3 1])&] +[s2; Constructs the CParser, with additional information for the +text. The additional info can be used when reporting error.&] +[s4; [%-*C@3 ptr]-|Pointer to the input text.&] +[s4; [%-*C@3 fn]-|The name of file (in fact, can be anything, value +is just stored).&] +[s4; [%-*C@3 line]-|First line number.&] +[s0;3 &] +[s0;:`:`:CParser`:`:CParser`(`):%- [* CParser]()&] +[s2; Constructs the CParser. Input text has to be assigned using +the SetPos method.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 ThrowError]([@(0.0.255) const]_[@(0.0.255) char]_`*[@3 s])&] +[s2; Throws CParser`::Error.&] +[s4; [%-*C@3 s]-|Error message.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 NoSkipSpaces]()&] +[s2; Sets CParser to the mode where white`-spaces are not automatically +skipped, but have to be skipped by Spaces method.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 SkipSpaces]()&] +[s2; Sets CParser to the mode where white`-spaces are automatically +skipped. First skip is performed when position in input text +is assigned via constructor or SetPos, then the skip is performed +after any symbol.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 Spaces]()&] +[s2; Skips white`-spaces.&] +[s4; [*/ Return value]-|true if there were white`-space to skip.&] +[s0;3 &] +[s5;K%- [@(0.0.255) char]_[@0 PeekChar]()&] +[s2; Returns the current single character.&] +[s4; [*/ Return value]-|Current character.&] +[s0;3 &] +[s5;K%- [@(0.0.255) char]_[@0 GetChar]()&] +[s2; Advances the position in the input text by one character.&] +[s4; [*/ Return value]-|Character at position before advancing it.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsChar]([@(0.0.255) char]_[@3 c])&] +[s2; Tests whether there is a specific character at the current position.&] +[s4; [%-*C@3 c]-|Character to test.&] +[s4; [*/ Return value]-|true on match.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsChar2]([@(0.0.255) char]_[@3 c1], [@(0.0.255) char]_[@3 c2])&] +[s2; Tests whether there is a specific character pair at the current +position.&] +[s4; [%-*C@3 c1]-|First character of pair.&] +[s4; [%-*C@3 c2]-|Second character of pair.&] +[s4; [*/ Return value]-|true on match.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsChar3]([@(0.0.255) char]_[@3 c1], [@(0.0.255) char]_[@3 c2], +[@(0.0.255) char]_[@3 c3])&] +[s2; Test for a specific character triplet at the current position.&] +[s4; [%-*C@3 c1]-|First character of triplet.&] +[s4; [%-*C@3 c2]-|Second character of triplet.&] +[s4; [%-*C@3 c3]-|Third character of triplet.&] +[s4; [*/ Return value]-|true on match.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 Char]([@(0.0.255) char]_[@3 c])&] +[s2; Tests for a single character at the current position. If there +is match, position is advanced.&] +[s4; [%-*C@3 c]-|Character to test.&] +[s4; [*/ Return value]-|true on match.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 Char2]([@(0.0.255) char]_[@3 c1], [@(0.0.255) char]_[@3 c2])&] +[s2; Tests for a character pair at the current position. If there +is match, position is advanced by two characters.&] +[s4; [%-*C@3 c1]-|First character of pair.&] +[s4; [%-*C@3 c2]-|Second character of pair.&] +[s4; [*/ Return value]-|true on match.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 Char3]([@(0.0.255) char]_[@3 c1], [@(0.0.255) char]_[@3 c2], +[@(0.0.255) char]_[@3 c3])&] +[s2; Tests for a character triplet at the current position. If there +is match, position is advanced by three characters.&] +[s4; [%-*C@3 c1]-|First character of triplet.&] +[s4; [%-*C@3 c2]-|Second character of triplet.&] +[s4; [%-*C@3 c3]-|Third character of triplet.&] +[s4; [*/ Return value]-|true on match.&] +[s0;@(0.0.255) &] +[s5;K%- [@(0.0.255) void]_[@0 PassChar]([@(0.0.255) char]_[@3 c])_throw(Error)&] +[s2; Calls Char(c). If it returns false, throws error.&] +[s4; [%-*C@3 c]-|Character to test.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 PassChar2]([@(0.0.255) char]_[@3 c1], [@(0.0.255) char]_[@3 c2])_th +row(Error)&] +[s2; Calls Char2(c1, c2). If it returns false, throws error.&] +[s4; [%-*C@3 c1]-|First character of pair.&] +[s4; [%-*C@3 c2]-|Second character of pair.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 PassChar3]([@(0.0.255) char]_[@3 c1], [@(0.0.255) char]_[@3 c2], +[@(0.0.255) char]_[@3 c3])_throw(Error)&] +[s2; Calls Char2(c1, c2, c3). If it returns false, throws the Error.&] +[s4; [%-*C@3 c1]-|First character of triplet.&] +[s4; [%-*C@3 c2]-|Second character of triplet.&] +[s4; [%-*C@3 c3]-|Third character of triplet.&] +[s0;3 &] +[s0;:`:`:CParser`:`:Id`(const char`*`):%- bool_[* Id](const_char_`*[*@3 s])&] +[s2; Tests for given C`-like identifier. If there is match, advances +position by strlen(s) characters.&] +[s4; [%-*C@3 s]-|Identifier.&] +[s4; [*/ Return value]-|true on match.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 PassId]([@(0.0.255) const]_[@(0.0.255) char]_`*[@3 s])_throw(Erro +r)&] +[s2; Invokes the Id method with s as parameter. If it returns false, +throws the Error.&] +[s4; [%-*C@3 s]-|Identifier.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsId]()&] +[s2; Tests whether there is any C`-like identifier at the current +position.&] +[s4; [*/ Return value]-|true if there is identifier.&] +[s0;3 &] +[s5;K%- [^`:`:String^ String]_[@0 ReadId]()_throw(Error)&] +[s2; Reads C`-like identifier from the current position. If there +is none, an Error is thrown.&] +[s4; [*/ Return value]-|Identifier.&] +[s0;3 &] +[s5;K%- [^`:`:String^ String]_[@0 ReadIdt]()_throw(Error)&] +[s2; Special variant of ReadId that considers different non`-alphanumeric +characters to be the part of identifier as long as they form +C`+`+ normal or template based type.&] +[s4; [*/ Return value]-|Identifier.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsInt]()&] +[s2; Test for integer at current position `- there either must be +digit, or `'`+`' or `'`-`' sign followed by any number of spaces +and digit.&] +[s4; [*/ Return value]-|true if there is integer.&] +[s0;3 &] +[s5;K%- [@(0.0.255) int]_[@0 ReadInt]()_throw(Error)&] +[s2; Reads the integer from the current position. If IsInt is false, +throws an Error.&] +[s4; [*/ Return value]-|Integer.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsNumber]()&] +[s2; Tests for sign`-less number at current position `- there must +be digit at current position.&] +[s4; [*/ Return value]-|true if there is number.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsNumber]([@(0.0.255) int]_[@3 base])&] +[s2; Tests for sign`-less number with given base `- there must be +digit or letter `'A`' `- `'Z`' or `'a`' `- `'z`', where range +is limit by acutal base (e.g. for base 12 letters `'a`' `'A`' +`'b`' `'B`' are allowed).&] +[s4; [%-*C@3 base]-|Numeric base.&] +[s4; [*/ Return value]-|true if there is number with given numeric base.&] +[s0;3 &] +[s5;K%- [^`:`:uint32^ uint32]_[@0 ReadNumber]([@(0.0.255) int]_[@3 base]_`=_[@3 10])_throw(Erro +r)&] +[s2; Reads a number with the given numeric base. If IsNumber(base) +is false, throws an Error.&] +[s4; [%-*C@3 base]-|Numeric base.&] +[s4; [*/ Return value]-|Number.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsDouble]()&] +[s2; Test for floating point number at current position `- there +either must be digit, or `'`+`' or `'`-`' sign followed by any +number of spaces and digit.&] +[s4; [*/ Return value]-|true if there is the floating point number.&] +[s0;3 &] +[s5;K%- [@(0.0.255) double]_[@0 ReadDouble]()_throw(Error)&] +[s2; Reads a floating point number with C based lexical rules.&] +[s4; [*/ Return value]-|Floating point number.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsString]()&] +[s2; Tests for C`-like string literal at the current position. Same +as IsChar(`'`\`"`');&] +[s4; [*/ Return value]-|true when there is string literal.&] +[s0;3 &] +[s5;K%- [^`:`:String^ String]_[@0 ReadOneString]([@(0.0.255) bool]_[@3 chkend]_`=_false)_thro +w(Error)&] +[s2; Reads C`-like string literal from current position (follow C +lexical rules, including escape codes). Literals on different +lines are not concatenated (unlike C).&] +[s4; [%-*C@3 chkend]-|When false, ReadOneString is more permissive as +it allows unterminated string literals `- string is then also +delimited by end of line or text.&] +[s4; [*/ Return value]-|String literal.&] +[s0;3 &] +[s5;K%- [^`:`:String^ String]_[@0 ReadString]([@(0.0.255) bool]_[@3 chkend]_`=_false)_throw(E +rror)&] +[s2; Reads C`-like string literal from current position (follow C +lexical rules, including escape codes). Literals on different +lines are concatenated (as in C).&] +[s4; [%-*C@3 chkend]-|When false, ReadOneString is more permissive as +it allows unterminated string literals `- string is then also +delimited by end of line or text.&] +[s4; [*/ Return value]-|String literal.&] +[s0;3 &] +[s5;K%- [^`:`:String^ String]_[@0 ReadOneString]([@(0.0.255) int]_[@3 delim], +[@(0.0.255) bool]_[@3 chkend]_`=_false)_throw(Error)&] +[s2; Reads C`-like string literal from current position (follow C +lexical rules, including escape codes) with different delimiter +than `'`\`"`'. Literals on different lines are not concatenated +(unlike C).&] +[s4; [%-*C@3 delim]-|Delimiter.&] +[s4; [%-*C@3 chkend]-|When false, ReadOneString is more permissive as +it allows unterminated string literals `- string is then also +delimited by end of line or text.&] +[s4; [*/ Return value]-|String literal.&] +[s0;3 &] +[s5;K%- [^`:`:String^ String]_[@0 ReadString]([@(0.0.255) int]_[@3 delim], +[@(0.0.255) bool]_[@3 chkend]_`=_false)_throw(Error)&] +[s2; Reads C`-like string literal from current position (follow C +lexical rules, including escape codes). with different delimiter +than `'`\`"`'. Literals on different lines are concatenated (as +in C).&] +[s4; [%-*C@3 delim]-|Delimiter.&] +[s4; [%-*C@3 chkend]-|When false, ReadOneString is more permissive as +it allows unterminated string literals `- string is then also +delimited by end of line or text.&] +[s4; [*/ Return value]-|String literal.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 SkipTerm]()&] +[s2; Skips a single symbol. Decimal numbers, identifiers and string +literals are skipped as whole symbols, otherwise input position +is advanced by 1 character.&] +[s0;3 &] +[s5;K%- [@(0.0.255) const]_[@(0.0.255) char]_`*[@0 GetPtr]()&] +[s2; Gets a pointer to the current position.&] +[s4; [*/ Return value]-|Pointer to current position.&] +[s0;3 &] +[s5;K%- [^`:`:CParser`:`:Pos^ Pos]_[@0 GetPos]()&] +[s2; Gets the current position,.&] +[s4; [*/ Return value]-|Current position. It contains the pointer as +well as the line number and the filename.&] +[s0;3 &] +[s5;K%- [@(0.0.255) void]_[@0 SetPos]([@(0.0.255) const]_[^`:`:CParser`:`:Pos^ CParser`::Pos]`& +_[@3 p])&] +[s2; Sets the current position.&] +[s4; [%-*C@3 pos]-|New current position. Can be in different text than +previously used in CParser.&] +[s0;3 &] +[s5;K%- [@(0.0.255) bool]_[@0 IsEof]()_[@(0.0.255) const]&] +[s2; Test for the end of input text.&] +[s4; [*/ Return value]-|true when current position is a the end of input +text (`'`\0`' character).&] +[s0;3 &] +[s5;K%- operator_[@(0.0.255) bool]()_[@(0.0.255) const]&] +[s4; [*/ Return value]-|!IsEof().&] +[s0; &] +[s5;K%- [@(0.0.255) int]_[@0 GetLine]()_[@(0.0.255) const]&] +[s4; [*/ Return value]-|Current line.&] +[s0;3 &] +[s5;K%- [^`:`:String^ String]_[@0 GetFileName]()_[@(0.0.255) const]&] +[s4; [*/ Return value]-|Actual filename.&] +[s0; &] +[s0; &] +[s0; &] +[s0; &] +[s0; C`-like string literal formatting&] +[s0; &] +[s0; AsCString routines produce C`-like literals (compatible with +CParser) from character data:&] +[s0;3 &] +[s0;:`:`:AsCString`(const char`*`,const char`*`,int`,const char`*`,bool`):%- String_[* A +sCString](const_char_`*[*@3 s], const_char_`*[*@3 end], int_[*@3 linemax]_`=_INT`_MAX, +const_char_`*[*@3 linepfx]_`=_NULL, bool_[*@3 smart]_`=_false)&] +[s2; Creates C`-like literal.&] +[s4; [%-*C@3 s]-|Pointer to characters.&] +[s4; [%-*C@3 end]-|End of characters array (`'`\0`' characters are allowed +inside data).&] +[s4; [%-*C@3 linemax]-|Maximal length of line. If this is exceeded, +ending `"`\`"`\n`" and [@3 linepfx] is inserted and literal continues +on the new line.&] +[s4; [%-*C@3 linepfx]-|Pointer to zero`-terminated text to be inserted +at the beginning of the line when the line length is exceeded.&] +[s4; [%-*C@3 smart]-|true activates smarter breaking into lines `- breaks +at spaces are preferred.&] +[s4; [*/ Return value]-|C`-like literal.&] +[s0;3 &] +[s0;:`:`:AsCString`(const char`*`,int`,const char`*`,bool`):%- String_[* AsCString](con +st_char_`*[*@3 s], int_[*@3 linemax]_`=_INT`_MAX, const_char_`*[*@3 linepfx]_`=_NULL, +bool_[*@3 smart]_`=_false)&] +[s2; Creates C`-like literal from zero terminated character data. +Same as AsCString([@3 s], [@3 s] `+ strlen([@3 s]), [@3 linemax], [@3 linepfx], +[@3 smart]).&] +[s0;3 &] +[s0;:`:`:AsCString`(const`:`:String`&`,int`,const char`*`,bool`):%- String_[* AsCString +](const_String`&_[*@3 s], int_[*@3 linemax]_`=_INT`_MAX, const_char_`*[*@3 linepfx]_`=_ +NULL, bool_[*@3 smart]_`=_false)&] +[s2; Creates C`-like literal from String. String can contain zero +characters. Same as AsCString([@3 s].Begin(), [@3 s].End(), [@3 linemax], +[@3 linepfx], [@3 smart]).&] +[s0; ] \ No newline at end of file diff --git a/uppsrc/Core/src.tpp/util$en-us.tpp b/uppsrc/Core/src.tpp/util$en-us.tpp index 800d815ff..3a2568945 100644 --- a/uppsrc/Core/src.tpp/util$en-us.tpp +++ b/uppsrc/Core/src.tpp/util$en-us.tpp @@ -1,42 +1,29 @@ -TITLE("Miscellaneous") -COMPRESSED -120,156,133,83,91,111,155,48,20,254,43,71,234,69,109,154, -102,190,98,3,47,149,218,62,76,211,54,105,93,159,16,106, -28,112,26,171,4,50,155,76,169,182,245,183,239,0,33,221, -195,182,38,81,44,224,187,158,35,50,6,199,199,100,74,142, -200,27,159,228,198,46,205,182,106,243,204,9,161,83,195,100, -250,244,225,115,156,78,174,206,34,113,142,34,20,69,184,162, -92,75,78,5,139,240,143,114,202,36,227,130,106,22,11,205, -185,38,73,81,153,16,242,172,98,90,167,157,51,67,18,83, -146,81,37,180,208,148,43,205,144,203,8,97,68,49,73,5, -215,76,38,165,13,69,158,25,205,211,201,151,8,73,188,115, -66,113,66,35,38,148,96,132,19,38,208,138,106,45,168,146, -154,199,81,148,20,102,211,186,166,222,123,57,74,25,77,23, -84,165,24,249,229,229,101,70,5,25,18,8,20,163,68,96, -84,138,247,136,96,138,202,152,196,82,83,77,56,138,75,69, -100,178,49,222,172,255,222,188,211,144,111,86,87,36,113,173, -69,137,201,5,165,10,41,209,52,58,162,66,97,81,205,133, -212,138,160,57,99,140,115,70,57,139,99,38,35,169,146,149, -53,165,245,251,10,6,195,79,40,82,213,84,29,33,145,8, -201,153,136,187,97,113,116,98,44,146,49,149,130,200,8,149, -18,111,191,109,157,183,107,91,227,198,126,60,252,58,185,253, -116,121,127,7,89,224,41,124,116,161,176,85,101,106,219,108, -195,105,158,5,146,194,112,76,32,59,33,228,146,144,9,244, -155,122,200,247,215,112,187,43,242,14,195,6,40,30,95,87, -46,0,254,218,149,133,141,183,75,235,189,45,193,55,77,59, -112,161,89,194,253,252,98,126,1,118,87,216,126,25,51,120, -223,118,148,133,9,174,48,85,245,12,6,238,90,239,234,199, -25,202,89,112,165,53,131,164,105,1,159,195,147,171,203,94, -232,32,1,133,169,97,97,193,58,244,245,176,54,181,121,68, -219,197,51,132,141,45,220,210,21,176,50,117,89,89,31,166, -208,120,8,110,189,169,108,23,127,188,63,42,108,131,45,167, -80,186,176,169,204,51,70,128,214,238,218,173,169,192,213,203, -198,175,77,239,214,54,125,63,196,250,217,31,245,113,96,217, -59,184,177,222,125,71,243,165,111,214,249,56,185,125,161,124, -128,241,61,60,153,227,23,67,140,199,217,252,60,121,157,117, -55,220,145,126,118,62,206,121,255,194,65,209,212,161,245,219, -162,109,134,12,255,81,237,161,221,213,16,98,126,250,111,155, -30,250,48,226,14,139,158,92,113,24,222,183,61,240,16,231, -250,53,70,223,120,220,92,247,88,164,7,151,235,81,224,242, -231,13,30,222,13,107,235,118,232,253,161,1,140,69,242,223, -77,207,70,247, \ No newline at end of file +topic "Miscellaneous"; +[2 $$0,0#00000000000000000000000000000000:Default] +[i448;a25;kKO9;*@(64)2 $$1,0#37138531426314131252341829483380:class] +[l288;2 $$2,0#27521748481378242620020725143825:desc] +[a83;*R6 $$3,0#31310162474203024125188417583966:caption] +[l288;i1121;b17;O9;~~~.1408;2 $$4,0#10431211400427159095818037425705:param] +[i448;a25;kKO9;*@(64)2 $$5,0#37138531426314131252341829483370:item] +[*+117 $$6,6#14700283458701402223321329925657:header] +[l288;a17;*1 $$7,7#70004532496200323422659154056402:requirement] +[{_}%EN-US +[s3; Miscellaneous&] +[s0; &] +[s0;%- class_[* Exc]&] +[s2; &] +[s2; This is the preferred root class of U`+`+ exception. It is basically +a String. The idea is that all kinds of exception can be either +managed by specific handlers, or simple Exc handler can be used, +displaying textual information to the user.&] +[s2; &] +[s0;%- [%%/ Derived from][%% ]String&] +[s0;3 &] +[s0;:`:`:Exc`:`:Exc`(`):%- [* Exc]()&] +[s2; Default constructor.&] +[s0;3 &] +[s0;:`:`:Exc`:`:Exc`(const`:`:String`&`):%- [* Exc](const_String`&_[*@3 desc])&] +[s2; Constructor from String.&] +[s4; [%-*C@3 desc]-|Description of error.&] +[s0; &] +[s0; ] \ No newline at end of file diff --git a/uppsrc/CppBase/Base.cpp b/uppsrc/CppBase/Base.cpp index 0f1c472cf..8956bb66f 100644 --- a/uppsrc/CppBase/Base.cpp +++ b/uppsrc/CppBase/Base.cpp @@ -10,6 +10,29 @@ NAMESPACE_UPP #define LLOG(x) #define LTIMING(x) // RTIMING(x) +class Nestfo { + bool bvalid, nvalid; + Vector baselist; + Vector nests; + int nesti; + void Bases(int i, Vector& g); + void Init(); + +public: + const CppBase& base; + VectorMap cache; + + const Vector& GetBases(); + const Vector& GetNests(); + int GetNest() const { return nesti; } + void NoBases() { baselist.Clear(); bvalid = true; } + + Nestfo(const CppBase& base, int nesti = -1); + Nestfo(int nesti, const CppBase& base); + Nestfo(const CppBase& base, const String& nest); + Nestfo(const Nestfo& f); +}; + void CppWordsHash::AddWord(const String& s) { int i = GetHashValue(s) & 127; @@ -160,6 +183,8 @@ const Vector& Nestfo::GetNests() return nests; } +String Qualify(Nestfo& nf, const String& type); + String Qualify0(Nestfo& nf, const String& type) { if(IsNull(type) || type == "const" || @@ -228,7 +253,7 @@ String Qualify(Nestfo& nf, const String& type) return x; } -String QualifyIds(Nestfo& nf, const String& k, CppWordsHash& w) +String QualifyIds(Nestfo& nf, const String& k, CppWordsHash& w, bool all) { String r; CParser p(k); @@ -245,7 +270,8 @@ String QualifyIds(Nestfo& nf, const String& k, CppWordsHash& w) } } Nestfo nnf(nf.GetNest(), nf.base); - t = Qualify(nnf, t); + if(all) + t = Qualify(nnf, t); if(iscid(*r.Last()) && iscid(*t)) r << ' '; r << t; @@ -262,13 +288,16 @@ String QualifyIds(Nestfo& nf, const String& k, CppWordsHash& w) t << id; } } - t = Qualify(nf, t); + if(all) + t = Qualify(nf, t); if(iscid(*r.Last()) && iscid(*t)) r << ' '; r << t; } else { int c = p.GetChar(); + if(c == '(') + all = true; r.Cat(c); p.Spaces(); } @@ -280,20 +309,20 @@ String Qualify(const CppBase& base, const String& nest, const String& type) { CppWordsHash dummy; Nestfo nf(base, nest); - return QualifyIds(nf, type, dummy); + return QualifyIds(nf, type, dummy, true); } String QualifyKey(const CppBase& base, const String& nest, const String& type) { CppWordsHash dummy; Nestfo nf(base, nest); - return QualifyIds(nf, type, dummy); + return QualifyIds(nf, type, dummy, false); } void QualifyTypes(Nestfo& nf, CppItem& m) { - m.qtype = QualifyIds(nf, m.type, m.words); - m.qptype = QualifyIds(nf, m.ptype, m.words); + m.qtype = QualifyIds(nf, m.type, m.words, true); + m.qptype = QualifyIds(nf, m.ptype, m.words, true); } void QualifyTypes(CppBase& base, const String& nest, CppItem& m) @@ -332,7 +361,7 @@ void QualifyPass2(CppBase& base, const CppWordsHash& words) QualifyTypes(nf, m); if(m.IsCode()) { String k = n.key[i]; - String r = QualifyIds(nf, m.key, m.words); + String r = QualifyIds(nf, m.key, m.words, false); if(k != r) { int q = n.key.Find(r); if(q >= 0 && q != i) @@ -395,7 +424,7 @@ void Remove(CppBase& base, const Vector& pf) void CppItem::Serialize(Stream& s) { s % kind % access; - s % natural % at % tparam % param % pname % tname % type % ptype % virt % key; + s % natural % at % tparam % param % pname % tname % ctname % type % ptype % virt % key; } END_UPP_NAMESPACE diff --git a/uppsrc/CppBase/CppBase.h b/uppsrc/CppBase/CppBase.h index ca8a17538..99e0230d4 100644 --- a/uppsrc/CppBase/CppBase.h +++ b/uppsrc/CppBase/CppBase.h @@ -237,6 +237,7 @@ struct CppPos : Moveable { struct CppSimpleItem { String natural; + String type; String qtype; String tparam; @@ -245,6 +246,7 @@ struct CppSimpleItem { String ptype; String qptype; String tname; + String ctname; byte access; byte kind; int16 at; @@ -301,6 +303,7 @@ class Parser { struct Context { int namespacel; String nesting; + String ctname; Vector tparam; Index typenames; int access; @@ -403,7 +406,7 @@ class Parser { CppItem& Item(const String& nesting, const String& item, const String& name, bool impl); CppItem& Item(const String& nesting, const String& item, const String& name); - CppItem& Fn(const Decl& d, const String& templ, bool body, int kind); + CppItem& Fn(const Decl& d, const String& templ, bool body, int kind, const String& tname, const String& tparam); struct Error {}; @@ -454,30 +457,6 @@ public: String NoTemplatePars(const String& type); -class Nestfo { - bool bvalid, nvalid; - Vector baselist; - Vector nests; - int nesti; - void Bases(int i, Vector& g); - void Init(); - -public: - const CppBase& base; - VectorMap cache; - - const Vector& GetBases(); - const Vector& GetNests(); - int GetNest() const { return nesti; } - void NoBases() { baselist.Clear(); bvalid = true; } - - Nestfo(const CppBase& base, int nesti = -1); - Nestfo(int nesti, const CppBase& base); - Nestfo(const CppBase& base, const String& nest); - Nestfo(const Nestfo& f); -}; - -String Qualify(Nestfo& nf, const String& type); String Qualify(const CppBase& base, const String& nest, const String& type); void QualifyTypes(CppBase& base, const String& nest, CppItem& m); String QualifyKey(const CppBase& base, const String& nest, const String& type); diff --git a/uppsrc/CppBase/CppBase.upp b/uppsrc/CppBase/CppBase.upp index 70e431bac..0baf1ca1e 100644 --- a/uppsrc/CppBase/CppBase.upp +++ b/uppsrc/CppBase/CppBase.upp @@ -11,6 +11,7 @@ file Pre.cpp, cpplex.cpp, Parser.cpp, + Parser2.cpp, Base.cpp, Info readonly separator, Copying; diff --git a/uppsrc/CppBase/Parser.cpp b/uppsrc/CppBase/Parser.cpp index 7f8a63ee2..ab45da735 100644 --- a/uppsrc/CppBase/Parser.cpp +++ b/uppsrc/CppBase/Parser.cpp @@ -19,14 +19,34 @@ inline const char *bew(const char *s, const char *t) return t; } +static String s_operator("operator"); +static String s_virtual("virtual"); +static String s_inline("inline"); +static String s_static("static"); + +static inline bool sSpaces(String& res, const char *& s) +{ + if((byte)*s <= ' ') { + char c = *s++; + if(c != '\2') { + res.Cat(' '); + while((byte)*s <= ' ' && *s) + s++; + } + return true; + } + return false; +} + String FnItem(const char *s, const char *pname, const char *qname, const String& name) { String res; + while(*s && (byte)*s <= ' ') s++; while(*s) { while(*s && !iscid(*s) && *s != '~') s++; while(iscid(*s) || *s == '~') res.Cat(*s++); - if(res == "operator") { + if(res == s_operator) { while(*s && *s != '(') { if((byte)*s >= ' ') res.Cat(*s); @@ -42,6 +62,7 @@ String FnItem(const char *s, const char *pname, const char *qname, const String& } while(*s) { const char *w = bew(qname, s); + byte c = *s; if(w && !iscid(*w)) { if(iscid(*res.Last())) res.Cat(' '); @@ -49,11 +70,11 @@ String FnItem(const char *s, const char *pname, const char *qname, const String& s = w; } else - if(iscid(*s)) { - String q; - while(iscid(*s)) - q.Cat(*s++); - if(q != "virtual" && q != "inline" && q != "static" && !InScList(q, pname)) { + if(iscid(c)) { + const char *b = s++; + while(iscid(*s)) s++; + String q(b, s); + if(q != s_virtual && q != s_inline && q != s_static && !InScList(q, pname)) { if(iscid(*res.Last())) res.Cat(' '); res.Cat(q); @@ -62,7 +83,7 @@ String FnItem(const char *s, const char *pname, const char *qname, const String& while((byte)*s <= ' ' && *s) s++; } else - if(*s == '=') { + if(c == '=') { s++; int l = 0; while(*s && !(l == 0 && (*s == ',' || *s == ')'))) { @@ -80,14 +101,17 @@ String FnItem(const char *s, const char *pname, const char *qname, const String& while((byte)*s <= ' ' && *s) s++; } - else - res.Cat(*s++); + else { + res.Cat(c); + s++; + } } return res; } String Purify(const char *s, const char *qname, const String& name) { String res; + while(*s && (byte)*s <= ' ') s++; while(*s) { const char *w = bew(qname, s); if(w) { @@ -96,22 +120,16 @@ String Purify(const char *s, const char *qname, const String& name) { } else if(iscid(*s)) { - String q(*s++, 1); //!!! speed up! - while(iscid(*s)) - q.Cat(*s++); - if(q != "virtual" && q != "inline" && q != "static") + const char *b = s++; + while(iscid(*s)) s++; + String q(b, s); + if(q != s_virtual && q != s_inline && q != s_static) res.Cat(q); else while((byte)*s <= ' ' && *s) s++; } else - if((byte)*s <= ' ') { - s++; - res.Cat(' '); - while((byte)*s <= ' ' && *s) - s++; - } - else + if(!sSpaces(res, s)) res.Cat(*s++); } return TrimRight(res); @@ -119,29 +137,33 @@ String Purify(const char *s, const char *qname, const String& name) { String Purify(const char *s) { String res; + while(*s && (byte)*s <= ' ') s++; while(*s) { if(iscid(*s)) { - String q(*s++, 1); //!!! speed up! - while(iscid(*s)) - q.Cat(*s++); - if(q != "virtual" && q != "inline") + const char *b = s++; + while(iscid(*s)) s++; + String q(b, s); + if(q != s_virtual && q != s_inline) res.Cat(q); else while((byte)*s <= ' ' && *s) s++; } else - if((byte)*s <= ' ') { - s++; - res.Cat(' '); - while((byte)*s <= ' ' && *s) - s++; - } - else + if(!sSpaces(res, s)) res.Cat(*s++); } return TrimRight(res); } +String Gpurify(const char *s) +{ + String res; + while(*s) + if(!sSpaces(res, s)) + res.Cat(*s++); + return res; +} + void ScAdd(String& s, const String& a) { if(a.IsEmpty()) return; @@ -172,6 +194,7 @@ void Parser::Context::operator<<=(const Context& t) access = t.access; noclass = t.noclass; namespacel = t.namespacel; + ctname = t.ctname; } Parser::Decla::Decla() @@ -935,10 +958,12 @@ CppItem& Parser::Item(const String& nesting, const String& item, const String& n n.namespacel = current_namespacel = context.namespacel; CppItem& im = dobody ? current : n.GetAdd(item, name); im.key = item; + im.ctname = context.ctname; CppPos& p = im.pos.Add(); p.file = filei; p.line = line + 1; p.impl = impl; + LLOG("New item " << GetCppFile(filei) << ' ' << line + 1 << " " << nesting << "::" << item); return im; } @@ -1059,6 +1084,11 @@ bool Parser::Nest(const String& tp, const String& tn) { while(Key(t_dblcolon)); context.access = t == tk_class ? PRIVATE : PUBLIC; context.noclass = false; + if(tn.GetCount()) { + if(context.ctname.GetCount()) + context.ctname << ';'; + context.ctname << tn; + } String nn; if(!tp.IsEmpty()) nn = "template " + tp + " "; @@ -1105,12 +1135,12 @@ bool Parser::Nest(const String& tp, const String& tn) { } if(Key('{')) { NestBody(); - im.natural = nn; + im.natural = Gpurify(nn); im.decla = true; } else if(IsNull(im.natural)) - im.natural = nn; + im.natural = Gpurify(nn); context = cc; CheckKey(';'); SetNestCurrent(); @@ -1125,7 +1155,8 @@ String DeTemp(const char *s) return r; } -CppItem& Parser::Fn(const Decl& d, const String& templ, bool body, int kind) +CppItem& Parser::Fn(const Decl& d, const String& templ, bool body, int kind, + const String& tname, const String& tparam) { String param; String pname; @@ -1171,7 +1202,7 @@ CppItem& Parser::Fn(const Decl& d, const String& templ, bool body, int kind) if(!body || IsNull(im.natural)) { im.natural.Clear(); if(!IsNull(templ)) { - im.natural = templ; + im.natural = TrimRight(Gpurify(templ)) + ' '; im.at = im.natural.GetLength(); } im.natural << Purify(d.natural, d.name, nm); @@ -1183,6 +1214,9 @@ CppItem& Parser::Fn(const Decl& d, const String& templ, bool body, int kind) im.virt = d.s_virtual; im.type = d.type; im.decla = true; + im.tname = tname; + im.tparam = tparam; + im.ctname = context.ctname; LLOG("FnItem: " << nesting << "::" << item << ", natural: " << im.natural); } return im; @@ -1241,9 +1275,8 @@ void Parser::Do() CppItem& m = Fn(d, "template " + tparam + ' ', body, context.noclass ? FUNCTIONTEMPLATE : d.s_static ? CLASSFUNCTIONTEMPLATE : - INSTANCEFUNCTIONTEMPLATE); - m.tname = tnames; - m.tparam = CleanTp(tparam); + INSTANCEFUNCTIONTEMPLATE, + tnames, tparam); functionItem = &m; } } @@ -1346,7 +1379,8 @@ void Parser::Do() Fn(d, Null, body, d.istructor ? (d.isdestructor ? DESTRUCTOR : CONSTRUCTOR) : d.isfriend ? INLINEFRIEND : context.noclass ? FUNCTION : - d.s_static ? CLASSFUNCTION : INSTANCEFUNCTION); + d.s_static ? CLASSFUNCTION : INSTANCEFUNCTION, + String(), String()); functionItem = &im; } else { diff --git a/uppsrc/CppBase/Parser2.cpp b/uppsrc/CppBase/Parser2.cpp new file mode 100644 index 000000000..672cba4c6 --- /dev/null +++ b/uppsrc/CppBase/Parser2.cpp @@ -0,0 +1,1447 @@ +#if 0 + +#include "CppBase.h" + +NAMESPACE_UPP + +#ifdef _MSC_VER +#pragma inline_depth(255) +#pragma optimize("t", on) +#endif + + +#define LLOG(x) // DLOG(x) +#define LTIMING(x) // TIMING(x) + +inline const char *bew(const char *s, const char *t) +{ + while(*s) + if(*s++ != *t++) + return NULL; + return t; +} + +String FnItem(const char *s, const char *pname, const char *qname, const String& name) { + String res; + while(*s) { + while(*s && !iscid(*s) && *s != '~') + s++; + while(iscid(*s) || *s == '~') + res.Cat(*s++); + if(res == "operator") { + while(*s && *s != '(') { + if((byte)*s >= ' ') + res.Cat(*s); + s++; + } + break; + } + while(*s && (byte)*s <= ' ') + s++; + if(*s == '(' && (res == name || res == '~' + name)) + break; + res.Clear(); + } + while(*s) { + const char *w = bew(qname, s); + if(w && !iscid(*w)) { + if(iscid(*res.Last())) + res.Cat(' '); + res.Cat(name); + s = w; + } + else + if(iscid(*s)) { + String q; + while(iscid(*s)) + q.Cat(*s++); + if(q != "virtual" && q != "inline" && q != "static" && !InScList(q, pname)) { + if(iscid(*res.Last())) + res.Cat(' '); + res.Cat(q); + } + else + while((byte)*s <= ' ' && *s) s++; + } + else + if(*s == '=') { + s++; + int l = 0; + while(*s && !(l == 0 && (*s == ',' || *s == ')'))) { + if(*s == '(') + l++; + else + if(*s == ')') + l--; + s++; + } + } + else + if((byte)*s <= ' ') { + s++; + while((byte)*s <= ' ' && *s) + s++; + } + else + res.Cat(*s++); + } + return res; +} + +String Purify(const char *s, const char *qname, const String& name) { + String res; + while(*s) { + const char *w = bew(qname, s); + if(w) { + res.Cat(name); + s = w; + } + else + if(iscid(*s)) { + String q(*s++, 1); //!!! speed up! + while(iscid(*s)) + q.Cat(*s++); + if(q != "virtual" && q != "inline" && q != "static") + res.Cat(q); + else + while((byte)*s <= ' ' && *s) s++; + } + else + if((byte)*s <= ' ') { + s++; + res.Cat(' '); + while((byte)*s <= ' ' && *s) + s++; + } + else + res.Cat(*s++); + } + return TrimRight(res); +} + +String Purify(const char *s) { + String res; + while(*s) { + if(iscid(*s)) { + String q(*s++, 1); //!!! speed up! + while(iscid(*s)) + q.Cat(*s++); + if(q != "virtual" && q != "inline") + res.Cat(q); + else + while((byte)*s <= ' ' && *s) s++; + } + else + if((byte)*s <= ' ') { + s++; + res.Cat(' '); + while((byte)*s <= ' ' && *s) + s++; + } + else + res.Cat(*s++); + } + return TrimRight(res); +} + +void ScAdd(String& s, const String& a) +{ + if(a.IsEmpty()) return; + if(!s.IsEmpty()) + s << ';'; + s << a; +} + +String Parser::Context::Dump() const +{ + return "Nesting: " + nesting; +} + +Parser::FunctionStat::FunctionStat(const String & nesting, + const CppItem & cppItem, + const LexSymbolStat &symbolStat, + int maxScopeDepth) : + nesting(nesting), cppItem(cppItem), + symbolStat(symbolStat), maxScopeDepth(maxScopeDepth) +{ +} + +void Parser::Context::operator<<=(const Context& t) +{ + nesting = t.nesting; + typenames <<= t.typenames; + tparam <<= t.tparam; + access = t.access; + noclass = t.noclass; + namespacel = t.namespacel; +} + +Parser::Decla::Decla() +{ + function = type_def = false; + s_static = s_auto = s_register = s_extern = s_mutable = s_explicit = s_virtual = false; + isfriend = istemplate = istructor = isptr = nofn = false; +} + + +bool Parser::Key(int code) +{ + if(lex == code) { + ++lex; + return true; + } + return false; +} + +int Parser::GetLine(const char *p) +{ + int pos = int(p - ~file.text); + int l = 0; + int h = file.linepos.GetCount(); + while(l < h) { + int q = (l + h) / 2; + if(file.linepos[q] < pos) + l = q + 1; + else + h = q; + } + return l; +} + +void Parser::Line() +{ + int pos = int(lex.Pos() - ~file.text); + while(line + 1 < file.linepos.GetCount() && file.linepos[line + 1] <= pos) + line++; +} + +void Parser::ThrowError(const String& e) +{ + err(GetLine(lex.Pos()), e); +#ifdef _DEBUG + int i = 0; + while(i < 40 && lex[i] != t_eof) + i++; + LLOG("ERROR: (" << GetLine(lex.Pos()) << ") " << e << ", nest: " << current_nest << + " " << AsCString(String(lex.Pos(), lex.Pos(i)))); +#endif + throw Error(); +} + +void Parser::Check(bool b, const char *err) +{ + if(!b) ThrowError(err); +} + +void Parser::CheckKey(int c) +{ + if(!Key(c)) ThrowError(Format("Missing %c", c)); +} + +String Parser::TemplateParams(String& param) +{ + const char *pos = lex.Pos(); + CheckKey('<'); + int level = 1; + String id; + bool gp = true; + while(lex != t_eof) { + if(lex.IsId() && gp) + id = lex.GetId(); + else + if(Key(',')) { + ScAdd(param, id); + id.Clear(); + gp = true; + } + else + if(Key('=')) { + if(!id.IsEmpty()) { + ScAdd(param, id); + id.Clear(); + } + gp = false; + } + else + if(Key('>')) { + level--; + if(level <= 0) { + ScAdd(param, id); + break; + } + } + else + if(Key('<')) + level++; + else + ++lex; + } + return String(pos, lex.Pos()); +} + +String Parser::TemplateParams() +{ + String dummy; + return TemplateParams(dummy); +} + +String Parser::TemplatePnames() +{ + String pnames; + TemplateParams(pnames); + return pnames; +} + +String Parser::ReadOper() { + const char *p = lex.Pos(); + Key(tk_operator); + int level = 0; + if(Key('(')) + level++; + for(;;) { + if(lex == t_eof || level <= 0 && lex == '(') break; + if(Key('(') || Key('[')) level++; + else + if(Key(')') || Key(']')) level--; + else + ++lex; + } + StringBuffer r; + while(p < lex.Pos()) { + if((byte)*p > ' ') + r.Cat(*p); + p++; + } + return r; +} + +String Parser::Name(String& name) +{ + String s; + if(Key(t_dblcolon)) { + s << "::"; + name = s; + } + Check(lex.IsId() || lex == tk_operator, "Name expected"); + for(;;) { + if(lex.IsId()) { + name << lex.Id(); + s << lex.GetId(); + } + else { + String h = ReadOper(); + name << h; + s << h; + break; + } + if(lex == '<') + s << TemplateParams(); + if(Key(t_dblcolon)) { + s << "::"; + name << "::"; + if(Key('~')) { + s << "~"; + name << "~"; + } + } + else + break; + } + return s; +} + +String Parser::Name() +{ + String h; + return Name(h); +} + +String Parser::Constant() +{ + const char *p = lex.Pos(); + const char *p1 = p; + int level = 0; + for(;;) { + p1 = lex.Pos(); + if(lex == t_eof) break; + if(level <= 0 && (lex == ',' || lex == ';' || lex == ')' || lex == '}' || lex == ']')) + break; + if(Key('(') || Key('[') || Key('{')) level++; + else + if(Key(')') || Key(']') || Key('}')) level--; + else + ++lex; + } + return String(p, p1); +} + +String Parser::SimpleType(Decla& d) +{ + if(Key(tk_struct) || Key(tk_class) || Key(tk_union) || Key(tk_enum) || Key(tk_typename)) { + if(lex.IsId() || lex == t_dblcolon) d.type = Name(); + if(lex == '{') EatBody(); + return Null; + } + if(Key(tk_bool) || Key(tk_float) || Key(tk_double) || Key(tk_void)) + return Null; + bool sgn = Key(tk_signed) || Key(tk_unsigned); + if(Key(tk_long)) { + Key(tk_long); + Key(tk_int) || Key(tk_double); + return Null; + } + if(Key(tk_short)) { + Key(tk_int); + return Null; + } + if(Key(tk_int) || Key(tk_char) || + Key(tk___int8) || Key(tk___int16) || Key(tk___int32) || Key(tk___int64)) return Null; + if(sgn) return Null; + const char *p = lex.Pos(); + bool cs = false; + Index cix; + if(Key(t_dblcolon)) + d.type << "::"; + Check(lex.IsId(), "Name expected"); + while(lex.IsId()) { + int q = FindIndex(context.tparam, lex[0]); + if(q >= 0) { + d.type << AsString(q); + ++lex; + break; + } + else { + d.type << lex.Id(); + if(cix.Find(lex) >= 0) + cs = true; + else + cix.Add(lex); + ++lex; + if(lex == '<') + d.type << TemplateParams(); + if(Key(t_dblcolon)) { + d.type << "::"; + if(Key('~')) + cs = true; + } + else + break; + } + } + return cs ? String(p, lex.Pos()) : String(); +} + +void Parser::Qualifier() +{ + Key(tk_const); + Key(tk_volatile); + if(Key(tk_throw)) { + while(lex != t_eof && !Key(')')) + ++lex; + } +} + +void Parser::Elipsis(Decl& d) +{ + Decl& q = d.param.Add(); + q.name = "..."; + CheckKey(')'); +} + +void Parser::ParamList(Decl& d) { + if(!Key(')')) + for(;;) { + if(Key(t_elipsis)) { + Elipsis(d); + break; + } + else + d.param.Add() = Declaration().Top(); + if(Key(t_elipsis)) { + Elipsis(d); + break; + } + if(Key(')')) break; + CheckKey(','); + } +} + +int Parser::RPtr() +{ + int n = 0; + int tlevel = 0; + for(;;) { + int t = lex[n]; + if(t == '*') return n + 1; + if(t == '<') { + tlevel++; + n++; + } + else + if(t == '>') { + tlevel--; + n++; + } + else + if(t == t_dblcolon || lex.IsId(n) || t == ',' && tlevel > 0) + n++; + else + return 0; + } +} + +void Parser::EatInitializers() +{ + if(Key(':')) + while(lex != '{' && lex != t_eof) + ++lex; +} + +void Parser::Declarator(Decl& d, const char *p) +{ + int n = RPtr(); + if(n) { + while(n--) lex.Get(); + Declarator(d, p); + d.isptr = true; + return; + } + if(Key('&')) { + Declarator(d, p); + return; + } + if(Key(tk_const)) { + Declarator(d, p); + return; + } + if(Key('(')) { + Declarator(d, p); + if(d.isptr) + d.nofn = true; + CheckKey(')'); + } +// if(lex == tk_operator) +// d.name = ReadOper(); +// else + if(lex.IsId() || lex == t_dblcolon || lex == tk_operator) { + d.name = Name(); + if(Key(':')) + if(!Key(t_integer)) + Name(); + } + if(Key('(')) { + if(inbody || (lex < 256 || lex == tk_true || lex == tk_false) + && lex != ')' && lex != t_dblcolon) { + int level = 0; + for(;;) { + if(lex == t_eof) break; + if(Key('(')) level++; + else + if(Key(')')) { + if(--level < 0) break; + } + else + ++lex; + } + return; + } + else { + d.function = !d.nofn; + ParamList(d); + p = lex.Pos(); + Qualifier(); + } + } + EatInitializers(); + while(Key('[')) { + int level = 1; + while(level && lex != t_eof) { + if(Key('[')) level++; + else + if(Key(']')) level--; + else + ++lex; + } + } + if(Key('=') || (inbody && lex == '(')) { + int level = 0; + for(;;) { + if(lex == t_eof || level == 0 && (lex == ',' || lex == ')' || lex == ';')) + break; + if(Key('(') || Key('{')) + level++; + else + if(Key(')') || Key('}')) + level--; + else + ++lex; + } + } +} + +Parser::Decl& Parser::Finish(Decl& d, const char *s) +{ + d.natural = String(s, lex.Pos()); + return d; +} + +Parser::Decl Parser::Type() { + Decl d; + const char *p = lex.Pos(); + Qualifier(); + SimpleType(d); + Declarator(d, p); + return Finish(d, p); +} + +bool Parser::IsParamList(int q) +{ + return true; +} + +Array Parser::Declaration(bool l0, bool more) +{ + Array r; + Decla d; + const char *p = lex.Pos(); + if(Key(tk_typedef)) { + r = Declaration(false, true); + for(int i = 0; i < r.GetCount(); i++) { + r[i].type_def = true; + r[i].natural = "typedef " + r[i].natural; + } + return r; + } + if(Key(tk_friend)) + d.isfriend = true; + for(;;) { + if(Key(tk_static)) + d.s_static = true; + else + if(Key(tk_extern)) + d.s_extern = true; + else + if(Key(tk_auto)) + d.s_auto = true; + else + if(Key(tk_register)) + d.s_register = true; + else + if(Key(tk_mutable)) + d.s_mutable = true; + else + if(Key(tk_explicit)) + d.s_explicit = true; + else + if(Key(tk_virtual)) + d.s_virtual = true; + else + if(!Key(tk_inline)) + break; + } + Qualifier(); + bool isdestructor = Key('~'); + if(l0 && context.typenames.Find(lex) >= 0 && lex[1] == '(' && lex.IsId()) { + Decl& a = r.Add(); + a.name = lex.GetId(); + a.isdestructor = isdestructor; + a.function = true; + a.istructor = true; + ++lex; + ParamList(a); + Qualifier(); + a.natural = String(p, lex.Pos()); + EatInitializers(); + return r; + } + if(lex == tk_operator) { + Decl& a = r.Add(); + (Decla&)a = d; + a.name = ReadOper(); + Key('('); + ParamList(a); + Qualifier(); + a.function = true; + a.natural = String(p, lex.Pos()); + return r; + } + String st = SimpleType(d); + if(!st.IsEmpty()) { + Decl& a = r.Add(); + a.name = st; + a.isdestructor = st.Find('~') > 0; + a.function = true; + a.istructor = true; + if(Key('(')) + ParamList(a); + Qualifier(); + a.natural = String(p, lex.Pos()); + EatInitializers(); + return r; + } + String natural1 = String(p, lex.Pos()); + do { + const char *p1 = lex.Pos(); + Decl& a = r.Add(); + (Decla&)a = d; + Declarator(a, p); + a.natural = natural1 + String(p1, lex.Pos()); + p = lex.Pos(); + } + while(more && Key(',')); + return r; +} + +void Parser::Locals(const String& type) +{ + Array d = Declaration(true, true); + for(int i = 0; i < d.GetCount(); i++) + local.Add(d[i].name, type); +} + +String Parser::Tparam(int& q) +{ + if(lex[q] != '<') + return Null; + const char *p = lex.Pos(q); + int level = 1; + q++; + while(lex[q] != t_eof && level) { + if(lex[q] == '<') + level++; + if(lex[q] == '>') + level--; + q++; + } + return String(p, lex.Pos(q)); +} + +String NoTemplatePars(const String& s) +{ + int q = s.Find('<'); + return q >= 0 ? s.Mid(0, q) : s; +} + +bool Parser::TryDecl() +{ + int q = 0; + while(lex[0] == tk_static || lex[0] == tk_const || lex[0] == tk_auto || + lex[0] == tk_register || lex[0] == tk_volatile) + ++lex; + int t = lex[q]; + if(t == tk_int || t == tk_bool || t == tk_float || t == tk_double || t == tk_void || + t == tk_long || t == tk_signed || t == tk_unsigned || t == tk_short || + t == tk_char || t == tk___int8 || t == tk___int16 || t == tk___int32 || t == tk___int64) { + while(lex[q] == '*' || lex[q] == '&') + q++; + if(!lex.IsId(q)) + return false; + Locals(Null); + return true; + } + String type; + if(lex[q] == t_dblcolon) { + type << "::"; + q++; + } + if(lex.IsId(q)) { + type << lex.Id(q++); + type << Tparam(q); + } + else + return false; + while(lex[q] == t_dblcolon) { + type << "::"; + if(lex.IsId(++q)) + type << lex.Id(q++); + else + return false; + type << Tparam(q); + } + while(lex[q] == '*' || lex[q] == '&') + q++; + if(!lex.IsId(q)) + return false; + type = Qualify(*base, current_nest, type); + if(base->Find(NoTemplatePars(type)) >= 0) { + Locals(type); + return true; + } + return false; +} + +void Parser::MatchPars() +{ + int level = 1; + while(level && lex != t_eof) { + if(Key('(')) level++; + else + if(Key(')')) level--; + else + ++lex; + } +} + +void Parser::Statement() +{ + RecursionCounter recursionCounter(currentScopeDepth, lex == '{' ? 0 : 1); + maxScopeDepth = max(maxScopeDepth, currentScopeDepth); + + if(Key(tk_case)) { + if(lex.IsId()) + ++lex; + Key(':'); + } + if(Key(tk_default)) + Key(':'); + if(lex.IsId() && lex[1] == ':') { + ++lex; + ++lex; + } + if(Key('{')) { + int l = local.GetCount(); + while(!Key('}')) { + if(lex == t_eof) + ThrowError(""); + Statement(); + } + local.Trim(l); + } + else + if(Key(tk_if)) { + int l = local.GetCount(); + Key('('); + TryDecl(); + MatchPars(); + Statement(); + if(Key(tk_else)) + Statement(); + local.Trim(l); + } + else + if(Key(tk_for)) { + int l = local.GetCount(); + Key('('); + TryDecl(); + MatchPars(); + Statement(); + local.Trim(l); + } + else + if(Key(tk_while)) { + int l = local.GetCount(); + Key('('); + TryDecl(); + MatchPars(); + Statement(); + local.Trim(l); + } + else + if(Key(tk_try)) + Statement(); + else + if(Key(tk_catch)) { + Key('('); + MatchPars(); + Statement(); + } + else + if(Key(tk_do)) { + Statement(); + Key(tk_while); + Key('('); + MatchPars(); + } + else + if(Key(tk_switch)) { + int l = local.GetCount(); + Key('('); + TryDecl(); + MatchPars(); + Statement(); + local.Trim(l); + } + else + if(TryDecl()) + Key(';'); + else + for(;;) { + if(lex == t_eof) + ThrowError(""); + if(Key(';') || lex == '{' || lex == '}' || lex >= tk_if && lex <= tk_do) + break; + ++lex; + } +} + +bool Parser::EatBody() +{ + if(lex != '{') return false; + lex.BeginBody(); + maxScopeDepth = currentScopeDepth = dobody ? 0 : 1; + if(dobody) { + inbody = true; + Statement(); + inbody = false; + local.Clear(); + } + else { + Key('{'); + int level = 1; + while(level && lex != t_eof) { + if(Key('{')) level++; + else + if(Key('}')) level--; + else + ++lex; + maxScopeDepth = max(level, maxScopeDepth); + } + } + lex.EndBody(); + return true; +} + +String CleanTp(const String& tp) +{ + int q = tp.Find('<'); + int w = tp.ReverseFind('>'); + if(q < 0 || w < 0) return tp; + String a = TrimLeft(TrimRight(tp.Mid(q + 1, w - q - 1))); + const char *s = a; + String r; + while(*s) { + if(*s == ',') { + r.Cat(';'); + s++; + while(*s && *s <= ' ') + s++; + } + else + r.Cat(*s++); + } + return r; +} + +void Parser::SetNestCurrent() +{ + current_nest = Nvl(context.nesting, "::"); +} + +CppItem& Parser::Item(const String& nesting, const String& item, const String& name, bool impl) +{ + current_nest = Nvl(nesting, "::"); + if(dobody) + current = CppItem(); + current_key = item; + CppNest& n = base->GetAdd(current_nest); + n.namespacel = current_namespacel = context.namespacel; + CppItem& im = dobody ? current : n.GetAdd(item, name); + im.key = item; + CppPos& p = im.pos.Add(); + p.file = filei; + p.line = line + 1; + p.impl = impl; + return im; +} + +CppItem& Parser::Item(const String& nesting, const String& item, const String& name) +{ + String h = Purify(item); + CppItem& im = Item(nesting, h, name, false); + im.natural = h; + return im; +} + +void Parser::Resume(int bl) +{ + for(;;) { + if(lex == t_eof || lex.GetBracesLevel() == bl && lex == ';') + break; + ++lex; + } +} + +void Parser::NestBody() +{ + int bl = lex.GetBracesLevel(); + while(!Key('}')) { + if(lex == t_eof) + ThrowError("Unexpected end of file"); + try { + Do(); + } + catch(Error) { + Resume(bl); + Key(';'); + } + } +} + +void TpSkip(CParser& p) +{ + int lvl = 0; + for(;;) { + if(lvl == 0 && (p.IsChar(',') || p.IsChar('>')) || p.IsEof()) + break; + if(p.Char('<')) + lvl++; + else + if(p.Char('>')) + lvl--; + else + p.SkipTerm(); + } +} + +String Subst(const String& s, const Vector& tpar) +{ + if(tpar.GetCount() == 0) + return s; + String r; + CParser p(s); + while(!p.IsEof()) { + if(p.IsId()) { + String id = p.ReadId(); + int q = FindIndex(tpar, id); + if(q >= 0) + r << AsString(q); + else + r << id; + } + else + r << p.GetChar(); + } + return r; +} + +bool Parser::Nest(const String& tp, const String& tn) { + if(Key(tk_namespace)) { + Check(lex.IsId(), "Expected name of namespace"); + String name = lex.GetId(); + if(Key('{')) { + Context cc; + cc <<= context; + context.nesting << "::" << name; + context.namespacel = context.nesting.GetLength(); + NestBody(); + context <<= cc; + } + Key(';'); + SetNestCurrent(); + return true; + } + if((lex == tk_class || lex == tk_struct || lex == tk_union) && lex[1] != '{') { + int t = lex.GetCode(); + context.typenames.FindAdd(lex); + Context cc; + cc <<= context; + CParser p(tp); + Vector tpar; + if(p.Char('<')) { + while(!p.IsEof() && !p.Char('>')) { + if((p.Id("class") || p.Id("typename") || p.Id("struct")) && p.IsId()) { + tpar.Add(p.ReadId()); + context.tparam.Add(lex.Id(tpar.Top())); + } + else + context.tparam.Add(0); + TpSkip(p); + p.Char(','); + } + } + if(Key(t_dblcolon)) + context.nesting = Null; + String name; + do { + Check(lex.IsId(), "Missing identifier"); + context.typenames.FindAdd(lex); + name = lex.GetId(); + context.nesting << "::" << name; + } + while(Key(t_dblcolon)); + context.access = t == tk_class ? PRIVATE : PUBLIC; + context.noclass = false; + String nn; + if(!tp.IsEmpty()) + nn = "template " + tp + " "; + String key = (t == tk_class ? "class" : t == tk_union ? "union" : "struct"); + nn << key << ' ' << name; + CppItem& im = Item(context.nesting, key, name, lex != ';'); + if(Key(';')) { + context = cc; + SetNestCurrent(); + return true; + } + im.kind = tp.IsEmpty() ? STRUCT : STRUCTTEMPLATE; + im.type = name; + im.access = cc.access; + im.tname = tn; + im.tparam = CleanTp(tp); + im.ptype.Clear(); + im.pname.Clear(); + im.param.Clear(); + if(Key(':')) { + nn << " : "; + bool c = false; + do { + String access = t == tk_class ? "private" : "public"; + if(Key(tk_public)) access = "public"; + else + if(Key(tk_protected)) access = "protected"; + else + if(Key(tk_private)) access = "private"; + if(Key(tk_virtual)) access << " virtual"; + String h; + String n = Name(h); + ScAdd(im.pname, h); + if(c) + im.ptype << ';'; + im.ptype << Subst(n, tpar); + ScAdd(im.param, access + ' ' + n); + if(c) + nn << ", "; + nn << access + ' ' + n; + c = true; + } + while(Key(',')); + } + if(Key('{')) { + NestBody(); + im.natural = nn; + im.decla = true; + } + else + if(IsNull(im.natural)) + im.natural = nn; + context = cc; + CheckKey(';'); + SetNestCurrent(); + return true; + } + return false; +} + +String DeTemp(const char *s) +{ + String r; + return r; +} + +CppItem& Parser::Fn(const Decl& d, const String& templ, bool body, int kind) +{ + String param; + String pname; + String ptype; + for(int i = 0; i < d.param.GetCount(); i++) { + const Decla& p = d.param[i]; + ScAdd(param, p.natural); + if(i) + ptype << ';'; + ptype << p.type; + ScAdd(pname, p.name); + } + String nn0; + String nm = d.name; + int q = d.name.ReverseFind(':'); + if(q >= 0) { + nm = d.name.Mid(q + 1); + if(q > 0) + nn0 = d.name.Mid(0, q - 1); + } + String item = FnItem(d.natural, pname, d.name, nm); + String nesting = context.nesting; + String nn; + const char *s = nn0; + int l = 0; + while(*s) { + if(*s == '<') + l++; + else + if(*s == '>') + l--; + else + if(l == 0) + nn.Cat(*s); + s++; + } + if(*nn == ':') + nesting = nn; + else + if(!IsNull(nn)) + nesting << "::" << nn; + CppItem& im = Item(nesting, item, nm, body); + if(!body || IsNull(im.natural)) { + im.natural.Clear(); + if(!IsNull(templ)) { + im.natural = templ; + im.at = im.natural.GetLength(); + } + im.natural << Purify(d.natural, d.name, nm); + im.kind = kind; + im.param = param; + im.pname = pname; + im.ptype = ptype; + im.access = context.access; + im.virt = d.s_virtual; + im.type = d.type; + im.decla = true; + LLOG("FnItem: " << nesting << "::" << item << ", natural: " << im.natural); + } + return im; +} + +void Parser::Do() +{ + LLOG("Do, nest: " << current_nest); + Line(); + if(Key(tk_using)) { + while(!Key(';') && lex != t_eof) + ++lex; + } + else + if(Key(tk_extern) && lex == t_string) { + ++lex; + ++lex; + if(Key('{')) { + int bl = lex.GetBracesLevel(); + while(lex != '}') + try { + if(lex == t_eof) + ThrowError("Unexpected end of file"); + Do(); + } + catch(Error) { + Resume(bl); + } + } + Key(';'); + } + else + if(Key(tk_template)) { + if(lex.IsId() || lex == tk_class && lex.IsId(1)) { + Key(tk_class); + for(;;) { + if(lex.IsId()) + lex.GetId(); + else + if(!Key(t_dblcolon)) + break; + } + TemplateParams(); + Key(';'); + } + else { + String tnames; + String tparam = TemplateParams(tnames); + if(!Nest(tparam, tnames)) { + Array r = Declaration(true, true); + CppItem *functionItem = 0; + bool body = lex == '{'; + for(int i = 0; i < r.GetCount(); i++) { + Decl& d = r[i]; + if(!d.isfriend && d.function) { + CppItem& m = Fn(d, "template " + tparam + ' ', body, + context.noclass ? FUNCTIONTEMPLATE : + d.s_static ? CLASSFUNCTIONTEMPLATE : + INSTANCEFUNCTIONTEMPLATE); + m.tname = tnames; + m.tparam = CleanTp(tparam); + functionItem = &m; + } + } + if(body && functionItem && whenFnEnd) { + symbolsOutsideFunctions.Merge( lex.FinishStatCollection() ); + lex.StartStatCollection(); // start collection of function symbols + } + EatBody(); + if(body && functionItem && whenFnEnd) { + whenFnEnd(FunctionStat(current_nest, *functionItem, + lex.FinishStatCollection(), maxScopeDepth)); + lex.StartStatCollection(); // start collection of orphan symbols + } + Key(';'); + } + EatBody(); + } + } + else + if(lex == tk_enum && (lex[1] == '{' || lex[2] == '{')) { + ++lex; + String name; + if(lex.IsId()) + name = lex.GetId(); + if(Key('{')) { + for(;;) { + Line(); + String val; + Check(lex.IsId(), "Expected identifier"); + String id = lex.GetId(); + CppItem& im = Item(context.nesting, id, id); + im.natural = "enum "; + if(!IsNull(name)) + im.natural << name << ' '; + im.natural << id; + if(Key('=')) + im.natural << " = " << Constant(); + im.kind = ENUM; + im.access = context.access; + Key(','); + if(Key('}')) break; + } + } + Key(';'); + SetNestCurrent(); + } + else + if(Key('#')) { + if(lex.Code() == t_string) { + String n = lex.GetText(); + String name; + const char *s = n; + while(*s && iscid(*s)) + name.Cat(*s++); + CppItem& im = Item(context.nesting, n, name); + im.kind = MACRO; + s = strchr(n, '('); + if(s) { + s++; + String p; + for(;;) { + if(iscid(*s)) + p.Cat(*s++); + else { + ScAdd(im.pname, p); + p.Clear(); + if(*s == ')' || *s == '\0') break; + s++; + } + } + } + im.access = context.access; + } + } + else + if(!Nest(String(), String())) { + if(Key(tk_public)) { + context.access = PUBLIC; + Key(':'); + } + else + if(Key(tk_private)) { + context.access = PRIVATE; + Key(':'); + } + else + if(Key(tk_protected)) { + context.access = PROTECTED; + Key(':'); + } + else { + Array r = Declaration(true, true); + CppItem *functionItem = 0; + bool body = lex == '{'; + for(int i = 0; i < r.GetCount(); i++) { + Decl& d = r[i]; + if(!d.isfriend || body) { + if(d.function) { + CppItem &im = + Fn(d, Null, body, d.istructor ? (d.isdestructor ? DESTRUCTOR : CONSTRUCTOR) : + d.isfriend ? INLINEFRIEND : + context.noclass ? FUNCTION : + d.s_static ? CLASSFUNCTION : INSTANCEFUNCTION); + functionItem = &im; + } + else { + String h = d.natural; + int q = h.Find('='); + if(q >= 0) + h = TrimRight(h.Mid(0, q)); + String nest = context.nesting; + if(d.type_def) + nest << "::" << d.name; + CppItem& im = Item(nest, d.type_def ? "typedef" : d.name, d.name); + im.natural = Purify(h); + im.type = im.ptype = d.type; + im.access = context.access; + im.kind = d.type_def ? TYPEDEF : + context.noclass ? VARIABLE : + d.s_static ? CLASSVARIABLE : INSTANCEVARIABLE; + } + } + } + if(body && functionItem && whenFnEnd) { + symbolsOutsideFunctions.Merge( lex.FinishStatCollection() ); + lex.StartStatCollection(); // start collection of function symbols + } + EatBody(); + if(body && functionItem && whenFnEnd) { + whenFnEnd(FunctionStat(current_nest, *functionItem, + lex.FinishStatCollection(), maxScopeDepth)); + lex.StartStatCollection(); // start collection of orphan symbols + } + SetNestCurrent(); + Key(';'); + } + } +} + +void Parser::Do(Stream& in, const Vector& ignore, CppBase& _base, const String& fn, + Callback2 _err, const Vector& typenames) +{ + LLOG("= C++ Parser ==================================== " << fn); + base = &_base; + file = PreProcess(in); + lex.Init(~file.text, ignore); + err = _err; + filei = GetCppFileIndex(fn); + lpos = 0; + line = 0; + if(whenFnEnd) + lex.StartStatCollection(); + + while(lex != t_eof) + try { + try { + current_nest = "::"; + context.access = PUBLIC; + context.noclass = true; + context.typenames.Clear(); + context.tparam.Clear(); + inbody = false; + for(int i = 0; i < typenames.GetCount(); i++) + context.typenames.Add(lex.Id(typenames[i])); + context.namespacel = 0; + Do(); + } + catch(Error) { + if(lex.IsBody()) { + LLOG("---- Recovery to next ';'"); + Resume(lex.GetBracesLevel()); + Key(';'); + } + else { + LLOG("---- Recovery to file level"); + ++lex; + lex.SkipToGrounding(); + lex.ClearBracesLevel(); + } + } + } + catch(Lex::Grounding) { + LLOG("---- Grounding to file level"); + lex.ClearBracesLevel(); + lex.ClearBody(); + } +} + +void Parse(Stream& s, const Vector& ignore, CppBase& base, const String& fn, + Callback2 _err) +{ + LTIMING("Parse"); + Parser p; + p.Do(s, ignore, base, fn, _err); +} + +END_UPP_NAMESPACE + +#endif \ No newline at end of file diff --git a/uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp b/uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp index e0b51f6fc..6f12448cb 100644 --- a/uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp +++ b/uppsrc/CtrlCore/src.tpp/Ctrl$en-us.tpp @@ -1,4 +1,5 @@ -topic "Ctrl";[2 $$0,0#00000000000000000000000000000000:Default] +topic "Ctrl"; +[2 $$0,0#00000000000000000000000000000000:Default] [l288;i1120;a17;O9;~~~.1408;2 $$1,0#10431211400427159095818037425705:param] [a83;*R6 $$2,5#31310162474203024125188417583966:caption] [b83;*4 $$3,5#07864147445237544204411237157677:title] diff --git a/uppsrc/CtrlLib/src.tpp/FileList$en-us.tpp b/uppsrc/CtrlLib/src.tpp/FileList$en-us.tpp index 22700504d..40a874a81 100644 --- a/uppsrc/CtrlLib/src.tpp/FileList$en-us.tpp +++ b/uppsrc/CtrlLib/src.tpp/FileList$en-us.tpp @@ -1,55 +1,317 @@ -TITLE("FileList") -COMPRESSED -120,156,237,188,249,83,99,73,150,38,250,175,96,221,51,101,153,53,57,249,98,205,140,202,236,105,171,55,61,221,99,245,166,172,199,172,179,103,230,135,124,153,29,100,4,145,137,85,100,68,24,16,85,93,239,217,107,99,23,32,144,64,18,18,18,66,151,69,72,108,90,208,138,16,210,101,21,8,45,23,73,32,132,132,144,208,138,246,21,173,87,247,190,43,1,17,16,25,145,91,213,204,179,103,214,10,179,208,197,175,251,241,227,199,143,159,243,125,238,14,159,223,169,251,55,255,230,214,7,183,254,242,214,15,124,62,249,79,13,79,234,95,62,109,249,226,243,198,123,247,30,124,90,127,231,254,167,191,251,47,255,245,87,159,254,242,215,239,125,116,239,253,170,148,219,152,148,187,31,223,190,251,224,254,221,219,247,238,124,132,253,119,251,238,237,59,247,239,220,189,119,251,193,157,95,221,123,112,247,238,131,91,159,60,122,90,223,220,252,197,231,79,239,60,120,240,105,181,209,157,15,238,252,229,157,143,239,223,185,253,241,189,7,247,30,220,190,251,241,131,59,88,219,59,183,110, -221,185,245,241,157,251,183,239,221,125,112,231,254,39,143,27,154,31,125,241,121,253,131,187,159,254,242,31,62,194,26,221,173,246,132,9,191,117,251,163,59,247,62,190,119,231,214,221,91,119,238,97,93,221,126,240,224,222,237,143,239,63,184,251,171,143,62,250,228,81,253,139,150,198,231,207,46,251,106,188,125,251,206,237,79,191,186,253,241,167,152,206,255,242,47,255,242,225,237,123,183,46,52,184,135,9,187,125,235,30,166,234,109,172,236,214,189,59,31,223,190,255,171,91,191,186,255,224,246,131,91,119,49,225,247,63,190,117,255,147,23,245,77,245,223,190,123,232,247,127,112,232,31,223,250,164,177,165,1,19,241,203,127,119,251,246,199,88,147,143,62,248,232,47,111,223,251,24,27,232,131,187,247,238,63,248,248,22,214,249,157,59,119,238,222,189,115,251,238,157,95,253,234,206,253,143,238,127,252,201,55,13,245,143,27,154,190,248,252,255,254,167,255,231,223,254,237,223,255,251,255,246,89,221,231,205,183,63,253,47,159,60,196,254,253,93,227,211,134,223,54,54,183,84,159,107, -86,253,228,203,234,227,223,60,127,250,242,219,103,213,23,95,214,125,254,111,111,221,250,247,183,110,125,249,229,175,223,187,245,225,173,15,239,220,191,255,126,221,229,4,92,189,169,251,167,215,207,191,190,85,119,37,244,122,133,79,174,87,121,45,232,197,203,175,158,54,62,122,155,164,186,215,58,124,241,139,47,62,111,190,243,105,221,229,215,175,127,221,248,109,253,215,13,159,220,185,115,239,214,47,176,113,222,106,239,88,109,235,105,107,109,237,40,32,173,216,167,32,103,198,198,64,177,95,131,163,107,206,187,122,152,166,210,214,89,66,232,23,184,79,59,39,57,211,89,225,26,151,115,146,236,102,151,135,188,221,158,142,168,65,193,100,12,173,186,151,180,212,182,131,92,43,129,122,72,208,173,83,109,35,222,128,123,197,177,186,190,122,30,62,25,139,56,130,7,32,186,95,26,179,152,193,112,240,208,217,157,47,73,236,203,203,165,173,172,58,172,222,46,5,129,140,11,9,6,103,102,90,103,46,62,178,153,50,21,45,202,243,173,166,61,236,35,210,117,120,0,76,187,213,238,74, -18,226,174,100,18,196,14,194,73,151,112,192,151,62,94,19,88,218,143,74,173,118,116,185,171,45,212,190,227,242,181,159,1,152,168,89,85,2,137,40,53,209,138,202,101,207,107,243,80,123,92,63,4,16,122,70,98,109,189,170,240,26,101,22,71,155,142,196,11,99,204,196,150,27,80,45,230,252,197,41,23,146,46,226,105,4,143,92,173,114,45,103,45,186,20,196,106,237,209,22,118,7,59,50,129,64,192,60,183,87,241,173,111,17,79,186,144,80,251,26,88,14,45,250,19,68,176,16,162,7,115,197,210,41,174,18,131,244,168,126,205,49,63,105,104,167,17,198,215,59,134,197,114,72,23,83,115,210,33,5,159,65,158,114,91,124,172,133,209,184,108,82,26,218,69,41,68,94,101,236,76,102,162,196,195,120,82,63,82,12,118,11,78,80,117,158,12,69,211,209,252,17,174,35,214,189,144,18,7,125,67,251,91,237,232,40,181,3,23,240,207,168,2,35,129,177,160,186,192,29,47,180,102,214,69,22,240,36,120,14,56,44,210,222,19,125,150,161,137,48,83,90,91,160,228,101, -24,66,37,130,124,53,11,169,17,87,133,11,78,251,35,174,179,130,50,164,88,138,245,31,21,203,65,74,121,214,155,58,159,1,203,185,232,249,193,161,43,225,56,65,202,201,88,184,146,80,157,91,131,73,145,160,159,7,1,81,16,205,24,228,101,106,151,26,5,169,21,87,42,57,181,225,63,235,157,239,57,24,224,173,182,103,194,172,188,92,46,223,240,26,42,97,24,209,164,161,50,105,104,123,227,32,202,69,139,165,114,128,74,50,218,149,67,253,121,209,222,198,4,224,118,198,20,125,28,203,0,193,84,8,107,131,16,97,169,103,96,224,132,206,151,194,135,22,81,220,159,56,21,109,139,102,188,40,44,209,81,79,86,112,235,163,120,101,41,232,238,77,184,200,206,3,186,62,147,82,153,144,117,16,57,23,228,207,149,39,169,238,200,84,98,30,142,251,102,54,53,106,226,188,213,214,222,142,50,44,189,231,157,139,86,9,151,114,228,40,174,216,43,92,185,221,157,159,192,155,75,132,49,26,107,171,84,84,162,172,144,114,102,177,11,54,56,182,149,37,30,48,28,62,2,32, -117,193,176,55,121,86,36,76,203,104,231,16,155,205,223,116,47,102,237,71,226,33,111,71,112,35,51,0,45,21,36,71,64,164,75,50,61,25,227,10,207,33,73,97,122,212,156,51,231,194,189,72,40,235,34,123,198,96,75,116,72,46,100,159,157,43,16,209,12,74,69,18,21,168,68,138,81,197,179,249,46,164,216,94,146,160,253,222,98,217,153,115,133,132,209,8,64,22,59,78,5,25,79,30,118,33,71,188,2,34,214,83,134,182,142,219,97,139,87,28,5,0,242,6,92,48,206,72,166,103,80,130,216,159,230,230,55,55,116,204,4,184,141,120,52,221,187,206,169,109,98,247,108,201,37,220,142,68,219,138,249,41,179,103,130,70,139,5,96,14,34,81,160,230,152,104,209,165,139,84,7,90,9,6,17,117,160,12,121,125,230,41,194,168,204,28,163,44,144,34,220,142,82,49,152,71,225,136,58,187,103,85,236,123,122,121,195,3,48,178,159,215,35,224,84,95,133,139,130,225,67,135,15,4,182,52,84,33,189,34,158,45,230,5,211,157,60,237,32,35,53,23,159,43,198,169, -253,106,111,60,119,196,154,29,8,231,216,142,179,138,206,238,15,169,148,156,148,159,140,20,231,19,74,125,22,82,226,36,10,252,200,218,40,153,57,44,212,120,241,51,109,71,211,8,223,190,158,58,5,4,21,22,180,2,85,50,92,37,109,73,146,69,32,32,167,174,116,57,211,9,212,222,239,157,31,215,168,129,210,16,162,93,203,140,14,201,100,21,177,116,24,191,62,6,128,37,19,132,196,5,52,56,72,92,149,142,155,23,187,240,227,100,252,25,45,147,80,169,114,83,122,251,226,169,217,117,34,48,172,163,200,216,62,190,221,34,235,26,212,118,249,211,130,197,182,229,53,247,178,123,110,219,66,3,179,135,172,194,104,116,62,239,95,167,185,134,20,243,157,122,109,190,59,85,4,29,29,216,18,141,135,80,138,158,140,40,226,226,29,244,136,81,168,204,238,116,153,56,51,219,123,80,200,144,153,36,200,33,7,45,177,190,52,182,134,224,33,235,42,2,209,246,240,244,25,234,190,110,123,204,90,202,116,162,113,35,9,66,51,42,0,206,1,129,112,200,194,5,224,0,138,208, -13,196,68,130,233,64,15,136,0,226,177,110,36,18,10,185,32,54,15,156,151,19,160,203,72,80,13,74,247,201,168,133,99,66,73,240,174,101,71,163,4,142,193,144,11,95,100,144,80,202,148,94,189,55,235,8,135,243,170,1,143,28,51,142,22,61,230,121,209,96,187,240,100,151,77,99,193,128,172,232,88,194,77,199,247,193,142,178,103,182,71,166,9,234,97,241,96,124,55,170,183,109,91,32,209,44,79,150,21,102,35,197,41,45,186,80,130,45,1,50,23,58,41,120,229,3,167,253,59,44,17,124,232,101,141,7,17,61,127,77,182,209,213,11,110,229,176,48,164,157,74,83,10,121,47,226,161,110,202,3,76,187,110,172,131,182,45,13,108,21,10,22,117,171,105,115,229,28,237,215,19,212,171,210,20,32,217,226,72,17,130,47,217,157,146,116,47,241,85,109,231,133,96,4,16,168,172,96,116,44,61,184,211,47,26,9,140,91,102,64,57,80,26,161,131,35,69,225,228,41,119,103,90,85,4,7,206,44,237,37,181,17,146,176,188,211,7,241,181,74,102,170,60,51,4,159, -56,2,101,110,96,114,175,23,47,25,19,32,69,181,110,128,34,3,58,74,29,48,153,160,6,84,187,110,20,166,184,56,137,157,73,168,95,168,214,110,18,138,60,147,22,129,182,16,53,157,45,110,63,247,149,55,70,172,69,221,65,18,45,250,142,99,22,38,136,219,140,154,10,115,243,86,144,139,248,135,251,136,5,17,45,156,130,146,232,232,222,58,8,178,72,51,211,189,142,144,39,112,10,204,207,90,217,104,144,129,82,228,81,225,201,102,94,200,83,58,50,208,225,4,126,186,164,12,238,173,193,149,158,248,220,0,114,212,83,130,51,209,17,84,147,152,43,135,220,176,91,19,244,33,190,68,174,167,19,152,196,249,188,40,91,52,61,74,143,204,2,69,149,165,20,132,33,4,9,35,131,132,64,86,177,79,162,171,78,129,41,251,132,113,157,19,34,30,162,250,9,22,10,35,101,184,232,38,58,43,52,45,160,245,64,109,83,25,32,232,221,38,226,18,123,162,50,14,203,129,73,11,232,27,132,129,182,45,123,47,1,53,23,100,49,192,112,102,204,150,77,162,66,172,127,99, -111,62,102,92,233,67,123,1,179,208,101,209,158,24,93,235,224,97,249,60,120,90,4,201,150,213,253,179,232,160,44,131,166,99,68,115,17,71,222,6,22,134,78,97,197,142,72,108,211,194,61,93,176,88,168,76,109,148,120,153,54,244,132,33,41,194,156,60,170,150,168,81,166,174,247,96,254,4,72,35,189,225,206,98,113,227,120,21,112,249,240,224,10,176,84,118,183,234,144,35,70,18,162,245,236,184,44,222,99,219,104,146,6,89,91,209,229,86,209,128,162,21,123,211,163,79,210,86,57,180,104,174,236,55,181,1,3,59,209,204,2,160,108,31,222,163,199,139,34,69,18,231,96,39,55,42,128,21,191,212,89,56,226,226,73,232,126,194,84,81,81,11,65,132,146,9,66,149,132,203,190,98,56,231,164,113,113,15,64,38,245,241,105,114,148,180,80,57,63,46,6,182,201,133,217,96,172,123,31,220,154,25,22,111,29,89,45,228,157,202,224,134,169,28,228,158,8,97,47,222,25,5,12,252,202,198,42,11,5,213,221,209,205,200,164,98,226,104,120,29,204,148,89,171,122,65, -28,208,72,156,89,136,112,2,101,53,6,137,170,216,214,169,216,207,192,1,151,8,6,42,174,9,151,120,39,233,14,28,187,29,140,132,74,186,18,157,223,240,225,211,56,130,16,93,233,89,236,115,57,123,248,37,46,236,93,211,91,217,184,118,69,72,16,95,131,35,99,252,67,179,34,29,20,239,103,6,43,150,168,34,116,8,180,105,215,136,172,132,72,127,72,26,166,239,47,59,251,1,91,212,230,21,211,86,226,20,204,61,142,182,17,104,141,228,181,66,156,211,142,142,162,90,205,61,179,207,96,29,44,48,105,32,126,49,80,96,39,196,193,197,104,180,13,212,185,79,32,133,123,108,241,84,91,16,207,76,38,121,5,194,156,38,220,22,90,62,193,85,74,135,241,148,65,21,65,20,11,40,87,174,86,50,53,157,139,168,175,219,63,150,94,66,57,243,250,200,57,52,62,54,12,123,139,61,231,219,11,40,66,78,198,121,22,138,122,183,111,234,64,48,156,234,9,239,235,104,157,37,88,188,176,91,65,123,177,121,221,77,108,130,145,36,148,194,107,121,56,82,132,48,88,17, -47,208,51,105,90,106,120,215,4,91,40,237,8,125,110,94,139,42,36,43,10,46,63,103,100,130,163,185,130,220,115,60,49,15,162,253,59,150,33,182,134,161,218,31,208,106,2,165,224,9,164,83,196,123,12,96,168,11,0,251,231,147,83,148,44,203,180,137,56,74,193,244,158,34,55,215,199,101,161,178,99,42,42,70,243,83,19,62,194,216,76,22,53,71,204,147,138,224,2,202,158,72,198,24,234,100,251,30,219,9,34,20,233,164,46,218,161,140,138,37,254,88,40,59,157,55,146,123,214,245,10,63,2,73,217,220,195,65,211,25,229,24,76,108,183,15,187,208,64,122,127,243,168,66,117,47,7,17,41,36,93,5,79,1,233,201,94,188,104,216,232,72,166,23,134,178,184,52,78,178,211,77,178,44,181,138,20,221,23,110,72,235,193,220,112,21,11,217,142,42,120,243,181,23,86,131,145,113,161,179,149,126,114,220,10,3,188,83,56,143,142,14,117,129,190,118,102,44,148,1,139,25,92,37,141,202,186,3,64,170,91,54,50,65,192,171,168,124,19,103,180,92,70,248,97,193, -50,25,145,91,226,254,25,46,202,53,172,211,163,168,149,137,228,166,12,168,54,5,169,183,100,123,165,129,109,176,139,146,230,7,64,90,104,110,155,198,241,24,3,187,60,214,148,125,202,162,49,22,7,103,143,104,97,45,170,61,183,211,231,71,147,80,135,30,237,87,46,119,113,230,120,199,0,80,224,246,20,208,4,193,143,246,119,23,185,134,14,35,106,183,168,142,182,109,137,248,10,47,203,29,39,13,7,229,100,221,201,30,93,201,162,193,49,233,33,107,16,68,86,178,120,200,207,211,112,247,188,115,100,98,123,122,25,57,171,108,164,219,224,76,186,115,50,62,113,170,104,239,230,68,204,44,74,116,47,58,171,158,69,151,73,131,54,157,212,179,236,84,31,49,218,35,184,72,82,202,96,36,226,193,140,91,78,23,133,112,116,121,162,167,100,94,237,39,45,36,216,193,179,29,238,114,15,159,199,159,221,4,59,36,21,4,78,251,180,131,113,143,119,103,90,180,116,42,38,149,151,83,1,163,155,179,215,110,176,134,152,90,84,202,246,149,184,249,101,246,132,167,160,140,13,201, -199,247,248,165,51,40,226,233,156,94,214,36,33,255,28,191,123,178,196,157,33,39,180,254,232,98,239,110,202,137,235,33,132,84,219,58,167,165,40,70,57,231,132,53,154,60,176,96,94,82,22,131,27,162,29,194,169,129,227,119,197,204,203,78,207,144,129,15,122,221,150,64,27,154,234,155,103,68,142,16,173,196,33,153,62,246,26,65,148,92,129,82,16,143,56,64,79,204,157,67,169,196,252,41,208,97,2,55,10,7,8,146,63,236,197,35,50,18,162,80,16,224,204,216,78,60,127,102,154,74,181,33,124,78,251,240,97,72,206,28,70,232,156,245,228,169,25,220,218,30,222,102,86,200,41,251,0,152,100,171,117,170,109,14,92,30,34,46,238,225,241,57,49,98,7,25,211,204,165,146,218,135,50,150,217,152,13,82,219,96,145,100,92,154,53,219,136,96,119,74,57,182,195,65,193,246,34,97,33,159,135,146,73,91,209,175,129,196,6,33,97,153,23,228,218,248,209,152,143,204,246,68,151,9,144,3,156,39,147,80,212,76,72,110,194,78,147,98,120,72,28,88,177,40,151,135, -124,232,110,116,192,0,103,22,187,58,41,160,171,232,91,225,104,52,99,100,165,239,192,86,18,151,200,85,79,12,14,97,193,72,49,224,118,1,116,166,183,104,40,24,185,105,28,179,159,205,113,39,219,124,216,228,138,41,210,193,17,126,171,158,63,221,138,249,103,187,165,75,137,193,149,36,134,45,204,110,44,232,42,90,139,61,152,143,23,65,103,146,75,112,17,141,196,52,122,32,235,78,99,241,184,40,4,157,123,65,4,130,115,73,68,239,39,195,128,55,210,22,150,109,251,209,49,31,219,161,61,114,43,5,30,43,29,37,83,188,187,21,4,18,118,108,251,229,40,243,152,208,78,49,67,218,204,40,156,166,3,74,101,116,94,2,37,11,104,32,34,0,145,232,81,81,188,122,156,47,102,130,11,27,125,202,165,179,21,174,7,118,49,252,216,82,133,6,43,73,142,236,108,194,119,58,163,54,193,71,162,78,243,116,26,229,108,159,15,81,195,176,133,204,109,221,73,208,28,59,147,40,20,69,172,30,224,116,97,135,229,102,17,19,189,212,101,81,182,135,174,222,130,39,226,27, -172,193,147,117,12,28,38,43,17,202,64,70,32,75,209,44,158,189,36,180,19,139,216,41,210,245,137,67,24,200,13,27,246,6,150,114,39,2,190,4,23,50,99,222,68,228,26,209,73,74,36,55,69,148,199,243,253,54,243,248,104,80,144,210,245,147,227,196,98,36,44,219,81,23,193,216,244,44,3,13,240,103,88,115,122,123,107,90,78,26,59,152,61,67,123,122,209,190,74,144,89,10,22,160,5,106,132,131,165,45,55,0,211,128,156,153,132,204,162,65,187,184,16,4,17,216,207,69,17,226,73,152,30,2,193,82,246,108,4,212,16,81,192,116,140,207,40,242,122,2,29,132,236,102,185,58,122,52,91,73,159,160,230,229,25,251,241,168,227,0,91,128,158,153,101,159,63,186,111,39,112,89,188,20,215,128,210,57,72,20,44,97,124,135,236,2,136,37,154,39,177,61,174,62,37,195,218,94,197,180,155,183,194,10,149,205,184,93,193,192,252,58,56,187,111,5,201,164,34,74,162,69,167,44,82,45,126,210,234,9,166,247,233,121,99,26,212,243,227,46,162,108,148,137,198,153, -40,121,30,191,75,21,110,32,80,140,151,82,56,34,71,241,74,134,129,90,115,146,24,189,34,156,166,48,208,238,212,48,115,207,107,229,175,131,242,147,83,28,12,120,236,116,231,168,189,104,229,158,162,166,160,60,162,116,179,42,212,204,124,138,59,67,101,175,113,170,142,181,166,152,198,126,34,119,114,240,36,12,28,11,145,232,128,25,123,198,30,7,45,168,184,230,113,81,61,223,182,13,166,166,70,86,85,227,40,23,79,33,211,227,113,171,231,60,217,77,153,174,144,233,248,200,100,213,235,90,209,236,202,154,9,101,14,47,10,5,164,165,249,10,73,239,23,96,190,230,137,182,203,143,210,69,28,77,96,97,21,108,218,19,123,134,198,44,200,73,242,209,140,21,151,17,154,65,57,51,229,63,6,108,203,187,112,158,62,164,242,74,247,246,65,229,97,122,117,213,167,89,95,110,221,37,45,121,198,22,188,36,204,47,77,67,6,134,82,81,97,204,219,148,18,103,190,211,114,82,154,177,9,50,137,195,9,156,32,131,151,149,22,138,184,220,116,116,27,72,116,81,42,232,20,177, -27,93,63,209,172,91,150,173,190,193,174,45,162,120,120,224,144,152,155,58,85,174,248,153,11,122,84,65,9,185,36,254,54,52,108,26,80,36,130,2,127,34,63,82,176,226,214,225,76,155,102,6,62,103,45,172,149,75,253,43,237,146,17,207,216,232,46,97,98,105,18,68,241,217,76,56,157,63,91,233,0,137,34,228,200,176,172,63,80,104,66,60,39,98,142,245,184,43,27,133,19,15,205,203,84,75,164,99,71,43,40,201,118,166,203,9,117,155,233,133,104,182,130,40,246,12,116,48,179,65,99,200,195,58,41,207,48,16,247,172,73,236,26,59,16,179,231,215,9,8,191,56,74,91,20,142,120,3,59,106,202,250,225,169,115,152,45,23,217,39,81,70,162,82,17,137,209,176,119,127,224,188,149,162,23,238,75,101,28,86,191,102,52,236,231,26,212,33,218,244,160,25,237,27,75,71,227,107,243,125,50,253,49,184,85,34,250,163,110,96,66,224,221,59,21,58,23,103,71,119,35,129,206,21,88,60,193,60,70,195,202,69,61,72,118,76,167,86,180,46,40,102,237,156,63,6, -149,195,46,31,218,29,218,24,243,3,220,221,237,115,70,124,11,77,130,147,212,210,232,216,162,114,80,166,47,5,143,75,235,123,199,34,89,152,23,148,185,201,240,249,10,11,213,210,201,180,94,59,180,155,141,73,140,170,53,137,188,164,238,27,0,81,125,255,9,35,213,10,73,143,188,139,131,12,229,160,27,176,120,17,58,101,209,59,97,91,157,236,182,143,16,65,137,101,32,169,246,157,47,64,180,125,126,2,57,98,163,99,99,185,164,116,138,23,143,180,129,146,125,138,203,100,47,76,197,251,173,220,160,147,71,156,216,172,232,100,125,39,199,91,3,113,173,211,25,153,138,119,44,29,38,245,80,170,76,243,110,245,237,15,117,69,142,86,252,106,19,107,106,40,184,184,129,96,81,138,85,73,0,56,5,134,30,45,153,209,8,83,70,64,247,109,40,113,114,13,91,199,109,197,141,77,123,71,239,236,113,43,125,243,184,21,141,14,116,114,178,85,111,118,3,60,95,106,64,47,64,67,252,220,74,242,232,48,177,219,229,17,168,211,135,61,35,199,177,88,63,108,193,34,233,161, -117,36,7,105,87,78,181,128,178,3,205,174,21,201,46,23,30,241,14,80,225,193,14,242,137,205,98,57,28,13,110,177,21,69,117,20,166,33,10,113,25,77,161,41,119,27,22,128,51,227,109,138,98,217,181,197,95,57,5,148,83,88,74,20,133,172,154,46,132,206,99,18,115,58,191,4,62,215,76,123,161,56,144,141,36,182,86,232,104,95,132,193,17,30,44,168,194,71,240,208,80,28,16,139,66,35,113,145,198,31,9,59,56,17,235,134,78,141,34,193,97,218,161,244,12,54,239,81,79,92,27,243,97,215,220,90,69,220,31,76,105,251,189,89,227,38,88,84,173,109,131,49,187,117,179,179,88,14,110,179,122,70,245,74,142,82,187,239,19,244,84,208,126,71,57,104,88,152,225,230,0,171,185,34,30,68,123,54,71,183,116,194,99,5,89,76,220,63,114,31,120,161,53,197,108,145,144,170,88,250,15,12,157,219,67,78,13,234,157,208,173,109,117,170,80,68,149,148,155,233,71,217,162,176,147,211,134,241,111,187,126,154,23,233,61,179,83,82,189,49,31,53,191,47,67,15, -225,78,241,208,14,171,157,206,209,232,115,62,123,162,47,124,14,0,206,141,129,172,29,37,197,128,182,174,97,219,184,184,151,202,218,108,157,244,22,184,162,3,154,9,78,90,246,183,29,115,69,238,206,88,132,24,195,82,127,88,231,52,13,163,125,4,50,173,63,118,54,149,107,227,24,150,123,203,211,86,199,124,107,153,27,12,143,70,43,136,58,4,172,164,78,203,254,115,129,64,194,89,247,176,177,192,29,176,28,28,192,150,168,112,123,184,139,133,159,54,147,19,102,123,18,92,27,177,158,87,184,163,167,125,90,103,143,103,195,156,93,78,120,84,93,75,147,168,186,207,185,96,2,99,56,2,156,159,42,4,179,234,51,132,158,22,133,4,212,28,228,155,134,197,84,102,165,18,68,124,107,198,136,126,1,103,233,145,103,70,54,65,151,211,225,75,187,89,27,211,116,83,134,230,114,13,172,118,160,241,124,23,6,10,22,247,96,106,116,153,110,218,192,241,166,139,19,116,241,102,72,56,136,10,20,40,52,52,239,236,135,186,9,99,10,216,48,189,100,106,69,187,61,139,128,150, -94,65,233,21,1,106,246,109,17,16,133,29,239,168,69,114,129,153,221,211,182,67,143,106,59,93,51,91,100,247,113,59,87,39,86,86,214,237,4,16,99,193,156,36,89,223,221,235,41,136,39,251,3,224,116,132,50,51,48,84,10,12,46,7,187,205,20,1,213,198,50,41,253,250,8,210,59,2,77,160,229,25,40,57,94,6,193,94,5,122,220,138,193,219,238,99,12,219,163,105,196,141,143,183,181,249,136,169,182,121,88,44,221,20,88,133,118,173,96,160,192,197,187,137,0,175,109,53,219,230,211,87,65,3,22,193,61,85,208,176,100,73,236,109,143,227,24,35,242,163,28,115,105,35,214,14,3,97,62,6,36,52,30,32,86,50,116,29,182,163,199,1,192,135,185,189,1,33,211,153,35,138,96,175,49,52,173,37,161,20,212,81,201,119,122,115,209,2,105,24,28,34,39,34,80,154,25,158,195,152,129,123,42,109,40,22,15,32,80,92,226,173,130,114,92,153,107,91,140,209,42,228,62,147,81,11,245,164,226,109,102,80,207,150,193,64,113,148,222,134,178,134,81,203,232,212, -129,207,133,131,146,155,59,182,208,38,74,41,247,157,35,179,221,97,74,55,74,157,118,242,135,145,65,192,36,144,27,99,69,80,145,231,20,29,139,37,161,211,78,53,14,40,253,182,176,133,14,70,60,189,225,240,250,232,80,7,121,211,74,32,128,177,9,14,181,178,230,41,25,157,145,182,9,53,23,6,196,246,180,108,74,193,8,154,161,148,217,187,49,187,13,118,140,6,211,4,157,205,183,189,38,52,38,68,233,50,164,69,247,187,75,233,20,151,56,48,56,48,203,70,185,75,113,253,88,88,195,76,99,158,56,140,209,166,214,115,87,44,31,41,34,181,212,104,195,13,153,64,242,162,155,139,210,15,143,66,128,127,114,53,9,25,43,69,43,184,37,183,9,199,204,39,103,82,73,16,144,235,78,49,116,67,155,45,4,167,101,103,136,118,30,158,206,56,219,135,198,139,8,221,125,172,153,176,174,27,138,227,96,7,222,28,227,193,250,32,97,4,212,101,51,142,96,98,173,119,215,199,24,93,61,28,72,66,253,86,5,1,196,21,36,198,17,222,41,219,188,57,216,106,59,233, -30,246,161,62,165,70,37,165,202,201,251,3,106,186,55,126,196,58,154,205,8,108,149,217,93,112,141,192,140,166,209,96,96,159,180,76,56,79,170,97,0,47,21,6,179,82,183,9,180,42,53,165,152,108,163,43,5,37,214,87,141,197,116,15,202,111,197,248,122,199,80,45,10,30,183,14,213,162,32,126,188,82,139,130,109,171,238,236,77,60,137,175,102,119,7,164,138,206,128,81,143,172,119,121,17,43,155,137,1,242,182,29,155,141,142,241,167,36,198,159,40,231,80,100,176,34,160,231,97,141,140,153,63,44,159,56,215,19,108,59,111,180,51,128,76,208,252,120,73,110,89,236,238,154,214,231,6,144,253,246,126,100,190,124,236,14,29,1,130,51,0,0,11,10,40,4,64,172,202,146,110,5,84,166,37,171,126,217,241,122,218,37,88,2,201,218,53,41,13,145,116,194,68,178,154,125,40,57,161,45,210,207,119,98,19,195,91,168,5,240,100,23,40,90,163,26,80,180,219,199,144,104,8,195,99,114,240,92,57,70,68,138,90,54,122,162,174,36,59,212,193,156,18,203,255,25, -189,214,198,217,57,52,103,245,84,70,239,225,174,55,73,62,92,4,249,235,109,204,197,148,223,140,193,176,227,213,246,12,37,128,241,30,187,135,153,48,99,244,188,224,235,144,110,116,40,121,163,58,10,209,54,69,211,182,158,167,80,161,100,225,208,13,184,16,36,168,82,103,115,182,115,162,112,118,94,99,150,79,231,117,184,184,24,206,80,195,115,198,161,138,120,145,163,183,91,108,243,103,193,252,144,74,42,84,179,3,129,37,238,148,56,88,217,84,237,157,249,112,251,73,40,227,117,151,87,132,14,81,190,8,143,69,54,29,91,71,49,118,36,197,226,69,114,210,66,208,61,81,177,141,138,228,107,188,172,14,7,100,152,17,128,78,199,79,119,136,134,7,71,189,58,164,212,221,89,228,118,170,73,126,181,213,30,228,241,115,152,241,181,83,167,192,129,93,54,198,178,197,142,206,142,57,6,70,172,99,154,42,85,77,162,198,185,83,21,1,237,94,233,239,90,155,88,62,235,118,46,109,68,45,167,64,247,180,218,214,177,128,198,141,1,209,26,120,172,19,22,130,9,176,140,158, -21,19,72,100,43,81,70,203,68,8,13,18,245,2,164,178,5,128,69,212,69,3,144,16,222,85,174,20,33,16,213,1,9,52,121,136,150,139,114,20,68,66,7,46,36,157,200,131,104,12,64,11,142,178,208,19,79,108,111,138,214,51,98,170,153,202,4,32,201,246,140,189,59,120,52,70,130,73,158,172,29,91,87,152,15,102,6,195,12,17,35,179,182,120,114,76,153,86,115,8,195,38,6,184,181,12,91,2,242,49,84,223,55,178,184,23,141,44,170,82,34,40,202,57,31,3,181,118,54,201,175,163,219,91,199,237,125,78,60,200,30,51,199,245,35,33,221,220,73,217,78,216,54,238,244,150,105,162,233,145,153,209,5,94,228,96,31,236,223,88,65,216,236,82,140,101,156,24,200,240,150,85,59,7,73,175,12,203,229,11,248,221,114,176,21,164,168,169,147,199,185,83,192,45,129,176,252,158,75,65,123,123,196,29,253,105,251,78,23,198,241,171,20,159,237,172,122,63,26,101,15,92,0,90,192,125,17,24,11,24,232,45,186,92,169,163,129,188,51,138,2,228,137,182,174,218, -14,65,210,177,209,175,103,112,164,220,72,36,47,24,98,225,58,69,179,22,117,190,163,253,124,180,175,146,201,100,218,232,46,210,74,145,195,85,247,76,23,221,154,32,157,239,52,106,251,168,229,105,212,59,152,222,178,43,67,131,134,243,53,227,192,132,37,32,181,204,104,132,195,174,45,171,128,63,25,98,199,132,185,181,221,34,23,203,233,62,41,167,35,194,135,21,125,189,133,160,57,173,88,88,39,118,23,55,120,217,240,136,205,192,50,195,35,157,20,138,129,115,54,146,147,117,59,203,201,116,23,247,208,185,40,63,89,96,76,87,198,50,129,120,199,193,26,154,11,88,212,30,51,203,190,155,43,204,121,100,192,50,203,137,176,18,43,110,226,166,213,101,16,115,13,145,197,227,141,101,69,97,104,185,245,120,126,191,157,191,27,25,20,13,0,231,116,253,90,103,9,177,176,98,198,110,49,67,17,39,219,15,100,48,138,133,233,200,86,121,89,47,99,227,251,121,93,113,237,153,101,181,195,194,146,206,113,245,42,118,55,218,195,192,129,253,196,178,49,146,29,59,225,44,165,245, -158,35,213,40,57,107,241,14,114,66,51,103,11,75,72,38,47,65,172,177,185,180,17,226,83,172,35,46,251,81,31,212,173,84,251,21,54,164,93,130,234,245,22,217,114,126,144,129,204,198,50,228,50,55,118,88,98,246,157,112,124,201,144,183,127,157,179,97,107,159,178,157,121,135,9,142,84,160,144,76,81,197,161,195,131,60,192,63,158,29,215,249,70,120,14,216,178,154,129,124,200,50,139,34,225,37,161,74,100,15,22,251,252,22,39,22,120,185,142,83,0,183,142,162,138,67,78,172,148,88,173,186,225,41,144,235,232,237,34,156,42,162,142,252,212,17,50,187,197,151,80,93,78,109,176,117,114,62,141,57,237,58,205,207,179,12,248,118,4,73,136,31,219,210,38,21,243,185,224,185,222,69,115,6,150,121,90,245,226,104,14,97,143,71,84,11,140,74,167,24,57,45,7,61,101,90,191,200,54,213,73,237,48,207,133,82,126,235,241,121,169,127,75,35,144,161,156,233,76,8,153,118,180,107,117,126,171,81,119,56,61,204,145,40,231,183,65,121,59,208,77,110,157,100,107,34, -102,218,209,176,70,186,189,158,231,110,137,198,142,73,27,156,240,22,115,120,151,157,182,198,100,198,0,192,55,78,123,241,169,178,219,125,228,221,155,218,20,232,39,131,7,132,161,226,70,13,161,146,46,220,243,138,111,185,201,0,111,168,67,44,86,216,114,220,182,42,32,69,33,235,56,114,132,22,81,59,216,173,115,165,4,86,18,46,62,213,138,150,2,110,0,69,197,164,98,42,75,159,193,157,67,39,122,153,119,98,21,36,6,237,62,16,24,27,30,131,137,153,92,91,117,227,42,77,237,199,120,25,12,200,248,182,35,176,76,149,246,81,119,19,150,174,12,221,80,228,246,174,29,185,58,41,28,221,86,124,172,120,168,147,77,140,75,6,186,210,86,212,142,115,146,103,185,39,65,93,52,1,156,118,225,187,214,193,67,49,11,21,158,204,17,45,133,72,82,146,157,233,94,52,151,22,196,168,111,244,20,159,86,59,180,179,179,20,52,163,242,205,79,102,103,148,101,174,71,37,92,212,72,237,91,230,253,232,198,33,23,195,34,109,7,202,30,47,180,57,46,243,170,184,66,233, -26,223,104,44,144,231,73,43,229,252,225,194,104,16,149,200,55,214,108,235,147,130,145,210,230,192,10,79,123,100,89,0,103,101,158,149,236,230,218,57,87,25,177,174,160,140,165,49,92,10,153,14,119,176,246,215,51,237,98,95,62,66,146,68,214,28,50,155,154,38,211,163,69,231,222,186,198,71,143,149,32,176,122,74,16,28,103,117,161,253,187,227,98,126,223,176,119,233,128,218,203,59,93,103,10,121,83,198,126,111,250,204,50,158,11,56,244,189,251,91,17,28,154,238,219,246,163,108,154,128,103,157,37,241,216,109,222,50,87,150,168,158,191,229,117,187,42,68,161,35,209,10,251,92,215,162,129,34,176,242,249,83,6,159,134,147,154,0,76,254,244,44,156,9,96,54,66,141,203,211,231,86,15,179,53,9,205,137,97,178,139,188,69,245,117,108,49,169,39,137,193,88,27,172,96,6,16,193,153,42,234,221,167,21,185,212,3,82,44,146,153,216,67,64,8,94,211,48,89,33,217,88,38,223,129,97,0,91,222,152,90,30,202,90,99,83,105,137,228,200,7,87,0,98,143,220, -130,155,117,118,132,206,204,3,189,222,86,161,158,82,60,91,57,48,245,240,188,24,245,93,156,216,234,161,154,56,188,224,105,154,63,134,128,115,171,115,24,22,176,17,101,199,244,74,134,57,177,23,9,242,143,49,99,6,179,65,170,39,24,148,147,35,204,81,27,192,68,125,83,204,242,153,84,204,7,92,157,103,232,36,186,115,68,207,250,160,84,183,45,54,195,242,12,87,81,35,44,30,148,138,112,178,17,1,51,135,175,209,31,43,123,245,98,35,169,227,98,219,116,117,133,67,139,122,129,145,110,200,218,113,142,38,212,173,8,179,3,231,45,229,167,152,213,4,133,97,131,185,81,6,106,118,232,226,249,33,206,249,217,32,106,97,119,109,85,50,126,205,122,223,94,59,19,237,183,40,178,221,100,250,166,106,57,154,196,57,90,131,65,24,216,155,72,216,240,7,164,190,80,9,227,45,203,35,163,19,139,131,187,195,147,22,176,171,35,62,177,207,152,154,75,196,90,187,212,178,237,128,18,237,12,211,41,25,72,61,151,143,193,253,93,217,92,116,3,183,108,14,15,204,168,215, -100,52,38,42,9,117,79,122,240,75,59,90,33,29,157,75,12,89,71,145,253,76,18,6,232,78,53,131,168,20,33,179,250,36,127,115,89,179,7,112,141,129,8,231,156,105,112,216,125,102,48,99,241,165,44,154,149,121,231,220,148,82,150,229,156,119,31,28,43,252,104,112,112,82,215,175,102,165,112,146,19,134,89,137,22,130,177,201,254,46,216,186,62,187,229,29,204,154,180,26,161,29,197,198,138,101,99,175,111,181,39,159,208,154,226,217,112,156,185,129,146,115,228,141,132,217,13,22,117,248,221,152,91,11,156,154,52,235,94,216,164,5,187,178,122,28,2,133,218,199,50,40,99,76,57,96,152,140,247,161,200,202,230,38,56,70,94,20,46,153,132,40,124,20,88,49,78,2,195,8,93,79,134,152,126,192,99,159,232,159,241,133,173,6,111,6,181,5,242,186,8,111,86,154,26,197,162,14,138,76,207,110,42,182,38,54,150,226,30,165,186,223,18,150,105,39,75,104,255,230,66,73,116,54,51,196,53,182,41,240,162,110,78,160,39,228,202,225,247,143,21,104,112,100,158,183, -53,74,198,122,236,38,231,180,174,109,169,177,243,108,174,19,197,89,118,229,93,173,6,56,19,100,236,171,44,33,4,178,82,150,193,72,102,148,23,26,129,92,198,204,104,57,226,183,140,142,51,140,128,43,106,88,159,245,17,67,3,63,188,223,152,174,185,201,56,60,159,72,228,229,135,201,229,240,82,95,23,138,110,179,20,74,92,55,5,40,14,238,24,206,219,176,176,102,32,129,22,165,119,135,39,34,41,19,19,61,73,136,75,219,247,2,17,205,74,143,42,5,239,151,105,164,114,79,159,129,71,218,178,3,154,212,144,149,48,51,95,49,145,231,151,138,182,204,228,170,224,168,115,0,35,194,35,72,101,165,253,80,161,31,102,208,237,171,219,112,154,6,91,78,218,99,238,77,195,244,152,48,9,141,230,242,112,121,238,140,225,96,109,57,13,104,107,108,207,204,4,19,253,235,249,77,75,116,143,25,238,89,102,157,219,233,139,49,122,14,178,196,215,183,82,108,204,95,22,48,242,61,53,102,95,29,1,58,244,89,63,47,72,108,47,6,231,206,250,244,58,2,147,190,233,147, -111,118,59,165,153,60,171,146,219,216,52,173,118,116,31,33,195,179,142,153,197,253,126,47,243,156,83,177,16,118,237,167,80,72,65,31,53,186,216,94,221,224,230,144,84,71,162,246,206,119,111,58,253,126,100,86,45,97,14,171,103,241,54,28,147,14,2,107,116,235,172,204,168,97,142,217,48,62,219,54,144,166,26,5,233,18,74,113,136,207,182,230,23,109,54,3,165,95,101,0,183,74,202,238,125,164,18,52,174,116,171,206,150,112,24,242,9,187,206,33,159,63,116,112,66,134,203,80,12,158,245,72,34,219,249,221,5,249,134,195,239,66,211,218,46,152,153,153,206,13,28,77,225,229,134,145,245,12,93,178,213,182,226,60,158,223,241,26,1,189,75,94,65,50,102,11,39,26,79,171,198,230,228,12,16,159,233,219,84,244,13,79,108,39,122,250,11,50,79,134,50,139,178,35,14,19,109,173,119,105,211,58,225,19,184,166,119,140,244,201,60,62,107,116,24,55,189,166,98,217,221,215,189,56,103,94,89,60,90,240,196,15,198,89,104,103,121,188,192,8,14,238,142,166,246,6, -206,151,208,147,234,196,159,142,176,208,156,16,242,14,183,85,119,149,55,236,147,23,219,44,199,147,23,219,44,248,18,150,196,250,10,65,90,170,118,106,30,157,231,212,78,205,21,243,238,78,253,112,190,187,45,196,175,158,190,56,43,22,166,8,42,4,141,151,248,108,111,29,36,135,198,230,84,170,226,201,137,158,52,26,212,229,79,7,0,165,55,11,114,34,252,1,172,254,186,11,85,165,203,154,206,242,110,201,81,61,54,39,140,140,140,203,229,242,195,137,101,198,24,234,61,182,98,254,121,60,35,71,124,136,22,69,78,244,228,66,208,99,105,91,61,33,114,15,219,137,109,122,245,156,64,154,35,159,159,157,155,70,98,178,240,44,155,232,162,72,250,42,103,171,54,30,185,96,11,142,146,64,43,82,76,138,204,125,197,224,30,107,116,121,153,233,199,5,143,55,193,190,152,113,198,62,87,112,219,115,41,19,80,222,89,177,226,53,17,67,150,220,54,227,30,113,19,208,244,64,190,189,109,88,20,195,72,141,216,136,35,155,178,240,248,236,18,87,10,105,193,225,174,144,90,68, -153,174,172,104,80,242,118,201,56,163,194,132,84,50,27,32,161,162,80,169,198,24,137,233,56,183,79,78,111,163,175,105,24,33,180,24,156,138,66,61,162,158,156,78,187,102,179,114,24,107,185,30,125,23,169,195,110,183,216,79,142,130,27,75,220,242,176,12,95,12,110,231,247,220,9,5,70,48,67,5,182,238,140,79,196,243,209,217,141,33,115,110,117,168,221,50,202,156,227,38,189,128,141,60,110,210,44,14,102,248,184,30,9,139,236,231,122,39,84,250,222,211,240,248,76,160,196,177,114,77,131,32,163,44,26,58,201,48,231,236,180,115,200,120,32,51,196,138,74,48,25,162,9,103,87,97,18,18,154,234,90,8,48,15,108,122,141,110,219,188,100,6,139,120,218,198,57,133,148,152,39,159,247,168,24,123,107,253,139,177,30,222,226,254,86,94,94,82,177,54,252,147,72,113,110,55,187,184,137,50,151,109,126,16,240,31,243,181,147,138,136,235,100,54,35,4,176,52,53,114,186,178,184,34,45,235,38,163,251,64,91,16,61,102,198,252,230,117,125,240,104,111,13,156,242,67, -112,230,64,101,32,4,216,181,115,239,60,100,231,45,8,145,227,193,98,17,215,75,26,165,37,163,163,84,184,122,3,37,188,149,89,58,73,139,172,187,70,73,8,3,231,1,162,113,71,154,103,172,0,59,121,157,36,110,194,52,64,233,20,83,30,216,45,156,139,71,129,254,222,158,221,189,163,161,245,65,130,24,46,89,54,9,122,182,207,149,7,217,91,140,216,194,249,84,240,148,154,159,80,247,123,44,169,115,76,28,59,121,116,60,185,57,40,177,156,217,55,15,247,151,109,193,202,198,198,150,106,119,122,91,1,12,157,194,90,118,103,92,57,142,160,41,239,96,104,97,151,161,158,58,136,218,236,179,43,187,18,18,177,127,14,72,87,184,75,131,41,34,177,187,212,191,48,220,94,160,132,166,89,7,252,114,9,230,160,254,74,207,4,177,71,51,190,216,133,95,174,250,127,0,93,193,69,186,204,82,44,129,182,98,172,98,28,77,71,6,107,167,141,175,121,184,161,198,86,244,190,225,72,27,186,72,199,143,247,146,49,66,195,21,81,67,214,106,148,29,212,250,170,121,52,174, -89,215,50,79,231,64,60,77,175,241,144,87,245,62,146,116,234,108,97,155,149,6,64,89,152,58,44,234,197,85,236,252,98,196,15,16,125,101,127,187,106,142,96,6,199,64,34,218,25,195,228,96,176,109,157,181,160,38,157,88,10,206,78,86,113,203,212,58,176,165,153,114,206,77,11,205,28,85,37,227,181,22,87,79,248,182,169,177,240,76,16,216,95,161,217,130,11,122,246,41,27,31,45,64,200,16,148,220,55,217,24,54,247,201,72,215,169,128,223,71,35,74,115,33,90,94,86,62,70,88,163,233,66,80,196,211,219,103,217,35,60,141,189,59,71,58,13,195,227,78,62,26,118,206,31,91,193,225,89,112,185,231,108,160,119,225,52,180,16,50,159,86,218,39,115,12,94,176,16,162,219,54,115,158,17,73,216,68,205,103,153,225,76,192,11,116,105,75,244,192,22,57,49,191,120,72,154,18,132,2,177,252,10,110,87,89,8,30,238,246,119,217,117,37,244,220,199,51,129,3,200,137,117,182,154,121,69,168,136,18,49,152,60,101,104,35,62,163,245,238,81,152,104,116,74,85, -94,24,234,63,222,206,37,33,161,73,19,88,47,4,57,209,242,214,178,221,220,131,30,247,145,134,93,168,125,141,38,214,28,30,88,205,203,171,224,225,26,130,108,46,100,13,154,236,58,18,115,36,0,83,59,143,92,236,76,40,200,237,243,160,13,95,164,73,229,234,157,51,116,119,199,206,209,246,38,192,216,41,71,227,216,140,233,227,86,151,122,90,17,199,59,97,177,166,118,139,105,217,156,160,245,90,101,97,54,201,229,167,219,135,157,202,174,222,184,75,196,63,62,182,134,248,179,78,63,115,72,234,39,173,231,5,6,13,77,101,154,212,208,172,107,234,117,96,253,104,159,95,65,149,176,127,135,68,218,201,39,151,96,87,216,174,140,209,214,6,142,170,121,21,93,205,140,38,161,214,85,222,2,17,11,116,62,98,79,53,249,38,95,239,219,77,86,43,141,192,25,74,188,55,9,201,199,133,190,170,23,13,86,50,128,35,177,146,55,36,42,14,110,109,63,161,220,167,78,66,9,204,199,170,124,162,202,252,85,253,149,226,25,13,128,93,136,103,218,198,75,36,14,104,4,39, -181,16,52,72,65,64,170,233,64,23,181,244,109,204,83,187,209,68,116,155,170,82,33,110,144,11,56,252,33,28,48,155,85,5,139,220,52,170,180,118,143,140,12,206,202,68,181,90,43,98,197,6,77,224,42,107,131,43,185,34,6,197,214,100,132,141,54,24,32,142,113,9,198,94,166,184,139,118,6,119,176,70,240,22,137,89,164,241,142,201,77,18,233,168,85,231,91,97,70,113,42,250,38,26,141,184,208,131,146,67,121,204,148,57,246,65,101,154,141,241,187,20,36,180,102,6,60,197,141,9,231,248,138,48,168,237,100,179,28,250,196,38,69,30,20,79,232,97,191,175,164,220,241,69,1,32,231,247,71,92,133,242,204,230,12,201,17,192,8,116,185,111,13,129,236,198,109,1,42,89,119,132,92,122,228,116,178,151,237,176,28,35,136,217,163,179,205,72,247,247,91,203,194,210,176,94,27,111,35,110,247,225,135,22,142,165,135,150,84,152,79,12,193,11,187,59,20,206,164,33,160,15,22,213,123,40,7,78,175,37,74,243,76,247,174,11,232,139,209,99,100,32,176,239,60,75, -200,156,118,2,221,219,153,67,139,112,172,59,20,114,50,25,153,133,238,206,213,227,9,5,121,102,215,51,169,161,22,211,210,105,188,121,153,166,159,2,241,231,162,233,78,233,202,208,122,200,152,169,184,198,145,162,42,15,134,86,116,18,61,251,132,230,215,213,238,103,36,152,206,126,169,125,114,32,153,30,147,143,203,6,105,240,97,175,101,57,49,219,198,19,70,14,185,33,41,113,124,169,171,107,107,222,193,147,2,218,226,17,133,164,205,238,199,45,172,96,89,152,131,196,68,28,41,150,89,91,49,10,98,186,234,125,13,11,170,29,13,22,131,1,86,46,80,147,227,180,148,198,130,195,212,17,191,206,215,142,82,39,153,18,125,174,92,213,67,128,233,225,4,208,229,24,245,140,37,73,105,19,123,219,155,89,37,6,12,7,188,161,81,108,229,46,119,77,11,164,106,223,84,232,72,149,17,9,134,208,17,241,14,85,187,98,180,183,149,40,229,196,25,160,38,244,194,11,50,202,172,143,233,42,102,198,170,138,248,33,151,41,157,96,77,85,168,82,132,78,129,203,92,26,137,202, -222,25,88,18,72,229,122,136,89,50,83,149,74,141,114,240,156,143,55,81,25,194,142,140,25,207,33,8,237,237,71,12,255,8,51,34,29,64,136,49,120,193,170,99,171,247,121,147,227,204,248,138,11,151,43,161,65,34,128,172,247,243,51,9,180,223,68,233,55,147,232,132,201,32,16,14,196,184,9,199,26,119,135,178,71,154,138,45,88,82,44,82,89,145,22,219,226,219,156,165,35,197,24,55,224,176,183,169,209,236,20,23,168,28,243,241,44,112,143,49,136,227,109,183,163,9,223,2,37,52,51,172,42,49,139,71,209,34,28,200,205,66,153,202,56,4,38,242,57,27,81,184,213,121,166,171,148,193,108,42,163,76,140,179,6,71,214,107,248,117,7,220,103,180,86,201,13,22,154,77,40,183,181,53,218,159,119,67,148,234,71,95,17,185,221,125,237,237,237,104,123,237,35,114,136,96,112,202,232,206,220,188,214,252,143,223,52,54,95,92,172,174,195,30,90,190,105,184,118,3,186,174,249,69,195,163,198,250,167,141,255,87,125,245,58,122,221,147,231,77,117,143,27,155,95,60, -173,255,99,227,179,175,235,158,98,85,154,235,158,63,169,123,210,248,180,1,123,104,170,107,110,252,182,241,105,125,83,93,245,186,120,243,135,117,53,25,143,158,63,107,190,170,88,189,162,93,215,220,210,244,242,81,203,203,38,172,201,31,26,91,190,169,107,120,218,240,109,195,51,172,66,253,139,23,77,207,95,52,53,214,183,52,212,181,60,175,171,222,156,111,106,252,170,161,174,254,217,227,171,110,235,26,159,61,110,252,125,227,227,151,245,79,47,122,253,176,58,140,91,23,163,185,253,105,237,186,252,119,175,152,87,159,171,223,23,61,127,242,235,91,87,183,203,175,93,9,191,120,247,197,171,23,31,221,123,255,218,173,240,215,210,106,194,46,175,134,63,189,247,0,235,250,179,171,241,212,189,108,110,120,92,213,252,155,231,79,31,99,154,98,230,250,246,194,112,245,95,61,127,217,82,51,110,213,50,31,214,125,246,252,219,139,199,230,15,48,43,254,174,161,54,150,186,167,13,207,190,110,249,230,131,186,122,76,84,35,102,237,250,71,45,117,207,158,183,96,99,111,106,120,212,242, -244,143,23,242,191,250,227,43,109,106,150,169,214,126,254,12,123,139,25,15,179,204,133,6,223,214,99,66,95,85,123,217,92,255,117,67,117,114,94,60,109,104,170,205,98,35,102,110,204,210,223,214,55,253,177,106,246,167,141,143,106,138,54,215,189,215,240,225,215,31,94,168,211,140,77,204,163,150,231,77,205,239,95,26,185,102,221,154,165,239,255,144,165,27,155,49,165,223,110,232,175,158,63,127,250,46,51,215,154,221,48,238,111,158,212,97,230,109,248,160,102,173,170,47,181,212,55,98,106,94,152,228,121,211,31,127,134,106,152,144,107,154,213,126,241,224,55,213,155,253,95,94,104,83,123,126,167,130,88,227,27,250,213,60,186,90,250,211,21,121,86,255,109,195,155,138,96,190,132,173,172,75,77,46,126,120,151,42,213,230,223,81,165,90,248,211,53,121,130,153,245,77,77,254,14,43,187,212,163,250,248,46,45,170,77,111,106,129,21,188,90,8,87,171,182,234,249,79,126,182,122,141,207,126,247,166,118,88,140,122,222,116,169,94,237,249,157,19,246,236,119,55,212,171,85,254, -51,235,119,177,110,223,238,237,141,239,54,221,69,179,27,218,253,182,86,116,21,82,127,186,38,45,141,223,117,169,127,196,202,46,45,85,125,124,151,54,213,166,55,117,169,199,34,199,31,154,26,171,193,184,241,231,152,165,225,159,91,254,148,153,187,104,254,19,38,175,218,162,1,203,53,63,103,45,86,115,205,159,176,22,107,191,228,117,93,211,255,253,241,227,198,106,64,197,210,212,69,26,171,253,62,215,213,196,126,112,165,59,54,144,250,39,45,88,76,254,211,28,176,218,197,159,176,134,175,154,191,99,29,87,243,69,253,91,199,243,211,53,125,254,162,161,169,30,139,219,53,84,208,242,218,202,15,127,241,240,189,135,239,215,10,63,185,182,122,110,40,124,213,246,181,226,181,250,239,24,213,143,155,194,135,191,120,239,253,55,229,93,183,194,63,52,96,137,29,203,55,111,157,151,91,55,190,238,191,101,216,255,227,155,134,103,255,208,240,182,64,255,55,245,79,159,126,85,255,232,119,119,174,150,194,213,207,55,245,251,171,47,190,27,82,222,54,234,43,43,126,80,247,19,27,252, -245,235,209,191,86,246,234,55,223,46,176,225,165,102,117,151,207,152,71,252,1,171,249,202,93,235,254,80,223,92,215,84,123,172,129,19,204,103,154,62,196,146,81,83,21,159,52,125,253,178,138,237,174,160,229,243,166,198,175,27,159,93,98,183,106,139,15,48,148,129,169,247,24,67,48,13,87,149,158,53,252,225,205,181,240,78,3,127,214,82,223,212,242,183,152,111,86,221,231,147,183,196,223,223,63,111,124,252,106,132,175,198,138,77,198,171,150,175,222,190,247,254,213,184,107,239,46,148,105,192,106,212,95,173,221,106,193,163,151,77,77,181,17,85,241,72,117,105,52,253,40,69,255,246,217,227,159,165,230,101,187,183,40,137,189,121,139,138,53,124,249,3,186,252,166,249,74,149,119,45,184,239,3,105,152,82,23,2,110,190,127,215,58,170,251,71,12,190,213,53,62,185,166,38,54,207,24,180,109,252,253,15,26,237,191,254,238,103,217,236,162,217,143,51,89,21,65,87,189,186,249,154,251,87,147,11,166,32,198,49,48,84,221,116,89,244,221,0,253,78,181,255,115,3,166,51, -150,248,191,199,190,63,24,185,222,12,158,87,97,188,74,62,222,136,96,215,135,142,117,253,198,180,92,67,66,239,234,240,215,119,235,26,111,190,122,215,92,94,133,195,87,41,183,182,10,94,17,186,186,250,75,202,248,164,177,161,74,128,30,55,252,243,15,217,234,42,168,63,252,252,225,23,255,95,25,237,186,14,255,51,173,247,89,213,145,176,96,137,77,210,123,151,21,126,89,107,253,254,15,174,216,103,88,80,189,116,170,15,190,155,58,95,23,213,200,75,181,228,42,253,95,60,213,128,211,195,15,170,171,250,225,7,141,87,165,85,56,120,227,253,91,36,223,148,243,223,235,159,190,108,248,137,171,241,66,247,215,171,241,45,9,234,154,113,111,218,245,149,97,235,126,56,177,189,61,245,191,145,245,111,204,252,221,11,14,245,179,187,184,96,141,55,9,227,27,29,212,248,226,171,214,15,255,195,63,253,253,203,167,79,95,119,244,26,165,221,0,104,55,140,240,228,198,11,76,196,103,45,143,171,149,223,123,255,13,57,23,200,250,38,168,190,105,78,12,78,223,16,84,171,250,143, -24,108,190,46,235,29,84,253,166,164,26,79,191,46,235,73,253,211,230,134,183,10,121,215,228,94,210,159,235,66,174,189,189,245,150,105,121,77,103,110,48,153,27,82,91,110,188,120,187,193,127,208,80,151,212,227,221,98,254,156,62,120,241,7,34,254,36,23,121,5,224,191,43,166,182,98,235,30,215,183,212,215,61,252,15,117,213,178,87,217,240,98,97,98,185,248,21,226,186,8,231,55,130,248,139,231,205,141,215,160,254,59,35,20,70,120,30,190,247,255,179,200,132,233,252,189,97,233,95,195,203,191,134,151,127,13,47,63,55,188,96,171,235,173,177,165,134,191,171,140,239,73,237,0,225,71,128,233,191,185,160,92,127,143,173,166,239,35,45,63,113,211,230,2,45,95,147,253,6,244,251,177,24,184,70,15,46,153,215,197,129,6,70,17,155,159,99,28,248,55,53,198,216,84,35,182,207,158,95,22,127,128,49,138,11,1,13,223,190,104,249,227,165,142,63,100,133,191,195,192,244,101,124,173,123,244,77,125,211,195,95,190,61,214,189,125,53,84,207,47,158,253,172,88,119,189, -6,214,237,53,15,248,229,187,226,220,251,175,119,15,26,46,56,192,21,117,126,109,161,215,249,229,26,14,174,73,169,158,34,61,107,248,186,190,74,15,235,126,95,243,46,140,59,86,79,65,26,159,213,132,212,124,166,238,179,134,250,166,71,223,84,13,251,180,241,25,246,252,99,236,247,89,109,182,177,41,248,49,134,124,71,108,186,176,228,43,73,255,171,77,250,155,235,110,246,166,233,62,196,172,113,205,72,213,173,149,203,77,140,11,207,171,210,218,198,139,51,163,43,23,188,56,90,121,94,245,210,63,52,54,55,188,42,175,133,219,31,220,123,121,94,165,36,175,50,243,13,226,222,244,184,161,9,75,210,63,113,75,230,249,15,240,132,239,11,134,223,233,254,203,186,218,215,59,194,226,243,27,239,94,239,252,60,191,218,248,185,240,179,154,136,215,199,78,205,216,82,197,66,217,239,27,155,170,187,3,117,223,54,180,124,243,252,98,131,180,38,175,122,40,250,198,17,231,15,50,59,76,246,255,104,124,220,242,205,37,249,253,164,238,109,131,250,242,59,127,220,234,13,10,251,74, -204,247,218,239,93,185,242,15,111,49,196,149,239,52,191,168,127,84,117,12,12,43,254,254,114,51,248,5,102,139,150,234,88,95,111,3,60,250,97,132,136,5,219,107,131,253,30,154,255,61,84,187,22,178,191,51,214,159,16,176,47,34,10,182,48,170,59,149,175,4,253,144,234,181,109,161,42,236,124,175,134,83,127,238,36,93,137,249,222,57,122,39,40,250,234,70,250,173,174,220,107,72,254,98,155,170,58,39,223,62,127,140,45,233,234,38,108,109,159,237,233,211,231,127,184,56,46,169,238,121,93,236,175,94,79,88,239,97,118,168,30,87,95,52,197,154,213,125,245,178,165,165,186,151,248,251,203,99,137,106,181,247,63,188,190,61,246,174,29,225,90,167,245,143,30,53,188,104,121,189,147,251,99,54,204,254,143,151,205,151,217,253,79,178,239,149,152,255,25,246,189,146,125,105,223,198,39,175,115,255,171,232,240,249,47,235,30,254,159,181,12,134,61,253,111,95,212,194,123,253,163,150,134,166,230,15,46,78,232,171,54,121,81,223,212,114,121,232,243,180,122,194,214,252,18,203, -99,175,106,86,77,122,237,108,168,249,173,123,142,151,95,119,63,125,181,100,94,157,244,55,61,127,137,173,204,134,230,47,46,234,93,27,247,117,219,255,246,121,61,134,38,110,204,194,47,222,189,175,116,149,39,47,73,218,245,211,139,187,15,255,234,162,240,29,252,236,138,244,253,245,37,93,195,122,251,236,143,205,152,67,253,230,217,147,231,239,202,15,239,76,189,85,181,191,59,183,63,197,71,238,214,194,250,207,167,100,63,14,113,95,227,46,63,165,135,31,7,12,94,212,183,96,126,242,172,249,45,93,124,89,181,220,151,239,246,112,76,177,230,27,78,254,6,171,186,113,48,117,247,203,87,103,82,119,95,53,250,171,239,235,234,207,103,205,15,234,46,29,231,175,175,171,95,141,64,191,121,147,240,254,205,223,255,183,223,254,246,77,58,115,195,205,46,92,226,245,207,239,152,181,218,109,162,90,165,239,176,225,27,205,223,123,255,253,27,199,99,79,94,62,123,84,59,73,120,138,121,103,243,117,80,86,115,181,11,168,246,138,0,213,16,218,181,58,85,95,249,240,122,193,171,233, -189,10,43,175,66,120,77,198,183,245,205,191,195,96,72,67,245,111,122,182,92,156,183,53,55,124,139,165,223,167,152,6,23,119,119,30,254,197,195,95,126,248,232,197,139,79,177,175,111,30,254,197,251,53,30,114,179,75,76,122,227,37,200,251,224,242,242,214,53,224,88,187,81,244,58,8,213,6,240,240,47,176,130,250,175,176,80,255,240,47,234,30,213,142,225,223,195,194,253,147,151,79,47,47,133,93,94,199,185,188,52,132,217,227,253,27,195,122,53,119,175,160,127,115,13,52,96,33,174,185,241,235,103,181,51,194,218,189,164,155,215,187,170,145,175,185,238,189,39,181,195,196,170,179,85,195,103,3,6,187,46,34,101,53,72,223,232,31,19,123,179,223,107,179,122,173,231,87,184,229,226,85,21,113,52,52,61,193,112,206,219,18,85,21,18,254,199,63,94,146,207,155,33,243,167,195,219,11,65,127,214,32,246,14,236,90,117,141,154,249,222,61,166,191,253,231,150,63,203,144,48,57,255,171,70,244,234,138,71,243,27,9,241,139,255,23,174,109,17,45, - +topic "FileList"; +[2 $$0,0#00000000000000000000000000000000:Default] +[i448;a25;kKO9;*@(64)2 $$1,0#37138531426314131252341829483380:class] +[l288;2 $$2,2#27521748481378242620020725143825:desc] +[a83;*R6 $$3,0#31310162474203024125188417583966:caption] +[l288;i1121;b17;O9;~~~.1408;2 $$4,0#10431211400427159095818037425705:param] +[i448;a25;kKO9;*@(64)2 $$5,0#37138531426314131252341829483370:item] +[*+117 $$6,6#14700283458701402223321329925657:header] +[{_}%EN-US +[s1;K:`:`:FileList`:`:class:%- [@(0.0.255) class]_[@0 FileList]_:_[@(0.0.255) public]_[^`:`:ColumnList^ C +olumnList]&] +[s2; &] +[s2; +@@image:2240&1320 +흿Ƈᄢ͹ɖ׎ +–ؘޝտҿ݆ں稨в +⟁ϧޅӂ穽ς̑큉 +ⷾߺϞʐҪŏޅ +۫͂ƒ鹮䞬єꋒ熯ه톬 +ł娽²ӿӵϾ鹸 +𲯌ϟͷ艫Ս +斒ڻáӍώޙӲDz˖޼› +ߓՙ¿ƾ؂Ӊִ +黨ǻٟϾТϤٳϸٟ녴ϴߓ +쑷햳럓٭̔܂쟟 +Ψ˜ƆݣǏ߰⡗롋ң +픬맃ֹ≭俟Ɩɐٞ +齻ϻ㋨٥៯ϼ󧻗ϟڌ㫠ƾ +󛑶ұスڱޯԋӶɅ򯱁 +ӗמ—ߑۃ̓ٚȅѦ󢎷ۗ¸ϗ +ǝΒӧ͏ՏﹷΎԓӦ +ܿߋ̾Щܭ炰ʤ۸Կ⩈ϲ +擧㷍Ȟ㞠̮Åɣķ˝ǵӾļ̎ +Ŧ񴆸럯ֿȌӨȥӂϴ +ЉˍߦȢόĎØӜ +ֿ啊¿៫֤סو +멟Ԓ៣ڡ¦̡ +ɟρǏвӿډѲЫμҰ¿ +쐶ǟȲޚˉիޟ䋿 +ٚϗ؛րٚс󬟻Йۤ֋٧ +ڼ⟓ǓԿŨӓްͮ +뢹ٕ¿̯ƴώʹ߲ߡ߳ۚオ򇎰݈ +֤띮ҹןגԺ݌㳗ϦჃ +ڨ򇎬쁿ϹއͽƄ +ϠǬӔʊկ˗Ŀɭ뎐Ӕ +Μܡӑƚԍ˹Ϳ酟йܖ +䎝Ң횾Фݿ샻쳴Γ̹ϵאܿǂ +ϵ៵ÃȆӸ̗ٚۃہ렰݀܀ +񆶘Ѧ꯺娧™֜ϾŶǿ濗Ǘ +ʭڣٗڙσܟ̓ӽ緓Й +מƧ㪓ṂҞ쩾˵ݾٚ𵚚 +ෙ釙ȧĿɐȥ᳒Ђ푷 +Ю℥媮챉݇ҸòȎͦҺͮ +񊫚ɴ۴οϭៃѿ׉ѣ鷜 +ҿǕǜڍ˽ǦЋڿǿθ؏Ȧ +ϳͰخ䓤캎ۿҎѹӻ󱅄伦Ɲ +湍ߟΧ򇜌̮ӅɅ຀ۃߏΏ +ն໯֙ϰ܎򙟻쫴 +믿Ê輧ߚϐᨾٲҥӓȢ +􈙾Þٞ딍ڔ¡Ѝޯҽˏ +ҠˌȾ殨ڀ򷒝թϬ릀Ғڳ +鿿蘿Ə܋̎ҷ٩Һܛ⨺ڎͷ +Ǡɉ୼҇ʯ¿ֿӵɋԙ̮ߏʖ +֮¿ڙݛ֧񧨖񧨓 +̮҄ǿ뢃݀ +삷ӞևҿܟغԿºʒ❬ё͚ +ػدסǟӺ䐅ŏ׏Ỽ圬ߴ +эևƨ❛ʎ較ͺչ㜾 +ټ͙×˵͍ڟŽȾݕڢ +ԍ̰Եƛ;闥ܿݱ愼껱̿ۥ +քܿÝ埧𿢖ܲəν̌ +ޚϵ㱐ژӍϗԮ٤𵣭끿Ԕ֧ݭ˶ +ōŊԑټўϰ֋뜶ڃ܀ +܀썄􋠓̯ʅ⯾׈Ӆ֘ɼɟߋ㍖ +כŤ󠁹Ů៻ƅƥż뚦լ +ۦ˾畗׵ЖëߪɌĿǿĄǞ̻䯈 +ͬě˰ܹӌ̈́Ǒńҙ̥ +ڔԶȞÍퟁؠĀ՗۪ȝ +ѕͺ۫韼⤚Ǖғ +݈⽅ݬѿ퇎鯖̬ӈĿå +ߍ캙Ç鰐ϑ݌φͥрⱟəŎڋۿ +ҤșɄߨœ܂˳ڎ̆濥딨携Ҕ؞ѻϡ +܀򇴆įְɯ⮀̮Ǡ +ꮀׂͅɒϿ +رψҿ̤ӛ߇ꔆݮѯ۱ +ږ΍ә›֎끡򶣹éǿ +񧏍̝Ɯ裕Ϡ؇ѿֿŷذ赴矷 +祶ɫ݂ơ玘䚛׍όֹΘĐ +ކƽԍٞ٩ʿԒѿֻÅ +܀܀썄̮ǿϽ쨿ⶉ̮ퟷؙ̗ +ƶڭ勴Ԃٟ蟟Ϟ˼߯ +״ޗӟξڝ緿ɤ޾ئ̖ +ױٚ䃵Ã˔أɀ罾ҷ +ˇΑث渧Ľ۲ +ˇ럙筮ɣڶܦ͚탥Ϊ὎ +ݸំ؃˰̯şߗϿ˟ +IJҖϴǨچٝ򋵰ꚲܔњź +̊뱽ڤ˙ڀڊ݋̘˪ڎȉԿüΡ󭺽 +㶋瀿ϠЏȅ렰݀܀줍 +ٍÌ̚Ӿߒ癮Ɋڻ +΍Өư֯䵦íͦ͞ +ݱެӾҞ⶟ͳúܫԂ됲ӞΆ +ն̶Ӟ̽ަٽ㐦謸 +Ϯ֘يφӶަ¦؂㕎ܩ䘭 +ֿះצǨچŮ瀢— +ӍȯϮߗ溭ɾ뽬أҪƯۂ +ץǿҗٕƵŲܒæŜʤ柮ΥУį̢Վڃ +܀҄Ӆ֠ڿ֒̶ +俟򖌿݀ٿӅ߄˶ڇݓ +¿׳ުɩ䫢⽰ƵקջĠ㽧 +׬¢čӬּꃞ뒴۶ؾ +Ͽ砞ʠՖœΌӠ̉֩ +ʽ˒ԧ͔֮߱Ʀ捅κ✀ϪߓŖŜԗ +ՒƜ鶝Ӈ݃ҍ〰̔шϱňѦ +؏ܙ緓뜛؟䣜赳߄ٙ +Ӆ֤຀̗ٚ㟘փタت +ŠЂӹ􆓙ĽۀС؋ՒǞʕӿԚ퀅Ꙕ +Çꍨ醢⋸ɰ֛ݾĺПҿ +Ƽݪܹ琢ˌޚһ©ư +ˋɟɿ̇邝͢ĿѰ΢̓Ϝڡ +뭩Ĺšø⻾ɢĬ訑΁ܹ瘫ś͢ǵ΄ +誄ʷԽ֔ӛΟ©鍤̮Ӆ +Ʌ຀긊Ǟ͒ӻȭϧƼ +ͭڟ֎ѓل˾׹̕ނͥϛ۞ +Мꈺڙɬ珂ˎĆݵ +ۨԌӎ鹙ߤːđ˒؇֩Ɯؾ韁ί +ū͔Ϳμ踇ޓʬɅ٣͘ +ܫΟ߷Ӧ򽝪Ĺї֡ߥΙ +Ҽ٬ՠʛЍޅᘞ㕁ڢ܀ܢ썄מ +—߹̕鮂ӜΠ݀¿靪̒፟뮍Ƅ +סր̮ܨ̓Ӂޏׂ̾јꩤߔح +ҊОĿΨڪџȼ֋ϳ·ɿ +龲Ψڪÿƚψ֦̅ø +ﹶ讏ÑӛؓƱ󮇈㡽̉꠨֧ѐ +ڗն闰飅Ҹҿ䀘툭 +忟ܮɢީňἱˢԟܜս͎椹Ԓڭܐ +δ韓ȵ˴ّĎ̤Ś +ʤܢĐԺŽʥǹɤʚکʴ +񏏆饞ծƠҵ̗될݀܀썄͓ +ֆӅɜᪿ䒵Ǟ򟿶ꖕڮ埏傽ҿ +¿ž݄рƣݪҦޮأԼ̤ᤋؚޘ +ᯮ粭کچݮݫֿ草☴і +㟅œ﫱גʻʌѿ֩Д죽 +ϰź҈܊ҺĬт﹓؋ +ɉ߾Ʃֶꤒڕݻ߲鮩圑ƗѢƗ +ŸԮȒڻٮ̮π䏈鍤̮Ϸ +݀ܐۧݒܰl藟ح՗ݖ͵ƃəǠ +ǖ࿧釟ֆ×ÁΉӴ +㝷Ѵ伜쇽ۻܜԿϰáݠɄĔ糡쟟 +ĨǯᢉبԀNJܵꮏȔ +ߟ퓟ڎݜ󬆄ܡƖ򵥋Һ̣ +ߠ˴̤ޗ݌ڢ򝷠׉Ӻ敏ק鵏ūۭٔ +Ӟϳίɛ涐畖ݟ螴 +瘍粺ٽ󲯑Ȗɼځ蟾 +ȍϜҖƻіҋڂٚ嘜뵍ˤԭ߇珟Œє +ҒȔВǦٹځܮКǂ䬔騕 +Ͽ؏ń…ɅȿԚ̗ϔ +۲ +&] +[s2; &] +[s2; This class is the ColumnList specialization for displaying lists +of files or similar items. List consists of File structures with +elements appropriate to describe and display individual files.&] +[s0; &] +[s1;l288;K:`:`:FileList`:`:File`:`:struct:%- [@(0.0.255) struct]_[@0 FileList`::File]&] +[s2;l480; Structure used to hold information about the item. Some +items, like file length, are in fact not directly used by FileList +and are only provided to make FileList usage simpler for its +primary applications (e.g. file selectors).&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:isdir:%- [@(0.0.255) bool]_[@0 isdir]&] +[s2;l480; If true, item contains directory.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:icon:%- [^`:`:Image^ Image]_[@0 icon]&] +[s2;l480; File icon.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:name:%- [^`:`:String^ String]_[@0 name]&] +[s2;l480; Filename.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:font:%- [^`:`:Font^ Font]_[@0 font]&] +[s2;l480; Font used to display the filename.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:ink:%- [^`:`:Color^ Color]_[@0 ink]&] +[s2;l480; Color used to display the filename.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:length:%- [@(0.0.255) int]_[@0 length]&] +[s2;l480; Length of file.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:time:%- [^`:`:Time^ Time]_[@0 time]&] +[s2;l480; Last write time.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:extink:%- [^`:`:Color^ Color]_[@0 extink]&] +[s2;l480; Color used to display the file extension.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:desc:%- [^`:`:String^ String]_[@0 desc]&] +[s2;l480; Additional description of file, displayed after the filename.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:descfont:%- [^`:`:Font^ Font]_[@0 descfont]&] +[s2;l480; Font used for additional description.&] +[s0;l288; &] +[s5;l288;K:`:`:FileList`:`:File`:`:operator const`:`:String`&`(`)const:%- operator_[@(0.0.255) c +onst]_[^`:`:String^ String]`&()_[@(0.0.255) const]&] +[s2;l480; Returns name.&] +[s0;l288; &] +[s0; &] +[s0; &] +[s5;K:`:`:FileList`:`:WhenRename:%- [^`:`:Callback2^ Callback2]<[@(0.0.255) const]_String +`&, [@(0.0.255) const]_String`&>_[@0 WhenRename]&] +[s2; This callback is called when filename was renamed by user. First +argument is the original filename, second one is the new filename.&] +[s0; &] +[s5;K:`:`:FileList`:`:StartEdit`(`):%- [@(0.0.255) void]_[@0 StartEdit]()&] +[s2; Starts the editation of the current item for rename.&] +[s0; &] +[s5;K:`:`:FileList`:`:EndEdit`(`):%- [@(0.0.255) void]_[@0 EndEdit]()&] +[s2; Ends the editation of item.&] +[s0; &] +[s5;K:`:`:FileList`:`:IsEdit`(`)const:%- [@(0.0.255) bool]_[@0 IsEdit]()_[@(0.0.255) const]&] +[s2; True if editation is active.&] +[s0; &] +[s5;K:`:`:FileList`:`:OkEdit`(`):%- [@(0.0.255) void]_[@0 OkEdit]()&] +[s2; Ends the editation and calls WhenRename to actually rename the +filename.&] +[s0; &] +[s5;K:`:`:FileList`:`:Get`(int`)const:%- [@(0.0.255) const]_[^`:`:FileList`:`:File^ File]`& +_[@0 Get]([@(0.0.255) int]_[@3 i])_[@(0.0.255) const]&] +[s2; Returns the file item structure at specified index.&] +[s0; &] +[s5;K:`:`:FileList`:`:operator`[`]`(int`)const:%- [@(0.0.255) const]_[^`:`:FileList`:`:File^ F +ile]`&_[@0 operator`[`]]([@(0.0.255) int]_[@3 i])_[@(0.0.255) const]&] +[s2; Same as Get([%-*@3 i]).&] +[s0; &] +[s5;K:`:`:FileList`:`:Insert`(int`,const`:`:String`&`,const`:`:Image`&`,`:`:Font`,`:`:Color`,bool`,int`,`:`:Time`,`:`:Color`,const`:`:String`&`,`:`:Font`,`:`:Value`):%- [@(0.0.255) v +oid]_[@0 Insert]([@(0.0.255) int]_[@3 ii], [@(0.0.255) const]_[^`:`:String^ String]`&_[@3 nam +e], [@(0.0.255) const]_[^`:`:Image^ Image]`&_[@3 icon]_`=_Null, [^`:`:Font^ Font]_[@3 font]_ +`=_StdFont(), [^`:`:Color^ Color]_[@3 ink]_`=_SColorText(), [@(0.0.255) bool]_[@3 isdir]_ +`=_false, [@(0.0.255) int]_[@3 length]_`=_[@3 0], [^`:`:Time^ Time]_[@3 time]_`=_Null, +[^`:`:Color^ Color]_[@3 extink]_`=_Null, [@(0.0.255) const]_[^`:`:String^ String]`&_[@3 des +c]_`=_Null, [^`:`:Font^ Font]_[@3 descfont]_`=_Null, Value data `= +Null)&] +[s2; Inserts a new file item at specified position.&] +[s0; &] +[s5;K:`:`:FileList`:`:Add`(const`:`:String`&`,const`:`:Image`&`,`:`:Font`,`:`:Color`,bool`,int`,`:`:Time`,`:`:Color`,const`:`:String`&`,`:`:Font`,`:`:Value`):%- [@(0.0.255) v +oid]_[@0 Add]([@(0.0.255) const]_[^`:`:String^ String]`&_[@3 name], [@(0.0.255) const]_[^`:`:Image^ I +mage]`&_[@3 icon]_`=_Null, [^`:`:Font^ Font]_[@3 font]_`=_StdFont(), +[^`:`:Color^ Color]_[@3 ink]_`=_SColorText(), [@(0.0.255) bool]_[@3 isdir]_`=_false, +[@(0.0.255) int]_[@3 length]_`=_[@3 0], [^`:`:Time^ Time]_[@3 time]_`=_Null, +[^`:`:Color^ Color]_[@3 extink]_`=_Null, [@(0.0.255) const]_[^`:`:String^ String]`&_[@3 des +c]_`=_Null, [^`:`:Font^ Font]_[@3 descfont]_`=_Null, Value data `= +Null)&] +[s2; Adds a new file item at the end of list.&] +[s0; &] +[s5;K:`:`:FileList`:`:GetCurrentName`(`)const:%- [^`:`:String^ String]_[@0 GetCurrentName +]()_[@(0.0.255) const]&] +[s2; Returns the filename of item with cursor. If there is no cursor, +returns empty String.&] +[s0; &] +[s5;K:`:`:FileList`:`:Find`(const char`*`):%- [@(0.0.255) int]_[@0 Find]([@(0.0.255) const]_ +[@(0.0.255) char]_`*[@3 name])&] +[s2; The index of the item with specified [%-*@3 name] or negative +value if not in the list. Search is linear.&] +[s0; &] +[s5;K:`:`:FileList`:`:FindSetCursor`(const char`*`):%- [@(0.0.255) bool]_[@0 FindSetCurso +r]([@(0.0.255) const]_[@(0.0.255) char]_`*[@3 name])&] +[s2; If item with [%-*@3 name].is in the list, sets the cursor to it +and returns true, otherwise returns false.&] +[s0; &] +[s5;K:`:`:FileList`:`:Sort`(const`:`:FileList`:`:Order`&`):%- [@(0.0.255) void]_[@0 Sort]( +[@(0.0.255) const]_[^`:`:FileList`:`:Order^ Order]`&_[@3 order])&] +[s2; Sorts the list. Order contains single virtual method for ordering +File structures.&] +[s0; &] +[s5;K:`:`:FileList`:`:IconWidth`(int`):%- [^`:`:FileList^ FileList]`&_[@0 IconWidth]([@(0.0.255) i +nt]_[@3 w])&] +[s2; Sets the space reserved for painting the file icon.&] +[s0; &] +[s5;K:`:`:FileList`:`:GetIconWidth`(`)const:%- [@(0.0.255) int]_[@0 GetIconWidth]()_[@(0.0.255) c +onst]&] +[s2; Returns the value set by IconWidth.&] +[s0; &] +[s5;K:`:`:FileList`:`:Renaming`(bool`):%- [^`:`:FileList^ FileList]`&_[@0 Renaming]([@(0.0.255) b +ool]_[@3 b]_`=_true)&] +[s2; In renaming mode, user is allowed to edit the name of item (by +holding mouse button over the item). WhenRename callback is called +when user accepts the new name.&] +[s0; &] +[s5;K:`:`:FileList`:`:JustName`(bool`):%- [^`:`:FileList^ FileList]`&_[@0 JustName]([@(0.0.255) b +ool]_[@3 b]_`=_true)&] +[s2; In JustName mode, if filename contains [* `\] or [* /] characters, +only the part after last such character is displayed as filename.&] +[s0; &] +[s0; &] +[s3;%- FileList routines&] +[s0;@(0.0.255) &] +[s5;K:`:`:Load`(`:`:FileList`&`,const`:`:String`&`,const char`*`,bool`,`:`:Callback3``,`:`:FileSystemInfo`&`):%- [@(0.0.255) b +ool]_[@0 Load]([^`:`:FileList^ FileList]`&_[@3 list], [@(0.0.255) const]_[^`:`:String^ Stri +ng]`&_[@3 dir], [@(0.0.255) const]_[@(0.0.255) char]_`*[@3 patterns], +[^bool^ bool]_[@3 dirs]_`=_false, [^`:`:Callback3^ Callback3]<[^bool^ bool], +[@(0.0.255) const]_[^`:`:String^ String]`&, Image`&>_[@3 WhenIcon]_`=_CNULL, +[^`:`:FileSystemInfo^ FileSystemInfo]`&_[@3 filesystem]_`=_StdFileSystemInfo())&] +[s2; This function loads [%-*@3 list] with file items in [%-*@3 dir]. +[%-*@3 patterns] contain allowed file masks separated by semicolon +(e.g. `"`*.cpp;`*.h`"). If [%-*@3 dirs] is false, files in the +list are displayed with `"disabled`" color (useful for directory +selection). [%-*@3 WhenIcon] specifies icon assignment for individual +filenames (first bool paremeter is true for directories). [%-*@3 filesystem] +specifies the file system interface.&] +[s0; &] +[s5;K:`:`:SortByName`(`:`:FileList`&`):%- [@(0.0.255) void]_[@0 SortByName]([^`:`:FileList^ F +ileList]`&_[@3 list])&] +[s2; Sorts the list by names.&] +[s0; &] +[s5;K:`:`:SortByExt`(`:`:FileList`&`):%- [@(0.0.255) void]_[@0 SortByExt]([^`:`:FileList^ F +ileList]`&_[@3 list])&] +[s2; Sorts the list by extensions.&] +[s0; &] +[s0; ] \ No newline at end of file diff --git a/uppsrc/CtrlLib/src.tpp/FileSel$en-us.tpp b/uppsrc/CtrlLib/src.tpp/FileSel$en-us.tpp index 960c175fc..66d5dc58b 100644 --- a/uppsrc/CtrlLib/src.tpp/FileSel$en-us.tpp +++ b/uppsrc/CtrlLib/src.tpp/FileSel$en-us.tpp @@ -1,4 +1,5 @@ -topic "FileSel";[2 $$0,0#00000000000000000000000000000000:Default] +topic "FileSel"; +[2 $$0,0#00000000000000000000000000000000:Default] [i448;a25;kKO9;*@(64)2 $$1,0#37138531426314131252341829483380:class] [l288;2 $$2,2#27521748481378242620020725143825:desc] [a83;*R6 $$3,0#31310162474203024125188417583966:caption] diff --git a/uppsrc/RichText/ParseQtf.cpp b/uppsrc/RichText/ParseQtf.cpp index 9d8462e8c..9a28cb819 100644 --- a/uppsrc/RichText/ParseQtf.cpp +++ b/uppsrc/RichText/ParseQtf.cpp @@ -329,18 +329,6 @@ void RichQtfParser::Error(const char *s) { throw Exc(); } -dword scanX(const char *s) -{ - dword r = 0; - for(int i = 0; i < 8; i++) { - r = (r << 4) | (*s >= '0' && *s <= '9' ? *s - '0' : - *s >= 'A' && *s <= 'F' ? *s - 'A' : - *s >= 'a' && *s <= 'f' ? *s - 'a' : 0); - s++; - } - return r; -} - void RichQtfParser::FlushStyles() { for(int i = 0; i < styleid.GetCount(); i++) @@ -852,10 +840,7 @@ void RichQtfParser::Parse(const char *qtf, byte _accesskey) xu.Cat(*term++); if(xu.GetLength() != 32) Error("Invalid UUID !"); - id.a = scanX(~xu); - id.b = scanX(~xu + 8); - id.c = scanX(~xu + 16); - id.d = scanX(~xu + 24); + id = ScanUuid(xu); } else if(i) diff --git a/uppsrc/RichText/Txt.h b/uppsrc/RichText/Txt.h index 56fa03ab8..402be6beb 100644 --- a/uppsrc/RichText/Txt.h +++ b/uppsrc/RichText/Txt.h @@ -124,9 +124,6 @@ protected: void Put(int i, const RichPara& p, const RichStyle& s); void Put(int i, const RichPara& p, const RichStyles& s); - int GetPartLength(int pi) const; - int FindPart(int& pos) const; - int GetPartPos(int pi) const; void Sync0(const Para& pp, int parti, const RichContext& rc) const; inline void Sync(int parti, const RichContext& rc) const { @@ -188,15 +185,19 @@ protected: public: enum ValPosType { LABELS, INDEXENTRIES }; + int GetPartCount() const { return part.GetCount(); } + bool IsPara(int i) const { return part[i].Is(); } + bool IsTable(int i) const; + int GetPartLength(int pi) const; + int FindPart(int& pos) const; + int GetPartPos(int pi) const; + RichPara Get(int i, const RichStyles& s) const; RichPara Get(int i, const Uuid& styleid, const RichStyles& s) const; RichPara Get(int i, const RichStyle& style) const; Uuid GetParaStyle(int i) const { return part[i].Get().styleid; } void SetParaStyle(int i, const Uuid& si); - int GetPartCount() const { return part.GetCount(); } - bool IsPara(int i) const { return part[i].Is(); } - bool IsTable(int i) const; const RichTable& GetTable(int i) const; int GetLength() const; @@ -216,6 +217,8 @@ public: void Insert(int parai, const RichPara& p, const RichStyles& s); void Cat(const RichPara& p, const RichStyles& s) { Set(GetPartCount(), p, s); } + void RemovePart(int parti); + void Normalize(); Vector GetAllLanguages() const; diff --git a/uppsrc/RichText/TxtData.cpp b/uppsrc/RichText/TxtData.cpp index dcd3fbdcb..224ba3896 100644 --- a/uppsrc/RichText/TxtData.cpp +++ b/uppsrc/RichText/TxtData.cpp @@ -143,6 +143,12 @@ void RichTxt::Insert(int i, const RichPara& p, const RichStyles& s) Set(i, p, s); } +void RichTxt::RemovePart(int parti) +{ + part.Remove(parti); + Invalidate(); +} + void RichTxt::SetPick(int i, pick_ RichTable& p) { const_cast(p).Normalize(); diff --git a/uppsrc/ide/Browser/Base.cpp b/uppsrc/ide/Browser/Base.cpp index d9232fcb5..58317a987 100644 --- a/uppsrc/ide/Browser/Base.cpp +++ b/uppsrc/ide/Browser/Base.cpp @@ -3,7 +3,7 @@ #define LTIMING(x) // RTIMING(x) #define LLOG(x) -static const char s_dbver[] = "Assist++ 1.1"; +static const char s_dbver[] = "Assist++ 2.0"; CppBase& BrowserBase() { diff --git a/uppsrc/ide/Browser/Browser.h b/uppsrc/ide/Browser/Browser.h index c98cb966a..5e265ee14 100644 --- a/uppsrc/ide/Browser/Browser.h +++ b/uppsrc/ide/Browser/Browser.h @@ -51,7 +51,7 @@ enum { ITEM_TNAME, ITEM_NUMBER, ITEM_SIGN, - ITEM_RET, + ITEM_UPP, ITEM_TYPE, ITEM_PTYPE = ITEM_TYPE + 10000, }; @@ -63,7 +63,8 @@ struct ItemTextPart : Moveable { int ii; }; -Vector ParseItemNatural(const CppItemInfo& m, const char *natural); +Vector ParseItemNatural(const String& name, const CppSimpleItem& m, const char *natural); +Vector ParseItemNatural(const CppItemInfo& m); Vector ParseItemNatural(const CppItemInfo& m); bool SplitNestKey(const String& s, String& nest, String& key); @@ -353,12 +354,14 @@ protected: void Tools(Bar& bar); void Label(String&); - void CreateQtf(const String& item, const CppItemInfo& m, String& p1, String& p2); + void CreateQtf(const String& item, const String& name, const CppSimpleItem& m, String& p1, String& p2); void InsertItem(); void FindBrokenRef(); void JumpToDefinition(); + void FixTopic(); + public: Callback1 WhenTemplatesMenu; diff --git a/uppsrc/ide/Browser/Browser.upp b/uppsrc/ide/Browser/Browser.upp index 1df5ee4eb..d7cacf802 100644 --- a/uppsrc/ide/Browser/Browser.upp +++ b/uppsrc/ide/Browser/Browser.upp @@ -11,6 +11,7 @@ file Browser readonly separator, Lay.cpp, Base.cpp optimize_speed, + Item.cpp, ItemList.cpp, Query.cpp, Browser.cpp, diff --git a/uppsrc/ide/Browser/IdeTopic.cpp b/uppsrc/ide/Browser/IdeTopic.cpp index ae731603a..3efc42bb0 100644 --- a/uppsrc/ide/Browser/IdeTopic.cpp +++ b/uppsrc/ide/Browser/IdeTopic.cpp @@ -1,5 +1,18 @@ #include "Browser.h" +#define CODEITEM "37138531426314131252341829483370" +#define STRUCTITEM "37138531426314131252341829483380" + +static const char styles[] = + "[ $$0,0#00000000000000000000000000000000:Default]" + "[i448;a25;kKO9;2 $$1,0#" CODEITEM ":codeitem]" + "[i448;a25;kKO9;3 $$2,0#" STRUCTITEM ":structitem]" + "[l288;2 $$3,0#27521748481378242620020725143825:desc]" + "[H6;0 $$4,0#05600065144404261032431302351956:begin]" + "[l288;a25;kK~~~.1408;@3;2 $$5,0#61217621437177404841962893300719:param]" + "[0 $$7,0#96390100711032703541132217272105:end]" +; + void TopicEditor::JumpToDefinition() { PostCallback(callback1(IdeGotoLink, editor.GetFormatInfo().label)); @@ -19,46 +32,42 @@ void TopicEditor::Label(String& label) label = ref.Get(); } -struct FindBrokenRefIterator : RichText::Iterator { - int cursor; - - virtual bool operator()(int pos, const RichPara& para) - { - if(pos >= cursor && para.format.label[0] == ':' && para.format.label[1] == ':') { - String nest; - String key; - if(para.GetLength() && SplitNestKey(para.format.label, nest, key)) { - int q = BrowserBase().Find(nest); - if(q >= 0 && BrowserBase()[q].key.Find(key) >= 0) - return false; - } - cursor = pos; - return true; - } - return false; - } -}; - void TopicEditor::FindBrokenRef() { - Progress pi; - pi.SetTotal(topic.GetCount()); + Uuid codeitem = ScanUuid(CODEITEM); + Uuid stritem = ScanUuid(STRUCTITEM); for(;;) { if(IsNull(topicpath)) return; - pi.SetText(GetFileTitle(topicpath)); - pi.SetPos(topic.GetCursor()); - FindBrokenRefIterator fi; - fi.cursor = editor.GetCursor(); - if(editor.Get().Iterate(fi)) { - editor.Move(fi.cursor); - break; + const RichText& txt = editor.Get(); + int c = editor.GetCursor(); + int i = txt.FindPart(c); + while(++i < txt.GetPartCount()) { + if(txt.IsPara(i)) { + Uuid style = txt.GetParaStyle(i); + if(style == codeitem || style == stritem) { + RichPara para = txt.Get(i); + if(para.format.label == "noref") + continue; + if(!IsNull(para.format.label)) { + String nest; + String key; + if(SplitNestKey(para.format.label, nest, key)) { + int q = BrowserBase().Find(nest); + if(q >= 0 || BrowserBase()[q].key.Find(key) >= 0) + continue; + } + } + editor.Move(txt.GetPartPos(i)); + return; + } + } } if(!topic.IsCursor()) break; - int c = topic.GetCursor() + 1; + c = topic.GetCursor() + 1; if(c >= topic.GetCount()) { - PromptOK("No more broken references."); + PromptOK("No more invalid references."); break; } topic.SetCursor(c); @@ -140,10 +149,10 @@ static int sSplitT(int c) { return c == ';' || c == '<' || c == '>' || c == ','; } -String DecoratedItem(const CppItemInfo& m, const char *natural) +String DecoratedItem(const String& name, const CppSimpleItem& m, const char *natural) { String qtf = "[%00-00K "; - Vector n = ParseItemNatural(m, natural); + Vector n = ParseItemNatural(name, m, natural); if(m.virt) qtf << "[@B virtual] "; if(m.kind == CLASSFUNCTION || m.kind == CLASSFUNCTIONTEMPLATE) @@ -165,6 +174,9 @@ String DecoratedItem(const CppItemInfo& m, const char *natural) case ITEM_NAME: qtf << "*"; break; + case ITEM_UPP: + qtf << "@c"; + break; case ITEM_CPP_TYPE: case ITEM_CPP: qtf << "@B"; @@ -185,24 +197,16 @@ String DecoratedItem(const CppItemInfo& m, const char *natural) return qtf + "]"; } -static const char styles[] = - "[ $$0,0#00000000000000000000000000000000:Default]" - "[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483370:item]" - "[i448;a25;kKO9;3 $$2,0#37138531426314131252341829483380:class]" - "[l288;2 $$3,0#27521748481378242620020725143825:desc]" - "[H6;0 $$4,0#05600065144404261032431302351956:begin]" - "[l288;a25;kK~~~.1408;@3;2 $$5,0#61217621437177404841962893300719:param]" - "[0 $$7,0#96390100711032703541132217272105:end]" -; - -void TopicEditor::CreateQtf(const String& item, const CppItemInfo& m, String& p1, String& p2) +void TopicEditor::CreateQtf(const String& item, const String& name, const CppSimpleItem& m, + String& p1, String& p2) { String qtf; bool str = m.kind == STRUCT || m.kind == STRUCTTEMPLATE; if(!str) qtf << "[s4 &]"; - qtf << (str ? "[s2;:" : "[s1;:") << DeQtf(item) << ": "; - if(m.IsTemplate()) { + String st = str ? "[s2;" : "[s1;"; + String k = st + ':' + DeQtf(item) + ": "; + if(m.IsTemplate() && str) { int q = 0; int w = 0; while(q < m.natural.GetLength()) { @@ -217,15 +221,15 @@ void TopicEditor::CreateQtf(const String& item, const CppItemInfo& m, String& p1 } q++; } - qtf << DecoratedItem(m, m.natural.Mid(0, q)); + qtf << "[s2:noref: " << DecoratedItem(name, m, m.natural.Mid(0, q)) << "&][s2 " << k; if(q < m.natural.GetLength()) { while((byte)m.natural[q] <= 32) q++; - qtf << '&' << DecoratedItem(m, m.natural.Mid(q)); + qtf << DecoratedItem(name, m, m.natural.Mid(q)); } } else - qtf << DecoratedItem(m, m.natural); + qtf << k << DecoratedItem(name, m, m.natural); qtf << "&]"; p1 = qtf; @@ -283,14 +287,17 @@ void TopicEditor::InsertItem() for(int i = 0; i < ref.browser.item.GetCount(); i++) if(ref.browser.item.IsSelected(i)) { String a1, a2; - CreateQtf(ref.browser.GetItem(i), ref.browser.GetItemInfo(i), a1, a2); + const CppItemInfo& m = ref.browser.GetItemInfo(i); + CreateQtf(ref.browser.GetItem(i), m.name, m, a1, a2); p1 << p2 << a1; p2 = a2; } } else - if(ref.browser.item.IsCursor()) - CreateQtf(ref.browser.GetItem(), ref.browser.GetItemInfo(), p1, p2); + if(ref.browser.item.IsCursor()) { + const CppItemInfo& m = ref.browser.GetItemInfo(); + CreateQtf(ref.browser.GetItem(), m.name, m, p1, p2); + } else return; editor.BeginOp(); @@ -302,6 +309,66 @@ void TopicEditor::InsertItem() editor.Move(c); } +void TopicEditor::FixTopic() +{ + String nest; + if(!EditText(nest, "Fix topic", "Nest")) + return; + if(nest[0] != ':') + nest = "::" + nest; + CppBase& base = BrowserBase(); + int q = base.Find(nest); + if(q < 0) { + Exclamation("Nest not found"); + return; + } + CppNest& n = base[q]; + Index natural; + Vector link; + for(int i = 0; i < n.GetCount(); i++) { + const CppItem& m = n[i]; + natural.Add(m.natural); + link.Add(nest + "::" + n.key[i]); + } + RichText result; + const RichText& txt = editor.Get(); + bool started = false; + for(int i = 0; i < txt.GetPartCount(); i++) + if(txt.IsPara(i)) { + RichPara p = txt.Get(i); + WString h = p.GetText(); + String nat; + for(const wchar *s = h; *s; s++) + if((byte )*s < 128 || *s == 160) + nat.Cat(*s == 160 ? ' ' : *s); + int q = natural.Find(nat); + if(q >= 0) { + started = true; + const CppSimpleItem& m = n[q]; + String p1, p2; + CreateQtf(link[q], n.name[q], m, p1, p2); + p1 = "[s7; &]" + p1; + RichText h = ParseQTF(styles + p1); + if(h.GetPartCount()) + h.RemovePart(h.GetPartCount() - 1); + result.CatPick(h); + } + else + if(!started || p.GetLength()) + result.Cat(p); + } + else { + RichTable b; + b <<= txt.GetTable(i); + result.CatPick(b); + } + RichPara empty; + result.Cat(empty); + editor.BeginOp(); + editor.SetSelection(0, txt.GetLength()); + editor.PasteText(result); +} + String TopicEditor::GetFileName() const { return grouppath; diff --git a/uppsrc/ide/Browser/Item.cpp b/uppsrc/ide/Browser/Item.cpp new file mode 100644 index 000000000..6ef70a343 --- /dev/null +++ b/uppsrc/ide/Browser/Item.cpp @@ -0,0 +1,127 @@ +#include "Browser.h" + +bool IsCppKeyword(const String& id) +{ + static Index kw; + if(kw.GetCount() == 0) { + const char **cppk = CppKeyword(); + for(int i = 0; cppk[i]; i++) + kw.Add(cppk[i]); + } + return kw.Find(id) >= 0; +} + +bool IsCppType(const String& id) +{ + static const char *t[] = { + "int", "long", "short", "void", "float", "double", "char", "signed", "unsigned", "bool", + "const", "mutable", "struct", "class", "union" + }; + static Index kt; + if(kt.GetCount() == 0) { + for(int i = 0; i < __countof(t); i++) + kt.Add(t[i]); + } + return kt.Find(id) >= 0; +} + +int InScListIndext(const char *s, const char *list) +{ + int ii = 0; + for(;;) { + const char *q = s; + while(*list == ' ') list++; + for(;;) { + if(*q == '\0' && *list == '\0') return ii; + if(*q != *list) { + if(*q == '\0' && (*list == '<' || *list == ';' || *list == ',' || *list == '>')) + return ii; + if(*list == '\0') return -1; + break; + } + q++; + list++; + } + while(*list && *list != ';' && *list != '<' && *list != '>' && *list != ',') list++; + if(*list == '\0') return -1; + list++; + ii++; + } +} + +static String s_pick_("pick_"); + +Vector ParseItemNatural(const String& name, const CppSimpleItem& m, const char *s) +{ + Vector part; + bool param = false; + while(*s) { + ItemTextPart& p = part.Add(); + p.pos = (int)(s - ~m.natural); + p.type = ITEM_TEXT; + int n = 1; + if(*s >= '0' && *s <= '9') { + while(s[n] >= '0' && s[n] <= '9') + n++; + p.type = ITEM_NUMBER; + } + else + if(iscid(*s) || *s == ':') { + if(strncmp(s, name, name.GetLength()) == 0 && !iscid(s[name.GetLength()])) { + p.type = ITEM_NAME; + n = name.GetLength(); + param = true; + } + else { + String id; + n = 0; + while(IsAlNum(s[n]) || s[n] == '_' || s[n] == ':') + id.Cat(s[n++]); + if(IsCppType(id)) + p.type = ITEM_CPP_TYPE; + else + if(IsCppKeyword(id)) + p.type = ITEM_CPP; + else + if(InScList(id, m.pname)) + p.type = ITEM_PNAME; + else + if(id == s_pick_) { + p.type = ITEM_UPP; + } + else + if(InScList(id, m.tname) || InScList(id, m.ctname)) + p.type = ITEM_TNAME; + else + if(param) { + int ii = InScListIndext(id, m.ptype); + if(ii >= 0) + p.type = ITEM_PTYPE + ii; + } + else { + int ii = InScListIndext(id, m.type); + if(ii >= 0) + p.type = ITEM_TYPE + ii; + } + } + } + else { + p.type = ITEM_SIGN; + while(s[n] && !iscid(s[n])) + n++; + } + p.len = n; + s += n; + } + return part; +} + +Vector ParseItemNatural(const CppItemInfo& m, const char *s) +{ + return ParseItemNatural(m.name, m, s); +} + +Vector ParseItemNatural(const CppItemInfo& m) +{ + return ParseItemNatural(m, ~m.natural + m.at); +} diff --git a/uppsrc/ide/Browser/ItemList.cpp b/uppsrc/ide/Browser/ItemList.cpp index 2c510d844..2f7584f07 100644 --- a/uppsrc/ide/Browser/ItemList.cpp +++ b/uppsrc/ide/Browser/ItemList.cpp @@ -1,120 +1,5 @@ #include "Browser.h" -bool IsCppKeyword(const String& id) -{ - static Index kw; - if(kw.GetCount() == 0) { - const char **cppk = CppKeyword(); - for(int i = 0; cppk[i]; i++) - kw.Add(cppk[i]); - } - return kw.Find(id) >= 0; -} - -bool IsCppType(const String& id) -{ - static const char *t[] = { - "int", "long", "short", "void", "float", "double", "char", "signed", "unsigned", "bool", - "const", "mutable", "struct", "class", "union", "public", "private", "protected" - }; - static Index kt; - if(kt.GetCount() == 0) { - for(int i = 0; i < __countof(t); i++) - kt.Add(t[i]); - } - return kt.Find(id) >= 0; -} - -int InScListIndext(const char *s, const char *list) -{ - int ii = 0; - for(;;) { - const char *q = s; - while(*list == ' ') list++; - for(;;) { - if(*q == '\0' && *list == '\0') return ii; - if(*q != *list) { - if(*q == '\0' && (*list == '<' || *list == ';' || *list == ',' || *list == '>')) - return ii; - if(*list == '\0') return -1; - break; - } - q++; - list++; - } - while(*list && *list != ';' && *list != '<' && *list != '>' && *list != ',') list++; - if(*list == '\0') return -1; - list++; - ii++; - } -} - -Vector ParseItemNatural(const CppItemInfo& m, const char *s) -{ - Vector part; - bool param = false; - while(*s) { - while(*s == '\2') s++; - ItemTextPart& p = part.Add(); - p.pos = (int)(s - ~m.natural); - p.type = ITEM_TEXT; - int n = 1; - if(*s >= '0' && *s <= '9') { - while(s[n] >= '0' && s[n] <= '9') - n++; - p.type = ITEM_NUMBER; - } - else - if(iscid(*s) || *s == ':') { - if(strncmp(s, m.name, m.name.GetLength()) == 0 && !iscid(s[m.name.GetLength()])) { - p.type = ITEM_NAME; - n = m.name.GetLength(); - param = true; - } - else { - String id; - n = 0; - while(IsAlNum(s[n]) || s[n] == '_' || s[n] == ':') - id.Cat(s[n++]); - if(IsCppType(id)) - p.type = ITEM_CPP_TYPE; - else - if(IsCppKeyword(id)) - p.type = ITEM_CPP; - else - if(InScList(id, m.pname)) - p.type = ITEM_PNAME; - else - if(InScList(id, m.tname)) - p.type = ITEM_TNAME; - if(param) { - int ii = InScListIndext(id, m.ptype); - if(ii >= 0) - p.type = ITEM_PTYPE + ii; - } - else { - int ii = InScListIndext(id, m.type); - if(ii >= 0) - p.type = ITEM_TYPE + ii; - } - } - } - else { - p.type = ITEM_SIGN; - while(s[n] && !iscid(s[n]) && s[n] != '\2') - n++; - } - p.len = n; - s += n; - } - return part; -} - -Vector ParseItemNatural(const CppItemInfo& m) -{ - return ParseItemNatural(m, ~m.natural + m.at); -} - int CppItemInfoDisplay::DoPaint(Draw& w, const Rect& r, const Value& q, Color _ink, Color paper, dword style) const { @@ -220,6 +105,9 @@ int CppItemInfoDisplay::DoPaint(Draw& w, const Rect& r, const Value& q, case ITEM_NAME: f.Bold(); break; + case ITEM_UPP: + ink = Cyan; + break; case ITEM_CPP_TYPE: case ITEM_CPP: ink = LtBlue; diff --git a/uppsrc/ide/Browser/Topic.lay b/uppsrc/ide/Browser/Topic.lay index 7a86d37f0..513c0e390 100644 --- a/uppsrc/ide/Browser/Topic.lay +++ b/uppsrc/ide/Browser/Topic.lay @@ -62,3 +62,4 @@ LAYOUT(SaveTemplateLayout, 248, 96) ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(108, 64).TopPosZ(60, 24)) ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(176, 64).TopPosZ(60, 24)) END_LAYOUT + diff --git a/uppsrc/ide/Browser/TopicWin.cpp b/uppsrc/ide/Browser/TopicWin.cpp index 204865540..d74924d6a 100644 --- a/uppsrc/ide/Browser/TopicWin.cpp +++ b/uppsrc/ide/Browser/TopicWin.cpp @@ -330,6 +330,9 @@ void TopicEditor::SetBar() bool TopicEditor::Key(dword key, int cnt) { switch(key) { + case K_ALT_F10: + FixTopic(); + return true; case K_ALT_UP: return topic.Key(K_UP, 0); case K_ALT_DOWN: diff --git a/uppsrc/ide/Browser/init b/uppsrc/ide/Browser/init index b7e9dab19..becf02e8e 100644 --- a/uppsrc/ide/Browser/init +++ b/uppsrc/ide/Browser/init @@ -4,7 +4,7 @@ #include "ide\Common/init" #include "PdfDraw/init" #include "RichEdit/init" -#define BLITZ_INDEX__ FBC518112DEEE5BCB5A93FFF277DB6572 +#define BLITZ_INDEX__ F249BD357E97BA043EF2E512156539AB2 #include "TopicI.icpp" #undef BLITZ_INDEX__ #endif diff --git a/uppsrc/ide/Debuggers/Visualise.cpp b/uppsrc/ide/Debuggers/Visualise.cpp index 9bdf7a02c..ffe77fb25 100644 --- a/uppsrc/ide/Debuggers/Visualise.cpp +++ b/uppsrc/ide/Debuggers/Visualise.cpp @@ -62,7 +62,7 @@ void Pdb::Visualise(Visual& result, Pdb::Val val, int expandptr, int slen, int m else { String x = ReadString(val.address, slen + 1); String dt; - if(x.GetLength() > (IsOk(x) ? slen : 10)) { + if(x.GetLength() > (IsOk(x) ? slen : 20)) { x.Trim(x.GetLength() - 1); dt = ".."; } @@ -126,7 +126,7 @@ void Pdb::Visualise(Visual& result, Pdb::Val val, int expandptr, int slen, int m Val r = t.member[i]; r.address += val.address; try { - Visualise(result, r, max(expandptr - 1, 0), 20, maxlen); + Visualise(result, r, max(expandptr - 1, 0), 32, maxlen); } catch(CParser::Error e) { result.Cat(e, SColorDisabled); @@ -143,7 +143,7 @@ void Pdb::Visualise(Visual& result, Pdb::Val val, int expandptr, int slen, int m result.Cat(t.static_member.GetKey(i)); result.Cat("=", SColorMark); try { - Visualise(result, t.static_member[i], max(expandptr - 1, 0), 20, maxlen); + Visualise(result, t.static_member[i], max(expandptr - 1, 0), 32, maxlen); } catch(CParser::Error e) { result.Cat(e, SColorDisabled); diff --git a/uppsrc/ide/Help.cpp b/uppsrc/ide/Help.cpp index 5f1e4ee45..9a35a6d74 100644 --- a/uppsrc/ide/Help.cpp +++ b/uppsrc/ide/Help.cpp @@ -174,6 +174,10 @@ void TopicCtrl::SyncDocTree() } else { if(otherfirst) { + if(usedfirst) { + usid = AddTree(0, IdeImg::Package(), Null, "Used packages"); + usedfirst = false; + } otid = AddTree(0, IdeImg::Package(), Null, "Other packages"); otherfirst = false; } @@ -520,10 +524,8 @@ struct HelpModule : public IdeModule { if(IsHelpName(path)) { topic_serial++; GetRefLinks(""); - if(ide->doc.GetCurrent().IsEmpty()) { - ide->doc.SyncDocTree(); - ide->doc.GoTo(Nvl(recent_topic, sTopicHome)); - } + ide->doc.SyncDocTree(); + ide->doc.GoTo(Nvl(recent_topic, sTopicHome)); HelpDes *d = new HelpDes; d->topic = &ide->doc; return d;