diff options
Diffstat (limited to 'src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp')
-rw-r--r-- | src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp b/src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp new file mode 100644 index 000000000..9e0791992 --- /dev/null +++ b/src/libs/7zip/unix/CPP/myWindows/mySplitCommandLine.cpp @@ -0,0 +1,82 @@ +#include "StdAfx.h" + +#include "../Common/StringConvert.h" + +#include "myPrivate.h" + +#ifdef ENV_HAVE_LOCALE +#include <locale.h> +#endif + +extern void my_windows_split_path(const AString &p_path, AString &dir , AString &base); + +void mySplitCommandLine(int numArguments,const char *arguments[],UStringVector &parts) { + + { // define P7ZIP_HOME_DIR + static char p7zip_home_dir[MAX_PATH]; + AString dir,name; + my_windows_split_path(arguments[0],dir,name); + snprintf(p7zip_home_dir,sizeof(p7zip_home_dir),"P7ZIP_HOME_DIR=%s/",(const char *)dir); + p7zip_home_dir[sizeof(p7zip_home_dir)-1] = 0; + putenv(p7zip_home_dir); + } + +#ifdef ENV_HAVE_LOCALE + // set the program's current locale from the user's environment variables + setlocale(LC_ALL,""); + + + // auto-detect which conversion p7zip should use + char *locale = setlocale(LC_CTYPE,0); + if (locale) { + size_t len = strlen(locale); + char *locale_upper = (char *)malloc(len+1); + if (locale_upper) { + strcpy(locale_upper,locale); + + for(size_t i=0;i<len;i++) + locale_upper[i] = toupper(locale_upper[i] & 255); + + if ( (strcmp(locale_upper,"") != 0) + && (strcmp(locale_upper,"C") != 0) + && (strcmp(locale_upper,"POSIX") != 0) ) { + global_use_utf16_conversion = 1; + } + free(locale_upper); + } + } +#elif defined(LOCALE_IS_UTF8) + global_use_utf16_conversion = 1; // assume LC_CTYPE="utf8" +#else + global_use_utf16_conversion = 0; // assume LC_CTYPE="C" +#endif + + parts.Clear(); + for(int ind=0;ind < numArguments; ind++) { + if ((ind <= 2) && (strcmp(arguments[ind],"-no-utf16") == 0)) { + global_use_utf16_conversion = 0; + } else if ((ind <= 2) && (strcmp(arguments[ind],"-utf16") == 0)) { + global_use_utf16_conversion = 1; + } else { + UString tmp = MultiByteToUnicodeString(arguments[ind]); + // tmp.Trim(); " " is a valid filename ... + if (!tmp.IsEmpty()) { + parts.Add(tmp); + } + } + } +} + +const char *my_getlocale(void) { +#ifdef ENV_HAVE_LOCALE + const char* ret = setlocale(LC_CTYPE,0); + if (ret == 0) + ret ="C"; + return ret; +#elif defined(LOCALE_IS_UTF8) + return "utf8"; +#else + return "C"; +#endif +} + |