diff fluid-mnf/trace.c @ 311:9cecc930d78f

fluid-mnf: original source from TI, defenestrated line endings and rearranged directory structure, but no *.[ch] source file content changes yet
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 29 Feb 2020 05:36:07 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fluid-mnf/trace.c	Sat Feb 29 05:36:07 2020 +0000
@@ -0,0 +1,134 @@
+/******************************************************************************
+ * Generic tracing library
+ *
+ * Idea, design and coding by Mads Meisner-Jensen, mmj@ti.com
+ *
+ * $Id: trace.c 1.5 Fri, 11 Oct 2002 08:40:21 +0200 mmj $
+ *
+ ******************************************************************************/
+
+#include "trace.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+
+#define TRACE_MODS 2
+
+
+/******************************************************************************
+ * 
+ *****************************************************************************/
+
+static struct trace_s {
+    int spaces;    // number of spaces to indent per level
+    int level;     // current indentation level (private)
+    int enable;    // global trace enable/disable flag
+    FILE *fp;      // file descriptor of file to write traces to
+    int mask[TRACE_MODS];  // bitmask for each module
+} trace;
+
+int tr_init(int spaces, char *filename)
+{
+    trace.spaces = spaces;
+    trace.level = 0;
+    trace.enable = 1;
+    trace.fp = stdout;
+    memset(trace.mask, 0, sizeof(trace.mask));
+
+    if (filename != NULL && (trace.fp = fopen(filename, "w")) == NULL) {
+        return -1;
+    }
+    return 0;
+}
+
+int tr_mask(int mask)
+{
+    int module, old;
+
+    module = ((mask & TrModMask) >> 24) - 1;
+    if (module < 0 || module >= TRACE_MODS)
+        return -1;
+
+    old = trace.mask[module];
+    trace.mask[module] = mask & TrBitMask;
+
+    return old;
+}
+
+void tr_enable(int onoff)
+{
+    trace.enable = onoff;
+}
+
+// return current indentation if this trace type is enabled, otherwise
+// return zero.
+int tr_query(int mask)
+{
+    int module;
+
+    module = (mask & TrModMask) >> 24;
+    if (module < 0 || module >= TRACE_MODS)
+        return 0;
+
+    return (trace.mask[module] & (mask & TrBitMask) ?
+            trace.level * trace.spaces : 0);
+}
+
+extern void hexdump(const char *p, int size, unsigned int address, int unitsize);
+
+void tr_hexdump(int mask, const void *p, int size)
+{
+    unsigned int module;
+
+    module = mask & TrModMask;
+    mask   = mask & TrBitMask;
+
+    if ((mask & trace.mask[module >> 24]) == 0)
+        return;
+    
+    hexdump(p, size, 0, 1);
+}
+
+void tr(int mask, char *format, ...)
+{
+    va_list args;
+    unsigned int type, module;
+    int indent;
+    static char buf[256];
+    const char spaces[160 + 1] =
+        "                                        "
+        "                                        "
+        "                                        "
+        "                                        ";
+
+    if (!trace.enable)
+        return;
+
+    type   = mask & TrTypeMask;
+    module = mask & TrModMask;
+    mask   = mask & TrBitMask;
+
+    if ((mask & trace.mask[(module >> 24) - 1]) == 0)
+        return;
+
+    if (type == TrEnd)
+        trace.level--;
+
+    indent = (type == TrCont ? 0 : trace.level);
+
+    if (indent < 0 || indent > 40) {
+        indent = trace.level = 0;
+        fprintf(stderr, "WARNING: trace indent out of range!\n");
+    }
+    if (strlen(format) > 0) {
+        va_start(args, format);
+        vsprintf(buf, format, args);
+        indent *= trace.spaces;
+        fprintf(trace.fp, "%s%s", &spaces[sizeof(spaces) - 1 - indent], buf);
+        fflush(trace.fp);
+    }
+    if (type == TrBegin)
+        trace.level++;
+}