--- /-\ wrote: 
> In an attempt to do varargs ok() without the magical __VA_ARGS__,
> I've come up with two little example solutions shown below.
> Improvements welcome.

Sorry, but curiosity got the better of me and I took a look at how
the very widely used and portable C++ ACE library does it.
The version below is very loosely based on the ACE library
ACE_ERROR() macro.

Note the funky (( and )) macro hackery in the ok's below. This is
almost as much fun as Perl golf. :-)

AFAICT, in the ACE version, instead of gr_save() below it calls a
setter method on a singleton "logger" object and instead of gr()
it calls the log method of the said singleton logger object.

/* Version very loosely based on ACE C++ library ACE_ERROR() --------- */
#include <stdio.h>
#include <stdarg.h>

#define ok(X)  \
  do { \
      gr_save(__FILE__, __LINE__); \
      gr X; \
  } while (0)

static const char* g_file;
static unsigned long g_line;

void gr_save(const char* file, unsigned long line) {
    g_file = file;
    g_line = line;
}

void gr(int cond, const char* fmt, ...) {
    va_list t;
    printf("cond:%d file:%s line:%lu, ", cond, g_file, g_line);
    va_start(t, fmt);
    vprintf(fmt, t);
    va_end(t);
}

int main() {
    ok(( 1==1, "test %s %d\n", "one eq one",  42 ));
    ok(( 0==1, "test %s %d\n", "zero eq one", 43 ));
    return 0;
}

/* ------------------------------------------------------------------- */

/-\



Find local movie times and trailers on Yahoo! Movies.
http://au.movies.yahoo.com

Reply via email to