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