#if 1
#define INDENT_MAX 50
static const char __indent_string[INDENT_MAX+3] = "| | | | | | | | | | | | | | | | | | | | | | | | | \0\0\0";
static const char *indent = __indent_string + INDENT_MAX;
#define IN() INf("");
#define INf(fmt,args...) do{\
printk("%s,-< %s:%d " fmt "\n", indent, __FUNCTION__, __LINE__, ## args);\
if ((indent-2) >= __indent_string) indent-=2;\
} while(0)
#define OUT() OUTf("")
#define OUTp(ptr) OUTf("= %p",ptr)
#define OUTd(num) OUTf("= %d",num)
#define OUTf(fmt,args...) do{\
if (indent <= __indent_string+INDENT_MAX) indent+=2;\
printk("%s`-> %s:%d " fmt "\n", indent, __FUNCTION__, __LINE__, ## args);\
} while(0)
#endif
/* usage */
int foo()
{
int error;
IN();
error = 0;
OUTd(error);
return error;
}
int bar()
{
int error;
IN();
printk ("%scalling foo twice...\n", indent);
error = foo();
error = foo();
OUTd(error);
return error;
}
int baz()
{
int error;
IN();
error = bar();
error = bar();
OUTd(error);
return error;
}
/*
* the above would generate something like...
*
* ,-< baz:43
* | ,-< bar:31
* | | calling foo twice...
* | | ,-< foo:19
* | | `-> foo:24 = 0
* | | ,-< foo:19
* | | `-> foo:24 = 0
* | `-> bar:36 = 0
* | ,-< bar:31
* | | calling foo twice...
* | | ,-< foo:19
* | | `-> foo:24 = 0
* | | ,-< foo:19
* | | `-> foo:24 = 0
* | `-> bar:36 = 0
* `-> baz:48 = 0
*/