< prev index next >

src/java.base/windows/native/libjli/java_md.c

Print this page




1000             JLI_MemFree(nargv[i]);
1001         }
1002         JLI_MemFree(nargv);
1003         return NewPlatformStringArray(env, strv, argc);
1004     }
1005     NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
1006                                                 "expandArgs",
1007                                                 "([Ljava/lang/String;)[Ljava/lang/String;"));
1008 
1009     // expand the arguments that require expansion, the java method will strip
1010     // out the indicator character.
1011     NULL_CHECK0(inArray = NewPlatformStringArray(env, nargv, argc));
1012     outArray = (*env)->CallStaticObjectMethod(env, cls, mid, inArray);
1013     for (i = 0; i < argc; i++) {
1014         JLI_MemFree(nargv[i]);
1015     }
1016     JLI_MemFree(nargv);
1017     JLI_MemFree(filteredargs);
1018     return outArray;
1019 }
















































































1000             JLI_MemFree(nargv[i]);
1001         }
1002         JLI_MemFree(nargv);
1003         return NewPlatformStringArray(env, strv, argc);
1004     }
1005     NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
1006                                                 "expandArgs",
1007                                                 "([Ljava/lang/String;)[Ljava/lang/String;"));
1008 
1009     // expand the arguments that require expansion, the java method will strip
1010     // out the indicator character.
1011     NULL_CHECK0(inArray = NewPlatformStringArray(env, nargv, argc));
1012     outArray = (*env)->CallStaticObjectMethod(env, cls, mid, inArray);
1013     for (i = 0; i < argc; i++) {
1014         JLI_MemFree(nargv[i]);
1015     }
1016     JLI_MemFree(nargv);
1017     JLI_MemFree(filteredargs);
1018     return outArray;
1019 }
1020 
1021 /*
1022  * Translate Unicode command line arguments to multi byte chars.
1023  */
1024 static jboolean
1025 DecodeUnicodeArgs(LPWSTR cmd_line_wide, LPSTR* cmd_line_utf8) {
1026     int cmd_line_utf8_length;
1027 
1028     // First call to WideCharToMultiByte calculates destination buffer length.
1029     cmd_line_utf8_length = WideCharToMultiByte(CP_UTF8,
1030                                             0,
1031                                             cmd_line_wide,
1032                                             -1,
1033                                             NULL,
1034                                             0,
1035                                             NULL,
1036                                             NULL);
1037     if (!cmd_line_utf8_length) {
1038         JLI_ReportErrorMessage(
1039             "WideCharToMultiByte failed to calculate destination buffer length "
1040             "with error code %d", GetLastError());
1041         return JNI_FALSE;
1042     }
1043 
1044     // Allocate buffer to receive conversion to UTF-8.
1045     *cmd_line_utf8 = JLI_MemAlloc((size_t)cmd_line_utf8_length * sizeof(CHAR));
1046 
1047     // Second call to WideCharToMultiByte does the actual conversion.
1048     if (!WideCharToMultiByte(CP_UTF8,
1049                              0,
1050                              cmd_line_wide,
1051                              -1,
1052                              *cmd_line_utf8,
1053                              cmd_line_utf8_length,
1054                              NULL,
1055                              NULL)) {
1056         JLI_ReportErrorMessage(
1057             "WideCharToMultiByte failed to convert to UTF-8 "
1058             "with error code %d", GetLastError());
1059         JLI_MemFree(*cmd_line_utf8);
1060         *cmd_line_utf8 = NULL;
1061         return JNI_FALSE;
1062     }
1063     return JNI_TRUE;
1064 }
1065 
1066 /*
1067  * Translate command line arguments from Windows format to argc+argv.
1068  */
1069 static void
1070 ConvertWinArgsToCommonFormat(LPSTR cmd_line, int *pargc, char*** pargv) {
1071     JLI_CmdToArgs(cmd_line);
1072 
1073     *pargc = JLI_GetStdArgc();
1074     // add one more to mark the end
1075     *pargv = (char **)JLI_MemAlloc((*pargc + 1) * (sizeof(char *)));
1076     {
1077         int i = 0;
1078         StdArg *stdargs = JLI_GetStdArgs();
1079         for (i = 0 ; i < *pargc ; ++i) {
1080             (*pargv)[i] = stdargs[i].arg;
1081         }
1082         (*pargv)[i] = NULL;
1083     }
1084 }
1085 
1086 jboolean
1087 JLI_DecodeArgs(int *pargc, char*** pargv) {
1088     LPSTR cmdLineUtf8;
1089 
1090     if (!DecodeUnicodeArgs(GetCommandLineW(), &cmdLineUtf8)) {
1091         return JNI_FALSE;
1092     }
1093     ConvertWinArgsToCommonFormat(cmdLineUtf8, pargc, pargv);
1094     JLI_MemFree(cmdLineUtf8);
1095 
1096     return JNI_TRUE;
1097 }
< prev index next >