20 for (
int i = 0; i < columnsSize.
size(); ++i) {
43 std::ranges::transform(headers, std::back_inserter(columnsSize), [](
const QString &header) {
48 if (columnsSize.
empty()) {
49 std::ranges::transform(rows,
50 std::back_inserter(columnsSize),
52 }
else if (rows.size() != columnsSize.
size()) {
53 qFatal(
"Incomplete table");
59 if (row.size() > columnsSize.
size()) {
60 qFatal(
"Incomplete table");
63 for (
int i = 0; i < row.size(); ++i) {
64 columnsSize[i] = qMax(columnsSize[i], row[i].size());
72 QByteArray div = buildTableDivision(columnsSize);
83 for (
int i = 0; i < headers.
size(); ++i) {
86 out.setFieldWidth(columnsSize[i]);
100 for (
int i = 0; i < row.size(); ++i) {
103 out.setFieldWidth(columnsSize[i]);
106 out.setFieldWidth(0);
126 char *data = ba.
data();
127 const char *inputPtr = data;
129 const int len = ba.
length();
130 bool skipUtf8 =
true;
132 for (
int i = 0; i < len; ++i, ++outlen) {
133 const char c = inputPtr[i];
134 if (c ==
'%' && i + 2 < len) {
135 int a =
static_cast<int>(
static_cast<unsigned char>(inputPtr[++i]));
136 int b =
static_cast<int>(
static_cast<unsigned char>(inputPtr[++i]));
138 if (a >=
'0' && a <=
'9') {
140 }
else if (a >=
'a' && a <=
'f') {
142 }
else if (a >=
'A' && a <=
'F') {
146 if (b >=
'0' && b <=
'9') {
148 }
else if (b >=
'a' && b <=
'f') {
150 }
else if (b >=
'A' && b <=
'F') {
154 *data++ = (char) ((a << 4) | b);
156 }
else if (c ==
'+') {
179 const char *inputPtr = data;
182 bool skipUtf8 =
true;
186 auto processKeyPair = [&] {
188 if ((data - from) == 0) {
195 :
QString::fromUtf8(from, data - from));
197 }
else if ((data - from) > 0) {
199 :
QString::fromUtf8(from, data - from),
204 for (
int i = 0; i < len; ++i, ++outlen) {
205 const char c = inputPtr[i];
206 if (c ==
'%' && i + 2 < len) {
207 int a =
static_cast<int>(
static_cast<unsigned char>(inputPtr[++i]));
208 int b =
static_cast<int>(
static_cast<unsigned char>(inputPtr[++i]));
210 if (a >=
'0' && a <=
'9') {
212 }
else if (a >=
'a' && a <=
'f') {
214 }
else if (a >=
'A' && a <=
'F') {
218 if (b >=
'0' && b <=
'9') {
220 }
else if (b >=
'a' && b <=
'f') {
222 }
else if (b >=
'A' && b <=
'F') {
226 *data++ = (char) ((a << 4) | b);
228 }
else if (c ==
'+') {
230 }
else if (c ==
'=') {
232 :
QString::fromUtf8(from, data - from);
236 }
else if (c ==
'&') {
258 char *data = ba->
data();
259 const char *inputPtr = data;
262 bool skipUtf8 =
true;
264 for (
int i = 0; i < len; ++i, ++outlen) {
265 const char c = inputPtr[i];
266 if (c ==
'%' && i + 2 < len) {
267 int a =
static_cast<int>(
static_cast<unsigned char>(inputPtr[++i]));
268 int b =
static_cast<int>(
static_cast<unsigned char>(inputPtr[++i]));
270 if (a >=
'0' && a <=
'9') {
272 }
else if (a >=
'a' && a <=
'f') {
274 }
else if (a >=
'A' && a <=
'F') {
278 if (b >=
'0' && b <=
'9') {
280 }
else if (b >=
'a' && b <=
'f') {
282 }
else if (b >=
'A' && b <=
'F') {
286 *data++ = (char) ((a << 4) | b);
288 }
else if (c ==
'+') {
309 for (
const QChar ch : str) {
310 if (ch >= u
'0' && ch <= u
'9') {
328 }
else if ((ch >= u
'a' && ch <= u
'z') || ch == u
'M') {
352 return std::chrono::microseconds::zero();
363 return std::chrono::microseconds::zero();
366 std::chrono::microseconds ms = std::chrono::microseconds::zero();
368 for (
const std::pair<QString, QString> &p : parts) {
370 const qulonglong dur = p.first.toULongLong(&_ok);
376 if (p.second == u
"usec" || p.second == u
"us") {
377 ms += std::chrono::microseconds{dur};
378 }
else if (p.second == u
"msec" || p.second == u
"ms") {
379 ms += std::chrono::milliseconds{dur};
380 }
else if (p.second == u
"seconds" || p.second == u
"second" || p.second == u
"sec" ||
381 p.second == u
"s" || p.second.isEmpty()) {
382 ms += std::chrono::seconds{dur};
383 }
else if (p.second == u
"minutes" || p.second == u
"minute" || p.second == u
"min" ||
385 ms += std::chrono::minutes{dur};
386 }
else if (p.second == u
"hours" || p.second == u
"hour" || p.second == u
"hr" ||
388 ms += std::chrono::hours{dur};
389 }
else if (p.second == u
"days" || p.second == u
"day" || p.second == u
"d") {
390 ms += std::chrono::days{dur};
391 }
else if (p.second == u
"weeks" || p.second == u
"week" || p.second == u
"w") {
392 ms += std::chrono::weeks{dur};
393 }
else if (p.second == u
"months" || p.second == u
"month" || p.second == u
"M") {
394 ms += std::chrono::months{dur};
395 }
else if (p.second == u
"years" || p.second == u
"year" || p.second == u
"y") {
396 ms += std::chrono::years{dur};
407 return std::chrono::microseconds::zero();
CUTELYST_EXPORT std::chrono::microseconds durationFromString(QStringView str, bool *ok=nullptr)
The Cutelyst namespace holds all public Cutelyst API.
QByteArray & fill(char ch, qsizetype size)
bool isEmpty() const const
qsizetype length() const const
QList::reference emplace_back(Args &&... args)
bool isEmpty() const const
qsizetype size() const const
QMultiMap::iterator insert(QMultiMap::const_iterator pos, const Key &key, const T &value)
QString & append(QChar ch)
QString fromLatin1(QByteArrayView str)
QString fromUtf8(QByteArrayView str)
bool isEmpty() const const
qsizetype size() const const
QByteArray toLatin1() const const