#include <stdio.h>
/* Passing a function to itself */
/* Example 1 */
/* Choose a return type */
typedef int example1_t;
/* Establish a function type with no parameter specification */
typedef example1_t f_example1_any();
/* Establish the actual function type */
typedef example1_t f_example1(f_example1_any *, int, double);
/* You can declare the upcoming function */
f_example1 example1;
/* Definition */
example1_t example1(f_example1_any * f, int i, double d) {
/* Convert 'f' to the actual type */
f_example1 * func = f;
(void) i;
(void) d;
/* Simple check */
if (func == example1) {
puts("example1: Passed ourself in the street"); }
return 0;
}
/* Example 2 */
/* Choose a _unique_ return type */
typedef struct { int ret; } example2_t;
/* Establish a function type with no parameter specification */
typedef example2_t f_example2_any();
/* Establish the actual function type */
typedef example2_t f_example2(f_example2_any *, int, double);
/* You can declare the upcoming function */
f_example2 example2;
/* Definition */
example2_t example2(f_example2_any * f, int i, double d) {
example2_t result;
/* Convert 'f' to the actual type */
f_example2 * func = f;
(void) i;
(void) d;
/* Simple check */
if (func == example2) {
puts("example2: Passed ourself in the street"); }
return (result.ret = 0), result;
}
/* Example 3 */
/* Use a function pointer wrapper */
typedef struct s_example3 s_example3;
/* Establish the actual function type */
typedef int f_example3(s_example3 *, int, double);
/* Complete the object type */
struct s_example3 {
f_example3 * func;
};
/* You can declare the upcoming function */
f_example3 example3;
/* Definition */
int example3(s_example3 * f, int i, double d) {
(void) i;
(void) d;
/* Simple check */
if (f->func == example3) {
puts("example3: Passed ourself in the street"); }
return 0;
}
/* Tests */
int main(void) {
s_example3 example3_wrapper = { example3 };
example1(example1, 42, 3.14159);
example2(example2, 42, 3.14159);
example3(&example3_wrapper, 42, 3.14159);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovKiBQYXNzaW5nIGEgZnVuY3Rpb24gdG8gaXRzZWxmICovCgovKiBFeGFtcGxlIDEgKi8KCi8qIENob29zZSBhIHJldHVybiB0eXBlICovCnR5cGVkZWYgaW50IGV4YW1wbGUxX3Q7CgovKiBFc3RhYmxpc2ggYSBmdW5jdGlvbiB0eXBlIHdpdGggbm8gcGFyYW1ldGVyIHNwZWNpZmljYXRpb24gKi8KdHlwZWRlZiBleGFtcGxlMV90IGZfZXhhbXBsZTFfYW55KCk7CgovKiBFc3RhYmxpc2ggdGhlIGFjdHVhbCBmdW5jdGlvbiB0eXBlICovCnR5cGVkZWYgZXhhbXBsZTFfdCBmX2V4YW1wbGUxKGZfZXhhbXBsZTFfYW55ICosIGludCwgZG91YmxlKTsKCi8qIFlvdSBjYW4gZGVjbGFyZSB0aGUgdXBjb21pbmcgZnVuY3Rpb24gKi8KZl9leGFtcGxlMSBleGFtcGxlMTsKCi8qIERlZmluaXRpb24gKi8KZXhhbXBsZTFfdCBleGFtcGxlMShmX2V4YW1wbGUxX2FueSAqIGYsIGludCBpLCBkb3VibGUgZCkgewogICAgLyogQ29udmVydCAnZicgdG8gdGhlIGFjdHVhbCB0eXBlICovCiAgICBmX2V4YW1wbGUxICogZnVuYyA9IGY7CgogICAgKHZvaWQpIGk7CiAgICAodm9pZCkgZDsKICAgIC8qIFNpbXBsZSBjaGVjayAqLwogICAgaWYgKGZ1bmMgPT0gZXhhbXBsZTEpIHsKICAgICAgICBwdXRzKCJleGFtcGxlMTogUGFzc2VkIG91cnNlbGYgaW4gdGhlIHN0cmVldCIpOwogICAgICB9CiAgICByZXR1cm4gMDsKICB9CgovKiBFeGFtcGxlIDIgKi8KCi8qIENob29zZSBhIF91bmlxdWVfIHJldHVybiB0eXBlICovCnR5cGVkZWYgc3RydWN0IHsgaW50IHJldDsgfSBleGFtcGxlMl90OwoKLyogRXN0YWJsaXNoIGEgZnVuY3Rpb24gdHlwZSB3aXRoIG5vIHBhcmFtZXRlciBzcGVjaWZpY2F0aW9uICovCnR5cGVkZWYgZXhhbXBsZTJfdCBmX2V4YW1wbGUyX2FueSgpOwoKLyogRXN0YWJsaXNoIHRoZSBhY3R1YWwgZnVuY3Rpb24gdHlwZSAqLwp0eXBlZGVmIGV4YW1wbGUyX3QgZl9leGFtcGxlMihmX2V4YW1wbGUyX2FueSAqLCBpbnQsIGRvdWJsZSk7CgovKiBZb3UgY2FuIGRlY2xhcmUgdGhlIHVwY29taW5nIGZ1bmN0aW9uICovCmZfZXhhbXBsZTIgZXhhbXBsZTI7CgovKiBEZWZpbml0aW9uICovCmV4YW1wbGUyX3QgZXhhbXBsZTIoZl9leGFtcGxlMl9hbnkgKiBmLCBpbnQgaSwgZG91YmxlIGQpIHsKICAgIGV4YW1wbGUyX3QgcmVzdWx0OwogICAgLyogQ29udmVydCAnZicgdG8gdGhlIGFjdHVhbCB0eXBlICovCiAgICBmX2V4YW1wbGUyICogZnVuYyA9IGY7CgogICAgKHZvaWQpIGk7CiAgICAodm9pZCkgZDsKICAgIC8qIFNpbXBsZSBjaGVjayAqLwogICAgaWYgKGZ1bmMgPT0gZXhhbXBsZTIpIHsKICAgICAgICBwdXRzKCJleGFtcGxlMjogUGFzc2VkIG91cnNlbGYgaW4gdGhlIHN0cmVldCIpOwogICAgICB9CiAgICByZXR1cm4gKHJlc3VsdC5yZXQgPSAwKSwgcmVzdWx0OwogIH0KCi8qIEV4YW1wbGUgMyAqLwoKLyogVXNlIGEgZnVuY3Rpb24gcG9pbnRlciB3cmFwcGVyICovCnR5cGVkZWYgc3RydWN0IHNfZXhhbXBsZTMgc19leGFtcGxlMzsKCi8qIEVzdGFibGlzaCB0aGUgYWN0dWFsIGZ1bmN0aW9uIHR5cGUgKi8KdHlwZWRlZiBpbnQgZl9leGFtcGxlMyhzX2V4YW1wbGUzICosIGludCwgZG91YmxlKTsKCi8qIENvbXBsZXRlIHRoZSBvYmplY3QgdHlwZSAqLwpzdHJ1Y3Qgc19leGFtcGxlMyB7CiAgICBmX2V4YW1wbGUzICogZnVuYzsKICB9OwoKLyogWW91IGNhbiBkZWNsYXJlIHRoZSB1cGNvbWluZyBmdW5jdGlvbiAqLwpmX2V4YW1wbGUzIGV4YW1wbGUzOwoKLyogRGVmaW5pdGlvbiAqLwppbnQgZXhhbXBsZTMoc19leGFtcGxlMyAqIGYsIGludCBpLCBkb3VibGUgZCkgewoKICAgICh2b2lkKSBpOwogICAgKHZvaWQpIGQ7CiAgICAvKiBTaW1wbGUgY2hlY2sgKi8KICAgIGlmIChmLT5mdW5jID09IGV4YW1wbGUzKSB7CiAgICAgICAgcHV0cygiZXhhbXBsZTM6IFBhc3NlZCBvdXJzZWxmIGluIHRoZSBzdHJlZXQiKTsKICAgICAgfQogICAgcmV0dXJuIDA7CiAgfQoKLyogVGVzdHMgKi8KaW50IG1haW4odm9pZCkgewogICAgc19leGFtcGxlMyBleGFtcGxlM193cmFwcGVyID0geyBleGFtcGxlMyB9OwoKICAgIGV4YW1wbGUxKGV4YW1wbGUxLCA0MiwgMy4xNDE1OSk7CiAgICBleGFtcGxlMihleGFtcGxlMiwgNDIsIDMuMTQxNTkpOwogICAgZXhhbXBsZTMoJmV4YW1wbGUzX3dyYXBwZXIsIDQyLCAzLjE0MTU5KTsKCiAgICByZXR1cm4gMDsKICB9