|
@@ -31,9 +31,10 @@
|
|
//
|
|
//
|
|
|
|
|
|
static const char *program_name = "luaot";
|
|
static const char *program_name = "luaot";
|
|
-static const char *input_filename = NULL;
|
|
|
|
-static const char *output_filename = NULL;
|
|
|
|
-static const char *module_name = NULL;
|
|
|
|
|
|
+static char *input_filename = NULL;
|
|
|
|
+static char *output_filename = NULL;
|
|
|
|
+static char *module_name = NULL;
|
|
|
|
+
|
|
static FILE * output_file = NULL;
|
|
static FILE * output_file = NULL;
|
|
static int nfunctions = 0;
|
|
static int nfunctions = 0;
|
|
static TString **tmname;
|
|
static TString **tmname;
|
|
@@ -88,13 +89,17 @@ static void doargs(int argc, char **argv)
|
|
int do_opts = 1;
|
|
int do_opts = 1;
|
|
int npos = 0;
|
|
int npos = 0;
|
|
for (int i = 1; i < argc; i++) {
|
|
for (int i = 1; i < argc; i++) {
|
|
- const char *arg = argv[i];
|
|
|
|
|
|
+ char *arg = argv[i];
|
|
if (do_opts && arg[0] == '-') {
|
|
if (do_opts && arg[0] == '-') {
|
|
if (0 == strcmp(arg, "--")) {
|
|
if (0 == strcmp(arg, "--")) {
|
|
do_opts = 0;
|
|
do_opts = 0;
|
|
} else if (0 == strcmp(arg, "-h")) {
|
|
} else if (0 == strcmp(arg, "-h")) {
|
|
usage();
|
|
usage();
|
|
exit(0);
|
|
exit(0);
|
|
|
|
+ } else if (0 == strcmp(arg, "-m")) {
|
|
|
|
+ i++;
|
|
|
|
+ if (i >= argc) { fatal_error("missing argument for -m"); }
|
|
|
|
+ module_name = argv[i];
|
|
} else if (0 == strcmp(arg, "-o")) {
|
|
} else if (0 == strcmp(arg, "-o")) {
|
|
i++;
|
|
i++;
|
|
if (i >= argc) { fatal_error("missing argument for -o"); }
|
|
if (i >= argc) { fatal_error("missing argument for -o"); }
|
|
@@ -122,7 +127,9 @@ static void doargs(int argc, char **argv)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static const char *get_module_name(const char *);
|
|
|
|
|
|
+static char *get_module_name_from_filename(const char *);
|
|
|
|
+static void check_module_name(const char *);
|
|
|
|
+static void replace_dots(char *);
|
|
static void print_functions();
|
|
static void print_functions();
|
|
static void print_source_code();
|
|
static void print_source_code();
|
|
|
|
|
|
@@ -131,7 +138,12 @@ int main(int argc, char **argv)
|
|
// Process input arguments
|
|
// Process input arguments
|
|
|
|
|
|
doargs(argc, argv);
|
|
doargs(argc, argv);
|
|
- module_name = get_module_name(output_filename);
|
|
|
|
|
|
+
|
|
|
|
+ if (!module_name) {
|
|
|
|
+ module_name = get_module_name_from_filename(output_filename);
|
|
|
|
+ }
|
|
|
|
+ check_module_name(module_name);
|
|
|
|
+ replace_dots(module_name);
|
|
|
|
|
|
// Read the input
|
|
// Read the input
|
|
|
|
|
|
@@ -159,9 +171,9 @@ int main(int argc, char **argv)
|
|
}
|
|
}
|
|
|
|
|
|
// Deduce the Lua module name given the file name
|
|
// Deduce the Lua module name given the file name
|
|
-// Example: ./foo/bar/baz.c -> foo_bar_baz
|
|
|
|
|
|
+// Example: ./foo/bar/baz.c -> foo.bar.baz
|
|
static
|
|
static
|
|
-const char *get_module_name(const char *filename)
|
|
|
|
|
|
+char *get_module_name_from_filename(const char *filename)
|
|
{
|
|
{
|
|
size_t n = strlen(filename);
|
|
size_t n = strlen(filename);
|
|
|
|
|
|
@@ -181,25 +193,41 @@ const char *get_module_name(const char *filename)
|
|
char *module_name = malloc(sep+1);
|
|
char *module_name = malloc(sep+1);
|
|
for (size_t i = 0; i < sep; i++) {
|
|
for (size_t i = 0; i < sep; i++) {
|
|
int c = filename[i];
|
|
int c = filename[i];
|
|
- if (c == '/' || c == '.') {
|
|
|
|
- module_name[i] = '_';
|
|
|
|
|
|
+ if (c == '/') {
|
|
|
|
+ module_name[i] = '.';
|
|
} else {
|
|
} else {
|
|
module_name[i] = c;
|
|
module_name[i] = c;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
module_name[sep] = '\0';
|
|
module_name[sep] = '\0';
|
|
|
|
|
|
|
|
+ return module_name;
|
|
|
|
+}
|
|
|
|
|
|
- for (size_t i = 0; i < sep; i++) {
|
|
|
|
|
|
+// Check if a module name contains only allowed characters
|
|
|
|
+static
|
|
|
|
+void check_module_name(const char *module_name)
|
|
|
|
+{
|
|
|
|
+ for (size_t i = 0; module_name[i] != '\0'; i++) {
|
|
int c = module_name[i];
|
|
int c = module_name[i];
|
|
- if (!isalnum(c) && c != '_') {
|
|
|
|
- fatal_error("output module name contains invalid characters");
|
|
|
|
|
|
+ if (!isalnum(c) && c != '_' && c != '.') {
|
|
|
|
+ fatal_error("output module name must contain only letters, numbers, or '.'");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
|
|
- return module_name;
|
|
|
|
|
|
+// Convert a module name to the internal "luaopen" name
|
|
|
|
+static
|
|
|
|
+void replace_dots(char *module_name)
|
|
|
|
+{
|
|
|
|
+ for (size_t i = 0; module_name[i] != '\0'; i++) {
|
|
|
|
+ if (module_name[i] == '.') {
|
|
|
|
+ module_name[i] = '_';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
//
|
|
//
|
|
// Printing bytecode information
|
|
// Printing bytecode information
|
|
// -----------------------------
|
|
// -----------------------------
|