PathCchAddExtension.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. #define DEFINE_UNICODE FALSE
  3. #define _PATH_SEPARATOR_CHR '\\'
  4. #define PATH_CCH_ADD_EXTENSION PathCchAddExtensionA
  5. */
  6. #if DEFINE_UNICODE
  7. HRESULT PATH_CCH_ADD_EXTENSION(PWSTR pszPath, size_t cchPath, PCWSTR pszExt)
  8. {
  9. #ifdef _WIN32
  10. LPWSTR pDot;
  11. BOOL bExtDot;
  12. LPWSTR pBackslash;
  13. size_t pszExtLength;
  14. size_t pszPathLength;
  15. if (!pszPath)
  16. return E_INVALIDARG;
  17. if (!pszExt)
  18. return E_INVALIDARG;
  19. pszExtLength = lstrlenW(pszExt);
  20. pszPathLength = lstrlenW(pszPath);
  21. bExtDot = (pszExt[0] == '.') ? TRUE : FALSE;
  22. pDot = wcsrchr(pszPath, '.');
  23. pBackslash = wcsrchr(pszPath, _PATH_SEPARATOR_CHR);
  24. if (pDot && pBackslash)
  25. {
  26. if (pDot > pBackslash)
  27. return S_FALSE;
  28. }
  29. if (cchPath > pszPathLength + pszExtLength + ((bExtDot) ? 0 : 1))
  30. {
  31. if (bExtDot)
  32. swprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, L"%s", pszExt);
  33. else
  34. swprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, L".%s", pszExt);
  35. return S_OK;
  36. }
  37. #endif
  38. return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
  39. }
  40. #else
  41. HRESULT PATH_CCH_ADD_EXTENSION(PSTR pszPath, size_t cchPath, PCSTR pszExt)
  42. {
  43. CHAR* pDot;
  44. BOOL bExtDot;
  45. CHAR* pBackslash;
  46. size_t pszExtLength;
  47. size_t pszPathLength;
  48. if (!pszPath)
  49. return E_INVALIDARG;
  50. if (!pszExt)
  51. return E_INVALIDARG;
  52. pszExtLength = lstrlenA(pszExt);
  53. pszPathLength = lstrlenA(pszPath);
  54. bExtDot = (pszExt[0] == '.') ? TRUE : FALSE;
  55. pDot = strrchr(pszPath, '.');
  56. pBackslash = strrchr(pszPath, _PATH_SEPARATOR_CHR);
  57. if (pDot && pBackslash)
  58. {
  59. if (pDot > pBackslash)
  60. return S_FALSE;
  61. }
  62. if (cchPath > pszPathLength + pszExtLength + ((bExtDot) ? 0 : 1))
  63. {
  64. if (bExtDot)
  65. sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, "%s", pszExt);
  66. else
  67. sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, ".%s", pszExt);
  68. return S_OK;
  69. }
  70. return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
  71. }
  72. #endif
  73. /*
  74. #undef DEFINE_UNICODE
  75. #undef _PATH_SEPARATOR_CHR
  76. #undef PATH_CCH_ADD_EXTENSION
  77. */