aboutsummaryrefslogtreecommitdiff
path: root/src/bin/rclauncher.c
blob: 4ff23e4a9c20895ecbb2eeeea244b4bc00e692a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

/*
** Simple Lua interpreter.
** This program is used to run a Lua file embedded as a resource.
** It creates a Lua state, opens all its standard libraries, and run
** the Lua file in a protected environment just to redirect the error
** messages to stdout and stderr.
**
** $Id: rclauncher.c,v 1.1 2008/06/30 14:29:59 carregal Exp $
*/

#include <string.h>
#include <stdlib.h>

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#include <windows.h>
#include <io.h>
#include <fcntl.h>

/*
** Report error message.
** Assumes that the error message is on top of the stack.
*/
static int report (lua_State *L) {
	fprintf (stderr, "lua: fatal error: `%s'\n", lua_tostring (L, -1));
	fflush (stderr);
	printf ("Content-type: text/plain\n\nConfiguration fatal error: see error log!\n");
	printf ("%s", lua_tostring(L, -1));
	return 1;
}

static int runlua (lua_State *L, const char *lua_string, int argc, char *argv[]) {
	int err_func;
	int err;

	lua_pushliteral(L, "debug");
	lua_rawget(L, LUA_GLOBALSINDEX);  /* get traceback function */
        lua_pushliteral(L, "traceback");
        lua_gettable(L, -2);
	err_func = lua_gettop (L);
	err = luaL_loadstring (L, lua_string);
	if(!err) {
	  int i;
	  for(i = 1; i < argc; i++)
	    lua_pushstring(L, argv[i]);
	  return lua_pcall (L, argc - 1, LUA_MULTRET, err_func);
	} else return err;
}

static DWORD GetModulePath( HINSTANCE hInst, LPTSTR pszBuffer, DWORD dwSize )
//
//	Return the size of the path in bytes.
{
	DWORD dwLength = GetModuleFileName( hInst, pszBuffer, dwSize );
	if( dwLength )
	{
		while( dwLength && pszBuffer[ dwLength ] != '.' )
		{
			dwLength--;
		}

		if( dwLength )
			pszBuffer[ dwLength ] = '\000';
	}
	return dwLength;
}


/*
** MAIN
*/
int main (int argc, char *argv[]) {
	char name[ MAX_PATH ];
	DWORD dwLength;
	int size;
	luaL_Buffer b;
	int i;
#ifdef UNICODE
	TCHAR lua_wstring[4098];
#endif
	char lua_string[4098];
	lua_State *L = lua_open();
	(void)argc; /* avoid "unused parameter" warning */
	luaL_openlibs(L);
	dwLength = GetModulePath( NULL, name, MAX_PATH );
	if(dwLength) { /* Optional bootstrap */
	  strcat(name, ".lua");
	  if(!luaL_loadfile (L, name)) {
	    if(lua_pcall (L, 0, LUA_MULTRET, 0)) {
	      report (L);
	      lua_close (L);
	      return EXIT_FAILURE;
	    }
	  }
	}
	luaL_buffinit(L, &b);
	for(i = 1; ; i++) {
#ifdef UNICODE
	  size = LoadString(GetModuleHandle(NULL), i, lua_wstring,
			    sizeof(lua_string)/sizeof(TCHAR));
	  if(size > 0) wcstombs(lua_string, lua_wstring, size + 1);
#else
	  size = LoadString(GetModuleHandle(NULL), i, lua_string,
			    sizeof(lua_string)/sizeof(char));
#endif
	  if(size) luaL_addlstring(&b, lua_string, size); else break;
	}
	luaL_pushresult(&b);
	if (runlua (L, lua_tostring(L, -1), argc, argv)) {
	  report (L);
	  lua_close (L);
	  return EXIT_FAILURE;
	}
	lua_close (L);
	return EXIT_SUCCESS;
}