
3 changed files with 138 additions and 2 deletions
@ -0,0 +1,60 @@ |
|||
#ifndef LIBTCC_H |
|||
#define LIBTCC_H |
|||
|
|||
struct TCCState; |
|||
|
|||
typedef struct TCCState TCCState; |
|||
|
|||
/* create a new TCC compilation context */ |
|||
TCCState *tcc_new(void); |
|||
|
|||
/* free a TCC compilation context */ |
|||
void tcc_delete(TCCState *s); |
|||
|
|||
/* add debug information in the generated code */ |
|||
void tcc_enable_debug(TCCState *s); |
|||
|
|||
/*****************************/ |
|||
/* preprocessor */ |
|||
|
|||
/* add include path */ |
|||
int tcc_add_include_path(TCCState *s, const char *pathname); |
|||
|
|||
/* define preprocessor symbol 'sym'. Can put optional value */ |
|||
void tcc_define_symbol(TCCState *s, const char *sym, const char *value); |
|||
|
|||
/* undefine preprocess symbol 'sym' */ |
|||
void tcc_undefine_symbol(TCCState *s, const char *sym); |
|||
|
|||
/*****************************/ |
|||
/* compiling */ |
|||
|
|||
/* compile a file. Return non zero if error. */ |
|||
int tcc_compile_file(TCCState *s, const char *filename); |
|||
|
|||
/* compile a string. Return non zero if error. */ |
|||
int tcc_compile_string(TCCState *s, const char *buf); |
|||
|
|||
/* get last error */ |
|||
int tcc_get_error(TCCState *s, char *buf, int buf_size); |
|||
|
|||
/*****************************/ |
|||
/* linking commands */ |
|||
|
|||
/* add a DYNAMIC library so that the compiled program can use its symbols */ |
|||
int tcc_add_dll(TCCState *s, const char *library_name); |
|||
|
|||
/* define a global symbol */ |
|||
int tcc_add_symbol(TCCState *s, const char *name, void *value); |
|||
|
|||
#define TCC_FILE_EXE 0 /* executable file */ |
|||
#define TCC_FILE_DLL 1 /* dynamic library */ |
|||
#define TCC_FILE_OBJ 2 /* object file */ |
|||
|
|||
/* output an executable file */ |
|||
int tcc_output_file(TCCState *s, const char *filename, int file_type); |
|||
|
|||
/* link and run main() function and return its value */ |
|||
int tcc_run(TCCState *s, int argc, char **argv); |
|||
|
|||
#endif |
@ -0,0 +1,62 @@ |
|||
/*
|
|||
* Simple Test program for libtcc |
|||
* |
|||
* libtcc can be useful to use tcc as a "backend" for a code generator. |
|||
*/ |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
|
|||
#include <libtcc.h> |
|||
|
|||
/* this function is called by the generated code */ |
|||
int add(int a, int b) |
|||
{ |
|||
return a + b; |
|||
} |
|||
|
|||
char my_program[] = |
|||
"int fib(int n)\n" |
|||
"{\n" |
|||
" if (n <= 2)\n" |
|||
" return 1;\n" |
|||
" else\n" |
|||
" return fib(n-1) + fib(n-2);\n" |
|||
"}\n" |
|||
"\n" |
|||
"int main(int argc, char **argv)\n" |
|||
"{\n" |
|||
" int n;\n" |
|||
" n = atoi(argv[1]);\n" |
|||
" printf(\"Hello World!\\n\");\n" |
|||
" printf(\"fib(%d) = %d\\n\", n, fib(n));\n" |
|||
" printf(\"add(%d, %d) = %d\\n\", n, 2 * n, add(n, 2 * n));\n" |
|||
" return 0;\n" |
|||
"}\n"; |
|||
|
|||
int main(int argc, char **argv) |
|||
{ |
|||
TCCState *s; |
|||
char *args[3]; |
|||
|
|||
s = tcc_new(); |
|||
if (!s) { |
|||
fprintf(stderr, "Could not create tcc state\n"); |
|||
exit(1); |
|||
} |
|||
|
|||
tcc_compile_string(s, my_program); |
|||
|
|||
/* as a test, we add a symbol that the compiled program can be
|
|||
linked with. You can have a similar result by opening a dll |
|||
with tcc_add_dll(() and using its symbols directly. */ |
|||
tcc_add_symbol(s, "add", (void *)&add); |
|||
|
|||
args[0] = ""; |
|||
args[1] = "32"; |
|||
args[2] = NULL; |
|||
|
|||
tcc_run(s, 2, args); |
|||
|
|||
tcc_delete(s); |
|||
return 0; |
|||
} |
Loading…
Reference in new issue