From 7cf41963391146126ec2d0064e8fb573fc0addf5 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 15 Oct 1999 16:45:31 +0000 Subject: [PATCH] jvgenmain.c (usage): New function. * jvgenmain.c (usage): New function. (main): Use it. Also, handle `-D' options. * jvspec.c (lang_specific_driver): Recognize -D. (jvgenmain_spec): Added `%{D*}' to jvgenmain invocation. From-SVN: r30019 --- gcc/java/ChangeLog | 5 ++++ gcc/java/jvgenmain.c | 58 +++++++++++++++++++++++++++++++++++++------- gcc/java/jvspec.c | 10 +++++++- 3 files changed, 63 insertions(+), 10 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 983de4d5835..27a36f9e2de 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,5 +1,10 @@ 1999-10-14 Tom Tromey + * jvgenmain.c (usage): New function. + (main): Use it. Also, handle `-D' options. + * jvspec.c (lang_specific_driver): Recognize -D. + (jvgenmain_spec): Added `%{D*}' to jvgenmain invocation. + * jvspec.c (jvgenmain_spec): Use `%umain', not just `%u'. 1999-10-14 Kaveh R. Ghazi diff --git a/gcc/java/jvgenmain.c b/gcc/java/jvgenmain.c index 07044848def..86040fcba3f 100644 --- a/gcc/java/jvgenmain.c +++ b/gcc/java/jvgenmain.c @@ -1,5 +1,5 @@ /* Program to generate "main" a Java(TM) class containing a main method. - Copyright (C) 1998 Free Software Foundation, Inc. + Copyright (C) 1998, 1999 Free Software Foundation, Inc. This file is part of GNU CC. @@ -79,39 +79,79 @@ gcc_obstack_init (obstack) (void (*) PROTO((void *))) OBSTACK_CHUNK_FREE); } +static void +usage (const char *name) +{ + fprintf (stderr, "Usage: %s [OPTIONS]... CLASSNAME [OUTFILE]\n", name); + exit (1); +} + int main (int argc, const char **argv) { const char *classname; FILE *stream; const char *mangled_classname; + int i, last_arg; + + if (argc < 2) + usage (argv[0]); - if (argc < 2 || argc > 3) + for (i = 1; i < argc; ++i) { - fprintf (stderr, "Usage: %s CLASSNAME [OUTFILE]\n", argv[0]); - exit(-1); + if (! strncmp (argv[i], "-D", 2)) + { + /* Handled later. */ + } + else + break; } - classname = argv[1]; + if (i < argc - 2 || i == argc) + usage (argv[0]); + last_arg = i; + + classname = argv[i]; gcc_obstack_init (&name_obstack); append_gpp_mangled_classtype (&name_obstack, classname); obstack_1grow (&name_obstack, '\0'); mangled_classname = obstack_finish (&name_obstack); - if (argc > 2 && strcmp (argv[2], "-") != 0) + if (i < argc - 1 && strcmp (argv[i + 1], "-") != 0) { - const char *outfile = argv[2]; + const char *outfile = argv[i + 1]; stream = fopen (outfile, "w"); if (stream == NULL) { fprintf (stderr, "%s: Cannot open output file: %s\n", argv[0], outfile); - exit (-1); + exit (1); } } else stream = stdout; + + /* At this point every element of ARGV from 1 to LAST_ARG is a `-D' + option. Process them appropriately. */ + fprintf (stream, "const char *_Jv_Compiler_Properties[] =\n{\n"); + for (i = 1; i < last_arg; ++i) + { + const char *p; + fprintf (stream, " \""); + for (p = &argv[i][2]; *p; ++p) + { + if (! isascii (*p)) + fprintf (stream, "\\%o", *p); + else if (*p == '\\' || *p == '"') + fprintf (stream, "\\%c", *p); + else + putc (*p, stream); + } + fprintf (stream, "\",\n"); + } + fprintf (stream, " 0\n};\n\n"); + fprintf (stream, "extern struct Class %s%s;\n", class_mangling_prefix, mangled_classname); fprintf (stream, "int main (int argc, const char **argv)\n"); @@ -123,7 +163,7 @@ main (int argc, const char **argv) { fprintf (stderr, "%s: Failed to close output file %s\n", argv[0], argv[2]); - exit (-1); + exit (1); } return 0; } diff --git a/gcc/java/jvspec.c b/gcc/java/jvspec.c index 87d893d9747..d4dde5e4635 100644 --- a/gcc/java/jvspec.c +++ b/gcc/java/jvspec.c @@ -50,7 +50,7 @@ int lang_specific_extra_outfiles = 0; #define COMBINE_INPUTS 0 const char jvgenmain_spec[] = - "jvgenmain %i %{!pipe:%umain.i} |\n\ + "jvgenmain %{D*} %i %{!pipe:%umain.i} |\n\ cc1 %{!pipe:%Umain.i} %1 \ %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\ %{g*} %{O*} \ @@ -163,6 +163,9 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries) int saw_O = 0; int saw_g = 0; + /* Saw a `-D' option. */ + int saw_D = 0; + /* An array used to flag each argument that needs a bit set for LANGSPEC, MATHLIB, WITHLIBC, or GCLIB. */ int *args; @@ -247,6 +250,8 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries) library = 0; will_link = 0; } + else if (argv[i][1] == 'D') + saw_D = 1; else if (argv[i][1] == 'g') saw_g = 1; else if (argv[i][1] == 'O') @@ -331,6 +336,9 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries) if (quote) fatal ("argument to `%s' missing\n", quote); + if (saw_D && ! main_class_name) + fatal ("can't specify `-D' without `--main'\n"); + num_args = argc + added; if (saw_C) { -- 2.30.2