Created
October 4, 2017 23:01
-
-
Save nathan-fiscaletti/cc9459be264311746776ffcabf07b554 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
// Type Definitions | |
// These are the type definitions that can be used to check for type | |
// They need to be unique so that only types starting with these | |
// prefixes will be presumed to be of the type specified. | |
typedef enum type { | |
TYPE_StateRequester = 0x10f3ccd3, | |
TYPE_OtherThing = 0x09331c8c | |
} type; | |
// State Requester Definitions & Functions | |
typedef int state_requester_f(void* request_parameters); | |
// Since we want to check the "type" of a function reference, | |
// we need to wrap it in a struct along with it's type code. | |
struct state_requester_t { | |
int type; | |
state_requester_f* call; | |
} typedef state_requester_t; | |
state_requester_t new_state_requester(state_requester_f* call) { | |
state_requester_t sr; | |
sr.type = TYPE_StateRequester; | |
sr.call = call; | |
return sr; | |
} | |
// This function will check if data is of type StateRequester | |
// | |
// If the data sent to this function is not of the length | |
// nessecary for the state_requester type, - OR - | |
// it's type property is not equal to the StateRequester type | |
// then we will presume that this data is NOT of type StateRequester | |
uint8_t is_state_requester(void* data, size_t len) { | |
return len == sizeof(state_requester_t) && | |
((state_requester_t*)data)->type == TYPE_StateRequester; | |
} | |
// Testing functions | |
int test_caller(void* data) { | |
printf("Got to the test_caller function.\n"); | |
return 0; | |
} | |
int main(int agc, char *argv[]) { | |
// Create an actual state_requester_t definitiion | |
state_requester_t sr = new_state_requester(&test_caller); | |
// Test to see if it's validated as a state_requester_t | |
if (is_state_requester(&sr, sizeof(state_requester_t))) { | |
printf("Yes, variable 'sr' is presumadely of type state_requester_t\n"); | |
sr.call(NULL); | |
} else { | |
printf("No, variable 'sr' is not of type state_requester_t\n"); | |
} | |
// Create a phony state_requester_t definition, | |
// but keep it the same length as a regular | |
// state_requester_t | |
void* a = malloc(sizeof(state_requester_t)); | |
// Test to see if it's validated as a state_requester_t | |
if (is_state_requester(a, sizeof(state_requester_t))) { | |
printf("Yes, variable 'a' is presumadely of type state_requester_t\n"); | |
} else { | |
printf("No, variable 'a' is not of type state_requester_t\n"); | |
} | |
free(a); | |
// Create a phony state_requester_t with an improper length | |
void* b = malloc(5); | |
// Test to see if it's validated as a state_requester_t | |
if (is_state_requester(b, sizeof(state_requester_t))) { | |
printf("Yes, variable 'b' is presumadely of type state_requester_t\n"); | |
} else { | |
printf("No, variable 'b' is not of type state_requester_t\n"); | |
} | |
free(b); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment