summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/lua/texluac.w
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/texluac.w')
-rw-r--r--Build/source/texk/web2c/luatexdir/lua/texluac.w243
1 files changed, 243 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/texluac.w b/Build/source/texk/web2c/luatexdir/lua/texluac.w
new file mode 100644
index 00000000000..108e27864dc
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/lua/texluac.w
@@ -0,0 +1,243 @@
+% texlua.w
+%
+% Copyright (C) 1994-2007 Lua.org, PUC-Rio. All rights reserved.
+% Copyright 2006-2010 Taco Hoekwater <taco@@luatex.org>
+%
+% 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.
+
+% This file is part of LuaTeX.
+
+@ @c
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define luac_c
+#define LUA_CORE
+
+#include "lua51/lua.h"
+#include "lua51/lauxlib.h"
+
+#include "lua51/ldo.h"
+#include "lua51/lfunc.h"
+#include "lua51/lmem.h"
+#include "lua51/lobject.h"
+#include "lua51/lopcodes.h"
+#include "lua51/lstring.h"
+#include "lua51/lundump.h"
+
+@ @c
+static const char _svn_version[] =
+ "$Id: texluac.w 3583 2010-04-02 17:40:44Z hhenkel $ $URL: http://foundry.supelec.fr/svn/luatex/tags/beta-0.60.0/source/texk/web2c/luatexdir/lua/texluac.w $";
+
+@ @c
+#define PROGNAME "texluac" /* default program name */
+#define OUTPUT PROGNAME ".out" /* default output file */
+
+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 */
+
+@ @c
+__attribute__ ((noreturn))
+static void fatal(const char *message)
+{
+ fprintf(stderr, "%s: %s\n", progname, message);
+ exit(EXIT_FAILURE);
+}
+
+@ @c
+__attribute__ ((noreturn))
+static void cannot(const char *what)
+{
+ fprintf(stderr, "%s: cannot %s %s: %s\n", progname, what, output,
+ strerror(errno));
+ exit(EXIT_FAILURE);
+}
+
+@ @c
+__attribute__ ((noreturn))
+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);
+}
+
+@ @c
+#define IS(s) (strcmp(argv[i],s)==0)
+
+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;
+}
+
+@ @c
+#define toproto(L,i) (clvalue(L->top+(i))->l.p)
+
+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, (unsigned long) pc, Instruction);
+ f->sizecode = pc;
+ f->p = luaM_newvector(L, (unsigned long) 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;
+ }
+}
+
+@ @c
+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);
+}
+
+@ @c
+struct Smain {
+ int argc;
+ char **argv;
+};
+
+@ @c
+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;
+}
+
+@ @c
+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;
+}