Search code examples
cjump-table

jump table examples in C


Please give me some examples of jump table usage. I have seen this example on wikipedia:

#include <stdio.h>
#include <stdlib.h>

typedef void (*Handler)(void);    /* A pointer to a handler function */



/* The functions */
void func3 (void) { printf( "3\n" ); }
void func2 (void) { printf( "2\n" ); }
void func1 (void) { printf( "1\n" ); }
void func0 (void) { printf( "0\n" ); }



Handler jump_table[4] = {func0, func1, func2, func3};



int main (int argc, char **argv) {
    int value;

    /* Convert first argument to 0-3 integer (Hash) */
    value = atoi(argv[1]) % 4;
    if (value < 0) {
        value *= -1;
    }

    /* Call appropriate function (func0 thru func3) */
    jump_table[value]();
}

But I was wondering if there is an alternate way of calling the function instead of using index as shown, in the above case it is jump_table[value]();

What I want to achieve is, instead of using the index is there a way to use the name of the function itself.

For example, say we have all the function pointers in a struct.

typedef struct _funcptrs
{
  void func1();
  void func2();
} funcptrs;

and now when I want to call the function can I do something like funcptrs.func1() ?


Solution

  • Certainly, but you need to declare them as function pointers and initialize them first. Though this defeats the purpose of a jump table if you have to spell out the function name.

    e.g.

    #include <stdio.h>
    
    void func1 (void) { printf( "1\n" ); }
    void func0 (void) { printf( "0\n" ); }
    
    typedef struct
    {
      void (*func0)(void);
      void (*func1)(void);
    }  funcptrs;
    
    int main(int argc, char *argv[])
    {
       funcptrs funcs = { func0, func1 };
       funcs.func1();
       return 0;
    }
    

    If you need to call the function by having the name of the function as a string, you need to create a mapping between the functions name and a function pointer, then search the table for that function, and call it.

    #include <stdio.h>
    #include <string.h>
    
    void func1 (void) { printf( "1\n" ); }
    void func0 (void) { printf( "0\n" ); }
    
    #define DEFUN(name) { #name, name }
    
    typedef struct
    {
      const char *name;
      void (*func)(void);
    }  funcptrs;
    
    void call(funcptrs *ptrs, const char *name)
    {
        int i;
        for(i = 0; ptrs[i].name; i++) {
          if(strcmp(ptrs[i].name, name) == 0) {
               ptrs[i].func();
               break;
           }
        }
    }
    int main(int argc, char *argv[])
    {
       funcptrs funcs[] = {DEFUN(func0), DEFUN(func1), {NULL,NULL}};
       call(funcs, "func0");
       return 0;
    }