#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif

class utUtils {
 public:
  void get_dir_exec(char* dir, char* exec) {
#ifdef _WIN32
  char BufferFileName[MAX_PATH];
  memset(BufferFileName,0,MAX_PATH);
  if (GetModuleFileName(NULL, BufferFileName, MAX_PATH)) {
    if (exec) {
      snprintf(exec, strlen(BufferFileName), "%s", BufferFileName);
    }

    std::string ss(BufferFileName);
    int idx = ss.find_last_of("\\");
    BufferFileName[idx] = '\0';
    snprintf(dir, strlen(BufferFileName), "%s", BufferFileName);
  }
  return;
#else
    char* filename = nullptr;
    if (readlink("/proc/self/exe", dir, 1024) < 0) {
      dir[0] = '\0';
      return;
    }
    filename = strrchr(dir, '/');
    if (filename == nullptr) {
      dir[0] = '\0';
      return;
    }
    ++filename;
    if (exec) {
      sprintf(exec, "%s", filename);
    }

    *filename = '\0';
    return;
#endif
  }


  std::string get_env(const std::string env) {

#ifdef _WIN32
  char* buf = nullptr;
  size_t sz = 0;
  if (_dupenv_s(&buf, &sz, env.c_str()) == 0 && buf != nullptr) {
      std::string var(buf);
      free(buf);
      return var;
  } else {
    return std::string();
  }

#else
    char* value = getenv(env.c_str());
    if (value == nullptr) {
      return std::string();
    }
    return std::string(value);
#endif
  }
};