#include <stdio.h>
#include <stdlib.h>
#define ACTION_OPEN_FILE 0
#define ACTION_WRITE_TO_STDOUT 1
typedef struct action_open_file
{
int type;
const char *path;
FILE *file;
} action_open_file_t;
typedef struct action_write_to_stdout
{
int type;
const char *string;
} action_write_to_stdout_t;
void execute_action_open_file(action_open_file_t *action)
{
printf("the open file action is called.\n");
action->file = !NULL; /* Типа открыл. */
}
void execute_action_write_to_stdout(action_write_to_stdout_t *action)
{
printf("the write to stdout action is called.\n");
printf("%s\n", action
->string
); }
void execute_action(void *action)
{
switch (*(int *)action)
{
case ACTION_OPEN_FILE:
return execute_action_open_file(action);
case ACTION_WRITE_TO_STDOUT:
return execute_action_write_to_stdout(action);
}
}
int main(void)
{
action_open_file_t action_1 =
{
.type = ACTION_OPEN_FILE,
.path = "...",
.file = NULL
};
action_write_to_stdout_t action_2 =
{
.type = ACTION_WRITE_TO_STDOUT,
.string = "Hello World"
};
execute_action(&action_1); /* Вызывается функция execute_action_open_file. */
execute_action(&action_2); /* Вызывается функция execute_action_write_to_stdout. */
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgQUNUSU9OX09QRU5fRklMRSAgICAgICAwCiNkZWZpbmUgQUNUSU9OX1dSSVRFX1RPX1NURE9VVCAxCgp0eXBlZGVmIHN0cnVjdCBhY3Rpb25fb3Blbl9maWxlCnsKCWludCAgICAgICAgIHR5cGU7Cgljb25zdCBjaGFyICpwYXRoOwoJRklMRSAgICAgICAqZmlsZTsKfSBhY3Rpb25fb3Blbl9maWxlX3Q7Cgp0eXBlZGVmIHN0cnVjdCBhY3Rpb25fd3JpdGVfdG9fc3Rkb3V0CnsKCWludCAgICAgICAgIHR5cGU7Cgljb25zdCBjaGFyICpzdHJpbmc7Cn0gYWN0aW9uX3dyaXRlX3RvX3N0ZG91dF90OwoKdm9pZCBleGVjdXRlX2FjdGlvbl9vcGVuX2ZpbGUoYWN0aW9uX29wZW5fZmlsZV90ICphY3Rpb24pCnsKCXByaW50ZigidGhlIG9wZW4gZmlsZSBhY3Rpb24gaXMgY2FsbGVkLlxuIik7CgkKCWFjdGlvbi0+ZmlsZSA9ICFOVUxMOyAvKiDQotC40L/QsCDQvtGC0LrRgNGL0LsuICovCn0KCnZvaWQgZXhlY3V0ZV9hY3Rpb25fd3JpdGVfdG9fc3Rkb3V0KGFjdGlvbl93cml0ZV90b19zdGRvdXRfdCAqYWN0aW9uKQp7CglwcmludGYoInRoZSB3cml0ZSB0byBzdGRvdXQgYWN0aW9uIGlzIGNhbGxlZC5cbiIpOwoJCglwcmludGYoIiVzXG4iLCBhY3Rpb24tPnN0cmluZyk7Cn0KCnZvaWQgZXhlY3V0ZV9hY3Rpb24odm9pZCAqYWN0aW9uKQp7Cglzd2l0Y2ggKCooaW50ICopYWN0aW9uKQoJewoJCWNhc2UgQUNUSU9OX09QRU5fRklMRToKCQkJcmV0dXJuIGV4ZWN1dGVfYWN0aW9uX29wZW5fZmlsZShhY3Rpb24pOwoJCQkKCQljYXNlIEFDVElPTl9XUklURV9UT19TVERPVVQ6CgkJCXJldHVybiBleGVjdXRlX2FjdGlvbl93cml0ZV90b19zdGRvdXQoYWN0aW9uKTsKCX0KfQoKaW50IG1haW4odm9pZCkgCnsKCWFjdGlvbl9vcGVuX2ZpbGVfdCBhY3Rpb25fMSA9Cgl7CgkJLnR5cGUgPSBBQ1RJT05fT1BFTl9GSUxFLAoJCS5wYXRoID0gIi4uLiIsCgkJLmZpbGUgPSBOVUxMCgl9OwoJCglhY3Rpb25fd3JpdGVfdG9fc3Rkb3V0X3QgYWN0aW9uXzIgPQoJewoJCS50eXBlID0gQUNUSU9OX1dSSVRFX1RPX1NURE9VVCwKCQkuc3RyaW5nID0gIkhlbGxvIFdvcmxkIgoJfTsKCQoJZXhlY3V0ZV9hY3Rpb24oJmFjdGlvbl8xKTsgLyog0JLRi9C30YvQstCw0LXRgtGB0Y8g0YTRg9C90LrRhtC40Y8gZXhlY3V0ZV9hY3Rpb25fb3Blbl9maWxlLiAqLwoJZXhlY3V0ZV9hY3Rpb24oJmFjdGlvbl8yKTsgLyog0JLRi9C30YvQstCw0LXRgtGB0Y8g0YTRg9C90LrRhtC40Y8gZXhlY3V0ZV9hY3Rpb25fd3JpdGVfdG9fc3Rkb3V0LiAqLwoJCglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cg==