| /* Copyright (C) 1999-2007 Free Software Foundation |
| |
| This file is part of libgcj. |
| |
| This software is copyrighted work licensed under the terms of the |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for |
| details. */ |
| |
| #include <config.h> |
| |
| #include <jvm.h> |
| #include <gcj/cni.h> |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| |
| static void |
| help () |
| { |
| printf ("Usage: gij [OPTION] ... CLASS [ARGS] ...\n"); |
| printf (" to interpret Java bytecodes, or\n"); |
| printf (" gij -jar [OPTION] ... JARFILE [ARGS] ...\n"); |
| printf (" to execute a jar file\n\n"); |
| printf (" --cp LIST set class path\n"); |
| printf (" --classpath LIST set class path\n"); |
| printf (" -DVAR=VAL define property VAR with value VAL\n"); |
| printf (" -?, --help print this help, then exit\n"); |
| printf (" -X print help on supported -X options, then exit\n"); |
| printf (" --ms=NUMBER set initial heap size\n"); |
| printf (" --mx=NUMBER set maximum heap size\n"); |
| printf (" --verbose[:class] print information about class loading\n"); |
| printf (" --showversion print version number, then keep going\n"); |
| printf (" --version print version number, then exit\n"); |
| printf ("\nOptions can be specified with `-' or `--'.\n"); |
| printf ("\nSee http://gcc.gnu.org/java/ for information on reporting bugs\n"); |
| exit (0); |
| } |
| |
| static void |
| version () |
| { |
| printf ("java version \"" JV_VERSION "\"\n"); |
| printf ("gij (GNU libgcj) version %s\n\n", __VERSION__); |
| printf ("Copyright (C) 2007 Free Software Foundation, Inc.\n"); |
| printf ("This is free software; see the source for copying conditions. There is NO\n"); |
| printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); |
| } |
| |
| static void |
| nonstandard_opts_help () |
| { |
| printf (" -Xms<size> set initial heap size\n"); |
| printf (" -Xmx<size> set maximum heap size\n"); |
| printf (" -Xss<size> set thread stack size\n"); |
| exit (0); |
| } |
| |
| static void |
| add_option (JvVMInitArgs& vm_args, char const* option, void const* extra) |
| { |
| vm_args.options = |
| (JvVMOption*) JvRealloc (vm_args.options, |
| (vm_args.nOptions + 1) * sizeof (JvVMOption)); |
| |
| vm_args.options[vm_args.nOptions].optionString = const_cast<char*> (option); |
| vm_args.options[vm_args.nOptions].extraInfo = const_cast<void*> (extra); |
| ++vm_args.nOptions; |
| } |
| |
| int |
| main (int argc, char const** argv) |
| { |
| JvVMInitArgs vm_args; |
| bool jar_mode = false; |
| |
| vm_args.options = NULL; |
| vm_args.nOptions = 0; |
| vm_args.ignoreUnrecognized = true; |
| |
| // Command-line options always override the CLASSPATH environment |
| // variable. |
| char *classpath = getenv("CLASSPATH"); |
| |
| if (classpath) |
| { |
| char* darg = (char*) JvMalloc (strlen (classpath) |
| + sizeof ("-Djava.class.path=")); |
| sprintf (darg, "-Djava.class.path=%s", classpath); |
| add_option (vm_args, darg, NULL); |
| } |
| |
| // Handle arguments to the java command. Store in vm_args arguments |
| // handled by the invocation API. |
| int i; |
| for (i = 1; i < argc; ++i) |
| { |
| char* arg = const_cast<char*> (argv[i]); |
| |
| // A non-option stops processing. |
| if (arg[0] != '-') |
| break; |
| |
| // A "--" stops processing. |
| if (! strcmp (arg, "--")) |
| { |
| ++i; |
| break; |
| } |
| |
| // Allow both single or double hyphen for all options. |
| if (arg[1] == '-') |
| ++arg; |
| |
| // Ignore JIT options |
| if (! strcmp (arg, "-client")) |
| continue; |
| else if (! strcmp (arg, "-server")) |
| continue; |
| else if (! strcmp (arg, "-hotspot")) |
| continue; |
| else if (! strcmp (arg, "-jrockit")) |
| continue; |
| // JVM Tool Interface options. |
| else if (! strncmp (arg, "-agentlib:", sizeof ("-agentlib:") - 1)) |
| add_option (vm_args, arg, NULL); |
| else if (! strncmp (arg, "-agentpath:", sizeof ("-agentpath:") - 1)) |
| add_option (vm_args, arg, NULL); |
| else if (! strcmp (arg, "-classpath") || ! strcmp (arg, "-cp")) |
| { |
| if (i >= argc - 1) |
| { |
| no_arg: |
| fprintf (stderr, "gij: option requires an argument -- `%s'\n", |
| argv[i]); |
| fprintf (stderr, "Try `gij --help' for more information.\n"); |
| exit (1); |
| } |
| |
| // Sun seems to translate the -classpath option into |
| // -Djava.class.path because if both -classpath and |
| // -Djava.class.path are specified on the java command line, |
| // the last one always wins. |
| char* darg = (char*) JvMalloc (strlen (argv[++i]) |
| + sizeof ("-Djava.class.path=")); |
| sprintf (darg, "-Djava.class.path=%s", argv[i]); |
| add_option (vm_args, darg, NULL); |
| } |
| else if (! strcmp (arg, "-debug")) |
| { |
| char* xarg = strdup ("-Xdebug"); |
| add_option (vm_args, xarg, NULL); |
| } |
| else if (! strncmp (arg, "-D", sizeof ("-D") - 1)) |
| add_option (vm_args, arg, NULL); |
| // Ignore 32/64-bit JIT options |
| else if (! strcmp (arg, "-d32") || ! strcmp (arg, "-d64")) |
| continue; |
| else if (! strncmp (arg, "-enableassertions", sizeof ("-enableassertions") - 1) |
| || ! strncmp (arg, "-ea", sizeof ("-ea") - 1)) |
| { |
| // FIXME: hook up assertion support |
| continue; |
| } |
| else if (! strncmp (arg, "-disableassertions", sizeof ("-disableassertions") - 1) |
| || ! strncmp (arg, "-da", sizeof ("-da") - 1)) |
| { |
| // FIXME: hook up assertion support |
| continue; |
| } |
| else if (! strcmp (arg, "-enablesystemassertions") |
| || ! strcmp (arg, "-esa")) |
| { |
| // FIXME: hook up system assertion support |
| continue; |
| } |
| else if (! strcmp (arg, "-disablesystemassertions") |
| || ! strcmp (arg, "-dsa")) |
| { |
| // FIXME |
| continue; |
| } |
| else if (! strcmp (arg, "-jar")) |
| { |
| jar_mode = true; |
| continue; |
| } |
| // Ignore java.lang.instrument option |
| else if (! strncmp (arg, "-javaagent:", sizeof ("-javaagent:") - 1)) |
| continue; |
| else if (! strcmp (arg, "-noclassgc")) |
| { |
| char* xarg = strdup ("-Xnoclassgc"); |
| add_option (vm_args, xarg, NULL); |
| } |
| // -ms=n |
| else if (! strncmp (arg, "-ms=", sizeof ("-ms=") - 1)) |
| { |
| arg[1] = 'X'; |
| arg[2] = 'm'; |
| arg[3] = 's'; |
| add_option (vm_args, arg, NULL); |
| } |
| // -ms n |
| else if (! strcmp (arg, "-ms")) |
| { |
| if (i >= argc - 1) |
| goto no_arg; |
| |
| char* xarg = (char*) JvMalloc (strlen (argv[++i]) |
| + sizeof ("-Xms")); |
| sprintf (xarg, "-Xms%s", argv[i]); |
| add_option (vm_args, xarg, NULL); |
| } |
| // -msn |
| else if (! strncmp (arg, "-ms", sizeof ("-ms") - 1)) |
| { |
| char* xarg = (char*) JvMalloc (strlen (arg) + sizeof ("X")); |
| sprintf (xarg, "-Xms%s", arg + sizeof ("-Xms") - 1); |
| add_option (vm_args, xarg, NULL); |
| } |
| // -mx=n |
| else if (! strncmp (arg, "-mx=", sizeof ("-mx=") - 1)) |
| { |
| arg[1] = 'X'; |
| arg[2] = 'm'; |
| arg[3] = 'x'; |
| add_option (vm_args, arg, NULL); |
| } |
| // -mx n |
| else if (! strcmp (arg, "-mx")) |
| { |
| if (i >= argc - 1) |
| goto no_arg; |
| |
| char* xarg = (char*) JvMalloc (strlen (argv[++i]) |
| + sizeof ("-Xmx")); |
| sprintf (xarg, "-Xmx%s", argv[i]); |
| add_option (vm_args, xarg, NULL); |
| } |
| // -mxn |
| else if (! strncmp (arg, "-mx", sizeof ("-mx") - 1)) |
| { |
| char* xarg = (char*) JvMalloc (strlen (arg) + sizeof ("X")); |
| sprintf (xarg, "-Xmx%s", arg + sizeof ("-Xmx") - 1); |
| add_option (vm_args, xarg, NULL); |
| } |
| // -ss=n |
| else if (! strncmp (arg, "-ss=", sizeof ("-ss=") - 1)) |
| { |
| arg[1] = 'X'; |
| arg[2] = 's'; |
| arg[3] = 's'; |
| add_option (vm_args, arg, NULL); |
| } |
| // -ss n |
| else if (! strcmp (arg, "-ss")) |
| { |
| if (i >= argc - 1) |
| goto no_arg; |
| |
| char* xarg = (char*) JvMalloc (strlen (argv[++i]) |
| + sizeof ("-Xss")); |
| sprintf (xarg, "-Xss%s", argv[i]); |
| add_option (vm_args, xarg, NULL); |
| } |
| // -ssn |
| else if (! strncmp (arg, "-ss", sizeof ("-ss") - 1)) |
| { |
| char* xarg = (char*) JvMalloc (strlen (arg) + sizeof ("X")); |
| sprintf (xarg, "-Xss%s", arg + sizeof ("-Xss") - 1); |
| add_option (vm_args, xarg, NULL); |
| } |
| // This handles all the option variants that begin with |
| // -verbose. |
| else if (! strncmp (arg, "-verbose", 8)) |
| add_option (vm_args, arg, NULL); |
| else if (! strcmp (arg, "-version")) |
| { |
| version (); |
| exit (0); |
| } |
| else if (! strcmp (arg, "-fullversion")) |
| { |
| printf ("java full version \"gcj-" JV_VERSION "\"\n"); |
| exit (0); |
| } |
| else if (! strcmp (arg, "-showversion")) |
| version (); |
| else if (! strcmp (arg, "-help") || ! strcmp (arg, "-?")) |
| help (); |
| else if (! strcmp (arg, "-X")) |
| nonstandard_opts_help (); |
| else if (! strncmp (arg, "-X", 2)) |
| add_option (vm_args, arg, NULL); |
| // Obsolete options recognized for backwards-compatibility. |
| else if (! strcmp (arg, "-verify") |
| || ! strcmp (arg, "-verifyremote")) |
| continue; |
| else if (! strcmp (arg, "-noverify")) |
| { |
| gcj::verifyClasses = false; |
| } |
| else |
| { |
| fprintf (stderr, "gij: unrecognized option -- `%s'\n", argv[i]); |
| fprintf (stderr, "Try `gij --help' for more information.\n"); |
| exit (1); |
| } |
| } |
| |
| if (argc - i < 1) |
| { |
| fprintf (stderr, "Usage: gij [OPTION] ... CLASS [ARGS] ...\n"); |
| fprintf (stderr, " to invoke CLASS.main, or\n"); |
| fprintf (stderr, " gij -jar [OPTION] ... JARFILE [ARGS] ...\n"); |
| fprintf (stderr, " to execute a jar file\n"); |
| fprintf (stderr, "Try `gij --help' for more information.\n"); |
| exit (1); |
| } |
| |
| // -jar mode overrides all other modes of specifying class path: |
| // CLASSPATH, -Djava.class.path, -classpath and -cp. |
| if (jar_mode) |
| { |
| char* darg = (char*) JvMalloc (strlen (argv[i]) |
| + sizeof ("-Djava.class.path=")); |
| sprintf (darg, "-Djava.class.path=%s", argv[i]); |
| add_option (vm_args, darg, NULL); |
| } |
| |
| _Jv_RunMain (&vm_args, NULL, argv[i], argc - i, |
| (char const**) (argv + i), jar_mode); |
| } |