Replace a previous patch of this ticket due to regex is not yet fully supported by gcc 4.8. --- src/log/logd/lgs_filehdl.cc | 53 +++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 8 deletions(-)
diff --git a/src/log/logd/lgs_filehdl.cc b/src/log/logd/lgs_filehdl.cc index 9f4e27979..1743c53fd 100644 --- a/src/log/logd/lgs_filehdl.cc +++ b/src/log/logd/lgs_filehdl.cc @@ -26,7 +26,6 @@ #include <sys/stat.h> #include <unistd.h> #include <string> -#include <regex> #include "base/logtrace.h" #include "base/osaf_time.h" @@ -955,6 +954,19 @@ static int chr_cnt_b(char *str, char c, int lim) { return cnt; } +/** + * Check if all character is decimal digit + * @param data string to be checked + * @param size number of characters to check + * @return: true if all character is decimal digit + */ +static bool all_digits(const char *data, int size) { + for (int i = 0; i < size; i++) { + if (!isdigit(data[i])) return false; + } + return true; +} + /** * Filter function used by scandir. * Find a current log file if it exist @@ -965,13 +977,38 @@ static int chr_cnt_b(char *str, char c, int lim) { /* Filename prefix (no timestamps or extension */ static std::string file_name_find_g; static int filter_logfile_name(const struct dirent *finfo) { - const std::string pattern = - "^" + file_name_find_g + "_[0-9]{8}_[0-9]{6}.log$"; - const std::regex e{pattern}; - if (std::regex_match(finfo->d_name, e)) { - return 1; - } - return 0; + size_t name_len = strlen(file_name_find_g.c_str()); + size_t fixed_length = name_len + strlen("_yyyymmdd_hhmmss.log"); + + if (strlen(finfo->d_name) != fixed_length) return 0; + + size_t day_length = strlen("yyyymmdd"); + size_t time_length = strlen("hhmmss"); + int day_offset = 1 + name_len; + int time_offset = 1 + day_offset + day_length; + int extension_offset = time_offset + time_length; + + bool start_with_filename = + strncmp(finfo->d_name, file_name_find_g.c_str(), name_len) == 0; + if (start_with_filename == false) return 0; + + bool underscore_1 = finfo->d_name[day_offset - 1] == '_'; + if (underscore_1 == false) return 0; + + bool yyyymmdd_format = all_digits(finfo->d_name + day_offset, day_length); + if (yyyymmdd_format == false) return 0; + + bool underscore_2 = finfo->d_name[time_offset - 1] == '_'; + if (underscore_2 == false) return 0; + + bool hhmmss_format = all_digits(finfo->d_name + time_offset, time_length); + if (hhmmss_format == false) return 0; + + bool log_extension = + strncmp(finfo->d_name + extension_offset, ".log", strlen(".log")) == 0; + if (log_extension == false) return 0; + + return 1; } /** -- 2.17.1 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel