Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Avoid (almost) duplicated code in xbt_log_layout_*.
[simgrid.git] / src / xbt / xbt_log_layout_format.c
index 67ab93d..d8d39e0 100644 (file)
@@ -1,6 +1,6 @@
 /* layout_simple - a dumb log layout                                        */
 
-/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2007-2011. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -18,37 +18,6 @@ extern const char *xbt_log_priority_names[8];
 
 static double format_begin_of_time = -1;
 
-#define append(data,letter) \
-  do { \
-    if (precision == -1 && length == -1) { \
-      tmp = bprintf("%" letter, data); \
-    } else if (precision == -1) { \
-      sprintf(tmpfmt,"%%%d" letter,length); \
-      tmp = bprintf(tmpfmt, data); \
-      length = -1; \
-    } else if (length == -1) { \
-      tmp = bprintf("%.*" letter, precision, data);\
-      precision = -1; \
-    } else { \
-      sprintf(tmpfmt,"%%%d.*" letter,length); \
-      tmp = bprintf(tmpfmt, precision, data); \
-      length = precision = -1; \
-    } \
-    xbt_strbuff_append(buff,tmp);\
-    free(tmp); \
-  } while (0)
-
-#define append_string(data) append(data, "s")
-#define append_int(data)    append(data, "d")
-#define append_double(data) append(data, "f")
-
-#define append2(fmt,elm,elm2)                                         \
-  do {                                                               \
-    xbt_strbuff_append(buff, tmp=bprintf(fmt,elm,elm2));          \
-    free(tmp);                                                    \
-    precision = -1;                                               \
-  } while (0)
-
 #define ERRMSG "Unknown %%%c sequence in layout format (%s).\nKnown sequences:\n"                       \
   "  what:        %%m: user message  %%c: log category  %%p: log priority\n"                      \
   "  where:\n"                                                                                    \
@@ -58,155 +27,12 @@ static double format_begin_of_time = -1;
   "  when:        %%d: date          %%r: app. age\n"                                             \
   "  other:       %%%%: %%             %%n: new line      %%e: plain space\n"
 
-
-static void xbt_log_layout_format_dynamic(xbt_log_layout_t l,
-                                          xbt_log_event_t ev,
-                                          const char *fmt,
-                                          xbt_log_appender_t app)
-{
-  xbt_strbuff_t buff = xbt_strbuff_new();
-  char tmpfmt[50];
-  int precision = -1;
-  int length = -1;
-  char *q = l->data;
-  char *tmp;
-  char *tmp2;
-
-  while (*q != '\0') {
-    if (*q == '%') {
-      q++;
-    handle_modifier:
-      switch (*q) {
-      case '\0':
-        fprintf(stderr, "Layout format (%s) ending with %%\n",
-                (char *) l->data);
-        abort();
-      case '%':
-        xbt_strbuff_append(buff, "%");
-        break;
-      case 'n':                /* platform-dependant line separator (LOG4J compliant) */
-        xbt_strbuff_append(buff, "\n");
-        break;
-      case 'e':                /* plain space (SimGrid extension) */
-        xbt_strbuff_append(buff, " ");
-        break;
-
-      case '.':                /* precision specifyier */
-        q++;
-        sscanf(q, "%d", &precision);
-        q += (precision>9?2:1);
-        goto handle_modifier;
-
-      case '0':
-      case '1':
-      case '2':
-      case '3':
-      case '4':
-      case '5':
-      case '6':
-      case '7':
-      case '8':
-      case '9': /* length modifier */
-        sscanf(q, "%d", &length);
-        q += (length>9?2:1);
-        goto handle_modifier;
-
-      case 'c':                /* category name; LOG4J compliant
-                                   should accept a precision postfix to show the hierarchy */
-        append_string(ev->cat->name);
-        break;
-      case 'p':                /* priority name; LOG4J compliant */
-        append_string(xbt_log_priority_names[ev->priority]);
-        break;
-
-      case 'h':                /* host name; SimGrid extension */
-        append_string(gras_os_myname());
-        break;
-      case 't':                /* thread name; LOG4J compliant */
-        append_string(xbt_thread_self_name());
-        break;
-      case 'P':                /* process name; SimGrid extension */
-        append_string(xbt_procname());
-        break;
-      case 'i':                /* process PID name; SimGrid extension */
-        append_int((*xbt_getpid) ());
-        break;
-
-      case 'F':                /* file name; LOG4J compliant */
-        append_string(ev->fileName);
-        break;
-      case 'l':                /* location; LOG4J compliant */
-        append2("%s:%d", ev->fileName, ev->lineNum);
-        precision = -1;         /* Ignored */
-        break;
-      case 'L':                /* line number; LOG4J compliant */
-        append_int(ev->lineNum);
-        break;
-      case 'M':                /* method (ie, function) name; LOG4J compliant */
-        append_string(ev->functionName);
-        break;
-      case 'b':                /* backtrace; called %throwable in LOG4J */
-      case 'B':                /* short backtrace; called %throwable{short} in LOG4J */
-#if defined(HAVE_EXECINFO_H) && defined(HAVE_POPEN) && defined(ADDR2LINE)
-        {
-          xbt_ex_t e;
-          int i;
-
-          e.used = backtrace((void **) e.bt, XBT_BACKTRACE_SIZE);
-          e.bt_strings = NULL;
-          e.msg = NULL;
-          e.remote = 0;
-          xbt_backtrace_current(&e);
-          if (*q == 'B') {
-            append_string(e.bt_strings[2] + 8);
-          } else {
-            for (i = 2; i < e.used; i++) {
-              append_string(e.bt_strings[i] + 8);
-              xbt_strbuff_append(buff, "\n");
-            }
-          }
-
-          xbt_ex_free(e);
-        }
-#else
-        append_string("(no backtrace on this arch)");
-#endif
-        break;
-
-      case 'd':                /* date; LOG4J compliant */
-        append_double(gras_os_time());
-        break;
-      case 'r':                /* application age; LOG4J compliant */
-        append_double(gras_os_time() - format_begin_of_time);
-        break;
-
-      case 'm':                /* user-provided message; LOG4J compliant */
-        tmp2 = bvprintf(fmt, ev->ap_copy);
-        append_string(tmp2);
-        free(tmp2);
-        break;
-
-      default:
-        fprintf(stderr, ERRMSG, *q, (char *) l->data);
-        abort();
-      }
-      q++;
-    } else {
-      char tmp2[2];
-      tmp2[0] = *(q++);
-      tmp2[1] = '\0';
-      xbt_strbuff_append(buff, tmp2);
-    }
-  }
-  app->do_append(app, buff->data);
-  xbt_strbuff_free(buff);
-}
+#define XBT_LOG_BUFF_SIZE (ev->buffer_size)
 
 #undef check_overflow
 #define check_overflow \
   if (p - ev->buffer >= XBT_LOG_BUFF_SIZE) { /* buffer overflow */ \
-    xbt_log_layout_format_dynamic(l,ev,msg_fmt,app);               \
-    return;                                                        \
+    return 0;                                                      \
   } else ((void)0)
 
 #define show_it(data,letter) \
@@ -235,10 +61,9 @@ static void xbt_log_layout_format_dynamic(xbt_log_layout_t l,
 #define show_int(data)    show_it(data, "d")
 #define show_double(data) show_it(data, "f")
 
-static void xbt_log_layout_format_doit(xbt_log_layout_t l,
-                                       xbt_log_event_t ev,
-                                       const char *msg_fmt,
-                                       xbt_log_appender_t app)
+static int xbt_log_layout_format_doit(xbt_log_layout_t l,
+                                      xbt_log_event_t ev,
+                                      const char *msg_fmt)
 {
   char *p, *q;
   char tmpfmt[50];
@@ -405,7 +230,8 @@ static void xbt_log_layout_format_doit(xbt_log_layout_t l,
     }
   }
   *p = '\0';
-  app->do_append(app, ev->buffer);
+
+  return 1;
 }
 
 static void xbt_log_layout_format_free(xbt_log_layout_t lay)