Date: Mon, 21 May 2001 17:04:35 -0500 From: John Joseph Trammell <trammell@trammell.dyndns.org> To: freebsd-questions@freebsd.org Subject: Re: Question for C preprocessor gurus Message-ID: <20010521170435.A1610@mn.rr.com> In-Reply-To: <11895256.990483991242.JavaMail.imail@zero.excite.com>; from john_wilson100@excite.com on Mon, May 21, 2001 at 03:26:30PM -0700 References: <11895256.990483991242.JavaMail.imail@zero.excite.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, May 21, 2001 at 03:26:30PM -0700, John Wilson wrote: > In this program I'm writing, I need to define a simple list of errors, e.g. > > #define ERR_OK 0 > #define ERR_BAD 1 > #define ERR_AWFUL 2 > > and a function to return error descriptions: > > char *f(int error_no) > { > switch (error_no) > { > case ERR_OK: > return "OK"; > > case ERR_BAD: > return "Bad"; > > /* .... */ > } > } > > > There is nothing wrong with this code, except one thing - to add a new > error, I need to do it in two different places. I was therefore wondering > if it was possible to avoid adding the same strings twice through (ab)use of > the preprocessor. How about defining the error values/symbols/messages in a text file, then generating the .c and .h files dynamically? [ ~/test/errno-001 ] cat errors.txt 0 ERR_OK okily-dokily! 1 ERR_BAD abandon ship! 2 ERR_AWFUL my hovercraft is full of eels! [ ~/test/errno-001 ] cat gencode.pl use strict; my @lines; while (<>) { chomp; push @lines, $_ } # make .h file open(FOO,">foo.h") or die "Can't open foo.h for writing: $!"; for (@lines) { my ($num,$sym) = (split(' ',$_,3))[0,1]; print FOO "#define $sym $num\n"; } close FOO; # make .c file open(FOO,">foo.c") or die "Can't open foo.c for writing: $!"; print FOO "char *f(int e) { switch (e) {\n"; for (@lines) { my ($sym,$text) = (split(' ',$_,3))[1,2]; print FOO "\tcase $sym: return \"$text\";\n"; } print FOO "}}\n"; close FOO; [ ~/test/errno-001 ] perl -w gencode.pl errors.txt [ ~/test/errno-001 ] cat foo.h foo.c #define ERR_OK 0 #define ERR_BAD 1 #define ERR_AWFUL 2 char *f(int e) { switch (e) { case ERR_OK: return "okily-dokily!"; case ERR_BAD: return "abandon ship!"; case ERR_AWFUL: return "my hovercraft is full of eels! "; }} [ ~/test/errno-001 ] -- If you don't look at the fnord, it can't get you. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010521170435.A1610>