Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use #include <...> for foreign header files.
[simgrid.git] / src / xbt / xbt_log_appender_file.cpp
index fd5c34a..657a1ca 100644 (file)
@@ -1,6 +1,6 @@
 /* file_appender - a dumb log appender which simply prints to a file        */
 
-/* Copyright (c) 2007-2021. The SimGrid Team.
+/* Copyright (c) 2007-2023. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -12,6 +12,7 @@
 #include <cerrno>
 #include <cstdio>
 #include <cstring>
+#include <string>
 
 static void append_file(const s_xbt_log_appender_t* this_, const char* str)
 {
@@ -25,10 +26,10 @@ static void free_(const s_xbt_log_appender_t* this_)
 
 xbt_log_appender_t xbt_log_appender_stream(FILE* f)
 {
-  xbt_log_appender_t res = xbt_new0(s_xbt_log_appender_t, 1);
-  res->do_append         = &append_file;
-  res->free_             = nullptr;
-  res->data              = static_cast<void*>(f);
+  auto* res      = xbt_new0(s_xbt_log_appender_t, 1);
+  res->do_append = &append_file;
+  res->free_     = nullptr;
+  res->data      = static_cast<void*>(f);
   return res;
 }
 
@@ -36,12 +37,11 @@ xbt_log_appender_t xbt_log_appender_file_new(const char* arg)
 {
   if (arg == nullptr)
     return xbt_log_appender_stream(stderr);
-  xbt_log_appender_t res = xbt_new0(s_xbt_log_appender_t, 1);
-  res->do_append         = &append_file;
-  res->free_             = &free_;
-  res->data              = static_cast<void*>(fopen(arg, "w"));
-  if (res->data == nullptr)
-    xbt_die("Cannot open file: %s: %s", arg, strerror(errno));
+  auto* res      = xbt_new0(s_xbt_log_appender_t, 1);
+  res->do_append = &append_file;
+  res->free_     = &free_;
+  res->data      = static_cast<void*>(fopen(arg, "w"));
+  xbt_assert(res->data != nullptr, "Cannot open file: %s: %s", arg, strerror(errno));
   return res;
 }
 
@@ -59,10 +59,9 @@ static constexpr const char* APPEND2_END_TOKEN_CLEAR = "\n                   ";
 static void open_append2_file(xbt_log_append2_file_t data){
   if(data->count<0) {
     //Roll
-    if (!data->file) {
+    if (not data->file) {
       data->file= fopen(data->filename, "w");
-      if (data->file == nullptr)
-        xbt_die("Cannot open file: %s: %s", data->filename, strerror(errno));
+      xbt_assert(data->file != nullptr, "Cannot open file: %s: %s", data->filename, strerror(errno));
     } else {
       fputs(APPEND2_END_TOKEN_CLEAR,data->file);
       fseek(data->file,0,SEEK_SET);
@@ -71,18 +70,12 @@ static void open_append2_file(xbt_log_append2_file_t data){
     //Split
     if(data->file)
       fclose(data->file);
-    char* pre=xbt_strdup(data->filename);
-    char* sep=strchr(pre,'%');
-    if(!sep)
-      sep=pre+strlen(pre);
-    const char* post    = sep + 1;
-    *sep                = '\0';
-    std::string newname = pre + std::to_string(data->count) + post;
+    std::string newname = data->filename;
+    size_t sep          = std::min(newname.find_first_of('%'), newname.size());
+    newname.replace(sep, 1, std::to_string(data->count));
     data->count++;
     data->file = fopen(newname.c_str(), "w");
-    if (data->file == nullptr)
-      xbt_die("Cannot open file: %s: %s", newname.c_str(), strerror(errno));
-    xbt_free(pre);
+    xbt_assert(data->file != nullptr, "Cannot open file: %s: %s", newname.c_str(), strerror(errno));
   }
 }
 
@@ -115,10 +108,10 @@ static void free_append2_(const s_xbt_log_appender_t* this_)
 //For split, replace %  in the file by the current count
 xbt_log_appender_t xbt_log_appender2_file_new(const char* arg, int roll)
 {
-  xbt_log_appender_t res      = xbt_new0(s_xbt_log_appender_t, 1);
-  res->do_append              = &append2_file;
-  res->free_                  = &free_append2_;
-  xbt_log_append2_file_t data = xbt_new0(struct xbt_log_append2_file_s, 1);
+  auto* res      = xbt_new0(s_xbt_log_appender_t, 1);
+  res->do_append = &append2_file;
+  res->free_     = &free_append2_;
+  auto* data     = xbt_new0(struct xbt_log_append2_file_s, 1);
   xbt_assert(arg);
   char* buf=xbt_strdup(arg);
   char* sep=strchr(buf,':');