1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker fad1b07018 Squashed 'software/minizinc/' content from commit 4f10c8205
git-subtree-dir: software/minizinc
git-subtree-split: 4f10c82056ffcb1041d7ffef29d77a7eef92cf76
2021-06-16 14:06:46 +10:00

113 lines
3.7 KiB
C++

/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
* Main authors:
* Guido Tack <guido.tack@monash.edu>
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#pragma once
#include <string>
#include <vector>
// Macro so that we can use overloaded wide versions of fstream::open for Windows
#ifdef _WIN32
#define FILE_PATH(path) MiniZinc::FileUtils::utf8_to_wide(path)
#else
#define FILE_PATH(path) (path)
#endif
namespace MiniZinc {
namespace FileUtils {
/// Return full path to current executable
std::string progpath();
/// Test if \a filename exists
bool file_exists(const std::string& filename);
/// Test if \a dirname exists and is a directory
bool directory_exists(const std::string& dirname);
/// Find executable \a filename anywhere on the path
/// On Windows, also check extensions .exe and .bat
std::string find_executable(const std::string& filename);
/// Return full path to file. If \a basePath is not empty, also try resolving
/// relative paths with respect to \a basePath.
std::string file_path(const std::string& filename, const std::string& basePath = std::string());
/// Return directory name containing \a filename
std::string dir_name(const std::string& filename);
/// Return base name of \a filename (without dir_name)
std::string base_name(const std::string& filename);
/// Check whether path is absolute
bool is_absolute(const std::string& path);
/// Return list of files with extension \a ext in directory \a dir
std::vector<std::string> directory_list(const std::string& dir,
const std::string& ext = std::string("*"));
/// Return share/minizinc directory if present anywhere above the executable
std::string share_directory();
/// Return current working directory
std::string working_directory();
/// Get global configuration file name (in share/minizinc directory)
std::string global_config_file();
/// Get per-user configuration file name (usually in home directory or AppData directory)
std::string user_config_file();
/// Get per-user configuration directory name (usually in home directory or AppData directory)
std::string user_config_dir();
/// Parse command line \a s into individual arguments
std::vector<std::string> parse_cmd_line(const std::string& s);
/// Combine individual arguments \a cmd into properly quoted command line
std::string combine_cmd_line(const std::vector<std::string>& cmd);
/// Create a temporary file
class TmpFile {
private:
std::string _name;
#ifdef _WIN32
std::vector<std::string> _tmpNames;
#endif
#ifndef _WIN32
int _tmpfileDesc;
#endif
public:
// Constructor for file with extension \a ext
TmpFile(const std::string& ext);
/// Destructor (removes file)
~TmpFile();
std::string name() const { return _name; }
};
/// Create a temporary directory
class TmpDir {
private:
std::string _name;
public:
// Constructor for difrectory
TmpDir();
/// Destructor (removes directory)
~TmpDir();
std::string name() const { return _name; }
};
/// Inflate string \a s
void inflate_string(std::string& s);
/// Deflate string \a s
std::string deflate_string(const std::string& s);
/// Encode string into base 64
std::string encode_base64(const std::string& s);
/// Decode string from base 64
std::string decode_base64(const std::string& s);
#ifdef _WIN32
/// Convert UTF-16 string to UTF-8
std::string wide_to_utf8(const wchar_t* str, int size = -1);
/// Convert UTF-16 string to UTF-8
std::string wide_to_utf8(const std::wstring& str);
/// Convert UTF-8 string to UTF-16
std::wstring utf8_to_wide(const std::string& str);
#endif
} // namespace FileUtils
} // namespace MiniZinc