// a simple C debug mechanism
#define _itoa(x) _str(x)
#define _str(x) #x
#define _ul(n,s,l,r) "\e[3"#n"m"l"\e[9"#n";4m" s "\e[;3"#n"m"r"\e[m"
#define _hl(n,s,l,r) "\e[3"#n"m"l"\e[9"#n"m" s "\e[;3"#n"m"r"\e[m"
#define _hlstr _ul(5,"%s","“","”")
#define _hlpath _ul(4,"%s","“","”")
#define _hlvar(v) _hl(2,v,"$","")

#if defined(_debug) || defined(_live_debug)
#	include <stdio.h>
#	define _var_pos "\e[34mat \e[94;4m" __FILE__ "#" _itoa(__LINE__) "\e[;34m:\e[m " 
#	ifdef _live_debug
#		define say(fmt,...) (debug ? fprintf(stderr, \
			_var_pos fmt "\n", __VA_ARGS__) : 0)
#	else
#		define say(fmt,...) fprintf(stderr, \
			_var_pos fmt "\n", __VA_ARGS__)
#	endif
#	define _var_expr(name,code,prefix,suffix) _var_pos "\e[1m" name "\e[m \e[35m= \e[35m" \
		prefix "\e[95;4m" "%" #code "\e[24;35m" suffix "\e[m\n"
#	define var(v) fprintf(stderr, _Generic ((v),      \
			char*         : _var_expr(#v,s,"“","”"),     \
			const char*   : _var_expr(#v,s,"",""),     \
			char          : _var_expr(#v,c,"‘","’"),      \
			signed   char : _var_expr(#v,hhi,"","i"),     \
			unsigned char : _var_expr(#v,hhu,"","u"),     \
			signed   short: _var_expr(#v,hi,"","I"),      \
			unsigned short: _var_expr(#v,hu,"","U"),      \
			signed   int  : _var_expr(#v,i,"","I"),       \
			unsigned int  : _var_expr(#v,u,"","U"),       \
			signed   long : _var_expr(#v,li,"","L"),      \
			unsigned long : _var_expr(#v,lu,"","UL"),      \
			signed   long long : _var_expr(#v,lli,"","LL"),\
			unsigned long long : _var_expr(#v,llu,"","ULL"),\
			default       : _var_expr(#v,p,"[","]")), v)
#else
#	define say(...) 
#	define var(v)
#endif
