[PATCH 1/4 v2] os/log: Pull LogMessageTypeVerbString out of LogVMessageVerb

Daniel Kurtz djkurtz at chromium.org
Sun Jul 31 21:21:20 PDT 2011


Also, optimize how the type and format strings are combined.

Signed-off-by: Daniel Kurtz <djkurtz at chromium.org>
---
 os/log.c |  111 ++++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 62 insertions(+), 49 deletions(-)

diff --git a/os/log.c b/os/log.c
index 4a310e6..06ae027 100644
--- a/os/log.c
+++ b/os/log.c
@@ -165,6 +165,9 @@ asm (".desc ___crashreporter_info__, 0x10");
 #ifndef X_NOT_IMPLEMENTED_STRING
 #define X_NOT_IMPLEMENTED_STRING	"(NI)"
 #endif
+#ifndef X_NONE_STRING
+#define X_NONE_STRING                   ""
+#endif
 
 /*
  * LogInit is called to start logging to a file.  It is also called (with
@@ -323,58 +326,68 @@ LogWrite(int verb, const char *f, ...)
     va_end(args);
 }
 
-void
-LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
+/* Returns the Message Type string to prepend to a logging message, or NULL
+ * if the message will be dropped due to insufficient verbosity. */
+static const char*
+LogMessageTypeVerbString(MessageType type, int verb)
 {
-    const char *s  = X_UNKNOWN_STRING;
-    char tmpBuf[1024];
-
-    /* Ignore verbosity for X_ERROR */
-    if (logVerbosity >= verb || logFileVerbosity >= verb || type == X_ERROR) {
-	switch (type) {
-	case X_PROBED:
-	    s = X_PROBE_STRING;
-	    break;
-	case X_CONFIG:
-	    s = X_CONFIG_STRING;
-	    break;
-	case X_DEFAULT:
-	    s = X_DEFAULT_STRING;
-	    break;
-	case X_CMDLINE:
-	    s = X_CMDLINE_STRING;
-	    break;
-	case X_NOTICE:
-	    s = X_NOTICE_STRING;
-	    break;
-	case X_ERROR:
-	    s = X_ERROR_STRING;
-	    if (verb > 0)
-		verb = 0;
-	    break;
-	case X_WARNING:
-	    s = X_WARNING_STRING;
-	    break;
-	case X_INFO:
-	    s = X_INFO_STRING;
-	    break;
-	case X_NOT_IMPLEMENTED:
-	    s = X_NOT_IMPLEMENTED_STRING;
-	    break;
-	case X_UNKNOWN:
-	    s = X_UNKNOWN_STRING;
-	    break;
-	case X_NONE:
-	    s = NULL;
-	    break;
-	}
+    if (type == X_ERROR)
+	verb = 0;
+
+    if (logVerbosity < verb && logFileVerbosity < verb)
+	return NULL;
 
-        /* if s is not NULL we need a space before format */
-        snprintf(tmpBuf, sizeof(tmpBuf), "%s%s%s", s ? s : "",
-                                                   s ? " " : "",
-                                                   format);
-        LogVWrite(verb, tmpBuf, args);
+    switch (type) {
+    case X_PROBED:
+	return X_PROBE_STRING;
+    case X_CONFIG:
+	return  X_CONFIG_STRING;
+    case X_DEFAULT:
+	return  X_DEFAULT_STRING;
+    case X_CMDLINE:
+	return X_CMDLINE_STRING;
+    case X_NOTICE:
+	return X_NOTICE_STRING;
+    case X_ERROR:
+	return X_ERROR_STRING;
+    case X_WARNING:
+	return X_WARNING_STRING;
+    case X_INFO:
+	return X_INFO_STRING;
+    case X_NOT_IMPLEMENTED:
+	return X_NOT_IMPLEMENTED_STRING;
+    case X_UNKNOWN:
+	return X_UNKNOWN_STRING;
+    case X_NONE:
+	return X_NONE_STRING;
     }
+    return X_UNKNOWN_STRING;
+}
+
+void
+LogVMessageVerb(MessageType type, int verb, const char *format, va_list args)
+{
+    const char *type_str;
+    char tmpFormat[1024];
+    char *tmpFormat_end = &tmpFormat[sizeof(tmpFormat)];
+    char *p = tmpFormat;
+    int left;
+
+    type_str = LogMessageTypeVerbString(type, verb);
+    if (!type_str)
+	return;
+
+    /* if type_str is not "", prepend it, and ' ', to format */
+    left = tmpFormat_end - p;
+    if (strlen(type_str))
+	p += snprintf(p, left, "%s ", type_str);
+
+    /* if still room in tmpBuf copy as much of format as will fit */
+    left = tmpFormat_end - p;
+    if (left > 1)
+	snprintf(p, left, "%s", format);
+
+    LogVWrite(verb, tmpFormat, args);
 }
 
 /* Log message with verbosity level specified. */
-- 
1.7.3.1



More information about the xorg-devel mailing list