#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAGIC 0xAEAEAEAE
typedef int (*adder)(int);
int adderGeneric(int x)
{
int data = MAGIC;
return data + x;
}
void endOfAdderGeneric() {}
adder createAdder(int data)
{
char *start = (char *)adderGeneric;
char *end = (char *)endOfAdderGeneric;
char *result = (char *)malloc(end - start);
memcpy(result, start, end - start);
char *p;
for (p = result; ; ++p) {
int *q = (int *)p;
if (*q == MAGIC) {
*q = data;
break;
}
}
return (adder)result;
}
void deleteAdder(adder a)
{
char *m = (char *)a;
free(m);
}
int main()
{
adder add3 = createAdder(3);
adder add5 = createAdder(5);
printf("%d %d\n", add3(10), add5(10));
deleteAdder(add3);
deleteAdder(add5);
return 0;
}