diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/texluac.c')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/texluac.c | 324 |
1 files changed, 177 insertions, 147 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/texluac.c b/Build/source/texk/web2c/luatexdir/lua/texluac.c index 4bc13458d13..d4295aba6ae 100644 --- a/Build/source/texk/web2c/luatexdir/lua/texluac.c +++ b/Build/source/texk/web2c/luatexdir/lua/texluac.c @@ -1,7 +1,29 @@ -/* -** $Id: texluac.c 1013 2008-02-14 00:09:02Z oneiros $ -** Lua compiler (saves bytecodes to files; also list bytecodes) -** See Copyright Notice in lua.h +/* texlua.c + +* Copyright (C) 1994-2007 Lua.org, PUC-Rio. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Copyright 2006-2008 Taco Hoekwater <taco@luatex.org> + + This file is part of LuaTeX. */ #include <errno.h> @@ -23,177 +45,185 @@ #include <../lua51/lstring.h> #include <../lua51/lundump.h> -#define PROGNAME "texluac" /* default program name */ -#define OUTPUT PROGNAME ".out" /* default output file */ +static const char _svn_version[] = + "$Id: texluac.c 1226 2008-05-02 16:11:02Z oneiros $ $URL: http://scm.foundry.supelec.fr/svn/luatex/trunk/src/texk/web2c/luatexdir/lua/texluac.c $"; -static int dumping=1; /* dump bytecodes? */ -static int stripping=0; /* strip debug information? */ -static char Output[]={ OUTPUT }; /* default output file name */ -static const char* output=Output; /* actual output file name */ -static const char* progname=PROGNAME; /* actual program name */ +#define PROGNAME "texluac" /* default program name */ +#define OUTPUT PROGNAME ".out" /* default output file */ -static void fatal(const char* message) +static int dumping = 1; /* dump bytecodes? */ +static int stripping = 0; /* strip debug information? */ +static char Output[] = { OUTPUT }; /* default output file name */ +static const char *output = Output; /* actual output file name */ +static const char *progname = PROGNAME; /* actual program name */ + +static void fatal(const char *message) { - fprintf(stderr,"%s: %s\n",progname,message); - exit(EXIT_FAILURE); + fprintf(stderr, "%s: %s\n", progname, message); + exit(EXIT_FAILURE); } -static void cannot(const char* what) +static void cannot(const char *what) { - fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno)); - exit(EXIT_FAILURE); + fprintf(stderr, "%s: cannot %s %s: %s\n", progname, what, output, + strerror(errno)); + exit(EXIT_FAILURE); } -static void usage(const char* message) +static void usage(const char *message) { - if (*message=='-') - fprintf(stderr,"%s: unrecognized option " LUA_QS "\n",progname,message); - else - fprintf(stderr,"%s: %s\n",progname,message); - fprintf(stderr, - "usage: %s [options] [filenames].\n" - "Available options are:\n" - " - process stdin\n" - " -o name output to file " LUA_QL("name") " (default is \"%s\")\n" - " -p parse only\n" - " -s strip debug information\n" - " -v show version information\n" - " -- stop handling options\n", - progname,Output); - exit(EXIT_FAILURE); + if (*message == '-') + fprintf(stderr, "%s: unrecognized option " LUA_QS "\n", progname, + message); + else + fprintf(stderr, "%s: %s\n", progname, message); + fprintf(stderr, + "usage: %s [options] [filenames].\n" + "Available options are:\n" + " - process stdin\n" + " -o name output to file " LUA_QL("name") " (default is \"%s\")\n" + " -p parse only\n" + " -s strip debug information\n" + " -v show version information\n" + " -- stop handling options\n", progname, Output); + exit(EXIT_FAILURE); } -#define IS(s) (strcmp(argv[i],s)==0) +#define IS(s) (strcmp(argv[i],s)==0) -static int doargs(int argc, char* argv[]) +static int doargs(int argc, char *argv[]) { - int i; - int version=0; - if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0]; - for (i=1; i<argc; i++) - { - if (*argv[i]!='-') /* end of options; keep it */ - break; - else if (IS("--")) /* end of options; skip it */ - { - ++i; - if (version) ++version; - break; - } - else if (IS("-")) /* end of options; use stdin */ - break; - else if (IS("-o")) /* output file */ - { - output=argv[++i]; - if (output==NULL || *output==0) usage(LUA_QL("-o") " needs argument"); - if (IS("-")) output=NULL; - } - else if (IS("-p")) /* parse only */ - dumping=0; - else if (IS("-s")) /* strip debug information */ - stripping=1; - else if (IS("-v")) /* show version */ - ++version; - else if (IS("--luaconly")) /* ignore */ - ; - else if (IS("--luac")) /* ignore */ - ; - else /* unknown option */ - usage(argv[i]); - } - if (i==argc && (!dumping)) - { - dumping=0; - argv[--i]=Output; - } - if (version) - { - printf("%s %s\n",LUA_RELEASE,LUA_COPYRIGHT); - if (version==argc-1) exit(EXIT_SUCCESS); - } - return i; + int i; + int version = 0; + if (argv[0] != NULL && *argv[0] != 0) + progname = argv[0]; + for (i = 1; i < argc; i++) { + if (*argv[i] != '-') /* end of options; keep it */ + break; + else if (IS("--")) { /* end of options; skip it */ + ++i; + if (version) + ++version; + break; + } else if (IS("-")) /* end of options; use stdin */ + break; + else if (IS("-o")) { /* output file */ + output = argv[++i]; + if (output == NULL || *output == 0) + usage(LUA_QL("-o") " needs argument"); + if (IS("-")) + output = NULL; + } else if (IS("-p")) /* parse only */ + dumping = 0; + else if (IS("-s")) /* strip debug information */ + stripping = 1; + else if (IS("-v")) /* show version */ + ++version; + else if (IS("--luaconly")) /* ignore */ + ; + else if (IS("--luac")) /* ignore */ + ; + else /* unknown option */ + usage(argv[i]); + } + if (i == argc && (!dumping)) { + dumping = 0; + argv[--i] = Output; + } + if (version) { + printf("%s %s\n", LUA_RELEASE, LUA_COPYRIGHT); + if (version == argc - 1) + exit(EXIT_SUCCESS); + } + return i; } #define toproto(L,i) (clvalue(L->top+(i))->l.p) -static const Proto* combine(lua_State* L, int n) +static const Proto *combine(lua_State * L, int n) { - if (n==1) - return toproto(L,-1); - else - { - int i,pc; - Proto* f=luaF_newproto(L); - setptvalue2s(L,L->top,f); incr_top(L); - f->source=luaS_newliteral(L,"=(" PROGNAME ")"); - f->maxstacksize=1; - pc=2*n+1; - f->code=luaM_newvector(L,pc,Instruction); - f->sizecode=pc; - f->p=luaM_newvector(L,n,Proto*); - f->sizep=n; - pc=0; - for (i=0; i<n; i++) - { - f->p[i]=toproto(L,i-n-1); - f->code[pc++]=CREATE_ABx(OP_CLOSURE,0,i); - f->code[pc++]=CREATE_ABC(OP_CALL,0,1,1); - } - f->code[pc++]=CREATE_ABC(OP_RETURN,0,1,0); - return f; - } + if (n == 1) + return toproto(L, -1); + else { + int i, pc; + Proto *f = luaF_newproto(L); + setptvalue2s(L, L->top, f); + incr_top(L); + f->source = luaS_newliteral(L, "=(" PROGNAME ")"); + f->maxstacksize = 1; + pc = 2 * n + 1; + f->code = luaM_newvector(L, pc, Instruction); + f->sizecode = pc; + f->p = luaM_newvector(L, n, Proto *); + f->sizep = n; + pc = 0; + for (i = 0; i < n; i++) { + f->p[i] = toproto(L, i - n - 1); + f->code[pc++] = CREATE_ABx(OP_CLOSURE, 0, i); + f->code[pc++] = CREATE_ABC(OP_CALL, 0, 1, 1); + } + f->code[pc++] = CREATE_ABC(OP_RETURN, 0, 1, 0); + return f; + } } -static int writer(lua_State* L, const void* p, size_t size, void* u) +static int writer(lua_State * L, const void *p, size_t size, void *u) { - UNUSED(L); - return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0); + UNUSED(L); + return (fwrite(p, size, 1, (FILE *) u) != 1) && (size != 0); } struct Smain { - int argc; - char** argv; + int argc; + char **argv; }; -static int pmain(lua_State* L) +static int pmain(lua_State * L) { - struct Smain* s = (struct Smain*)lua_touserdata(L, 1); - int argc=s->argc; - char** argv=s->argv; - const Proto* f; - int i; - if (!lua_checkstack(L,argc)) fatal("too many input files"); - for (i=0; i<argc; i++) - { - const char* filename=IS("-") ? NULL : argv[i]; - if (luaL_loadfile(L,filename)!=0) fatal(lua_tostring(L,-1)); - } - f=combine(L,argc); - if (dumping) - { - FILE* D= (output==NULL) ? stdout : fopen(output,"wb"); - if (D==NULL) cannot("open"); - lua_lock(L); - luaU_dump(L,f,writer,D,stripping); - lua_unlock(L); - if (ferror(D)) cannot("write"); - if (fclose(D)) cannot("close"); - } - return 0; + struct Smain *s = (struct Smain *) lua_touserdata(L, 1); + int argc = s->argc; + char **argv = s->argv; + const Proto *f; + int i; + if (!lua_checkstack(L, argc)) + fatal("too many input files"); + for (i = 0; i < argc; i++) { + const char *filename = IS("-") ? NULL : argv[i]; + if (luaL_loadfile(L, filename) != 0) + fatal(lua_tostring(L, -1)); + } + f = combine(L, argc); + if (dumping) { + FILE *D = (output == NULL) ? stdout : fopen(output, "wb"); + if (D == NULL) + cannot("open"); + lua_lock(L); + luaU_dump(L, f, writer, D, stripping); + lua_unlock(L); + if (ferror(D)) + cannot("write"); + if (fclose(D)) + cannot("close"); + } + return 0; } -int luac_main(int argc, char* argv[]) +int luac_main(int argc, char *argv[]) { - lua_State* L; - struct Smain s; - int i=doargs(argc,argv); - argc-=i; argv+=i; - if (argc<=0) usage("no input files given"); - L=lua_open(); - if (L==NULL) fatal("not enough memory for state"); - s.argc=argc; - s.argv=argv; - if (lua_cpcall(L,pmain,&s)!=0) fatal(lua_tostring(L,-1)); - lua_close(L); - return EXIT_SUCCESS; + lua_State *L; + struct Smain s; + int i = doargs(argc, argv); + argc -= i; + argv += i; + if (argc <= 0) + usage("no input files given"); + L = lua_open(); + if (L == NULL) + fatal("not enough memory for state"); + s.argc = argc; + s.argv = argv; + if (lua_cpcall(L, pmain, &s) != 0) + fatal(lua_tostring(L, -1)); + lua_close(L); + return EXIT_SUCCESS; } |