@brief Updates format to be used while logging. @param userFormat User provided format
| 1406 | /// @brief Updates format to be used while logging. |
| 1407 | /// @param userFormat User provided format |
| 1408 | void LogFormat::parseFromFormat(const base::type::string_t& userFormat) { |
| 1409 | // We make copy because we will be changing the format |
| 1410 | // i.e, removing user provided date format from original format |
| 1411 | // and then storing it. |
| 1412 | base::type::string_t formatCopy = userFormat; |
| 1413 | m_flags = 0x0; |
| 1414 | auto conditionalAddFlag = [&](const base::type::char_t* specifier, base::FormatFlags flag) { |
| 1415 | std::size_t foundAt = base::type::string_t::npos; |
| 1416 | while ((foundAt = formatCopy.find(specifier, foundAt + 1)) != base::type::string_t::npos) { |
| 1417 | if (foundAt > 0 && formatCopy[foundAt - 1] == base::consts::kFormatSpecifierChar) { |
| 1418 | if (hasFlag(flag)) { |
| 1419 | // If we already have flag we remove the escape chars so that '%%' is turned to '%' |
| 1420 | // even after specifier resolution - this is because we only replaceFirst specifier |
| 1421 | formatCopy.erase(foundAt > 0 ? foundAt - 1 : 0, 1); |
| 1422 | ++foundAt; |
| 1423 | } |
| 1424 | } else { |
| 1425 | if (!hasFlag(flag)) addFlag(flag); |
| 1426 | } |
| 1427 | } |
| 1428 | }; |
| 1429 | conditionalAddFlag(base::consts::kAppNameFormatSpecifier, base::FormatFlags::AppName); |
| 1430 | conditionalAddFlag(base::consts::kSeverityLevelFormatSpecifier, base::FormatFlags::Level); |
| 1431 | conditionalAddFlag(base::consts::kSeverityLevelShortFormatSpecifier, base::FormatFlags::LevelShort); |
| 1432 | conditionalAddFlag(base::consts::kLoggerIdFormatSpecifier, base::FormatFlags::LoggerId); |
| 1433 | conditionalAddFlag(base::consts::kThreadIdFormatSpecifier, base::FormatFlags::ThreadId); |
| 1434 | conditionalAddFlag(base::consts::kLogFileFormatSpecifier, base::FormatFlags::File); |
| 1435 | conditionalAddFlag(base::consts::kLogFileBaseFormatSpecifier, base::FormatFlags::FileBase); |
| 1436 | conditionalAddFlag(base::consts::kLogLineFormatSpecifier, base::FormatFlags::Line); |
| 1437 | conditionalAddFlag(base::consts::kLogLocationFormatSpecifier, base::FormatFlags::Location); |
| 1438 | conditionalAddFlag(base::consts::kLogFunctionFormatSpecifier, base::FormatFlags::Function); |
| 1439 | conditionalAddFlag(base::consts::kCurrentUserFormatSpecifier, base::FormatFlags::User); |
| 1440 | conditionalAddFlag(base::consts::kCurrentHostFormatSpecifier, base::FormatFlags::Host); |
| 1441 | conditionalAddFlag(base::consts::kMessageFormatSpecifier, base::FormatFlags::LogMessage); |
| 1442 | conditionalAddFlag(base::consts::kVerboseLevelFormatSpecifier, base::FormatFlags::VerboseLevel); |
| 1443 | // For date/time we need to extract user's date format first |
| 1444 | std::size_t dateIndex = std::string::npos; |
| 1445 | if ((dateIndex = formatCopy.find(base::consts::kDateTimeFormatSpecifier)) != std::string::npos) { |
| 1446 | while (dateIndex > 0 && formatCopy[dateIndex - 1] == base::consts::kFormatSpecifierChar) { |
| 1447 | dateIndex = formatCopy.find(base::consts::kDateTimeFormatSpecifier, dateIndex + 1); |
| 1448 | } |
| 1449 | if (dateIndex != std::string::npos) { |
| 1450 | addFlag(base::FormatFlags::DateTime); |
| 1451 | updateDateFormat(dateIndex, formatCopy); |
| 1452 | } |
| 1453 | } |
| 1454 | m_format = formatCopy; |
| 1455 | updateFormatSpec(); |
| 1456 | } |
| 1457 | |
| 1458 | void LogFormat::updateDateFormat(std::size_t index, base::type::string_t& currFormat) { |
| 1459 | if (hasFlag(base::FormatFlags::DateTime)) { |