User-defined main()
If your application requirements include running custom C code before Lisp starts up, you may build your own Lisp executable. Here is an example:
On UNIX:
struct shlib_library_item { char * name; int system; }; #include <stdio.h> #include "misc/shlibs.h" void my_exit( int ); main( int argc, char **argv, char **envp ) { /* put custom installation code here */ fprintf(stderr, "custom code runs..\n" );
lisp_init( /* these three arguments are the main() arguments */ argc, argv, envp, /* custom exit function; use 0 if default exit() call desired */ my_exit, /* directory containing ACL shared library and Lisp image(s ) */ "/room2/test/src", /* ACL shared library name; name could vary, so check your ACL directory for the correct name */ "libacl50.so", /* default lisp image name; use 0 if no default desired */ "lisp.dxl", /* quiet flag; if 1, "Mapping..." message will be suppressed */ 0, /* Win32app flag; on UNIX, must be 0 */ 0, /* global variable containing prelinked library list; defined by shlibs.h include file */ linked_shared_libraries ); } void my_exit( int n ) { fprintf( stderr, "my exit code can run here\n" ); exit( n ); }
Remarks
On Windows:
#include <windows.h> #include <process.h> unsigned _stdcall startlisp(void *x) { StartLisp((char *) x, 1, 1); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HANDLE handle; int lisp_thread_id; /* custom code can go here */ MessageBox(NULL, "custom code could run now", "before Lisp starts", MB_OK); handle = (HANDLE) _beginthreadex(0, 0, startlisp, (void *) lpCmdLine, 0, &lisp_thread_id); WaitForSingleObject(handle, INFINITE); /* custom code can go here; it runs after Lisp exits */ MessageBox(NULL, "custom code could run now", "after Lisp exits", MB_OK); return 0; }
Remarks