ref: e27b298f60cf74d25179ceb09326735b724e8d6e
parent: 416a47f74171d93f9237afede0d434bcc841e3fd
	author: Ori Bernstein <ori@eigenstate.org>
	date: Wed Jul 25 07:01:28 EDT 2012
	
refactor muse and add merging.
--- a/util/muse.c
+++ b/util/muse.c
@@ -14,6 +14,7 @@
/* FIXME: move into one place...? */
Node *file;
char *outfile;
+int merge;
int debug;
char debugopt[128];
char **incpaths;
@@ -21,8 +22,9 @@
static void usage(char *prog)
 {-    printf("%s [-h] [-o outfile] inputs\n", prog);-    printf("\t-h\tPrint this help\n");+    printf("%s [-hIdos] [-o outfile] [-m] inputs\n", prog);+    printf("\t-h\tprint this help\n");+    printf("\t-m\ttreat the inputs as usefiles and merge them\n");     printf("\t-I path\tAdd 'path' to use search path\n");     printf("\t-d\tPrint debug dumps\n");     printf("\t-o\tOutput to outfile\n");@@ -29,23 +31,62 @@
     printf("\t-s\tShow the contents of usefiles `inputs`\n");}
+static void dumpuse(char *path)
+{+ Stab *globls;
+ FILE *f;
+ globls = file->file.globls;
+ readuse(file, globls);
+ f = fopen(path, "r");
+ dumpstab(globls, stdout);
+ fclose(f);
+}
+
+static void genuse(char *path)
+{+ Stab *globls;
+ FILE *f;
+
+ globls = file->file.globls;
+ tyinit(globls);
+ tokinit(path);
+ yyparse();
+
+ infer(file);
+ if (!outfile)
+        die("need output file name right now. FIX THIS.");+ f = fopen(outfile, "w");
+ writeuse(file, f);
+ fclose(f);
+}
+
+static void mergeuse(char *path)
+{+ Stab *globls;
+
+ globls = file->file.globls;
+ readuse(file, globls);
+}
+
int main(int argc, char **argv)
 {+ FILE *f;
int opt;
int i;
- Stab *globls;
- FILE *f;
     while ((opt = getopt(argc, argv, "d::ho:I:")) != -1) {         switch (opt) {- case 'o':
- outfile = optarg;
- break;
case 'h':
usage(argv[0]);
exit(0);
break;
+ case 'm':
+ merge = 1;
+ break;
+ case 'o':
+ outfile = optarg;
+ break;
case 'd':
debug = 1;
while (optarg && *optarg)
@@ -61,31 +102,21 @@
}
}
-    if (debugopt['s']) {-        for (i = optind; i < argc; i++) {- globls = mkstab();
- f = fopen(argv[i], "r");
- readuse(file, globls);
- dumpstab(globls, stdout);
- }
- exit(0);
- }
-
     for (i = optind; i < argc; i++) {- globls = mkstab();
- tyinit(globls);
- tokinit(argv[i]);
file = mkfile(argv[i]);
file->file.exports = mkstab();
- file->file.globls = globls;
- yyparse();
-
- infer(file);
- if (!outfile)
-	    die("need output file name right now. FIX THIS.");- f = fopen(outfile, "w");
- writeuse(file, f);
- fclose(f);
+ file->file.globls = mkstab();
+ if (merge)
+ mergeuse(argv[i]);
+ else if (debugopt['s'])
+ dumpuse(argv[i]);
+ else
+ genuse(argv[i]);
+ }
+    if (merge) {+ f = fopen(outfile, "w");
+ writeuse(file, f);
+ fclose(f);
}
return 0;
--
⑨