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

Reply via email to