jdk/src/windows/bin/java_md.c
changeset 13411 224a28370893
parent 12047 320a714614e9
child 16077 92008ab562e0
equal deleted inserted replaced
13410:e667545511c7 13411:224a28370893
  1355 jboolean
  1355 jboolean
  1356 ProcessPlatformOption(const char *arg)
  1356 ProcessPlatformOption(const char *arg)
  1357 {
  1357 {
  1358     return JNI_FALSE;
  1358     return JNI_FALSE;
  1359 }
  1359 }
       
  1360 
       
  1361 /*
       
  1362  * At this point we have the arguments to the application, and we need to
       
  1363  * check with original stdargs in order to compare which of these truly
       
  1364  * needs expansion. cmdtoargs will specify this if it finds a bare
       
  1365  * (unquoted) argument containing a glob character(s) ie. * or ?
       
  1366  */
       
  1367 jobjectArray
       
  1368 CreateApplicationArgs(JNIEnv *env, char **strv, int argc)
       
  1369 {
       
  1370     int i, j, idx, tlen;
       
  1371     jobjectArray outArray, inArray;
       
  1372     char *ostart, *astart, **nargv;
       
  1373     jboolean needs_expansion = JNI_FALSE;
       
  1374     jmethodID mid;
       
  1375     int stdargc;
       
  1376     StdArg *stdargs;
       
  1377     jclass cls = GetLauncherHelperClass(env);
       
  1378     NULL_CHECK0(cls);
       
  1379 
       
  1380     if (argc == 0) {
       
  1381         return NewPlatformStringArray(env, strv, argc);
       
  1382     }
       
  1383     // the holy grail we need to compare with.
       
  1384     stdargs = JLI_GetStdArgs();
       
  1385     stdargc = JLI_GetStdArgc();
       
  1386 
       
  1387     // sanity check, this should never happen
       
  1388     if (argc > stdargc) {
       
  1389         JLI_TraceLauncher("Warning: app args is larger than the original, %d %d\n", argc, stdargc);
       
  1390         JLI_TraceLauncher("passing arguments as-is.\n");
       
  1391         return NewPlatformStringArray(env, strv, argc);
       
  1392     }
       
  1393 
       
  1394     // sanity check, match the args we have, to the holy grail
       
  1395     idx = stdargc - argc;
       
  1396     ostart = stdargs[idx].arg;
       
  1397     astart = strv[0];
       
  1398     // sanity check, ensure that the first argument of the arrays are the same
       
  1399     if (JLI_StrCmp(ostart, astart) != 0) {
       
  1400         // some thing is amiss the args don't match
       
  1401         JLI_TraceLauncher("Warning: app args parsing error\n");
       
  1402         JLI_TraceLauncher("passing arguments as-is\n");
       
  1403         return NewPlatformStringArray(env, strv, argc);
       
  1404     }
       
  1405 
       
  1406     // make a copy of the args which will be expanded in java if required.
       
  1407     nargv = (char **)JLI_MemAlloc(argc * sizeof(char*));
       
  1408     for (i = 0, j = idx; i < argc; i++, j++) {
       
  1409         jboolean arg_expand = (JLI_StrCmp(stdargs[j].arg, strv[i]) == 0)
       
  1410                                 ? stdargs[j].has_wildcard
       
  1411                                 : JNI_FALSE;
       
  1412         if (needs_expansion == JNI_FALSE)
       
  1413             needs_expansion = arg_expand;
       
  1414 
       
  1415         // indicator char + String + NULL terminator, the java method will strip
       
  1416         // out the first character, the indicator character, so no matter what
       
  1417         // we add the indicator
       
  1418         tlen = 1 + JLI_StrLen(strv[i]) + 1;
       
  1419         nargv[i] = (char *) JLI_MemAlloc(tlen);
       
  1420         JLI_Snprintf(nargv[i], tlen, "%c%s", arg_expand ? 'T' : 'F', strv[i]);
       
  1421         JLI_TraceLauncher("%s\n", nargv[i]);
       
  1422     }
       
  1423 
       
  1424     if (!needs_expansion) {
       
  1425         // clean up any allocated memory and return back the old arguments
       
  1426         for (i = 0 ; i < argc ; i++) {
       
  1427             JLI_MemFree(nargv[i]);
       
  1428         }
       
  1429         JLI_MemFree(nargv);
       
  1430         return NewPlatformStringArray(env, strv, argc);
       
  1431     }
       
  1432     NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
       
  1433                                                 "expandArgs",
       
  1434                                                 "([Ljava/lang/String;)[Ljava/lang/String;"));
       
  1435 
       
  1436     // expand the arguments that require expansion, the java method will strip
       
  1437     // out the indicator character.
       
  1438     inArray = NewPlatformStringArray(env, nargv, argc);
       
  1439     outArray = (*env)->CallStaticObjectMethod(env, cls, mid, inArray);
       
  1440     for (i = 0; i < argc; i++) {
       
  1441         JLI_MemFree(nargv[i]);
       
  1442     }
       
  1443     JLI_MemFree(nargv);
       
  1444     return outArray;
       
  1445 }