int parseCommandLine(int argc, char *argv[], InitArgs *args) { int is_jar = FALSE; int status = 1; int i; Property props[argc-1]; int props_count = 0; for(i = 1; i < argc; i++) { if(*argv[i] != '-') { if(args->min_heap > args->max_heap) { printf("Minimum heap size greater than max!\n"); goto exit; } if((args->props_count = props_count)) { args->commandline_props = (Property*)sysMalloc(props_count * sizeof(Property)); memcpy(args->commandline_props, &props[0], props_count * sizeof(Property)); } if(is_jar) { args->classpath = argv[i]; argv[i] = "jamvm/java/lang/JarLauncher"; } return i; } if(strcmp(argv[i], "-help") == 0) { status = 0; break; } else if(strcmp(argv[i], "-X") == 0) { showNonStandardOptions(); status = 0; goto exit; } else if(strcmp(argv[i], "-version") == 0) { showVersionAndCopyright(); status = 0; goto exit; } else if(strcmp(argv[i], "-showversion") == 0) { showVersionAndCopyright(); } else if(strcmp(argv[i], "-fullversion") == 0) { showFullVersion(); status = 0; goto exit; } else if(strncmp(argv[i], "-verbose", 8) == 0) { char *type = &argv[i][8]; if(*type == '\0' || strcmp(type, ":class") == 0) args->verboseclass = TRUE; else if(strcmp(type, ":gc") == 0 || strcmp(type, "gc") == 0) args->verbosegc = TRUE; else if(strcmp(type, ":jni") == 0) args->verbosedll = TRUE; } else if(strcmp(argv[i], "-Xnoasyncgc") == 0) args->noasyncgc = TRUE; else if(strncmp(argv[i], "-ms", 3) == 0 || strncmp(argv[i], "-Xms", 4) == 0) { args->min_heap = parseMemValue(argv[i] + (argv[i][1] == 'm' ? 3 : 4)); if(args->min_heap < MIN_HEAP) { printf("Invalid minimum heap size: %s (min %dK)\n", argv[i], MIN_HEAP/KB); goto exit; } } else if(strncmp(argv[i], "-mx", 3) == 0 || strncmp(argv[i], "-Xmx", 4) == 0) { args->max_heap = parseMemValue(argv[i] + (argv[i][1] == 'm' ? 3 : 4)); if(args->max_heap < MIN_HEAP) { printf("Invalid maximum heap size: %s (min is %dK)\n", argv[i], MIN_HEAP/KB); goto exit; } } else if(strncmp(argv[i], "-ss", 3) == 0 || strncmp(argv[i], "-Xss", 4) == 0) { args->java_stack = parseMemValue(argv[i] + (argv[i][1] == 's' ? 3 : 4)); if(args->java_stack < MIN_STACK) { printf("Invalid Java stack size: %s (min is %dK)\n", argv[i], MIN_STACK/KB); goto exit; } } else if(strncmp(argv[i], "-D", 2) == 0) { char *pntr, *key = strcpy(sysMalloc(strlen(argv[i]+2) + 1), argv[i]+2); for(pntr = key; *pntr && (*pntr != '='); pntr++); if(*pntr) *pntr++ = '\0'; props[props_count].key = key; props[props_count++].value = pntr; } else if(strcmp(argv[i], "-classpath") == 0 || strcmp(argv[i], "-cp") == 0) { if(i == (argc-1)) { printf("%s : missing path list\n", argv[i]); goto exit; } args->classpath = argv[++i]; } else if(strncmp(argv[i], "-Xbootclasspath:", 16) == 0) { args->bootpathopt = '\0'; args->bootpath = argv[i] + 16; } else if(strncmp(argv[i], "-Xbootclasspath/a:", 18) == 0 || strncmp(argv[i], "-Xbootclasspath/p:", 18) == 0 || strncmp(argv[i], "-Xbootclasspath/c:", 18) == 0 || strncmp(argv[i], "-Xbootclasspath/v:", 18) == 0) { args->bootpathopt = argv[i][16]; args->bootpath = argv[i] + 18; } else if(strcmp(argv[i], "-jar") == 0) { is_jar = TRUE; } else if(strcmp(argv[i], "-Xnocompact") == 0) { args->compact_specified = TRUE; args->do_compact = FALSE; } else if(strcmp(argv[i], "-Xcompactalways") == 0) { args->compact_specified = args->do_compact = TRUE; #ifdef INLINING } else if(strcmp(argv[i], "-Xnoinlining") == 0) { /* Turning inlining off is equivalent to setting code memory to zero */ args->codemem = 0; } else if(strncmp(argv[i], "-Xreplication:", 14) == 0) { char *pntr = argv[i] + 14; if(strcmp(pntr, "none") == 0) args->replication = INT_MAX; else if(strcmp(pntr, "always") == 0) args->replication = 0; else args->replication = strtol(pntr, NULL, 0); } else if(strncmp(argv[i], "-Xcodemem:", 10) == 0) { char *pntr = argv[i] + 10; args->codemem = strncmp(pntr, "unlimited", 10) == 0 ? INT_MAX : parseMemValue(pntr); } else if(strcmp(argv[i], "-Xshowreloc") == 0) { showRelocatability(); status = 0; goto exit; #endif } else { printf("Unrecognised command line option: %s\n", argv[i]); break; } } showUsage(argv[0]); exit: exit(status); }
int parseCommonOpts(char *string, InitArgs *args, int is_jni) { int status = OPT_OK; if(strcmp(string, "-Xasyncgc") == 0) args->asyncgc = TRUE; else if(strncmp(string, "-Xms", 4) == 0 || (!is_jni && strncmp(string, "-ms", 3) == 0)) { char *value = string + (string[1] == 'm' ? 3 : 4); args->min_heap = parseMemValue(value); if(args->min_heap < MIN_HEAP) { optError(args, "Invalid minimum heap size: %s (min %dK)\n", string, MIN_HEAP/KB); status = OPT_ERROR; } } else if(strncmp(string, "-Xmx", 4) == 0 || (!is_jni && strncmp(string, "-mx", 3) == 0)) { char *value = string + (string[1] == 'm' ? 3 : 4); args->max_heap = parseMemValue(value); if(args->max_heap < MIN_HEAP) { optError(args, "Invalid maximum heap size: %s (min is %dK)\n", string, MIN_HEAP/KB); status = OPT_ERROR; } } else if(strncmp(string, "-Xss", 4) == 0 || (!is_jni && strncmp(string, "-ss", 3) == 0)) { char *value = string + (string[1] == 'm' ? 3 : 4); args->java_stack = parseMemValue(value); if(args->java_stack < MIN_STACK) { optError(args, "Invalid Java stack size: %s (min is %dK)\n", string, MIN_STACK/KB); status = OPT_ERROR; } } else if(strncmp(string, "-D", 2) == 0) { char *key = strcpy(sysMalloc(strlen(string + 2) + 1), string + 2); char *pntr; for(pntr = key; *pntr && (*pntr != '='); pntr++); if(*pntr) *pntr++ = '\0'; args->commandline_props[args->props_count].key = key; args->commandline_props[args->props_count++].value = pntr; } else if(strncmp(string, "-Xbootclasspath:", 16) == 0) { args->bootpath = string + 16; args->bootpath_p = args->bootpath_a = NULL; } else if(strncmp(string, "-Xbootclasspath/a:", 18) == 0) { args->bootpath_a = string + 18; } else if(strncmp(string, "-Xbootclasspath/p:", 18) == 0) { args->bootpath_p = string + 18; } else if(strcmp(string, "-Xnocompact") == 0) { args->compact_specified = TRUE; args->do_compact = FALSE; } else if(strcmp(string, "-Xcompactalways") == 0) { args->compact_specified = args->do_compact = TRUE; } else if(strcmp(string, "-Xtracejnisigs") == 0) { args->trace_jni_sigs = TRUE; #ifdef INLINING } else if(strcmp(string, "-Xnoinlining") == 0) { /* Turning inlining off is equivalent to setting code memory to zero */ args->codemem = 0; } else if(strcmp(string, "-Xnoprofiling") == 0) { args->profiling = FALSE; } else if(strcmp(string, "-Xnopatching") == 0) { args->branch_patching = FALSE; } else if(strcmp(string, "-Xnopatchingdup") == 0) { args->branch_patching_dup = FALSE; } else if(strcmp(string, "-Xnojoinblocks") == 0) { args->join_blocks = FALSE; } else if(strcmp(string, "-Xcodestats") == 0) { args->print_codestats = TRUE; } else if(strncmp(string, "-Xprofiling:", 12) == 0) { args->profile_threshold = strtol(string + 12, NULL, 0); } else if(strncmp(string, "-Xreplication:", 14) == 0) { char *pntr = string + 14; if(strcmp(pntr, "none") == 0) args->replication_threshold = INT_MAX; else if(strcmp(pntr, "always") == 0) args->replication_threshold = 0; else args->replication_threshold = strtol(pntr, NULL, 0); } else if(strncmp(string, "-Xcodemem:", 10) == 0) { char *pntr = string + 10; args->codemem = strncmp(pntr, "unlimited", 10) == 0 ? INT_MAX : parseMemValue(pntr); } else if(strcmp(string, "-Xshowreloc") == 0) { showRelocatability(); #endif #ifdef HAVE_PROFILE_STUBS } else if(strcmp(string, "-Xdumpstubsprofiles") == 0) { args->dump_stubs_profiles = TRUE; #endif /* Compatibility options */ } else { int i; for(i = 0; compat[i].option != NULL; i++) { int len = strlen(compat[i].option); if(strncmp(string, compat[i].option, len) == 0 && (((compat[i].flags & OPT_ARG) && string[len] == ':') || ((compat[i].flags & OPT_NOARG) && string[len] == '\0'))) break; } if(compat[i].option == NULL) status = OPT_UNREC; } return status; }