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.

65 lines
1.4 KiB

  1. #pragma once
  2. #pragma warning( disable : 4267 6387 )
  3. #include <windows.h>
  4. #include "crt.h"
  5. inline size_t get_module_path(HMODULE module, wchar_t **result, size_t *size, size_t free_space)
  6. {
  7. size_t i = 0;
  8. size_t len, s;
  9. *result = NULL;
  10. do
  11. {
  12. if (*result != NULL)
  13. memfree(*result);
  14. i++;
  15. s = i * MAX_PATH + 1;
  16. *result = memalloc(sizeof(wchar_t) * s);
  17. len = GetModuleFileNameW(module, *result, s);
  18. }
  19. while (GetLastError() == ERROR_INSUFFICIENT_BUFFER && s - len >= free_space);
  20. if (size != NULL)
  21. *size = s;
  22. return len;
  23. }
  24. inline wchar_t *get_ini_entry(const wchar_t *config_file, const wchar_t *section, const wchar_t *key,
  25. const wchar_t *default_val)
  26. {
  27. size_t i = 0;
  28. size_t size, read;
  29. wchar_t *result = NULL;
  30. do
  31. {
  32. if (result != NULL)
  33. memfree(result);
  34. i++;
  35. size = i * MAX_PATH + 1;
  36. result = memalloc(sizeof(wchar_t) * size);
  37. read = GetPrivateProfileStringW(section, key, default_val, result, size, config_file);
  38. }
  39. while (read == size - 1);
  40. return result;
  41. }
  42. inline wchar_t *get_file_name_no_ext(wchar_t *str, size_t len)
  43. {
  44. size_t ext_index = len;
  45. size_t i;
  46. for (i = len; i > 0; i--)
  47. {
  48. wchar_t c = *(str + i);
  49. if (c == L'.' && ext_index == len)
  50. ext_index = i;
  51. else if (c == L'\\')
  52. break;
  53. }
  54. size_t result_len = ext_index - i;
  55. wchar_t *result = memcalloc(sizeof(wchar_t) * result_len);
  56. wmemcpy(result, str + i + 1, result_len - 1);
  57. return result;
  58. }