#!/usr/bin/perl # debugdef.pl: avoid variadic debugging macros through automatic definitions # written by Thomas Orgis , placed in the public domain my $num = shift(@ARGV); print < */ #include "config.h" /* I could do that with variadic macros available: #define sdebug(me, s) fprintf(stderr, "[location] " s "\\n") #define debug(me, s, ...) fprintf(stderr, "[location] " s "\}n", __VA_ARGS__) Variadic macros are a C99 feature... Now just predefining stuff non-variadic for up to $num arguments. It's cumbersome to have them all with different names, though... */ #ifdef DEBUG #include EOT printdefs(1); print "#else\n"; printdefs(0); print "#endif\n"; for('warning', 'error') { print "\n/* $_ macros also here... */\n"; printdefs(1, $_); } sub printdefs { my $forreal = shift; my $type = shift; $type = 'debug' unless defined $type; my $i; while(++$i <= $num+1) { my @args, my $j; while(++$j < $i){ push(@args, chr(ord('a')+$j-1)); } unshift(@args, '') if(@args); print '#define '.$type.($i > 1 ? ($i-1) : '').'(s'; print join(', ', @args).') '; if($forreal){ print 'fprintf(stderr, "[" __FILE__ ":%i] '.$type.': " s "\n", __LINE__'.join(', ', @args).")\n"; } #else{ print "do {} while(0)\n"; } else{ print "\n"; } } }