Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
And now, try to compile before commiting in order to not commit invalid code (sorry)
[simgrid.git] / src / xbt / xbt_log_layout_simple.c
index 2a84a5d..8aea05b 100644 (file)
@@ -7,6 +7,7 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include "portable.h" /* execinfo when available */
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "xbt/synchro.h" /* xbt_thread_name */
 
 extern const char *xbt_log_priority_names[7];
 
+/* only used after the format using: we suppose that the buffer is big enough to display our data */
+#define check_overflow \
+  if (p-ev->buffer > XBT_LOG_BUFF_SIZE) { /* buffer overflow */ \
+     p=ev->buffer + XBT_LOG_BUFF_SIZE - strlen(" >> OUTPUT TRUNCATED <<\n"); \
+     p+=sprintf(p," >> OUTPUT TRUNCATED <<\n"); \
+  } 
 
-static char *xbt_log_layout_simple_doit(xbt_log_layout_t l,
-                                       xbt_log_event_t ev, 
-                                       const char *fmt) {
-  static char res[1024];
+static void xbt_log_layout_simple_doit(xbt_log_layout_t l,
+                                      xbt_log_event_t ev, 
+                                      const char *fmt) {
   static double begin_of_time = -1;
   char *p;  
 
@@ -32,32 +38,32 @@ static char *xbt_log_layout_simple_doit(xbt_log_layout_t l,
   if (begin_of_time<0) 
     begin_of_time=gras_os_time();
 
-  p = res;
-  p += sprintf(res,"[");;
+  p = ev->buffer;
+  p += snprintf(p,XBT_LOG_BUFF_SIZE-(p-ev->buffer),"[");
+
   /* Display the proc info if available */
   if(strlen(xbt_procname()))
-    p += sprintf(p,"%s:%s:(%d) ", 
+    p += snprintf(p,XBT_LOG_BUFF_SIZE-(p-ev->buffer),"%s:%s:(%d) ", 
                 gras_os_myname(), xbt_procname(),(*xbt_getpid)());
 
   /* Display the date */
-  p += sprintf(p,"%f] ", gras_os_time()-begin_of_time);
-
+  p += snprintf(p,XBT_LOG_BUFF_SIZE-(p-ev->buffer),"%f] ", gras_os_time()-begin_of_time);
 
   /* Display file position if not INFO*/
   if (ev->priority != xbt_log_priority_info)
-    p += sprintf(p, "%s:%d: ", ev->fileName, ev->lineNum);
+    p += snprintf(p,XBT_LOG_BUFF_SIZE-(p-ev->buffer), "%s:%d: ", ev->fileName, ev->lineNum);
 
   /* Display category name */
-  p += sprintf(p, "[%s/%s] ", 
+  p += snprintf(p,XBT_LOG_BUFF_SIZE-(p-ev->buffer), "[%s/%s] ", 
               ev->cat->name, xbt_log_priority_names[ev->priority] );
 
   /* Display user-provided message */
-  p += vsprintf(p, fmt, ev->ap);
-
+  p += vsnprintf(p,XBT_LOG_BUFF_SIZE-(p-ev->buffer), fmt, ev->ap);
+  check_overflow;
+   
   /* End it */
-  p += sprintf(p, "\n");
-
-  return res;
+  p += snprintf(p,XBT_LOG_BUFF_SIZE-(p-ev->buffer), "\n");
+  check_overflow;
 }
 
 xbt_log_layout_t xbt_log_layout_simple_new(char *arg) {