|
Message-ID: <4E398D5A.6080207@gmail.com> Date: Wed, 03 Aug 2011 20:03:06 +0200 From: Luka Marčetić <paxcoder@...il.com> To: musl@...ts.openwall.com Subject: Re: cluts weekly reports On 08/03/2011 07:22 PM, Rich Felker wrote: >>> I'm still confused why >>> this can't be done in plain C, with the test parameters in C >>> structures that you loop over, much like some of the existing tests >>> (e.g. numeric). > Could you please give some concrete examples of what trouble you're > running into? I think you're looking for a very complex solution to a > very simple problem, but I can't know until you give me a better idea > of the specific problem. There are easy ways to handle this type of > thing, with solutions ranging from a macro that concatenates the right > type of format specifier into the message string to rolling your own > rudimentary message formatting function that takes a void pointer or > union type for the data to print. Ideally what I'd want is: fp(args) where fp is a function pointer to functions with different prototypes, and args are a number of arguments, each of an arbitrary type. Or at least: if (nr_args == 1) fp (*(type[0] *) arg[0]); else if (nr_args == 2) fp (*(type[0] *) arg[0], *(type[1] *) arg[1]); What I'm doing instead essentially is: if (fp == specific_function) specific_function(*(int*)arg[0], *(char **)arg[1]); else if (fp == another_function) another_function(*(size_t *)arg[0]); I'm tired of doing that. Every time I get around to that part, not only do I need to consider pro's and con's of using function pointers vs enums vs switch-cases, but also, my first instinct is always: How do I make a generic function caller. There's no such thing in C, so I compensate. > As for function pointers and the need for different numbers and types > of arguments, you can either pass a pointer to a structure that > contains all of the argument data (thereby always having the same > function signature taking a single void * argument) or have a separate > type field and cast the function pointer to the right function type > and make the call with the right parameters based on the stored type. That just dislocates above, and puts it into the function to be called with the arg pointer (and, don't forget, the function identifier). I can go to IRC if you want to see what the generator output is/should be, and based on what input. Luka
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.