#include #include #include static const char *table[] = { "bob", NULL }; static int find_name(char *cand, int (*sel)(char *name, void *P), void *P) { int i; for( i = 0; table[i] != NULL; ++i ) { if( (strcmp(table[i], cand) == 0) && (sel == NULL || sel(cand, P)) ) { return( 1 ); } } return( 0 ); } void test(int parity) { char *spar = parity ? "odd" : "even"; int odd; static int is_odd(char *name, void *P) { int sel(char *name, void *P) { return( (strlen(name) & 1) == *(int *)P ); } return( find_name(name, sel, P) ); } odd = is_odd("bob", &parity); fprintf(stdout, "bob is %s%s\n", odd ? "" : "NOT ", spar); } void testw(int parity) { char *spar = parity ? "even" : "odd"; int odd; static int is_even(char *name, void *P) { int sel(char *name, void *P) { return( (strlen(name) & 1) != *(int *)P ); } return( find_name(name, sel, P) ); } odd = is_even("bob", &parity); fprintf(stdout, "bob is %s%s\n", odd ? "" : "NOT ", spar); } int main(int argc, char** argv) { int parity = argc > 1; test(parity); if ( argc > 2) { testw( parity); } return( 1 ); }