summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/pt/rde_critcl/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/modules/pt/rde_critcl/util.c')
-rw-r--r--tcllib/modules/pt/rde_critcl/util.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/tcllib/modules/pt/rde_critcl/util.c b/tcllib/modules/pt/rde_critcl/util.c
new file mode 100644
index 0000000..2eb0454
--- /dev/null
+++ b/tcllib/modules/pt/rde_critcl/util.c
@@ -0,0 +1,145 @@
+/*
+ * = = == === ===== ======== ============= =====================
+ * == pt::rde (critcl) - Data Structures - PARAM architectural state.
+ */
+
+#include <string.h>
+#include <util.h> /* Allocation utilities */
+
+/*
+ * = = == === ===== ======== ============= =====================
+ */
+
+#ifdef RDE_TRACE
+typedef struct F_STACK {
+ const char* str;
+ struct F_STACK* down;
+} F_STACK;
+
+static F_STACK* top = 0;
+static int level = 0;
+
+static void
+push (const char* str)
+{
+ F_STACK* new = ALLOC (F_STACK);
+ new->str = str;
+ new->down = top;
+ top = new;
+ level += 4;
+}
+
+static void
+pop (void)
+{
+ F_STACK* next = top->down;
+ level -= 4;
+ ckfree ((char*)top);
+ top = next;
+}
+
+static void
+indent (void)
+{
+ int i;
+ for (i = 0; i < level; i++) {
+ fwrite(" ", 1, 1, stdout);
+ fflush (stdout);
+ }
+
+ if (top) {
+ fwrite(top->str, 1, strlen(top->str), stdout);
+ fflush (stdout);
+ }
+
+ fwrite(" ", 1, 1, stdout);
+ fflush (stdout);
+}
+
+SCOPE void
+trace_enter (const char* fun)
+{
+ push (fun);
+ indent();
+ fwrite("ENTER\n", 1, 6, stdout);
+ fflush (stdout);
+}
+
+/*
+ * We may trace large data structures (AST!)
+ */
+static char msg [1024*1024];
+
+SCOPE void
+trace_return (const char *pat, ...)
+{
+ int len;
+ va_list args;
+
+ indent();
+ fwrite("RETURN = ", 1, 9, stdout);
+ fflush (stdout);
+
+ va_start(args, pat);
+ len = vsprintf(msg, pat, args);
+ va_end(args);
+
+ msg[len++] = '\n';
+ msg[len] = '\0';
+
+ fwrite(msg, 1, len, stdout);
+ fflush (stdout);
+
+ pop();
+}
+
+SCOPE void
+trace_printf (const char *pat, ...)
+{
+ int len;
+ va_list args;
+
+ indent();
+
+ va_start(args, pat);
+ len = vsprintf(msg, pat, args);
+ va_end(args);
+
+ msg[len++] = '\n';
+ msg[len] = '\0';
+
+ fwrite(msg, 1, len, stdout);
+ fflush (stdout);
+}
+
+SCOPE void
+trace_printf0 (const char *pat, ...)
+{
+ int len;
+ va_list args;
+
+ va_start(args, pat);
+ len = vsprintf(msg, pat, args);
+ va_end(args);
+
+ msg[len++] = '\n';
+ msg[len] = '\0';
+
+ fwrite(msg, 1, len, stdout);
+ fflush (stdout);
+}
+
+#endif
+
+/*
+ * = = == === ===== ======== ============= =====================
+ */
+
+
+/*
+ * local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */