Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Simple Test program for libtcc
  3.  *
  4.  * libtcc can be useful to use tcc as a "backend" for a code generator.
  5.  */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8.  
  9. #include "libtcc.h"
  10.  
  11. /* this function is called by the generated code */
  12. int add(int a, int b)
  13. {
  14.     return a + b;
  15. }
  16.  
  17. char my_program[] =
  18. "int fib(int n)\n"
  19. "{\n"
  20. "    if (n <= 2)\n"
  21. "        return 1;\n"
  22. "    else\n"
  23. "        return fib(n-1) + fib(n-2);\n"
  24. "}\n"
  25. "\n"
  26. "int foo(int n)\n"
  27. "{\n"
  28. "    printf(\"Hello World!\\n\");\n"
  29. "    printf(\"fib(%d) = %d\\n\", n, fib(n));\n"
  30. "    printf(\"add(%d, %d) = %d\\n\", n, 2 * n, add(n, 2 * n));\n"
  31. "    return 0;\n"
  32. "}\n";
  33.  
  34. int main(int argc, char **argv)
  35. {
  36.     TCCState *s;
  37.     int (*func)(int);
  38.     unsigned long val;
  39.    
  40.     s = tcc_new();
  41.     if (!s) {
  42.         fprintf(stderr, "Could not create tcc state\n");
  43.         exit(1);
  44.     }
  45.  
  46.     /* MUST BE CALLED before any compilation or file loading */
  47.     tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
  48.  
  49.     tcc_compile_string(s, my_program);
  50.  
  51.     /* as a test, we add a symbol that the compiled program can be
  52.        linked with. You can have a similar result by opening a dll
  53.        with tcc_add_dll(() and using its symbols directly. */
  54.     tcc_add_symbol(s, "add", (unsigned long)&add);
  55.    
  56.     tcc_relocate(s);
  57.  
  58.     tcc_get_symbol(s, &val, "foo");
  59.     func = (void *)val;
  60.  
  61.     func(32);
  62.  
  63.     tcc_delete(s);
  64.     return 0;
  65. }
  66.