C-Debug package, possible problems depending on program structure.

Kevin Szabo ksbszabo at wateng.UUCP
Wed Jan 23 10:39:26 AEST 1985


After reading Hugh's article I realized that my bug report/query should
have gone into this news group as well. And so here it is.
--------

This bug affects users of Fred Fish's C Debugging Package.

You may note that all of Fred's macros of the DBUG_X variety (x=1,2,3,4..)
have the form:

#define	DBUG_2( keyword, format ) \
	if(_db_on) {_dp_printf_( __LINE__, keyword, format );}


In the very rare case of the following usage, the `else' clause will incorrectly
bind to the `if(_db_on)' provided in the macro.

	if( some_thing_worth_noting_happens )
		DBUG_2( "interesting", "info" );
	else
		do the normal thing;

Admittedly this program structure should really never occur, but it could
surprise someone someday. The fix is to enclose the macro's in another
set of {}.

#define	DBUG_2( keyword, format ) \
	{if(_db_on) {_dp_printf_( __LINE__, keyword, format );};}


I like many of the idea's in Fred's package and I will probably incorporate
them into my own runtime macro's. One thing I would like to know is:
Does anybody have a nice way of handling variable length argument lists
to CPP?  Since my variable names are usually meaningful I would like
a macro that uses the variable names to create the format string. 
Thus I could do the following...

	int	blood, sweat; float tears;
	......
	DBUG( LEVEL, "churchill", "%d,%d,%f", blood, sweat, tears );

Ideally the macro would change all this to

	if( debug & LEVEL ) { if( keyword("churchill) )
				printf(" blood =%d, sweat= %d, tears= %f",....);


	(I use the bit vector LEVEL to select various areas of the package
	 to be elegible for debugging).

	The only thing I have been able to come up with is the following HACK(!)

	DBUG( LEVEL, "keyword", "fmt", ( variable, argument, list ));

#define	DBUG( level, key, fmt, args ) {\
		extern DebugLevel;\
		if( DebugLevel & level ) {\
			DebugStoreStrings( key, fmt,_LINE_, _FILE_,"args" );\
			DebugPassValues args;\
		}\
	}

	Of course DebugPassValues() has to look at the format strings
	and use VARARGS stuff to decode its argument list.

	Does the extra set of parantheses used to fool CPP into thinking that
	there is only one set of arguments really gross anybody out?
	Is it portable at all?  Especially the call to DebugPassValues,
	which requires CPP to retain the parantheses and thus create a valid
	function call?

					Kevin
-- 
Kevin Szabo  watmath!wateng!ksbszabo (U of Waterloo VLSI Group, Waterloo Ont.)



More information about the Comp.lang.c mailing list