1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/* $Id: dump.c,v 4.5 2011/01/02 19:17:15 tom Exp $
*
* useful dumps for cproto
*/
#include <trace.h>
#include <dump.h>
static char *whatFuncDefStyle(FuncDefStyle func_def);
static char *flagsDeclSpec(int flags);
#define PAD char pad[80]; sprintf(pad, "%-*s", level * 3, ".")
#ifndef DEBUG
#define DEBUG 0
#endif
#if DEBUG > 1
#define SHOW_CMTS(p) Trace p;
#else
#define SHOW_CMTS(p)
#endif
static char *
whatFuncDefStyle(FuncDefStyle func_def) /* style of function definition */
{
switch (func_def) {
case FUNC_NONE:
return "FUNC_NONE";
case FUNC_TRADITIONAL:
return "FUNC_TRADITIONAL";
case FUNC_ANSI:
return "FUNC_ANSI";
case FUNC_BOTH:
return "FUNC_BOTH";
}
return "?";
}
void
dump_parameter(Parameter * p, int level)
{
dump_declarator(p->declarator, level + 1);
dump_decl_spec(&(p->decl_spec), level + 1);
}
void
dump_param_list(ParameterList * p, int level)
{
struct parameter *q;
for (q = p->first; q != 0; q = q->next) {
dump_parameter(q, level);
}
}
void
dump_declarator(Declarator * d, int level)
{
PAD;
Trace("%sdeclarator %p\n", pad, d);
Trace("%s name /%s/\n", pad, d->name);
Trace("%s text /%s/\n", pad, d->text);
SHOW_CMTS(("%s begin %ld\n", pad, d->begin))
SHOW_CMTS(("%s begin_comment %ld\n", pad, d->begin_comment))
SHOW_CMTS(("%s end_comment %ld\n", pad, d->end_comment))
Trace("%s func_def %s\n", pad, whatFuncDefStyle(d->func_def));
#if DEBUG > 1
if (d->func_def != FUNC_NONE) {
Trace("%s >PARAMS of %p\n", pad, d);
dump_param_list(&(d->params), level + 1);
}
#endif
Trace("%s pointer %s\n", pad, d->pointer ? "YES" : "NO");
if (d->head != 0 && d != d->head) {
Trace("%s >HEAD of %p\n", pad, d);
dump_declarator(d->head, level + 1);
}
if (d->func_stack != 0) {
Trace("%s >FUNC_STACK of %p\n", pad, d);
dump_declarator(d->func_stack, level + 1);
}
if (d->next != 0) {
Trace("%s >NEXT of %p\n", pad, d);
dump_declarator(d->next, level + 1);
}
}
static char *
flagsDeclSpec(int flags)
{
static char temp[100];
static struct {
int mask;
char *text;
} table[] = {
{
DS_EXTERN, "extern"
},
{
DS_STATIC, "static"
},
{
DS_CHAR, "char"
},
{
DS_SHORT, "short"
},
{
DS_FLOAT, "float"
},
{
DS_JUNK, "junk"
},
};
unsigned j;
*temp = 0;
for (j = 0; j < sizeof(table) / sizeof(table[0]); j++) {
if (flags & table[j].mask) {
if (*temp)
(void) strcat(temp, ",");
(void) strcat(temp, table[j].text);
}
}
return temp;
}
void
dump_decl_spec(DeclSpec * d, int level)
{
PAD;
Trace("%sdecl_spec %p\n", pad, d);
Trace("%s flags %s\n", pad, flagsDeclSpec(d->flags));
Trace("%s text /%s/\n", pad, d->text);
SHOW_CMTS(("%s begin %ld\n", pad, d->begin))
}
|