Simplify the print routines by using LST_FOREACH instead of Lst_ForEach

and inlining the small printing utility functions.
Create a function that can be used to produce printable representations
of flag words.
This commit is contained in:
Hartmut Brandt 2005-03-11 13:24:08 +00:00
parent d64ac531ac
commit c2d34cc331
3 changed files with 69 additions and 67 deletions

View file

@ -2288,80 +2288,55 @@ Suff_Init(void)
/********************* DEBUGGING FUNCTIONS **********************/
static int
SuffPrintName(void *s, void *dummy __unused)
{
printf("`%s' ", ((Suff *)s)->name);
return (0);
}
static int
SuffPrintSuff(void *sp, void *dummy __unused)
{
Suff *s = sp;
int flags;
int flag;
printf("# `%s' [%d] ", s->name, s->refCount);
flags = s->flags;
if (flags) {
fputs(" (", stdout);
while (flags) {
flag = 1 << (ffs(flags) - 1);
flags &= ~flag;
switch (flag) {
case SUFF_NULL:
printf("NULL");
break;
case SUFF_INCLUDE:
printf("INCLUDE");
break;
case SUFF_LIBRARY:
printf("LIBRARY");
break;
default:
break;
}
fputc(flags ? '|' : ')', stdout);
}
}
fputc('\n', stdout);
printf("#\tTo: ");
Lst_ForEach(&s->parents, SuffPrintName, (void *)NULL);
fputc('\n', stdout);
printf("#\tFrom: ");
Lst_ForEach(&s->children, SuffPrintName, (void *)NULL);
fputc('\n', stdout);
printf("#\tSearch Path: ");
Dir_PrintPath(&s->searchPath);
fputc('\n', stdout);
return (0);
}
static int
SuffPrintTrans(void *tp, void *dummy __unused)
{
GNode *t = tp;
printf("%-16s: ", t->name);
Targ_PrintType(t->type);
fputc('\n', stdout);
Lst_ForEach(&t->commands, Targ_PrintCmd, (void *)NULL);
fputc('\n', stdout);
return (0);
}
void
Suff_PrintAll(void)
{
const LstNode *ln;
const LstNode *tln;
const GNode *gn;
const Suff *s;
static const struct flag2str suff_flags[] = {
{ SUFF_INCLUDE, "INCLUDE" },
{ SUFF_LIBRARY, "LIBRARY" },
{ SUFF_NULL, "NULL" },
{ 0, NULL }
};
printf("#*** Suffixes:\n");
Lst_ForEach(&sufflist, SuffPrintSuff, (void *)NULL);
LST_FOREACH(ln, &sufflist) {
s = Lst_Datum(ln);
printf("# `%s' [%d] ", s->name, s->refCount);
if (s->flags != 0) {
printf(" ");
print_flags(stdout, suff_flags, s->flags);
}
printf("\n#\tTo: ");
LST_FOREACH(tln, &s->parents)
printf("`%s' ", ((const Suff *)Lst_Datum(tln))->name);
printf("\n#\tFrom: ");
LST_FOREACH(tln, &s->children)
printf("`%s' ", ((const Suff *)Lst_Datum(tln))->name);
printf("\n#\tSearch Path: ");
Dir_PrintPath(&s->searchPath);
printf("\n");
}
printf("#*** Transformations:\n");
Lst_ForEach(&transforms, SuffPrintTrans, (void *)NULL);
LST_FOREACH(ln, &transforms) {
gn = Lst_Datum(ln);
printf("%-16s: ", gn->name);
Targ_PrintType(gn->type);
printf("\n");
LST_FOREACH(tln, &gn->commands)
printf("\t%s\n", (const char *)Lst_Datum(tln));
printf("\n");
}
}
#ifdef DEBUG_SRC

View file

@ -292,3 +292,23 @@ eunlink(const char *file)
return (unlink(file));
}
/*
* Convert a flag word to a printable thing and print it
*/
void
print_flags(FILE *fp, const struct flag2str *tab, u_int flags)
{
int first = 1;
fprintf(fp, "(");
while (tab->str != NULL) {
if (flags & tab->flag) {
if (!first)
fprintf(fp, "|");
first = 0;
fprintf(fp, "%s", tab->str);
}
tab++;
}
fprintf(fp, ")");
}

View file

@ -42,9 +42,15 @@
#define util_h_b7020fdb
#include <sys/types.h>
#include <stdio.h>
#define CONCAT(a,b) a##b
struct flag2str {
u_int flag;
const char *str;
};
/*
* debug control:
* There is one bit per module. It is up to the module what debug
@ -90,5 +96,6 @@ char *estrdup(const char *);
void *emalloc(size_t);
void *erealloc(void *, size_t);
int eunlink(const char *);
void print_flags(FILE *, const struct flag2str *, u_int);
#endif /* util_h_b7020fdb */