Re: elog() proposal

From: Mike Mascari <mascarm(at)mascari(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>, Peter Eisentraut <peter_e(at)gmx(dot)net>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: elog() proposal
Date: 2002-02-23 10:03:39
Message-ID: 3C7768FB.91E6C6D8@mascari.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Tom Lane wrote:
>
> Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us> writes:
> > OK, so elog(ERROR, ...) and PGError(msg, ...) would be the same. Makes
> > sense. Should we consider hiding these in macros so they really still
> > call elog(ERROR, ...) for backward compatiblity?
>
> I would love to make them macros, but I don't know a portable way to
> create macros with variable numbers of arguments. Do you feel like
> writing double parens?
>
> PGERROR((msg, ...))

I'm not sure about complete portability, but the trick that I use works
under both Linux/gcc and Windows/Visual C++. It is something like this:

#define elog mkError(__FILE__, __LINE__)

I then have the following prototypes:

----

typedef void (*throwError_ptr) (const char *message, ...);
throwError_ptr mkError(const char *file, int line);
void throwError(const char *message, ...);

-----

The implementation looks like:

throwError_ptr mkError(const char *file, int line) {

sprintf(global_message, "File: %s\nLine: %i\n", file, line);
return (throwError)

}

void throwError(const char *message, ...) {

va_list arg_ptr;
char buffer[MAX_MESSAGE];

va_start(arg_ptr, message);
vsnprintf(buffer, sizeof(buffer), message, arg_ptr);
va_end(arg_ptr);

fprintf(stderr, "Error: %s\n%s", global_message, message);

}

-----

So, I can write:

...
if (i < 0) {

elog("Illegal index specified: %i", i);

}
...

which becomes

mkError(__FILE__, __LINE__) ("Illegal index specified: %i", i);

Shouldn't that be portable?

Mike Mascari
mascarm(at)mascari(dot)com

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Bradley Baetz 2002-02-23 10:21:07
Previous Message Oleg Bartunov 2002-02-23 08:46:59 Re: new module contrib/tree for 7.2 ?