8 Commits

Author SHA1 Message Date
62c5523127 direct wchar_t output to PIScreen on Windows works 2025-09-24 18:34:01 +03:00
daab41e41e add options for fftw3 precisions
configureFromFullPathDevice for all devices now trim() components
2025-09-23 21:16:54 +03:00
a61c8477c7 fix PIMap operator<<(PIMap) error for size=2 2025-09-22 22:34:06 +03:00
788ad8f2c0 PIVariant::toNum from mathvector safety fix 2025-09-22 20:58:58 +03:00
78afc179c4 PIVariant::toNum now from mathvector 2025-09-22 16:26:09 +03:00
69ec4c9837 .clang-format 2025-09-21 21:08:18 +03:00
2368de6e93 rename PRIVATE_DEFINITION_FINISH to PRIVATE_DEFINITION_END_NO_INITIALIZE 2025-09-21 21:05:56 +03:00
e5df76ab1d decompose PRIVATE_DEFINITION_END(c) to PRIVATE_DEFINITION_FINISH(c) and RIVATE_DEFINITION_INITIALIZE(c)
now you can define private in separate file and initialize it in main cpp
2025-09-19 17:39:39 +03:00
14 changed files with 147 additions and 409 deletions

View File

@@ -135,7 +135,7 @@ JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false KeepEmptyLinesAtTheStartOfBlocks: false
LambdaBodyIndentation: Signature LambdaBodyIndentation: Signature
MacroBlockBegin: "PRIVATE_DEFINITION_START|STATIC_INITIALIZER_BEGIN" MacroBlockBegin: "PRIVATE_DEFINITION_START|STATIC_INITIALIZER_BEGIN"
MacroBlockEnd: "PRIVATE_DEFINITION_END|STATIC_INITIALIZER_END" MacroBlockEnd: "PRIVATE_DEFINITION_END|PRIVATE_DEFINITION_END_NO_INITIALIZE|STATIC_INITIALIZER_END"
MaxEmptyLinesToKeep: 2 MaxEmptyLinesToKeep: 2
NamespaceIndentation: None NamespaceIndentation: None
ObjCBinPackProtocolList: Auto ObjCBinPackProtocolList: Auto

View File

@@ -69,6 +69,9 @@ option(STD_IOSTREAM "Building with std iostream operators support" OFF)
option(INTROSPECTION "Build with introspection" OFF) option(INTROSPECTION "Build with introspection" OFF)
option(TESTS "Build tests and perform their before install step" OFF) option(TESTS "Build tests and perform their before install step" OFF)
option(COVERAGE "Build project with coverage info" OFF) option(COVERAGE "Build project with coverage info" OFF)
option(PIP_FFTW_F "Support fftw module for float" ON)
option(PIP_FFTW_L "Support fftw module for long double" ON)
option(PIP_FFTW_Q "Support fftw module for quad double" OFF)
set(PIP_UTILS 1) set(PIP_UTILS 1)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD 11)
@@ -436,8 +439,23 @@ if (NOT CROSSTOOLS)
if (PIP_BUILD_FFTW) if (PIP_BUILD_FFTW)
# Check if PIP support fftw3 for PIFFT using in math module # Check if PIP support fftw3 for PIFFT using in math module
set(FFTW_LIB_NAME fftw3) set(FFTW_LIB_NAME fftw3)
set(FFTW_LIB_SUFFIXES "" "f" "l" "q") set(FFTW_LIB_SUFFIXES "")
if (PIP_FFTW_F)
list(APPEND FFTW_LIB_SUFFIXES "f")
endif()
if (PIP_FFTW_L)
list(APPEND FFTW_LIB_SUFFIXES "l")
endif()
if (PIP_FFTW_Q)
list(APPEND FFTW_LIB_SUFFIXES "q")
endif()
if (NOT "${FFTW_LIB_SUFFIXES}" STREQUAL "")
set(FFTW_LIB_SUFFIXES ";${FFTW_LIB_SUFFIXES}")
else()
list(APPEND FFTW_LIB_SUFFIXES "" "_")
endif()
set(FFTW_LIB_SUFFIXES2 "" "-3") set(FFTW_LIB_SUFFIXES2 "" "-3")
set(FFTW_MSG "")
set(FFTW_LIBS) set(FFTW_LIBS)
set(FFTW_ABS_LIBS) set(FFTW_ABS_LIBS)
set(CMAKE_REQUIRED_INCLUDES fftw3.h) set(CMAKE_REQUIRED_INCLUDES fftw3.h)
@@ -452,6 +470,10 @@ if (NOT CROSSTOOLS)
set(${FFTW_CLN}_FOUND FALSE) set(${FFTW_CLN}_FOUND FALSE)
set(${FFTW_CLNT}_FOUND FALSE) set(${FFTW_CLNT}_FOUND FALSE)
if(${FFTW_CLN}_LIBRARIES) if(${FFTW_CLN}_LIBRARIES)
if (NOT "${FFTW_MSG}" STREQUAL "")
set(FFTW_MSG "${FFTW_MSG}, ")
endif()
set(FFTW_MSG "${FFTW_MSG}${FFTW_CLN}")
set(${FFTW_CLN}_FOUND TRUE) set(${FFTW_CLN}_FOUND TRUE)
list(APPEND FFTW_LIBS "${FFTW_CLN}") list(APPEND FFTW_LIBS "${FFTW_CLN}")
list(APPEND FFTW_ABS_LIBS "${${FFTW_CLN}_LIBRARIES}") list(APPEND FFTW_ABS_LIBS "${${FFTW_CLN}_LIBRARIES}")
@@ -475,7 +497,7 @@ if (NOT CROSSTOOLS)
endforeach() endforeach()
endforeach() endforeach()
if(FFTW_LIBS) if(FFTW_LIBS)
pip_module(fftw "${FFTW_LIBS}" "PIP FFTW support" "" "" "") pip_module(fftw "${FFTW_LIBS}" "PIP FFTW support" "" "" " (${FFTW_MSG})")
endif() endif()
endif() endif()
@@ -570,7 +592,7 @@ if (NOT CROSSTOOLS)
if (NOT DEFINED ANDROID_PLATFORM) if (NOT DEFINED ANDROID_PLATFORM)
if(microhttpd_FOUND AND curl_FOUND) if(microhttpd_FOUND AND curl_FOUND)
add_executable(pip_test "main.cpp") add_executable(pip_test "main.cpp")
target_link_libraries(pip_test pip pip_io_utils pip_client_server pip_http_server pip_http_client) target_link_libraries(pip_test pip pip_io_utils pip_client_server pip_http_server pip_http_client pip_console)
if(sodium_FOUND) if(sodium_FOUND)
add_executable(pip_cloud_test "main_picloud_test.cpp") add_executable(pip_cloud_test "main_picloud_test.cpp")
target_link_libraries(pip_cloud_test pip_cloud) target_link_libraries(pip_cloud_test pip_cloud)

View File

@@ -189,8 +189,8 @@ void PIScreen::SystemConsole::print() {
for (int j = 0; j < dh; ++j) { for (int j = 0; j < dh; ++j) {
int k = j * dw + i; int k = j * dw + i;
Cell & c(cells[j + dy0][i + dx0]); Cell & c(cells[j + dy0][i + dx0]);
PRIVATE->chars[k].Char.UnicodeChar = 0; PRIVATE->chars[k].Char.UnicodeChar = c.symbol.unicode16Code();
PRIVATE->chars[k].Char.AsciiChar = c.symbol.toConsole1Byte(); // PRIVATE->chars[k].Char.AsciiChar = c.symbol.toConsole1Byte();
PRIVATE->chars[k].Attributes = attributes(c); PRIVATE->chars[k].Attributes = attributes(c);
} }
// piCout << "draw" << dw << dh; // piCout << "draw" << dw << dh;
@@ -200,7 +200,7 @@ void PIScreen::SystemConsole::print() {
PRIVATE->srect.Top += dy0; PRIVATE->srect.Top += dy0;
PRIVATE->srect.Right -= width - dx1 - 1; PRIVATE->srect.Right -= width - dx1 - 1;
PRIVATE->srect.Bottom -= height - dy1 - 1; PRIVATE->srect.Bottom -= height - dy1 - 1;
WriteConsoleOutput(PRIVATE->hOut, PRIVATE->chars.data(), PRIVATE->bs, PRIVATE->bc, &PRIVATE->srect); WriteConsoleOutputW(PRIVATE->hOut, PRIVATE->chars.data(), PRIVATE->bs, PRIVATE->bc, &PRIVATE->srect);
#else #else
PIString s; PIString s;
int si = 0, sj = 0; int si = 0, sj = 0;

View File

@@ -365,8 +365,8 @@ public:
return *this; return *this;
} }
if (other.size() == 2) { if (other.size() == 2) {
insert(other.pim_index[0].key, other.pim_content[0]); insert(other.pim_index[0].key, other.pim_content[other.pim_index[0].index]);
insert(other.pim_index[1].key, other.pim_content[1]); insert(other.pim_index[1].key, other.pim_content[other.pim_index[1].index]);
return *this; return *this;
} }
for (int i = 0; i < other.pim_index.size_s(); ++i) { for (int i = 0; i < other.pim_index.size_s(); ++i) {

View File

@@ -12,7 +12,7 @@
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
Base macros Base macros
Ivan Pelipenko peri4ko@yandex.ru Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -333,9 +333,10 @@ typedef long long ssize_t;
__PrivateInitializer__ __privateinitializer__; __PrivateInitializer__ __privateinitializer__;
# define PRIVATE_DEFINITION_START(c) struct c::__Private__ { # define PRIVATE_DEFINITION_START(c) struct c::__Private__ {
# define PRIVATE_DEFINITION_END(c) \ # define PRIVATE_DEFINITION_END_NO_INITIALIZE(c) \
} \ } \
; \ ;
# define PRIVATE_DEFINITION_INITIALIZE(c) \
c::__PrivateInitializer__::__PrivateInitializer__() { \ c::__PrivateInitializer__::__PrivateInitializer__() { \
p = new c::__Private__(); \ p = new c::__Private__(); \
} \ } \
@@ -350,6 +351,10 @@ typedef long long ssize_t;
p = new c::__Private__(); \ p = new c::__Private__(); \
return *this; \ return *this; \
} }
# define PRIVATE_DEFINITION_END(c) \
PRIVATE_DEFINITION_END_NO_INITIALIZE \
(c) PRIVATE_DEFINITION_INITIALIZE(c)
# define PRIVATE (__privateinitializer__.p) # define PRIVATE (__privateinitializer__.p)
# define PRIVATEWB __privateinitializer__.p # define PRIVATEWB __privateinitializer__.p

View File

@@ -938,7 +938,7 @@ PIString PIBinaryLog::constructFullPathDevice() const {
void PIBinaryLog::configureFromFullPathDevice(const PIString & full_path) { void PIBinaryLog::configureFromFullPathDevice(const PIString & full_path) {
const PIStringList pl = full_path.split(":"); const PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) { for (int i = 0; i < pl.size_s(); ++i) {
const PIString p(pl[i]); const PIString p(pl[i].trimmed());
switch (i) { switch (i) {
case 0: setLogDir(p); break; case 0: setLogDir(p); break;
case 1: setFilePrefix(p); break; case 1: setFilePrefix(p); break;

View File

@@ -181,7 +181,7 @@ void PICAN::configureFromFullPathDevice(const PIString & full_path) {
PIString p(pl[i]); PIString p(pl[i]);
switch (i) { switch (i) {
case 0: setPath(p); break; case 0: setPath(p); break;
case 1: setCANID(p.toInt(16)); break; case 1: setCANID(p.trimmed().toInt(16)); break;
default: break; default: break;
} }
} }

View File

@@ -1047,7 +1047,7 @@ void PIEthernet::configureFromFullPathDevice(const PIString & full_path) {
PIStringList pl = full_path.split(":"); PIStringList pl = full_path.split(":");
bool mcast = false; bool mcast = false;
for (int i = 0; i < pl.size_s(); ++i) { for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]); PIString p(pl[i].trimmed());
switch (i) { switch (i) {
case 0: case 0:
p = p.toLowerCase(); p = p.toLowerCase();

View File

@@ -1067,7 +1067,7 @@ PIString PIPeer::constructFullPathDevice() const {
void PIPeer::configureFromFullPathDevice(const PIString & full_path) { void PIPeer::configureFromFullPathDevice(const PIString & full_path) {
PIStringList pl = full_path.split(":"); PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) { for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]); PIString p(pl[i].trimmed());
switch (i) { switch (i) {
case 0: changeName(p); break; case 0: changeName(p); break;
case 1: setTrustPeerName(p); break; case 1: setTrustPeerName(p); break;

View File

@@ -983,7 +983,7 @@ void PISerial::configureFromFullPathDevice(const PIString & full_path) {
} }
} }
for (int i = 0; i < pl.size_s(); ++i) { for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]); PIString p(pl[i].trimmed());
switch (i) { switch (i) {
case 0: setProperty("path", p); break; case 0: setProperty("path", p); break;
case 1: case 1:

View File

@@ -182,7 +182,7 @@ void PISharedMemory::configureFromFullPathDevice(const PIString & full_path) {
initPrivate(); initPrivate();
PIStringList pl = full_path.split(":"); PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) { for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]); PIString p(pl[i].trimmed());
switch (i) { switch (i) {
case 0: setPath(p); break; case 0: setPath(p); break;
case 1: dsize = p.toInt(); break; case 1: dsize = p.toInt(); break;

View File

@@ -187,7 +187,7 @@ PIString PISPI::constructFullPathDevice() const {
void PISPI::configureFromFullPathDevice(const PIString & full_path) { void PISPI::configureFromFullPathDevice(const PIString & full_path) {
PIStringList pl = full_path.split(":"); PIStringList pl = full_path.split(":");
for (int i = 0; i < pl.size_s(); ++i) { for (int i = 0; i < pl.size_s(); ++i) {
PIString p(pl[i]); PIString p(pl[i].trimmed());
switch (i) { switch (i) {
case 0: setPath(p); break; case 0: setPath(p); break;
case 1: setSpeed(p.toInt()); break; case 1: setSpeed(p.toInt()); break;

View File

@@ -712,6 +712,11 @@ int PIVariant::toInt() const {
ba >> r; ba >> r;
return (int)r.rgba; return (int)r.rgba;
} }
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0;
}
case PIVariant::pivCustom: return getAsValue<int>(*this); case PIVariant::pivCustom: return getAsValue<int>(*this);
default: break; default: break;
} }
@@ -817,6 +822,11 @@ llong PIVariant::toLLong() const {
ba >> r; ba >> r;
return llong(r.selectedValue()); return llong(r.selectedValue());
} }
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0L;
}
case PIVariant::pivCustom: return getAsValue<llong>(*this); case PIVariant::pivCustom: return getAsValue<llong>(*this);
default: break; default: break;
} }
@@ -922,6 +932,11 @@ float PIVariant::toFloat() const {
ba >> r; ba >> r;
return float(r.selectedValue()); return float(r.selectedValue());
} }
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0.f;
}
case PIVariant::pivCustom: return getAsValue<float>(*this); case PIVariant::pivCustom: return getAsValue<float>(*this);
default: break; default: break;
} }
@@ -1027,6 +1042,11 @@ double PIVariant::toDouble() const {
ba >> r; ba >> r;
return double(r.selectedValue()); return double(r.selectedValue());
} }
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0.;
}
case PIVariant::pivCustom: return getAsValue<double>(*this); case PIVariant::pivCustom: return getAsValue<double>(*this);
default: break; default: break;
} }
@@ -1132,6 +1152,11 @@ ldouble PIVariant::toLDouble() const {
ba >> r; ba >> r;
return ldouble(r.selectedValue()); return ldouble(r.selectedValue());
} }
case PIVariant::pivMathVector: {
PIMathVectord r;
ba >> r;
return r.size() > 0 ? r[0] : 0.;
}
case PIVariant::pivCustom: return getAsValue<float>(*this); case PIVariant::pivCustom: return getAsValue<float>(*this);
default: break; default: break;
} }

464
main.cpp
View File

@@ -8,405 +8,91 @@
using namespace PICoutManipulators; using namespace PICoutManipulators;
using namespace PIHTTP; using namespace PIHTTP;
PIMathVectord data;
struct SN { void _sfplot(const PIMathVectord & sf, PIString * str, const int lines, const int length) {
int _ii; int offset = (data.size() - length) / 2 / 2;
complexf _co; double max_sf = 0;
PIIODevice::DeviceMode m; for (int i = 0; i < length * 2; i++) {
}; if (sf[offset + i] > max_sf) {
struct S { max_sf = sf[offset + i];
bool _b; }
int _i; }
float _f; static PIVector2D<uchar> grid;
PIString str; grid.clear();
// SN _sn; grid.resize(lines * 2, length * 2);
PIVector2D<bool> v2d; // clang-format off
PIByteArray ba; static const PIChar dots[16] = {
PISystemTime st; PIChar::fromUTF8(" "), PIChar::fromUTF8(""), PIChar::fromUTF8(""), PIChar::fromUTF8(""),
PINetworkAddress na; PIChar::fromUTF8(""), PIChar::fromUTF8(""), PIChar::fromUTF8(""), PIChar::fromUTF8(""),
PIPointd po; PIChar::fromUTF8(""), PIChar::fromUTF8(""), PIChar::fromUTF8(""), PIChar::fromUTF8(""),
PILined li; PIChar::fromUTF8(""), PIChar::fromUTF8(""), PIChar::fromUTF8(""), PIChar::fromUTF8(""),
PIRectd re; };
}; // clang-format on
memset(grid.data(), 0, grid.size());
template<> for (int c = 0; c < grid.cols(); c++) {
PIJSON piSerializeJSON(const SN & v) { double rind = piClampi(piRound(sf[offset + c] / max_sf * (grid.rows() - 1)), 0, grid.rows() - 1);
PIJSON ret; grid.element(rind, c) = 1;
ret["_ii"] = piSerializeJSON(v._ii); }
ret["_co"] = piSerializeJSON(v._co); union helper {
ret["m"] = piSerializeJSON(v.m); uint index = 0;
return ret; struct {
} uint tl: 1;
template<> uint tr: 1;
PIJSON piSerializeJSON(const S & v) { uint bl: 1;
PIJSON ret; uint br: 1;
ret["_b"] = piSerializeJSON(v._b); };
ret["_i"] = piSerializeJSON(v._i); };
ret["_f"] = piSerializeJSON(v._f); for (int i = 0; i < lines; i++) {
ret["str"] = piSerializeJSON(v.str); str[i].resize(length);
// ret["_sn"] = piSerializeJSON(v._sn); }
ret["v2d"] = piSerializeJSON(v.v2d); helper h;
ret["ba"] = piSerializeJSON(v.ba); for (int l = 0; l < lines; l++) {
ret["st"] = piSerializeJSON(v.st); for (int c = 0; c < length; c++) {
ret["na"] = piSerializeJSON(v.na); int l2 = l + l;
ret["po"] = piSerializeJSON(v.po); int c2 = c + c;
ret["li"] = piSerializeJSON(v.li); h.bl = grid.element(l2, c2);
ret["re"] = piSerializeJSON(v.re); h.br = grid.element(l2, c2 + 1);
h.tl = grid.element(l2 + 1, c2);
return ret; h.tr = grid.element(l2 + 1, c2 + 1);
// piCout << h.index;
str[lines - 1 - l][c] = dots[h.index];
}
}
} }
template<>
void piDeserializeJSON(SN & v, const PIJSON & js) {
v = {};
piDeserializeJSON(v._ii, js["_ii"]);
piDeserializeJSON(v._co, js["_co"]);
piDeserializeJSON(v.m, js["m"]);
}
template<>
void piDeserializeJSON(S & v, const PIJSON & js) {
v = {};
piDeserializeJSON(v._b, js["_b"]);
piDeserializeJSON(v._i, js["_i"]);
piDeserializeJSON(v._f, js["_f"]);
piDeserializeJSON(v.str, js["str"]);
// piDeserializeJSON(v._sn, js["_sn"]);
piDeserializeJSON(v.v2d, js["v2d"]);
piDeserializeJSON(v.ba, js["ba"]);
piDeserializeJSON(v.st, js["st"]);
piDeserializeJSON(v.na, js["na"]);
piDeserializeJSON(v.po, js["po"]);
piDeserializeJSON(v.li, js["li"]);
piDeserializeJSON(v.re, js["re"]);
}
PIKbdListener kbd; TileSimple * test_tile;
PIScreen screen;
PIMathVectord asf;
int main(int argc, char * argv[]) { int main(int argc, char * argv[]) {
if (argc < 2) return 0; test_tile = new TileSimple();
PIFile f(argv[1], PIIODevice::ReadOnly); screen.rootTile()->addTile(test_tile);
piCout << "read" << f.path(); screen.rootTile()->addTile(new TilePICout());
auto fc = f.readAll(); PITimer _t;
piCout << fc.size(); PIString str[9];
if (!fc.isEmpty()) piCout << PIString::fromUTF8(fc.resized(32)); asf.resize(80);
return 0; _t.start(20_Hz, [&str] {
static double t = 0;
t += 0.1;
for (uint i = 0; i < asf.size(); ++i)
asf[i] = 1. + sin(t + 2. * i * M_2PI / asf.size());
_sfplot(asf, str, 9, 28);
screen.lock();
PIHTTPServer server; test_tile->content.resize(9);
server.listen({"127.0.0.1:7777"}); for (int i = 0; i < 9; i++) {
// server.setBasicAuthRealm("pip"); test_tile->content[i].first = str[i];
// server.setBasicAuthEnabled(true); }
// server.setBasicAuthCallback([](const PIString & u, const PIString & p) -> bool { screen.unlock();
// piCout << "basic auth" << u << p; piCout << "Время: "_u8 << t;
// return (u == "u" && p == "p");
auto reg = [&server](const PIString & path) {
server.registerPath(path, Method::Get, [path](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
piCout << "\nserver rec:\n\tpath: %1\n\t url: %2\n\t args: %3\n\tQ args: %4\n\tP args: %5"_a.arg(path)
.arg(msg.path())
.arg(piStringify(msg.arguments()))
.arg(piStringify(msg.queryArguments()))
.arg(piStringify(msg.pathArguments()));
return MessageMutable().setCode(Code::Accepted);
});
};
// });
reg(" /*/a/get ");
reg(" /*/{ID}/get ");
reg(" /*/*/get ");
reg(" /*/*_b/get ");
reg("/api/{ID}/get");
reg("/api/1/get");
// reg("/api/1/bort{bortID}/get");
// reg("/api/**");
// reg("/api/1/bort2/get");
// reg("/api/**/bort2/get");
/*server.registerPath("api/{ID}/bort{bortID}/get", Method::Get, [](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
piCout << "server rec:\n\tpath: %1\n\targs: %2\n\tQ args: %3\n\tP args: %4\n"_a.arg(msg.path())
.arg(piStringify(msg.arguments()))
.arg(piStringify(msg.queryArguments()))
.arg(piStringify(msg.pathArguments()));
return MessageMutable().setCode(Code::Accepted);
}); });
server.registerPath("sendMessage", Method::Post, [](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
return MessageMutable().setCode(Code::Accepted); screen.enableExitCapture();
});
server.registerUnhandled([](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
PIHTTP::MessageMutable ret;
piCout << "server rec:\n\tpath: %1\n\tmethod: %2\n\targs: %3\n\theaders: %4\n\tbody: %5\n"_a.arg(msg.path())
.arg(PIHTTP::methodName(msg.method()))
.arg(piStringify(msg.arguments()))
.arg(PIStringList(msg.headers().map<PIString>([](PIString k, PIString v) { return k + " = " + v; })).join("\n\t\t "))
.arg(PIString::fromUTF8(msg.body()));
ret.setCode(PIHTTP::Code::BadRequest);
ret.setBody(PIByteArray::fromAscii("hello client! 0123456789"));
return ret;
});*/
kbd.enableExitCapture('Q');
WAIT_FOR_EXIT; WAIT_FOR_EXIT;
return 0;
// PIRegularExpression pire("привет"_u8, PIRegularExpression::CaseInsensitive); screen.stopAndWait();
// PIString subj = "the dog ПриВет sat on the cat"_u8;
// PIRegularExpression pire("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$"_u8);
// PIString subj = "08/12/1985"_u8;
PIString pat = "*.Exe";
PIRegularExpression re_g = PIRegularExpression::fromGlob(pat, PIRegularExpression::CaseInsensitive);
PIRegularExpression re_p = PIRegularExpression::fromPOSIX(pat, PIRegularExpression::CaseInsensitive);
PIStringList files = {
"(Audio) 20250318-0852-16.8641941.m4a",
"dxwebsetup.exe",
"Firefox Installer.exe",
"LTA8092XS8_R8.pdf",
"SteamSetup.exe",
"TBT_1.41.1325.0.exe",
};
piCout << " src pat" << pat.quoted();
piCout << " Glob pat" << re_g.pattern().quoted();
piCout << "POSIX pat" << re_p.pattern().quoted();
piCout << "\nG P File";
for (auto f: files) {
piCout << (re_g.match(f) ? 1 : 0) << (re_p.match(f) ? 1 : 0) << f;
}
// return 0;
PIRegularExpression pire("(?:\\/\\/\\s*)?.*\\n?(?:\\bfunction\\b)\\s*(?<name>\\b\\w+\\b)\\s*(?:\\((?<args>[^;()]*?)\\))",
PIRegularExpression::Multiline);
PIString subj = PIString::fromUTF8(PIFile::readAll("telegram.qs"));
piCout << "Pattern:" << pire.pattern();
piCout << "Valid:" << pire.isValid();
piCout << "Error at" << pire.errorPosition() << ":" << pire.errorString();
piCout << "Groups count:" << pire.captureGroupsCount();
piCout << "Named groups:" << pire.captureGroupNames();
piCout << "";
auto mr = pire.matchIterator(subj);
auto pire2 = pire;
while (mr.next()) {
// piCout << "Subject" << subj;
piCout << "Matched:" << mr.hasMatch();
piCout << "By number";
for (int i = 0; i <= pire.captureGroupsCount(); ++i)
piCout << i << "=" << mr.matchedString(i).trimmed();
piCout << "By name";
for (auto g: pire.captureGroupNames())
piCout << g.quoted() << "=" << mr.matchedString(g);
piCout << "";
}
piCout << "!!!!!!!!!!!!!!!!!";
pire.match("vfsmndvbjbdlgdvb gdgf");
pire.match(subj);
{
PIVector<complexf> vec;
vec << complexf{0.1, 0.2} << complexf{-1, 0.5};
auto js = PIJSON::serialize(vec);
piCout << vec;
piCout << js;
piCout << PIJSON::deserialize<typeof(vec)>(js);
}
return 0;
/*PICodeParser parser;
parser.parseFile("c:/work/shstk/pip/test_header.h", false);
for (const auto * e: parser.entities) {
piCout << e->type << e->name << "{";
for (const auto & m: e->members) {
piCout << " " << m.type << m.name;
}
piCout << "}";
}
return 0;*/
// PIJSON j = piSerializeJSON(s);
// piDeserializeJSON(s, j);
PIVector<complexf> vec;
vec << complexf{0.1, 0.2} << complexf{-1, 0.5};
auto js = PIJSON::serialize(vec);
piCout << vec;
piCout << js;
piCout << PIJSON::deserialize<typeof(vec)>(js);
/*PIVector<S> s;
s << S{false, 0, 0.1} << S{true, 1, -10.1};
PIMap<int, S> m;
m[1] = S{false, 0, 0.15};
m[2] = S{true, 1, -10.1};
// m[1]._sn._co = {3, 4};
PIJSON j = piSerializeJSON(m);
piCout << j;
piDeserializeJSON(m, j);
piCout << m[1]._f;*/
// piCout << m[1]._sn._co;
/*PIVector<int> v({-1, 0, 10, 200});
PIMap<int, float> m({
{-1, -0.1 },
{0, 0.1 },
{100, 200.2}
});
piCout << v;
piCout << piSerializeJSON(v);
piDeserializeJSON(v, piSerializeJSON(v));
piCout << v;
piCout << m;
piDeserializeJSON(m, piSerializeJSON(m));
piCout << piSerializeJSON(m);*/
return 0;
/*auto src = PIByteArray::fromAscii("The quick brown fox jumps over the lazy dog");
auto key = PIByteArray::fromAscii("key");
PIStringList tnl;
int max_size = 0;
for (int t = 0; t < (int)PIDigest::Type::C ount; ++t) {
tnl << PIDigest::typeName((PIDigest::Type)t);
max_size = piMaxi(max_size, tnl.back().size_s());
}
PIByteArray hs;
piCout << PIString::fromAscii(src);
for (int t = 0; t < (int)PIDigest::Type::Count; ++t) {
hs = PIDigest::calculate(src, (PIDigest::Type)t);
piCout << tnl[t].expandLeftTo(max_size, ' ') << "->" << hs.toHex();
}
for (int t = 0; t < (int)PIDigest::Type::Count; ++t) {
const int bench_count = 100000;
PITimeMeasurer tm;
piForTimes(bench_count) {
hs = PIDigest::calculate(src, (PIDigest::Type)t);
}
auto el = tm.elapsed();
piCout << tnl[t].expandLeftTo(max_size, ' ') << "time" << el.toMilliseconds();
}
// src.clear();
// crypto_hash_sha512(sout.data(), src.data(), src.size());
// piCout << "sod:" << sout.toHex();
// piCout << "512:" << sha5xx(src, initial_512, 64).toHex();
return 0;*/
/*PIHTTP::MessageMutable req;
req.setBody(PIByteArray::fromAscii("hello server!")).addArgument("a0", "val.0").addArgument("a~r1", "знач,1"_u8);
auto * c = PIHTTPClient::create("http://u:p@127.0.0.1:7777/api", PIHTTP::Method::Get, req);
c->onFinish([](PIHTTP::MessageConst msg) {
piCout << "client rec:\n\tpath: %1\n\tmethod: %2\n\targs: %3\n\theaders: %4\n\tbody: %5\n"_a.arg(msg.path())
.arg(PIHTTP::methodName(msg.method()))
.arg(piStringify(msg.arguments()))
.arg(
PIStringList(msg.headers().map<PIString>([](PIString k, PIString v) { return k + " = " + v; })).join("\n\t\t
")) .arg(PIString::fromUTF8(msg.body()));
})
->onError([c](PIHTTP::MessageConst r) {
piCout << "error" << (int)r.code();
piCout << "msg" << c->lastError();
})
->onAbort([c](PIHTTP::MessageConst r) {
piCout << "abort" << (int)r.code();
piCout << "msg" << c->lastError();
})
->start();*/
auto * c = PIHTTPClient::create(
PIString("127.0.0.1:7777/%1").arg("sendMessag"),
Method::Post,
MessageMutable().addHeader(Header::ContentType, "application/json").setBody(PIByteArray::fromAscii("{hello}")));
c->onFinish([](const PIHTTP::MessageConst & msg) { piCout << "message finish" << (int)msg.code() << PIString::fromUTF8(msg.body()); })
->onError([c](const PIHTTP::MessageConst & msg) { piCout << "message error" << c->lastError(); })
->onAbort([c](const PIHTTP::MessageConst & msg) { piCout << "aborted"; })
->start();
piMSleep(1000);
// CurlThreadPool::instance()->destroy();
// kbd.enableExitCapture();
// WAIT_FOR_EXIT
// kbd.stopAndWait();
// server.stop();
c->abort();
piMSleep(10);
return 0;
// piCout << PIString::readableSize(PISystemMonitor::usedRAM());
/*PIVector<int> vi;
piForTimes(10) {
piSleep(2.);
vi.enlarge(1000000);
piCout << "now" << vi.size() << vi.capacity();
}
piSleep(5.);*/
/*kbd.enableExitCapture();
PIHTTPServer server;
server.setFavicon(PIFile::readAll("logo.png", false));
// server.setOption(MicrohttpdServer::Option::HTTPSEnabled, true);
server.listen({"127.0.0.1", 7777});
// server.listen({"192.168.1.10", 7778});
server.registerPath("/", MicrohttpdServer::Method::Get, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody(PIByteArray::fromAscii(pageTitle));
return ret;
});
server.registerPath("/html", MicrohttpdServer::Method::Get, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody("<!DOCTYPE html><html><body><p>arg=%1</p></body></html>"_a.arg(r.args.value("a0")).toUTF8());
return ret;
});
server.registerPath("/api", MicrohttpdServer::Method::Put, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody(PIByteArray::fromAscii("<!DOCTYPE html><html><body>API</body></html>"));
return ret;
});
server.registerPath("/api/", MicrohttpdServer::Method::Post, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody("<!DOCTYPE html><html><body>API etry %1</body></html>"_a.arg(r.path).toUTF8());
ret.setCode(405);
return ret;
});
server.registerUnhandled([](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply ret;
ret.setBody("<!DOCTYPE html><html><body>Unknown</body></html>"_a.arg(r.path).toUTF8());
ret.setCode(404);
return ret;
});*/
/*server.setRequestCallback([](MicrohttpdServer::Request r) -> MicrohttpdServer::Reply {
MicrohttpdServer::Reply rep;
piCout << "request" << r.path;
piCout << " header" << r.headers;
piCout << " args" << r.args;
piCout << " body" << r.body;
piCout << "";
rep.setBody(PIByteArray::fromAscii("[{\"value1\": true, \"value2\": \"ыекштп\"}]"));
return rep;
});*/
/*piCout << "start" << server.isListen();
WAIT_FOR_EXIT
server.stop();*/
return 0; return 0;
} }