[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Packaging and importing
- From: Shannon Stewman <stew@...>
- Date: Tue, 16 Aug 2005 17:30:43 -0500
On Wed, Aug 17, 2005 at 12:15:22AM +1000, David Burgess wrote:
> 1) we often package the Lua code as Windows resources. We found
> this to be simple and convenient. A Lua script that creates the resource
> file does most of the work. When the script is in an associated DLL it is
> rather simple (and quick) to write a loader that loads the code from a resource.
> This approach requires some small mods to loadlib.c in both 5.0.2 and 5.1w6.
One platform-independent approach to doing this is to byte-compile the
Lua code, load it into a static const char* array, and pull it into the
interpreter with luaL_loadbuffer. With a sufficient makefile mechanism
(I use Perforce Jam), this only adds a few seconds to the
edit-compile-debug cycle.
The code I wrote the generate .c/.h files from the Lua byte-code is:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
/* various buffers */
#define BUFSIZE 2048
#define FNBUFSZ 256
/* number of hex codes allowed on a single line */
#define LINELEN 10
char buf[BUFSIZE];
char fnbuf[FNBUFSZ];
char func_name[BUFSIZE];
int main( int argc, char** argv )
{
int i;
long int j;
char* s;
size_t nbytes;
FILE* lf;
FILE* cf;
FILE* hf;
if (argc < 3) return 1;
lf = fopen(argv[1],"r");
snprintf(fnbuf, FNBUFSZ, "%s.h", argv[2]);
hf = fopen(fnbuf,"w");
snprintf(fnbuf, FNBUFSZ, "%s.c", argv[2]);
cf = fopen(fnbuf,"w");
strncpy( fnbuf, argv[2], FNBUFSZ );
for(s = fnbuf; *s; ++s) {
if (*s == '/')
*s = '_';
else
*s = toupper(*s);
}
strncpy(func_name,argv[2],BUFSIZE);
s = strrchr(func_name, '/');
if (s)
memmove(func_name,s+1,strlen(s));
fprintf(hf, "#ifndef __%s__H__\n", fnbuf);
fprintf(hf, "#define __%s__H__\n", fnbuf);
fprintf(hf, "#include <stddef.h>\n");
fprintf(hf, "extern const char lc_%s_data[];\n" , func_name);
fprintf(hf, "extern const size_t lc_%s_size;\n", func_name);
fprintf(hf, "#endif /* __%s__H__ */\n", fnbuf);
fclose(hf);
fprintf(cf, "#include \"%s.h\"\n",argv[2]);
fprintf(cf, "const char lc_%s_data[] = {\n", func_name);
j = 0;
while(!feof(lf)) {
nbytes = fread(buf, sizeof(char), BUFSIZE, lf);
for(i=0; i < nbytes; ++i) {
fprintf(cf, " 0x%02hhx,", buf[i]);
if (++j % LINELEN == 0) {
fprintf(cf,"\n");
}
}
}
fprintf(cf,"\n 0x00\n};\n\n");
fprintf(cf,"const size_t lc_%s_size = %ld;\n\n", func_name, j);
fclose(cf);
return 0;
}
I haven't hit any upper limits in terms of script size, but I haven't
yet tried to stuff large scripts into static data area.
Cheers!
--
Shannon Stewman | Let us walk through the waning night,
Caught in a whirlpool, | As dawn-rays tickle our toes, the dew soothes
A quartering act: | Our blistered soles, and damp bones stir
Solitude or society? | As crimson cracks under the blue-grey sky.