#!/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"; foreach my $t ('warning', 'error', 'ereturn') { print "\n/* $t macros also here... */\n"; print "#ifndef NO_".uc($t)."\n"; printdefs(1, $t); print "#else\n"; printdefs(0, $t); print "#endif\n"; } sub printdefs { my $forreal = shift; my $type = shift; $type = 'debug' unless defined $type; my $i; my $pre = ''; my $post = ''; my $rv = ''; my $notreal = ''; if($type eq 'ereturn') { $pre = 'do{ '; $post = '; return rv; }while(0)'; $rv = 'rv, '; $notreal = 'return rv'; } 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) : '').'('.$rv.'s'; print join(', ', @args).') '; if($forreal){ print $pre.'fprintf(stderr, "[" __FILE__ ":%i] '.$type.': " s "\n", __LINE__'.join(', ', @args).")$post\n"; } #else{ print "do {} while(0)\n"; } else{ print "$notreal\n"; } } }