test_fnptrs_v1.tc¶
test_fnptrs_v1.tc — function pointers v1 (Phase B) probe
// =================================================================
// test_fnptrs_v1.tc — function pointers v1 (Phase B) probe
// =================================================================
// Local fn-ptr type via typedef
typedef int (*int_op)(int, int);
typedef void (*greet_fn)(char who[]);
// Some named functions to point at
int my_add(int a, int b) { return a + b; }
int my_mul(int a, int b) { return a * b; }
void hello(char who[]) {
addLog("Hello, %s!", who);
}
void hi(char who[]) {
addLog("Hi %s.", who);
}
// Test 1: local fn-ptr, assigned + called
void test_local_int_op() {
int_op op;
op = my_add;
int s = op(3, 4);
int_op op2;
op2 = my_mul;
int p = op2(3, 4);
addLog("test_local_int_op: 3+4=%d (expect 7), 3*4=%d (expect 12)", s, p);
}
// Test 2: reassign + dispatch by enum
int OP_ADD = 0;
int OP_MUL = 1;
int dispatch(int op_id, int a, int b) {
int_op fn;
if (op_id == OP_ADD) fn = my_add;
else fn = my_mul;
return fn(a, b);
}
void test_dispatch() {
addLog("test_dispatch: add=%d mul=%d (expect 9, 20)", dispatch(OP_ADD, 4, 5), dispatch(OP_MUL, 4, 5));
}
// Test 3: global fn-ptr
greet_fn g_greeter;
void test_global_fnptr() {
g_greeter = hello;
g_greeter("world");
g_greeter = hi;
g_greeter("Tasmota");
}
// Test 4: pass fn-ptr-valued expression as arg via dispatch helper
int run_op(int_op f, int a, int b) {
return f(a, b);
}
void test_fnptr_as_arg() {
int s = run_op(my_add, 10, 20);
int p = run_op(my_mul, 10, 20);
addLog("test_fnptr_as_arg: add=%d mul=%d (expect 30, 200)", s, p);
}
int main() {
addLog("=== fnptrs v1 probe start ===");
test_local_int_op();
test_dispatch();
test_global_fnptr();
test_fnptr_as_arg();
addLog("=== fnptrs v1 probe end ===");
return 0;
}