]> granicus.if.org Git - yasm/commitdiff
Make architecture selectable at the command line.
authorPeter Johnson <peter@tortall.net>
Sat, 31 May 2003 16:59:54 +0000 (16:59 -0000)
committerPeter Johnson <peter@tortall.net>
Sat, 31 May 2003 16:59:54 +0000 (16:59 -0000)
Also, fix bug that caused parser to not actually be selectable (any user
choice was overridden).

svn path=/trunk/yasm/; revision=958

frontends/yasm/yasm-module.c
frontends/yasm/yasm-module.h
frontends/yasm/yasm.c

index 565100d4e4bbc7d932286c29c7e771215c748762..89ba01f1437a973850596dae5b15d739a4f8d922 100644 (file)
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <util.h>
-/*@unused@*/ RCSID("$IdPath: yasm/frontends/yasm/yasm-module.c,v 1.13 2003/05/03 06:26:15 peter Exp $");
+/*@unused@*/ RCSID("$IdPath$");
 
 #include <libyasm/compat-queue.h>
 #include <libyasm.h>
@@ -44,6 +44,16 @@ typedef struct module {
 
 SLIST_HEAD(modulehead, module) modules = SLIST_HEAD_INITIALIZER(modules);
 
+/* NULL-terminated list of all possibly available architecture keywords.
+ * Could improve this a little by generating automatically at build-time.
+ */
+/*@-nullassign@*/
+const char *archs[] = {
+    "x86",
+    NULL
+};
+/*@=nullassign@*/
+
 /* NULL-terminated list of all possibly available object format keywords.
  * Could improve this a little by generating automatically at build-time.
  */
@@ -219,3 +229,17 @@ list_dbgfmts(void (*printfunc) (const char *name, const char *keyword))
            printfunc(p->name, p->keyword);
     }
 }
+
+void
+list_archs(void (*printfunc) (const char *name, const char *keyword))
+{
+    int i;
+    yasm_arch *p;
+
+    /* Go through available list, and try to load each one */
+    for (i = 0; archs[i]; i++) {
+       p = load_arch(archs[i]);
+       if (p)
+           printfunc(p->name, p->keyword);
+    }
+}
index ae5e000424a0fe3f1e200662f2599aa21bf0f00d..af764cfe030e79ccfe4e4d403a9c3dd7318b5793 100644 (file)
@@ -50,5 +50,6 @@ void list_parsers(void (*printfunc) (const char *name, const char *keyword));
 
 void list_preprocs(void (*printfunc) (const char *name, const char *keyword));
 void list_dbgfmts(void (*printfunc) (const char *name, const char *keyword));
+void list_archs(void (*printfunc) (const char *name, const char *keyword));
 
 #endif
index 1c2fd871bce6e135553abbf6869cace929919dcd..11bf923510fcecaa337074efaeba4576b6499380 100644 (file)
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <util.h>
-/*@unused@*/ RCSID("$IdPath: yasm/frontends/yasm/yasm.c,v 1.97 2003/05/05 03:42:09 peter Exp $");
+/*@unused@*/ RCSID("$IdPath$");
 
 #include <libyasm/compat-queue.h>
 #include <libyasm/bitvect.h>
@@ -66,6 +66,7 @@ static void cleanup(/*@null@*/ yasm_sectionhead *sections);
 
 /* Forward declarations: cmd line parser handlers */
 static int opt_special_handler(char *cmd, /*@null@*/ char *param, int extra);
+static int opt_arch_handler(char *cmd, /*@null@*/ char *param, int extra);
 static int opt_parser_handler(char *cmd, /*@null@*/ char *param, int extra);
 static int opt_preproc_handler(char *cmd, /*@null@*/ char *param, int extra);
 static int opt_objfmt_handler(char *cmd, /*@null@*/ char *param, int extra);
@@ -107,6 +108,8 @@ static opt_option options[] =
       N_("show version text"), NULL },
     { 'h', "help", 0, opt_special_handler, SPECIAL_SHOW_HELP,
       N_("show help text"), NULL },
+    { 'a', "arch", 1, opt_arch_handler, 0,
+      N_("select architecture (list with -a help)"), N_("arch") },
     { 'p', "parser", 1, opt_parser_handler, 0,
       N_("select parser (list with -p help)"), N_("parser") },
     { 'r', "preproc", 1, opt_preproc_handler, 0,
@@ -334,12 +337,13 @@ main(int argc, char *argv[])
        return EXIT_SUCCESS;
     }
 
-    /* Set x86 as the architecture (TODO: user choice) */
-    cur_arch = load_arch("x86");
-
+    /* Default to x86 as the architecture */
     if (!cur_arch) {
-       print_error(_("Could not load default architecture"));
-       return EXIT_FAILURE;
+       cur_arch = load_arch("x86");
+       if (!cur_arch) {
+           print_error(_("Could not load default architecture"));
+           return EXIT_FAILURE;
+       }
     }
 
     cur_arch->initialize();
@@ -410,12 +414,14 @@ main(int argc, char *argv[])
        cur_objfmt->initialize(in_filename, obj_filename, cur_dbgfmt,
                               cur_arch);
 
-    /* Set NASM as the parser */
-    cur_parser = load_parser("nasm");
+    /* Default to NASM as the parser */
     if (!cur_parser) {
-       print_error(_("unrecognized parser `%s'"), "nasm");
-       cleanup(NULL);
-       return EXIT_FAILURE;
+       cur_parser = load_parser("nasm");
+       if (!cur_parser) {
+           print_error(_("Could not load default parser"));
+           cleanup(NULL);
+           return EXIT_FAILURE;
+       }
     }
 
     /* If not already specified, default to the parser's default preproc. */
@@ -604,6 +610,24 @@ opt_special_handler(/*@unused@*/ char *cmd, /*@unused@*/ char *param, int extra)
     return 0;
 }
 
+static int
+opt_arch_handler(/*@unused@*/ char *cmd, char *param, /*@unused@*/ int extra)
+{
+    assert(param != NULL);
+    cur_arch = load_arch(param);
+    if (!cur_arch) {
+       if (!strcmp("help", param)) {
+           printf(_("Available yasm architectures:\n"));
+           list_archs(print_list_keyword_desc);
+           special_options = SPECIAL_LISTED;
+           return 0;
+       }
+       print_error(_("unrecognized architecture `%s'"), param);
+       return 1;
+    }
+    return 0;
+}
+
 static int
 opt_parser_handler(/*@unused@*/ char *cmd, char *param, /*@unused@*/ int extra)
 {