Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
2.6 KiB

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <direct.h>
  4. #include <assert.h>
  5. #include <tchar.h>
  6. #include <dbghelp.h>
  7. #include <strsafe.h>
  8. #include <str.h>
  9. BOOL
  10. wcs2ansi(
  11. const wchar_t *pwsz,
  12. char *psz,
  13. DWORD pszlen
  14. )
  15. {
  16. BOOL rc;
  17. int len;
  18. assert(psz && pwsz);
  19. len = wcslen(pwsz);
  20. if (!len) {
  21. *psz = 0;
  22. return TRUE;
  23. }
  24. rc = WideCharToMultiByte(CP_ACP,
  25. WC_SEPCHARS | WC_COMPOSITECHECK,
  26. pwsz,
  27. len,
  28. psz,
  29. pszlen,
  30. NULL,
  31. NULL);
  32. if (!rc)
  33. return FALSE;
  34. psz[len] = 0;
  35. return TRUE;
  36. }
  37. BOOL
  38. ansi2wcs(
  39. const char *psz,
  40. wchar_t *pwsz,
  41. DWORD pwszlen
  42. )
  43. {
  44. BOOL rc;
  45. int len;
  46. assert(psz && pwsz);
  47. len = strlen(psz);
  48. if (!len) {
  49. *pwsz = 0L;
  50. return TRUE;
  51. }
  52. rc = MultiByteToWideChar(CP_ACP,
  53. MB_COMPOSITE,
  54. psz,
  55. len,
  56. pwsz,
  57. pwszlen);
  58. if (!rc)
  59. return FALSE;
  60. pwsz[len] = 0;
  61. return TRUE;
  62. }
  63. BOOL
  64. tchar2ansi(
  65. const TCHAR *tsz,
  66. char *psz,
  67. DWORD pszlen
  68. )
  69. {
  70. #ifdef UNICODE
  71. return wcs2ansi(tsz, psz, pszlen);
  72. #else
  73. strcpy(psz, tsz);
  74. return true;
  75. #endif
  76. }
  77. BOOL
  78. ansi2tchar(
  79. const char *psz,
  80. TCHAR *tsz,
  81. DWORD tszlen
  82. )
  83. {
  84. #ifdef UNICODE
  85. return ansi2wcs(psz, tsz, tszlen);
  86. #else
  87. strcpy(tsz, psz);
  88. return true;
  89. #endif
  90. }
  91. void EnsureTrailingBackslash(TCHAR *sz)
  92. {
  93. int i;
  94. assert(sz);
  95. i = _tcslen(sz);
  96. if (!i)
  97. return;
  98. if (sz[i - 1] == TEXT('\\'))
  99. return;
  100. sz[i] = TEXT('\\');
  101. sz[i + 1] = TEXT('\0');
  102. }
  103. void RemoveTrailingBackslash(TCHAR *sz)
  104. {
  105. int i;
  106. assert(sz);
  107. i = _tcslen(sz);
  108. if (!i)
  109. return;
  110. if (sz[i - 1] == TEXT('\\'))
  111. sz[i] = TEXT('\0');
  112. }
  113. void getpath(TCHAR *fullpath, TCHAR *path, DWORD size)
  114. {
  115. static TCHAR drive[SZ_SIZE];
  116. static TCHAR dir[SZ_SIZE];
  117. assert(fullpath && *fullpath && path);
  118. _tsplitpath(fullpath, drive, dir, NULL, NULL);
  119. StringCchCopy(path, size, drive);
  120. StringCchCat(path, size, dir);
  121. path += _tcslen(path) - 1;
  122. if (*path == TEXT('\\'))
  123. *path = TEXT('\0');
  124. }