PageRenderTime 30ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/mordor/main.cpp

http://github.com/mozy/mordor
C++ | 43 lines | 38 code | 4 blank | 1 comment | 11 complexity | 7aa9e9642bd23d62571bb41221428083 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2010 - Mozy, Inc.
  2. #include "main.h"
  3. #ifdef WINDOWS
  4. namespace Mordor {
  5. char **CommandLineToUtf8(int argc, wchar_t **argvW)
  6. {
  7. DWORD totalLength = (argc + 1) * sizeof(char *);
  8. DWORD wcFlags = WC_ERR_INVALID_CHARS;
  9. for (int i = 0; i < argc; ++i) {
  10. int ret = WideCharToMultiByte(CP_UTF8, wcFlags, argvW[i], -1, NULL, 0, NULL, NULL);
  11. if (ret == 0 && GetLastError() == ERROR_INVALID_FLAGS) {
  12. wcFlags = 0;
  13. ret = WideCharToMultiByte(CP_UTF8, wcFlags, argvW[i], -1, NULL, 0, NULL, NULL);
  14. }
  15. if (ret == 0)
  16. return NULL;
  17. totalLength += ret;
  18. }
  19. char **result = (char **)LocalAlloc(LMEM_FIXED, totalLength);
  20. if (!result)
  21. return NULL;
  22. char *strings = (char *)result + (argc + 1) * sizeof(char *);
  23. totalLength -= (argc + 1) * sizeof(char *);
  24. for (int i = 0; i < argc; ++i) {
  25. result[i] = strings;
  26. int ret = WideCharToMultiByte(CP_UTF8, wcFlags, argvW[i], -1, strings,
  27. totalLength, NULL, NULL);
  28. if (ret == 0) {
  29. LocalFree(result);
  30. return NULL;
  31. }
  32. strings += ret;
  33. totalLength -= ret;
  34. }
  35. result[argc] = NULL;
  36. return result;
  37. }
  38. }
  39. #endif