1/*
2 * = = == === ===== ======== ============= =====================
3 * == pt::rde (critcl) - Data Structures - PARAM architectural state.
4 */
5
6#include <util.h>  /* Allocation utilities */
7
8/*
9 * = = == === ===== ======== ============= =====================
10 */
11
12#ifdef RDE_TRACE
13typedef struct F_STACK {
14    const char*     str;
15    struct F_STACK* down;
16} F_STACK;
17
18static F_STACK* top   = 0;
19static int      level = 0;
20
21static void
22push (const char* str)
23{
24    F_STACK* new = ALLOC (F_STACK);
25    new->str = str;
26    new->down = top;
27    top = new;
28    level += 4;
29}
30
31static void
32pop (void)
33{
34    F_STACK* next = top->down;
35    level -= 4;
36    ckfree ((char*)top);
37    top = next;
38}
39
40static void
41indent (void)
42{
43    int i;
44    for (i = 0; i < level; i++) {
45	fwrite(" ", 1, 1, stdout);
46	fflush           (stdout);
47    }
48
49    if (top) {
50	fwrite(top->str, 1, strlen(top->str), stdout);
51	fflush                               (stdout);
52    }
53
54    fwrite(" ", 1, 1, stdout);
55    fflush           (stdout);
56}
57
58SCOPE void
59trace_enter (const char* fun)
60{
61    push (fun);
62    indent();
63    fwrite("ENTER\n", 1, 6, stdout);
64    fflush                 (stdout);
65}
66
67/*
68 * We may trace large data structures (AST!)
69 */
70static char msg [1024*1024];
71
72SCOPE void
73trace_return (const char *pat, ...)
74{
75    int len;
76    va_list args;
77
78    indent();
79    fwrite("RETURN = ", 1, 9, stdout);
80    fflush                   (stdout);
81
82    va_start(args, pat);
83    len = vsprintf(msg, pat, args);
84    va_end(args);
85
86    msg[len++] = '\n';
87    msg[len] = '\0';
88
89    fwrite(msg, 1, len, stdout);
90    fflush             (stdout);
91
92    pop();
93}
94
95SCOPE void
96trace_printf (const char *pat, ...)
97{
98    int len;
99    va_list args;
100
101    indent();
102
103    va_start(args, pat);
104    len = vsprintf(msg, pat, args);
105    va_end(args);
106
107    msg[len++] = '\n';
108    msg[len] = '\0';
109
110    fwrite(msg, 1, len, stdout);
111    fflush             (stdout);
112}
113
114SCOPE void
115trace_printf0 (const char *pat, ...)
116{
117    int len;
118    va_list args;
119
120    va_start(args, pat);
121    len = vsprintf(msg, pat, args);
122    va_end(args);
123
124    msg[len++] = '\n';
125    msg[len] = '\0';
126
127    fwrite(msg, 1, len, stdout);
128    fflush             (stdout);
129}
130
131#endif
132
133/*
134 * = = == === ===== ======== ============= =====================
135 */
136
137
138/*
139 * local Variables:
140 * mode: c
141 * c-basic-offset: 4
142 * fill-column: 78
143 * End:
144 */
145