#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
 */
