Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • ken-martin/kwsys
  • isanych/kwsys
  • scivision/kwsys
  • nvartolomei/kwsys
  • alexy.pellegrini/kwsys
  • leha-bot/kwsys
  • utils/kwsys
  • lakor64/kwsys
  • dbahadir/kwsys
  • evansanita713/kwsys
  • chrstphrchvz/kwsys
  • robertmaynard/kwsys
  • shannonbooth/kwsys
  • brad.king/kwsys
  • eberge/kwsys
  • gjasny/kwsys
  • ben.boeckel/kwsys
  • madscientist/kwsys
  • ulatekh/kwsys
  • Joker-Van/kwsys
  • chuck.atkins/kwsys
  • egorpugin/kwsys
  • mwestphal/kwsys
  • purpleKarrot/kwsys
  • do-m-en/kwsys
  • nicber/kwsys
  • FloriansGit/kwsys
  • pa.solodovnikov/kwsys
  • sbwilson/kwsys
  • R2RT/kwsys
  • asit-dhal/kwsys
  • qarni/kwsys
  • nilsgladitz/kwsys
  • fwinkl/kwsys
  • leon-richardt/kwsys
  • jdavidberger/kwsys
  • seanm/kwsys
  • shawn.waldon/kwsys
  • svelez/kwsys
  • jrtc27/kwsys
  • bdvd/kwsys
  • multiplemonomials/kwsys
  • mwillers/kwsys
  • hernancmartinez/kwsys
  • semlanik/kwsys
  • jesusjcmtool/kwsys
  • vvs31415/kwsys
  • DerDakon/kwsys
  • metti/kwsys
  • dublet/kwsys
  • blowekamp/kwsys
  • bryonbean/kwsys
  • luzpaz/kwsys
  • kfitch42/kwsys
  • sebholt/kwsys
  • clinton/kwsys
  • volo-zyko/kwsys
  • hjmjohnson/kwsys
  • kyle.edwards/kwsys
  • sankhesh/kwsys
  • sebastianlipponer/kwsys
  • veprbl/kwsys
  • nekto1989/kwsys
  • todoooo/kwsys
  • spiros.tsalikis/kwsys
  • dnakamura/kwsys
  • dawesc/kwsys
  • orgads/kwsys
  • whoozle/kwsys
  • makise-homura/kwsys
  • LetWe/kwsys
  • lemniscati/kwsys
  • rleigh/kwsys
  • sjoubert/kwsys
  • dzenanz/kwsys
  • georg-emg/kwsys
  • marc.chevrier/kwsys
  • mstorsjo/kwsys
  • clemenswasser/kwsys
  • besser82/kwsys
  • thewtex/kwsys
  • yuriy-odonnell-epic/kwsys
  • huangguojun/kwsys
  • ceztko/kwsys
  • klossto/kwsys
  • cory.quammen/kwsys
  • cwarner-8702/kwsys
  • flagarde/kwsys
  • petk/kwsys
  • tstellar/kwsys
  • Lekensteyn/kwsys
  • crondog/kwsys
  • ihnorton/kwsys
  • albert-astals-cid-kdab/kwsys
  • alimpfard/kwsys
  • leibabarry/kwsys
  • jvanboxtel/kwsys
  • laurent.malka/kwsys
  • martin.duffy/kwsys
  • brad0/kwsys
  • jpr42/kwsys
  • neek78/kwsys
  • nnemkin/kwsys
  • Pospelove/kwsys
  • timblechmann/kwsys
  • nocnokneo/kwsys
  • hygonsoc/kwsys
  • dutow/kwsys
  • novas0x2a/kwsys
  • Markus87/kwsys
  • Xeonacid/kwsys
111 results
Show changes
Commits on Source (529)
--- ---
# This configuration requires clang-format version 6.0 exactly. # This configuration requires clang-format version 18 exactly.
BasedOnStyle: Mozilla BasedOnStyle: Mozilla
AlignOperands: false AlignOperands: false
AllowShortFunctionsOnASingleLine: InlineOnly AllowShortFunctionsOnASingleLine: InlineOnly
...@@ -16,6 +16,7 @@ BraceWrapping: ...@@ -16,6 +16,7 @@ BraceWrapping:
BreakBeforeBraces: Custom BreakBeforeBraces: Custom
ColumnLimit: 79 ColumnLimit: 79
IndentPPDirectives: AfterHash IndentPPDirectives: AfterHash
QualifierAlignment: Right
SortUsingDeclarations: false SortUsingDeclarations: false
SpaceAfterTemplateKeyword: true SpaceAfterTemplateKeyword: true
Standard: Cpp03 Standard: Cpp03
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
.hooks* export-ignore .hooks* export-ignore
# Custom attribute to mark sources as using the kwsys C code style. # Custom attribute to mark sources as using the kwsys C code style.
[attr]kwsys-c-style whitespace=tab-in-indent format.clang-format [attr]kwsys-c-style whitespace=tab-in-indent format.clang-format=18
/GitSetup export-ignore /GitSetup export-ignore
/*.sh export-ignore eol=lf /*.sh export-ignore eol=lf
......
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
# include "Base64.h.in" # include "Base64.h.in"
#endif #endif
static const unsigned char kwsysBase64EncodeTable[65] = static unsigned char const kwsysBase64EncodeTable[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyz"
"0123456789+/"; "0123456789+/";
static const unsigned char kwsysBase64DecodeTable[256] = { static unsigned char const kwsysBase64DecodeTable[256] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
...@@ -49,7 +49,7 @@ static unsigned char kwsysBase64DecodeChar(unsigned char c) ...@@ -49,7 +49,7 @@ static unsigned char kwsysBase64DecodeChar(unsigned char c)
} }
/* Encode 3 bytes into a 4 byte string. */ /* Encode 3 bytes into a 4 byte string. */
void kwsysBase64_Encode3(const unsigned char* src, unsigned char* dest) void kwsysBase64_Encode3(unsigned char const* src, unsigned char* dest)
{ {
dest[0] = kwsysBase64EncodeChar((src[0] >> 2) & 0x3F); dest[0] = kwsysBase64EncodeChar((src[0] >> 2) & 0x3F);
dest[1] = dest[1] =
...@@ -60,7 +60,7 @@ void kwsysBase64_Encode3(const unsigned char* src, unsigned char* dest) ...@@ -60,7 +60,7 @@ void kwsysBase64_Encode3(const unsigned char* src, unsigned char* dest)
} }
/* Encode 2 bytes into a 4 byte string. */ /* Encode 2 bytes into a 4 byte string. */
void kwsysBase64_Encode2(const unsigned char* src, unsigned char* dest) void kwsysBase64_Encode2(unsigned char const* src, unsigned char* dest)
{ {
dest[0] = kwsysBase64EncodeChar((src[0] >> 2) & 0x3F); dest[0] = kwsysBase64EncodeChar((src[0] >> 2) & 0x3F);
dest[1] = dest[1] =
...@@ -70,7 +70,7 @@ void kwsysBase64_Encode2(const unsigned char* src, unsigned char* dest) ...@@ -70,7 +70,7 @@ void kwsysBase64_Encode2(const unsigned char* src, unsigned char* dest)
} }
/* Encode 1 bytes into a 4 byte string. */ /* Encode 1 bytes into a 4 byte string. */
void kwsysBase64_Encode1(const unsigned char* src, unsigned char* dest) void kwsysBase64_Encode1(unsigned char const* src, unsigned char* dest)
{ {
dest[0] = kwsysBase64EncodeChar((src[0] >> 2) & 0x3F); dest[0] = kwsysBase64EncodeChar((src[0] >> 2) & 0x3F);
dest[1] = kwsysBase64EncodeChar(((src[0] << 4) & 0x30)); dest[1] = kwsysBase64EncodeChar(((src[0] << 4) & 0x30));
...@@ -88,11 +88,11 @@ void kwsysBase64_Encode1(const unsigned char* src, unsigned char* dest) ...@@ -88,11 +88,11 @@ void kwsysBase64_Encode1(const unsigned char* src, unsigned char* dest)
actually knowing how much data to expect (if the input is not a multiple of actually knowing how much data to expect (if the input is not a multiple of
3 bytes then the extra padding needed to complete the encode 4 bytes will 3 bytes then the extra padding needed to complete the encode 4 bytes will
stop the decoding anyway). */ stop the decoding anyway). */
size_t kwsysBase64_Encode(const unsigned char* input, size_t length, size_t kwsysBase64_Encode(unsigned char const* input, size_t length,
unsigned char* output, int mark_end) unsigned char* output, int mark_end)
{ {
const unsigned char* ptr = input; unsigned char const* ptr = input;
const unsigned char* end = input + length; unsigned char const* end = input + length;
unsigned char* optr = output; unsigned char* optr = output;
/* Encode complete triplet */ /* Encode complete triplet */
...@@ -128,9 +128,12 @@ size_t kwsysBase64_Encode(const unsigned char* input, size_t length, ...@@ -128,9 +128,12 @@ size_t kwsysBase64_Encode(const unsigned char* input, size_t length,
} }
/* Decode 4 bytes into a 3 byte string. */ /* Decode 4 bytes into a 3 byte string. */
int kwsysBase64_Decode3(const unsigned char* src, unsigned char* dest) int kwsysBase64_Decode3(unsigned char const* src, unsigned char* dest)
{ {
unsigned char d0, d1, d2, d3; unsigned char d0;
unsigned char d1;
unsigned char d2;
unsigned char d3;
d0 = kwsysBase64DecodeChar(src[0]); d0 = kwsysBase64DecodeChar(src[0]);
d1 = kwsysBase64DecodeChar(src[1]); d1 = kwsysBase64DecodeChar(src[1]);
...@@ -169,16 +172,16 @@ int kwsysBase64_Decode3(const unsigned char* src, unsigned char* dest) ...@@ -169,16 +172,16 @@ int kwsysBase64_Decode3(const unsigned char* src, unsigned char* dest)
'length' parameter is ignored. This enables the caller to decode a stream 'length' parameter is ignored. This enables the caller to decode a stream
without actually knowing how much decoded data to expect (of course, the without actually knowing how much decoded data to expect (of course, the
buffer must be large enough). */ buffer must be large enough). */
size_t kwsysBase64_Decode(const unsigned char* input, size_t length, size_t kwsysBase64_Decode(unsigned char const* input, size_t length,
unsigned char* output, size_t max_input_length) unsigned char* output, size_t max_input_length)
{ {
const unsigned char* ptr = input; unsigned char const* ptr = input;
unsigned char* optr = output; unsigned char* optr = output;
/* Decode complete triplet */ /* Decode complete triplet */
if (max_input_length) { if (max_input_length) {
const unsigned char* end = input + max_input_length; unsigned char const* end = input + max_input_length;
while (ptr < end) { while (ptr < end) {
int len = kwsysBase64_Decode3(ptr, optr); int len = kwsysBase64_Decode3(ptr, optr);
optr += len; optr += len;
......
...@@ -32,19 +32,19 @@ extern "C" { ...@@ -32,19 +32,19 @@ extern "C" {
/** /**
* Encode 3 bytes into a 4 byte string. * Encode 3 bytes into a 4 byte string.
*/ */
kwsysEXPORT void kwsysBase64_Encode3(const unsigned char* src, kwsysEXPORT void kwsysBase64_Encode3(unsigned char const* src,
unsigned char* dest); unsigned char* dest);
/** /**
* Encode 2 bytes into a 4 byte string. * Encode 2 bytes into a 4 byte string.
*/ */
kwsysEXPORT void kwsysBase64_Encode2(const unsigned char* src, kwsysEXPORT void kwsysBase64_Encode2(unsigned char const* src,
unsigned char* dest); unsigned char* dest);
/** /**
* Encode 1 bytes into a 4 byte string. * Encode 1 bytes into a 4 byte string.
*/ */
kwsysEXPORT void kwsysBase64_Encode1(const unsigned char* src, kwsysEXPORT void kwsysBase64_Encode1(unsigned char const* src,
unsigned char* dest); unsigned char* dest);
/** /**
...@@ -60,7 +60,7 @@ kwsysEXPORT void kwsysBase64_Encode1(const unsigned char* src, ...@@ -60,7 +60,7 @@ kwsysEXPORT void kwsysBase64_Encode1(const unsigned char* src,
* the extra padding needed to complete the encode 4 bytes will stop * the extra padding needed to complete the encode 4 bytes will stop
* the decoding anyway). * the decoding anyway).
*/ */
kwsysEXPORT size_t kwsysBase64_Encode(const unsigned char* input, kwsysEXPORT size_t kwsysBase64_Encode(unsigned char const* input,
size_t length, unsigned char* output, size_t length, unsigned char* output,
int mark_end); int mark_end);
...@@ -68,7 +68,7 @@ kwsysEXPORT size_t kwsysBase64_Encode(const unsigned char* input, ...@@ -68,7 +68,7 @@ kwsysEXPORT size_t kwsysBase64_Encode(const unsigned char* input,
* Decode 4 bytes into a 3 byte string. Returns the number of bytes * Decode 4 bytes into a 3 byte string. Returns the number of bytes
* actually decoded. * actually decoded.
*/ */
kwsysEXPORT int kwsysBase64_Decode3(const unsigned char* src, kwsysEXPORT int kwsysBase64_Decode3(unsigned char const* src,
unsigned char* dest); unsigned char* dest);
/** /**
...@@ -83,7 +83,7 @@ kwsysEXPORT int kwsysBase64_Decode3(const unsigned char* src, ...@@ -83,7 +83,7 @@ kwsysEXPORT int kwsysBase64_Decode3(const unsigned char* src,
* much decoded data to expect (of course, the buffer must be large * much decoded data to expect (of course, the buffer must be large
* enough). * enough).
*/ */
kwsysEXPORT size_t kwsysBase64_Decode(const unsigned char* input, kwsysEXPORT size_t kwsysBase64_Decode(unsigned char const* input,
size_t length, unsigned char* output, size_t length, unsigned char* output,
size_t max_input_length); size_t max_input_length);
......
This diff is collapsed.
...@@ -27,14 +27,14 @@ copies of KWSys within dependent projects can be updated to get the changes. ...@@ -27,14 +27,14 @@ copies of KWSys within dependent projects can be updated to get the changes.
Code Style Code Style
========== ==========
We use `clang-format`_ version **6.0** to define our style for C++ code in We use `clang-format`_ version **18** to define our style for C++ code in
the KWSys source tree. See the `.clang-format`_ configuration file for the KWSys source tree. See the `.clang-format`_ configuration file for
our style settings. Use the `clang-format.bash`_ script to format source our style settings. Use the `clang-format.bash`_ script to format source
code. It automatically runs ``clang-format`` on the set of source files code. It automatically runs ``clang-format`` on the set of source files
for which we enforce style. The script also has options to format only for which we enforce style. The script also has options to format only
a subset of files, such as those that are locally modified. a subset of files, such as those that are locally modified.
.. _`clang-format`: http://clang.llvm.org/docs/ClangFormat.html .. _`clang-format`: https://clang.llvm.org/docs/ClangFormat.html
.. _`.clang-format`: .clang-format .. _`.clang-format`: .clang-format
.. _`clang-format.bash`: clang-format.bash .. _`clang-format.bash`: clang-format.bash
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
set(CTEST_PROJECT_NAME "KWSys") set(CTEST_PROJECT_NAME "KWSys")
set(CTEST_NIGHTLY_START_TIME "21:00:00 EDT") set(CTEST_NIGHTLY_START_TIME "21:00:00 EDT")
set(CTEST_DROP_METHOD "http") set(CTEST_DROP_METHOD "https")
set(CTEST_DROP_SITE "open.cdash.org") set(CTEST_DROP_SITE "open.cdash.org")
set(CTEST_DROP_LOCATION "/submit.php?project=KWSys") set(CTEST_DROP_LOCATION "/submit.php?project=KWSys")
set(CTEST_DROP_SITE_CDASH TRUE) set(CTEST_DROP_SITE_CDASH TRUE)
...@@ -12,3 +12,7 @@ ...@@ -12,3 +12,7 @@
list(APPEND CTEST_CUSTOM_MEMCHECK_IGNORE list(APPEND CTEST_CUSTOM_MEMCHECK_IGNORE
kwsys.testProcess-10 kwsys.testProcess-10
) )
list(APPEND CTEST_CUSTOM_WARNING_EXCEPTION
"LICENSE WARNING"
)
...@@ -4,25 +4,24 @@ ...@@ -4,25 +4,24 @@
#include KWSYS_HEADER(CommandLineArguments.hxx) #include KWSYS_HEADER(CommandLineArguments.hxx)
#include KWSYS_HEADER(Configure.hxx) #include KWSYS_HEADER(Configure.hxx)
#include KWSYS_HEADER(String.hxx)
// Work-around CMake dependency scanning limitation. This must // Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers. // duplicate the above list of headers.
#if 0 #if 0
# include "CommandLineArguments.hxx.in" # include "CommandLineArguments.hxx.in"
# include "Configure.hxx.in" # include "Configure.hxx.in"
# include "String.hxx.in"
#endif #endif
#include <iostream> #include <iostream>
#include <map> #include <map>
#include <set> #include <set>
#include <sstream> #include <sstream>
#include <string>
#include <vector> #include <vector>
#include <stdio.h> #include <cstdio>
#include <stdlib.h> #include <cstdlib>
#include <string.h> #include <cstring>
#ifdef _MSC_VER #ifdef _MSC_VER
# pragma warning(disable : 4786) # pragma warning(disable : 4786)
...@@ -43,49 +42,44 @@ namespace KWSYS_NAMESPACE { ...@@ -43,49 +42,44 @@ namespace KWSYS_NAMESPACE {
struct CommandLineArgumentsCallbackStructure struct CommandLineArgumentsCallbackStructure
{ {
const char* Argument; char const* Argument;
int ArgumentType; int ArgumentType;
CommandLineArguments::CallbackType Callback; CommandLineArguments::CallbackType Callback;
void* CallData; void* CallData;
void* Variable; void* Variable;
int VariableType; int VariableType;
const char* Help; char const* Help;
}; };
class CommandLineArgumentsVectorOfStrings : public std::vector<kwsys::String> class CommandLineArgumentsVectorOfStrings : public std::vector<std::string>
{ {
}; };
class CommandLineArgumentsSetOfStrings : public std::set<kwsys::String> class CommandLineArgumentsSetOfStrings : public std::set<std::string>
{ {
}; };
class CommandLineArgumentsMapOfStrucs class CommandLineArgumentsMapOfStrucs
: public std::map<kwsys::String, CommandLineArgumentsCallbackStructure> : public std::map<std::string, CommandLineArgumentsCallbackStructure>
{ {
}; };
class CommandLineArgumentsInternal class CommandLineArgumentsInternal
{ {
public: public:
CommandLineArgumentsInternal() CommandLineArgumentsInternal() = default;
{
this->UnknownArgumentCallback = KWSYS_NULLPTR;
this->ClientData = KWSYS_NULLPTR;
this->LastArgument = 0;
}
typedef CommandLineArgumentsVectorOfStrings VectorOfStrings; using VectorOfStrings = CommandLineArgumentsVectorOfStrings;
typedef CommandLineArgumentsMapOfStrucs CallbacksMap; using CallbacksMap = CommandLineArgumentsMapOfStrucs;
typedef kwsys::String String; using String = std::string;
typedef CommandLineArgumentsSetOfStrings SetOfStrings; using SetOfStrings = CommandLineArgumentsSetOfStrings;
VectorOfStrings Argv; VectorOfStrings Argv;
String Argv0; String Argv0;
CallbacksMap Callbacks; CallbacksMap Callbacks;
CommandLineArguments::ErrorCallbackType UnknownArgumentCallback; CommandLineArguments::ErrorCallbackType UnknownArgumentCallback{ nullptr };
void* ClientData; void* ClientData{ nullptr };
VectorOfStrings::size_type LastArgument; VectorOfStrings::size_type LastArgument{ 0 };
VectorOfStrings UnusedArguments; VectorOfStrings UnusedArguments;
}; };
...@@ -103,7 +97,7 @@ CommandLineArguments::~CommandLineArguments() ...@@ -103,7 +97,7 @@ CommandLineArguments::~CommandLineArguments()
delete this->Internals; delete this->Internals;
} }
void CommandLineArguments::Initialize(int argc, const char* const argv[]) void CommandLineArguments::Initialize(int argc, char const* const argv[])
{ {
int cc; int cc;
...@@ -116,7 +110,7 @@ void CommandLineArguments::Initialize(int argc, const char* const argv[]) ...@@ -116,7 +110,7 @@ void CommandLineArguments::Initialize(int argc, const char* const argv[])
void CommandLineArguments::Initialize(int argc, char* argv[]) void CommandLineArguments::Initialize(int argc, char* argv[])
{ {
this->Initialize(argc, static_cast<const char* const*>(argv)); this->Initialize(argc, static_cast<char const* const*>(argv));
} }
void CommandLineArguments::Initialize() void CommandLineArguments::Initialize()
...@@ -125,21 +119,21 @@ void CommandLineArguments::Initialize() ...@@ -125,21 +119,21 @@ void CommandLineArguments::Initialize()
this->Internals->LastArgument = 0; this->Internals->LastArgument = 0;
} }
void CommandLineArguments::ProcessArgument(const char* arg) void CommandLineArguments::ProcessArgument(char const* arg)
{ {
this->Internals->Argv.push_back(arg); this->Internals->Argv.push_back(arg);
} }
bool CommandLineArguments::GetMatchedArguments( bool CommandLineArguments::GetMatchedArguments(
std::vector<std::string>* matches, const std::string& arg) std::vector<std::string>* matches, std::string const& arg)
{ {
matches->clear(); matches->clear();
CommandLineArguments::Internal::CallbacksMap::iterator it; CommandLineArguments::Internal::CallbacksMap::iterator it;
// Does the argument match to any we know about? // Does the argument match to any we know about?
for (it = this->Internals->Callbacks.begin(); for (it = this->Internals->Callbacks.begin();
it != this->Internals->Callbacks.end(); it++) { it != this->Internals->Callbacks.end(); ++it) {
const CommandLineArguments::Internal::String& parg = it->first; CommandLineArguments::Internal::String const& parg = it->first;
CommandLineArgumentsCallbackStructure* cs = &it->second; CommandLineArgumentsCallbackStructure* cs = &it->second;
if (cs->ArgumentType == CommandLineArguments::NO_ARGUMENT || if (cs->ArgumentType == CommandLineArguments::NO_ARGUMENT ||
cs->ArgumentType == CommandLineArguments::SPACE_ARGUMENT) { cs->ArgumentType == CommandLineArguments::SPACE_ARGUMENT) {
...@@ -161,7 +155,7 @@ int CommandLineArguments::Parse() ...@@ -161,7 +155,7 @@ int CommandLineArguments::Parse()
this->Internals->UnusedArguments.clear(); this->Internals->UnusedArguments.clear();
} }
for (cc = 0; cc < this->Internals->Argv.size(); cc++) { for (cc = 0; cc < this->Internals->Argv.size(); cc++) {
const std::string& arg = this->Internals->Argv[cc]; std::string const& arg = this->Internals->Argv[cc];
CommandLineArguments_DEBUG("Process argument: " << arg); CommandLineArguments_DEBUG("Process argument: " << arg);
this->Internals->LastArgument = cc; this->Internals->LastArgument = cc;
if (this->GetMatchedArguments(&matches, arg)) { if (this->GetMatchedArguments(&matches, arg)) {
...@@ -180,14 +174,14 @@ int CommandLineArguments::Parse() ...@@ -180,14 +174,14 @@ int CommandLineArguments::Parse()
// additional value // additional value
CommandLineArgumentsCallbackStructure* cs = CommandLineArgumentsCallbackStructure* cs =
&this->Internals->Callbacks[matches[maxidx]]; &this->Internals->Callbacks[matches[maxidx]];
const std::string& sarg = matches[maxidx]; std::string const& sarg = matches[maxidx];
if (cs->Argument != sarg) { if (cs->Argument != sarg) {
abort(); abort();
} }
switch (cs->ArgumentType) { switch (cs->ArgumentType) {
case NO_ARGUMENT: case NO_ARGUMENT:
// No value // No value
if (!this->PopulateVariable(cs, KWSYS_NULLPTR)) { if (!this->PopulateVariable(cs, nullptr)) {
return 0; return 0;
} }
break; break;
...@@ -226,7 +220,7 @@ int CommandLineArguments::Parse() ...@@ -226,7 +220,7 @@ int CommandLineArguments::Parse()
// Suck in all the rest of the arguments // Suck in all the rest of the arguments
CommandLineArguments_DEBUG("This is a multi argument: " << arg); CommandLineArguments_DEBUG("This is a multi argument: " << arg);
for (cc++; cc < this->Internals->Argv.size(); ++cc) { for (cc++; cc < this->Internals->Argv.size(); ++cc) {
const std::string& marg = this->Internals->Argv[cc]; std::string const& marg = this->Internals->Argv[cc];
CommandLineArguments_DEBUG( CommandLineArguments_DEBUG(
" check multi argument value: " << marg); " check multi argument value: " << marg);
if (this->GetMatchedArguments(&matches, marg)) { if (this->GetMatchedArguments(&matches, marg)) {
...@@ -311,7 +305,7 @@ void CommandLineArguments::GetUnusedArguments(int* argc, char*** argv) ...@@ -311,7 +305,7 @@ void CommandLineArguments::GetUnusedArguments(int* argc, char*** argv)
// Copy everything after the LastArgument, since that was not parsed. // Copy everything after the LastArgument, since that was not parsed.
for (cc = 0; cc < this->Internals->UnusedArguments.size(); cc++) { for (cc = 0; cc < this->Internals->UnusedArguments.size(); cc++) {
kwsys::String& str = this->Internals->UnusedArguments[cc]; std::string& str = this->Internals->UnusedArguments[cc];
args[cnt] = new char[str.size() + 1]; args[cnt] = new char[str.size() + 1];
strcpy(args[cnt], str.c_str()); strcpy(args[cnt], str.c_str());
cnt++; cnt++;
...@@ -324,15 +318,15 @@ void CommandLineArguments::DeleteRemainingArguments(int argc, char*** argv) ...@@ -324,15 +318,15 @@ void CommandLineArguments::DeleteRemainingArguments(int argc, char*** argv)
{ {
int cc; int cc;
for (cc = 0; cc < argc; ++cc) { for (cc = 0; cc < argc; ++cc) {
delete[](*argv)[cc]; delete[] (*argv)[cc];
} }
delete[] * argv; delete[] *argv;
} }
void CommandLineArguments::AddCallback(const char* argument, void CommandLineArguments::AddCallback(char const* argument,
ArgumentTypeEnum type, ArgumentTypeEnum type,
CallbackType callback, void* call_data, CallbackType callback, void* call_data,
const char* help) char const* help)
{ {
CommandLineArgumentsCallbackStructure s; CommandLineArgumentsCallbackStructure s;
s.Argument = argument; s.Argument = argument;
...@@ -340,23 +334,23 @@ void CommandLineArguments::AddCallback(const char* argument, ...@@ -340,23 +334,23 @@ void CommandLineArguments::AddCallback(const char* argument,
s.Callback = callback; s.Callback = callback;
s.CallData = call_data; s.CallData = call_data;
s.VariableType = CommandLineArguments::NO_VARIABLE_TYPE; s.VariableType = CommandLineArguments::NO_VARIABLE_TYPE;
s.Variable = KWSYS_NULLPTR; s.Variable = nullptr;
s.Help = help; s.Help = help;
this->Internals->Callbacks[argument] = s; this->Internals->Callbacks[argument] = s;
this->GenerateHelp(); this->GenerateHelp();
} }
void CommandLineArguments::AddArgument(const char* argument, void CommandLineArguments::AddArgument(char const* argument,
ArgumentTypeEnum type, ArgumentTypeEnum type,
VariableTypeEnum vtype, void* variable, VariableTypeEnum vtype, void* variable,
const char* help) char const* help)
{ {
CommandLineArgumentsCallbackStructure s; CommandLineArgumentsCallbackStructure s;
s.Argument = argument; s.Argument = argument;
s.ArgumentType = type; s.ArgumentType = type;
s.Callback = KWSYS_NULLPTR; s.Callback = nullptr;
s.CallData = KWSYS_NULLPTR; s.CallData = nullptr;
s.VariableType = vtype; s.VariableType = vtype;
s.Variable = variable; s.Variable = variable;
s.Help = help; s.Help = help;
...@@ -422,20 +416,18 @@ void CommandLineArguments::SetUnknownArgumentCallback( ...@@ -422,20 +416,18 @@ void CommandLineArguments::SetUnknownArgumentCallback(
this->Internals->UnknownArgumentCallback = callback; this->Internals->UnknownArgumentCallback = callback;
} }
const char* CommandLineArguments::GetHelp(const char* arg) char const* CommandLineArguments::GetHelp(char const* arg)
{ {
CommandLineArguments::Internal::CallbacksMap::iterator it = auto it = this->Internals->Callbacks.find(arg);
this->Internals->Callbacks.find(arg);
if (it == this->Internals->Callbacks.end()) { if (it == this->Internals->Callbacks.end()) {
return KWSYS_NULLPTR; return nullptr;
} }
// Since several arguments may point to the same argument, find the one this // Since several arguments may point to the same argument, find the one this
// one point to if this one is pointing to another argument. // one point to if this one is pointing to another argument.
CommandLineArgumentsCallbackStructure* cs = &(it->second); CommandLineArgumentsCallbackStructure* cs = &(it->second);
for (;;) { for (;;) {
CommandLineArguments::Internal::CallbacksMap::iterator hit = auto hit = this->Internals->Callbacks.find(cs->Help);
this->Internals->Callbacks.find(cs->Help);
if (hit == this->Internals->Callbacks.end()) { if (hit == this->Internals->Callbacks.end()) {
break; break;
} }
...@@ -453,7 +445,7 @@ void CommandLineArguments::SetLineLength(unsigned int ll) ...@@ -453,7 +445,7 @@ void CommandLineArguments::SetLineLength(unsigned int ll)
this->GenerateHelp(); this->GenerateHelp();
} }
const char* CommandLineArguments::GetArgv0() char const* CommandLineArguments::GetArgv0()
{ {
return this->Internals->Argv0.c_str(); return this->Internals->Argv0.c_str();
} }
...@@ -470,13 +462,12 @@ void CommandLineArguments::GenerateHelp() ...@@ -470,13 +462,12 @@ void CommandLineArguments::GenerateHelp()
// Collapse all arguments into the map of vectors of all arguments that do // Collapse all arguments into the map of vectors of all arguments that do
// the same thing. // the same thing.
CommandLineArguments::Internal::CallbacksMap::iterator it; CommandLineArguments::Internal::CallbacksMap::iterator it;
typedef std::map<CommandLineArguments::Internal::String, using MapArgs = std::map<CommandLineArguments::Internal::String,
CommandLineArguments::Internal::SetOfStrings> CommandLineArguments::Internal::SetOfStrings>;
MapArgs;
MapArgs mp; MapArgs mp;
MapArgs::iterator mpit, smpit; MapArgs::iterator mpit, smpit;
for (it = this->Internals->Callbacks.begin(); for (it = this->Internals->Callbacks.begin();
it != this->Internals->Callbacks.end(); it++) { it != this->Internals->Callbacks.end(); ++it) {
CommandLineArgumentsCallbackStructure* cs = &(it->second); CommandLineArgumentsCallbackStructure* cs = &(it->second);
mpit = mp.find(cs->Help); mpit = mp.find(cs->Help);
if (mpit != mp.end()) { if (mpit != mp.end()) {
...@@ -487,14 +478,14 @@ void CommandLineArguments::GenerateHelp() ...@@ -487,14 +478,14 @@ void CommandLineArguments::GenerateHelp()
} }
} }
for (it = this->Internals->Callbacks.begin(); for (it = this->Internals->Callbacks.begin();
it != this->Internals->Callbacks.end(); it++) { it != this->Internals->Callbacks.end(); ++it) {
CommandLineArgumentsCallbackStructure* cs = &(it->second); CommandLineArgumentsCallbackStructure* cs = &(it->second);
mpit = mp.find(cs->Help); mpit = mp.find(cs->Help);
if (mpit != mp.end()) { if (mpit != mp.end()) {
mpit->second.insert(it->first); mpit->second.insert(it->first);
smpit = mp.find(it->first); smpit = mp.find(it->first);
CommandLineArguments::Internal::SetOfStrings::iterator sit; CommandLineArguments::Internal::SetOfStrings::iterator sit;
for (sit = smpit->second.begin(); sit != smpit->second.end(); sit++) { for (sit = smpit->second.begin(); sit != smpit->second.end(); ++sit) {
mpit->second.insert(*sit); mpit->second.insert(*sit);
} }
mp.erase(smpit); mp.erase(smpit);
...@@ -505,9 +496,9 @@ void CommandLineArguments::GenerateHelp() ...@@ -505,9 +496,9 @@ void CommandLineArguments::GenerateHelp()
// Find the length of the longest string // Find the length of the longest string
CommandLineArguments::Internal::String::size_type maxlen = 0; CommandLineArguments::Internal::String::size_type maxlen = 0;
for (mpit = mp.begin(); mpit != mp.end(); mpit++) { for (mpit = mp.begin(); mpit != mp.end(); ++mpit) {
CommandLineArguments::Internal::SetOfStrings::iterator sit; CommandLineArguments::Internal::SetOfStrings::iterator sit;
for (sit = mpit->second.begin(); sit != mpit->second.end(); sit++) { for (sit = mpit->second.begin(); sit != mpit->second.end(); ++sit) {
CommandLineArguments::Internal::String::size_type clen = sit->size(); CommandLineArguments::Internal::String::size_type clen = sit->size();
switch (this->Internals->Callbacks[*sit].ArgumentType) { switch (this->Internals->Callbacks[*sit].ArgumentType) {
case CommandLineArguments::NO_ARGUMENT: case CommandLineArguments::NO_ARGUMENT:
...@@ -533,9 +524,9 @@ void CommandLineArguments::GenerateHelp() ...@@ -533,9 +524,9 @@ void CommandLineArguments::GenerateHelp()
maxlen += 4; // For the space before and after the option maxlen += 4; // For the space before and after the option
// Print help for each option // Print help for each option
for (mpit = mp.begin(); mpit != mp.end(); mpit++) { for (mpit = mp.begin(); mpit != mp.end(); ++mpit) {
CommandLineArguments::Internal::SetOfStrings::iterator sit; CommandLineArguments::Internal::SetOfStrings::iterator sit;
for (sit = mpit->second.begin(); sit != mpit->second.end(); sit++) { for (sit = mpit->second.begin(); sit != mpit->second.end(); ++sit) {
str << std::endl; str << std::endl;
std::string argument = *sit; std::string argument = *sit;
switch (this->Internals->Callbacks[*sit].ArgumentType) { switch (this->Internals->Callbacks[*sit].ArgumentType) {
...@@ -556,7 +547,7 @@ void CommandLineArguments::GenerateHelp() ...@@ -556,7 +547,7 @@ void CommandLineArguments::GenerateHelp()
} }
str << " " << argument.substr(0, maxstrlen) << " "; str << " " << argument.substr(0, maxstrlen) << " ";
} }
const char* ptr = this->Internals->Callbacks[mpit->first].Help; char const* ptr = this->Internals->Callbacks[mpit->first].Help;
size_t len = strlen(ptr); size_t len = strlen(ptr);
int cnt = 0; int cnt = 0;
while (len > 0) { while (len > 0) {
...@@ -607,7 +598,7 @@ void CommandLineArguments::GenerateHelp() ...@@ -607,7 +598,7 @@ void CommandLineArguments::GenerateHelp()
} }
void CommandLineArguments::PopulateVariable(bool* variable, void CommandLineArguments::PopulateVariable(bool* variable,
const std::string& value) std::string const& value)
{ {
if (value == "1" || value == "ON" || value == "on" || value == "On" || if (value == "1" || value == "ON" || value == "on" || value == "On" ||
value == "TRUE" || value == "true" || value == "True" || value == "TRUE" || value == "true" || value == "True" ||
...@@ -619,9 +610,9 @@ void CommandLineArguments::PopulateVariable(bool* variable, ...@@ -619,9 +610,9 @@ void CommandLineArguments::PopulateVariable(bool* variable,
} }
void CommandLineArguments::PopulateVariable(int* variable, void CommandLineArguments::PopulateVariable(int* variable,
const std::string& value) std::string const& value)
{ {
char* res = KWSYS_NULLPTR; char* res = nullptr;
*variable = static_cast<int>(strtol(value.c_str(), &res, 10)); *variable = static_cast<int>(strtol(value.c_str(), &res, 10));
// if ( res && *res ) // if ( res && *res )
// { // {
...@@ -630,9 +621,9 @@ void CommandLineArguments::PopulateVariable(int* variable, ...@@ -630,9 +621,9 @@ void CommandLineArguments::PopulateVariable(int* variable,
} }
void CommandLineArguments::PopulateVariable(double* variable, void CommandLineArguments::PopulateVariable(double* variable,
const std::string& value) std::string const& value)
{ {
char* res = KWSYS_NULLPTR; char* res = nullptr;
*variable = strtod(value.c_str(), &res); *variable = strtod(value.c_str(), &res);
// if ( res && *res ) // if ( res && *res )
// { // {
...@@ -641,21 +632,21 @@ void CommandLineArguments::PopulateVariable(double* variable, ...@@ -641,21 +632,21 @@ void CommandLineArguments::PopulateVariable(double* variable,
} }
void CommandLineArguments::PopulateVariable(char** variable, void CommandLineArguments::PopulateVariable(char** variable,
const std::string& value) std::string const& value)
{ {
delete[] * variable; delete[] *variable;
*variable = new char[value.size() + 1]; *variable = new char[value.size() + 1];
strcpy(*variable, value.c_str()); strcpy(*variable, value.c_str());
} }
void CommandLineArguments::PopulateVariable(std::string* variable, void CommandLineArguments::PopulateVariable(std::string* variable,
const std::string& value) std::string const& value)
{ {
*variable = value; *variable = value;
} }
void CommandLineArguments::PopulateVariable(std::vector<bool>* variable, void CommandLineArguments::PopulateVariable(std::vector<bool>* variable,
const std::string& value) std::string const& value)
{ {
bool val = false; bool val = false;
if (value == "1" || value == "ON" || value == "on" || value == "On" || if (value == "1" || value == "ON" || value == "on" || value == "On" ||
...@@ -667,9 +658,9 @@ void CommandLineArguments::PopulateVariable(std::vector<bool>* variable, ...@@ -667,9 +658,9 @@ void CommandLineArguments::PopulateVariable(std::vector<bool>* variable,
} }
void CommandLineArguments::PopulateVariable(std::vector<int>* variable, void CommandLineArguments::PopulateVariable(std::vector<int>* variable,
const std::string& value) std::string const& value)
{ {
char* res = KWSYS_NULLPTR; char* res = nullptr;
variable->push_back(static_cast<int>(strtol(value.c_str(), &res, 10))); variable->push_back(static_cast<int>(strtol(value.c_str(), &res, 10)));
// if ( res && *res ) // if ( res && *res )
// { // {
...@@ -678,9 +669,9 @@ void CommandLineArguments::PopulateVariable(std::vector<int>* variable, ...@@ -678,9 +669,9 @@ void CommandLineArguments::PopulateVariable(std::vector<int>* variable,
} }
void CommandLineArguments::PopulateVariable(std::vector<double>* variable, void CommandLineArguments::PopulateVariable(std::vector<double>* variable,
const std::string& value) std::string const& value)
{ {
char* res = KWSYS_NULLPTR; char* res = nullptr;
variable->push_back(strtod(value.c_str(), &res)); variable->push_back(strtod(value.c_str(), &res));
// if ( res && *res ) // if ( res && *res )
// { // {
...@@ -689,7 +680,7 @@ void CommandLineArguments::PopulateVariable(std::vector<double>* variable, ...@@ -689,7 +680,7 @@ void CommandLineArguments::PopulateVariable(std::vector<double>* variable,
} }
void CommandLineArguments::PopulateVariable(std::vector<char*>* variable, void CommandLineArguments::PopulateVariable(std::vector<char*>* variable,
const std::string& value) std::string const& value)
{ {
char* var = new char[value.size() + 1]; char* var = new char[value.size() + 1];
strcpy(var, value.c_str()); strcpy(var, value.c_str());
...@@ -697,19 +688,19 @@ void CommandLineArguments::PopulateVariable(std::vector<char*>* variable, ...@@ -697,19 +688,19 @@ void CommandLineArguments::PopulateVariable(std::vector<char*>* variable,
} }
void CommandLineArguments::PopulateVariable(std::vector<std::string>* variable, void CommandLineArguments::PopulateVariable(std::vector<std::string>* variable,
const std::string& value) std::string const& value)
{ {
variable->push_back(value); variable->push_back(value);
} }
bool CommandLineArguments::PopulateVariable( bool CommandLineArguments::PopulateVariable(
CommandLineArgumentsCallbackStructure* cs, const char* value) CommandLineArgumentsCallbackStructure* cs, char const* value)
{ {
// Call the callback // Call the callback
if (cs->Callback) { if (cs->Callback) {
if (!cs->Callback(cs->Argument, value, cs->CallData)) { if (!cs->Callback(cs->Argument, value, cs->CallData)) {
this->Internals->LastArgument--; this->Internals->LastArgument--;
return 0; return false;
} }
} }
CommandLineArguments_DEBUG("Set argument: " << cs->Argument << " to " CommandLineArguments_DEBUG("Set argument: " << cs->Argument << " to "
...@@ -759,10 +750,10 @@ bool CommandLineArguments::PopulateVariable( ...@@ -759,10 +750,10 @@ bool CommandLineArguments::PopulateVariable(
std::cerr << "Got unknown variable type: \"" << cs->VariableType std::cerr << "Got unknown variable type: \"" << cs->VariableType
<< "\"" << std::endl; << "\"" << std::endl;
this->Internals->LastArgument--; this->Internals->LastArgument--;
return 0; return false;
} }
} }
return 1; return true;
} }
} // namespace KWSYS_NAMESPACE } // namespace KWSYS_NAMESPACE
...@@ -62,6 +62,9 @@ public: ...@@ -62,6 +62,9 @@ public:
CommandLineArguments(); CommandLineArguments();
~CommandLineArguments(); ~CommandLineArguments();
CommandLineArguments(CommandLineArguments const&) = delete;
CommandLineArguments& operator=(CommandLineArguments const&) = delete;
/** /**
* Various argument types. * Various argument types.
*/ */
...@@ -97,14 +100,14 @@ public: ...@@ -97,14 +100,14 @@ public:
/** /**
* Prototypes for callbacks for callback interface. * Prototypes for callbacks for callback interface.
*/ */
typedef int (*CallbackType)(const char* argument, const char* value, typedef int (*CallbackType)(char const* argument, char const* value,
void* call_data); void* call_data);
typedef int (*ErrorCallbackType)(const char* argument, void* client_data); typedef int (*ErrorCallbackType)(char const* argument, void* client_data);
/** /**
* Initialize internal data structures. This should be called before parsing. * Initialize internal data structures. This should be called before parsing.
*/ */
void Initialize(int argc, const char* const argv[]); void Initialize(int argc, char const* const argv[]);
void Initialize(int argc, char* argv[]); void Initialize(int argc, char* argv[]);
/** /**
...@@ -113,7 +116,7 @@ public: ...@@ -113,7 +116,7 @@ public:
* are not available. * are not available.
*/ */
void Initialize(); void Initialize();
void ProcessArgument(const char* arg); void ProcessArgument(char const* arg);
/** /**
* This method will parse arguments and call appropriate methods. * This method will parse arguments and call appropriate methods.
...@@ -126,56 +129,56 @@ public: ...@@ -126,56 +129,56 @@ public:
* argument help specifies the help string used with this option. The * argument help specifies the help string used with this option. The
* callback and call_data can be skipped. * callback and call_data can be skipped.
*/ */
void AddCallback(const char* argument, ArgumentTypeEnum type, void AddCallback(char const* argument, ArgumentTypeEnum type,
CallbackType callback, void* call_data, const char* help); CallbackType callback, void* call_data, char const* help);
/** /**
* Add handler for argument which is going to set the variable to the * Add handler for argument which is going to set the variable to the
* specified value. If the argument is specified, the option is casted to the * specified value. If the argument is specified, the option is casted to the
* appropriate type. * appropriate type.
*/ */
void AddArgument(const char* argument, ArgumentTypeEnum type, bool* variable, void AddArgument(char const* argument, ArgumentTypeEnum type, bool* variable,
const char* help); char const* help);
void AddArgument(const char* argument, ArgumentTypeEnum type, int* variable, void AddArgument(char const* argument, ArgumentTypeEnum type, int* variable,
const char* help); char const* help);
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
double* variable, const char* help); double* variable, char const* help);
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
char** variable, const char* help); char** variable, char const* help);
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
std::string* variable, const char* help); std::string* variable, char const* help);
/** /**
* Add handler for argument which is going to set the variable to the * Add handler for argument which is going to set the variable to the
* specified value. If the argument is specified, the option is casted to the * specified value. If the argument is specified, the option is casted to the
* appropriate type. This will handle the multi argument values. * appropriate type. This will handle the multi argument values.
*/ */
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
std::vector<bool>* variable, const char* help); std::vector<bool>* variable, char const* help);
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
std::vector<int>* variable, const char* help); std::vector<int>* variable, char const* help);
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
std::vector<double>* variable, const char* help); std::vector<double>* variable, char const* help);
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
std::vector<char*>* variable, const char* help); std::vector<char*>* variable, char const* help);
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
std::vector<std::string>* variable, const char* help); std::vector<std::string>* variable, char const* help);
/** /**
* Add handler for boolean argument. The argument does not take any option * Add handler for boolean argument. The argument does not take any option
* and if it is specified, the value of the variable is true/1, otherwise it * and if it is specified, the value of the variable is true/1, otherwise it
* is false/0. * is false/0.
*/ */
void AddBooleanArgument(const char* argument, bool* variable, void AddBooleanArgument(char const* argument, bool* variable,
const char* help); char const* help);
void AddBooleanArgument(const char* argument, int* variable, void AddBooleanArgument(char const* argument, int* variable,
const char* help); char const* help);
void AddBooleanArgument(const char* argument, double* variable, void AddBooleanArgument(char const* argument, double* variable,
const char* help); char const* help);
void AddBooleanArgument(const char* argument, char** variable, void AddBooleanArgument(char const* argument, char** variable,
const char* help); char const* help);
void AddBooleanArgument(const char* argument, std::string* variable, void AddBooleanArgument(char const* argument, std::string* variable,
const char* help); char const* help);
/** /**
* Set the callbacks for error handling. * Set the callbacks for error handling.
...@@ -202,8 +205,8 @@ public: ...@@ -202,8 +205,8 @@ public:
* Return string containing help. If the argument is specified, only return * Return string containing help. If the argument is specified, only return
* help for that argument. * help for that argument.
*/ */
const char* GetHelp() { return this->Help.c_str(); } char const* GetHelp() { return this->Help.c_str(); }
const char* GetHelp(const char* arg); char const* GetHelp(char const* arg);
/** /**
* Get / Set the help line length. This length is used when generating the * Get / Set the help line length. This length is used when generating the
...@@ -216,7 +219,7 @@ public: ...@@ -216,7 +219,7 @@ public:
* Get the executable name (argv0). This is only available when using * Get the executable name (argv0). This is only available when using
* Initialize with argc/argv. * Initialize with argc/argv.
*/ */
const char* GetArgv0(); char const* GetArgv0();
/** /**
* Get index of the last argument parsed. This is the last argument that was * Get index of the last argument parsed. This is the last argument that was
...@@ -228,30 +231,30 @@ protected: ...@@ -228,30 +231,30 @@ protected:
void GenerateHelp(); void GenerateHelp();
//! This is internal method that registers variable with argument //! This is internal method that registers variable with argument
void AddArgument(const char* argument, ArgumentTypeEnum type, void AddArgument(char const* argument, ArgumentTypeEnum type,
VariableTypeEnum vtype, void* variable, const char* help); VariableTypeEnum vtype, void* variable, char const* help);
bool GetMatchedArguments(std::vector<std::string>* matches, bool GetMatchedArguments(std::vector<std::string>* matches,
const std::string& arg); std::string const& arg);
//! Populate individual variables //! Populate individual variables
bool PopulateVariable(CommandLineArgumentsCallbackStructure* cs, bool PopulateVariable(CommandLineArgumentsCallbackStructure* cs,
const char* value); char const* value);
//! Populate individual variables of type ... //! Populate individual variables of type ...
void PopulateVariable(bool* variable, const std::string& value); void PopulateVariable(bool* variable, std::string const& value);
void PopulateVariable(int* variable, const std::string& value); void PopulateVariable(int* variable, std::string const& value);
void PopulateVariable(double* variable, const std::string& value); void PopulateVariable(double* variable, std::string const& value);
void PopulateVariable(char** variable, const std::string& value); void PopulateVariable(char** variable, std::string const& value);
void PopulateVariable(std::string* variable, const std::string& value); void PopulateVariable(std::string* variable, std::string const& value);
void PopulateVariable(std::vector<bool>* variable, const std::string& value); void PopulateVariable(std::vector<bool>* variable, std::string const& value);
void PopulateVariable(std::vector<int>* variable, const std::string& value); void PopulateVariable(std::vector<int>* variable, std::string const& value);
void PopulateVariable(std::vector<double>* variable, void PopulateVariable(std::vector<double>* variable,
const std::string& value); std::string const& value);
void PopulateVariable(std::vector<char*>* variable, void PopulateVariable(std::vector<char*>* variable,
const std::string& value); std::string const& value);
void PopulateVariable(std::vector<std::string>* variable, void PopulateVariable(std::vector<std::string>* variable,
const std::string& value); std::string const& value);
typedef CommandLineArgumentsInternal Internal; typedef CommandLineArgumentsInternal Internal;
Internal* Internals; Internal* Internals;
......
...@@ -13,9 +13,6 @@ ...@@ -13,9 +13,6 @@
/* Disable some warnings inside kwsys source files. */ /* Disable some warnings inside kwsys source files. */
#if defined(KWSYS_NAMESPACE) #if defined(KWSYS_NAMESPACE)
# if defined(__BORLANDC__)
# pragma warn - 8027 /* function not inlined. */
# endif
# if defined(__INTEL_COMPILER) # if defined(__INTEL_COMPILER)
# pragma warning(disable : 1572) /* floating-point equality test */ # pragma warning(disable : 1572) /* floating-point equality test */
# endif # endif
...@@ -28,43 +25,6 @@ ...@@ -28,43 +25,6 @@
/* Whether kwsys namespace is "kwsys". */ /* Whether kwsys namespace is "kwsys". */
#define @KWSYS_NAMESPACE@_NAME_IS_KWSYS @KWSYS_NAME_IS_KWSYS@ #define @KWSYS_NAMESPACE@_NAME_IS_KWSYS @KWSYS_NAME_IS_KWSYS@
/* Whether Large File Support is requested. */
#define @KWSYS_NAMESPACE@_LFS_REQUESTED @KWSYS_LFS_REQUESTED@
/* Whether Large File Support is available. */
#if @KWSYS_NAMESPACE@_LFS_REQUESTED
# define @KWSYS_NAMESPACE@_LFS_AVAILABLE @KWSYS_LFS_AVAILABLE@
#endif
/* Setup Large File Support if requested. */
#if @KWSYS_NAMESPACE@_LFS_REQUESTED
/* Since LFS is requested this header must be included before system
headers whether or not LFS is available. */
# if 0 && (defined(_SYS_TYPES_H) || defined(_SYS_TYPES_INCLUDED))
# error "@KWSYS_NAMESPACE@/Configure.h must be included before sys/types.h"
# endif
/* Enable the large file API if it is available. */
# if @KWSYS_NAMESPACE@_LFS_AVAILABLE && \
!defined(@KWSYS_NAMESPACE@_LFS_NO_DEFINES)
# if !defined(_LARGEFILE_SOURCE) && \
!defined(@KWSYS_NAMESPACE@_LFS_NO_DEFINE_LARGEFILE_SOURCE)
# define _LARGEFILE_SOURCE
# endif
# if !defined(_LARGEFILE64_SOURCE) && \
!defined(@KWSYS_NAMESPACE@_LFS_NO_DEFINE_LARGEFILE64_SOURCE)
# define _LARGEFILE64_SOURCE
# endif
# if !defined(_LARGE_FILES) && \
!defined(@KWSYS_NAMESPACE@_LFS_NO_DEFINE_LARGE_FILES)
# define _LARGE_FILES
# endif
# if !defined(_FILE_OFFSET_BITS) && \
!defined(@KWSYS_NAMESPACE@_LFS_NO_DEFINE_FILE_OFFSET_BITS)
# define _FILE_OFFSET_BITS 64
# endif
# endif
#endif
/* Setup the export macro. */ /* Setup the export macro. */
#if @KWSYS_BUILD_SHARED@ #if @KWSYS_BUILD_SHARED@
# if defined(_WIN32) || defined(__CYGWIN__) # if defined(_WIN32) || defined(__CYGWIN__)
...@@ -105,11 +65,6 @@ ...@@ -105,11 +65,6 @@
# pragma warning(disable : 4710) /* function not inlined */ # pragma warning(disable : 4710) /* function not inlined */
# pragma warning(disable : 4786) /* identifier truncated in debug info */ # pragma warning(disable : 4786) /* identifier truncated in debug info */
# endif # endif
# if defined(__BORLANDC__) && !defined(__cplusplus)
/* Code has no effect; raised by winnt.h in C (not C++) when ignoring an
unused parameter using "(param)" syntax (i.e. no cast to void). */
# pragma warn - 8019
# endif
#endif #endif
/* MSVC 6.0 in release mode will warn about code it produces with its /* MSVC 6.0 in release mode will warn about code it produces with its
......
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
@KWSYS_CXX_HAS_EXT_STDIO_FILEBUF_H@ @KWSYS_CXX_HAS_EXT_STDIO_FILEBUF_H@
#if defined(__SUNPRO_CC) && __SUNPRO_CC > 0x5130 && defined(__has_attribute) #if defined(__SUNPRO_CC) && __SUNPRO_CC > 0x5130 && defined(__has_attribute)
# define @KWSYS_NAMESPACE@__has_cpp_attribute(x) __has_attribute(x) # define @KWSYS_NAMESPACE@_has_cpp_attribute(x) __has_attribute(x)
#elif defined(__has_cpp_attribute) #elif defined(__has_cpp_attribute)
# define @KWSYS_NAMESPACE@__has_cpp_attribute(x) __has_cpp_attribute(x) # define @KWSYS_NAMESPACE@_has_cpp_attribute(x) __has_cpp_attribute(x)
#else #else
# define @KWSYS_NAMESPACE@__has_cpp_attribute(x) 0 # define @KWSYS_NAMESPACE@_has_cpp_attribute(x) 0
#endif #endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
...@@ -28,13 +28,13 @@ ...@@ -28,13 +28,13 @@
#ifndef @KWSYS_NAMESPACE@_FALLTHROUGH #ifndef @KWSYS_NAMESPACE@_FALLTHROUGH
# if __cplusplus >= 201703L && \ # if __cplusplus >= 201703L && \
@KWSYS_NAMESPACE@__has_cpp_attribute(fallthrough) @KWSYS_NAMESPACE@_has_cpp_attribute(fallthrough)
# define @KWSYS_NAMESPACE@_FALLTHROUGH [[fallthrough]] # define @KWSYS_NAMESPACE@_FALLTHROUGH [[fallthrough]]
# elif __cplusplus >= 201103L && \ # elif __cplusplus >= 201103L && \
@KWSYS_NAMESPACE@__has_cpp_attribute(gnu::fallthrough) @KWSYS_NAMESPACE@_has_cpp_attribute(gnu::fallthrough)
# define @KWSYS_NAMESPACE@_FALLTHROUGH [[gnu::fallthrough]] # define @KWSYS_NAMESPACE@_FALLTHROUGH [[gnu::fallthrough]]
# elif __cplusplus >= 201103L && \ # elif __cplusplus >= 201103L && \
@KWSYS_NAMESPACE@__has_cpp_attribute(clang::fallthrough) @KWSYS_NAMESPACE@_has_cpp_attribute(clang::fallthrough)
# define @KWSYS_NAMESPACE@_FALLTHROUGH [[clang::fallthrough]] # define @KWSYS_NAMESPACE@_FALLTHROUGH [[clang::fallthrough]]
# endif # endif
#endif #endif
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
# define @KWSYS_NAMESPACE@_FALLTHROUGH static_cast<void>(0) # define @KWSYS_NAMESPACE@_FALLTHROUGH static_cast<void>(0)
#endif #endif
#undef @KWSYS_NAMESPACE@__has_cpp_attribute #undef @KWSYS_NAMESPACE@_has_cpp_attribute
/* If building a C++ file in kwsys itself, give the source file /* If building a C++ file in kwsys itself, give the source file
access to the macros without a configured namespace. */ access to the macros without a configured namespace. */
...@@ -55,7 +55,6 @@ ...@@ -55,7 +55,6 @@
# define KWSYS_CXX_HAS_EXT_STDIO_FILEBUF_H \ # define KWSYS_CXX_HAS_EXT_STDIO_FILEBUF_H \
@KWSYS_NAMESPACE@_CXX_HAS_EXT_STDIO_FILEBUF_H @KWSYS_NAMESPACE@_CXX_HAS_EXT_STDIO_FILEBUF_H
# define KWSYS_FALLTHROUGH @KWSYS_NAMESPACE@_FALLTHROUGH # define KWSYS_FALLTHROUGH @KWSYS_NAMESPACE@_FALLTHROUGH
# define KWSYS_NULLPTR @KWSYS_NAMESPACE@_NULLPTR
#endif #endif
#endif #endif
...@@ -34,14 +34,14 @@ public: ...@@ -34,14 +34,14 @@ public:
class Manager class Manager
{ {
public: public:
Manager(std::basic_ios<CharT, Traits>& ios, const bool err = false) Manager(std::basic_ios<CharT, Traits>& ios, bool const err = false)
: m_consolebuf(0) : m_consolebuf(0)
{ {
m_ios = &ios; m_ios = &ios;
try { try {
m_consolebuf = new BasicConsoleBuf<CharT, Traits>(err); m_consolebuf = new BasicConsoleBuf<CharT, Traits>(err);
m_streambuf = m_ios->rdbuf(m_consolebuf); m_streambuf = m_ios->rdbuf(m_consolebuf);
} catch (const std::runtime_error& ex) { } catch (std::runtime_error const& ex) {
std::cerr << "Failed to create ConsoleBuf!" << std::endl std::cerr << "Failed to create ConsoleBuf!" << std::endl
<< ex.what() << std::endl; << ex.what() << std::endl;
}; };
...@@ -72,7 +72,7 @@ public: ...@@ -72,7 +72,7 @@ public:
BasicConsoleBuf<CharT, Traits>* m_consolebuf; BasicConsoleBuf<CharT, Traits>* m_consolebuf;
}; };
BasicConsoleBuf(const bool err = false) BasicConsoleBuf(bool const err = false)
: flush_on_newline(true) : flush_on_newline(true)
, input_pipe_codepage(0) , input_pipe_codepage(0)
, output_pipe_codepage(0) , output_pipe_codepage(0)
...@@ -111,12 +111,12 @@ protected: ...@@ -111,12 +111,12 @@ protected:
success = false; success = false;
} }
if (m_hOutput && !m_obuffer.empty()) { if (m_hOutput && !m_obuffer.empty()) {
const std::wstring wbuffer = getBuffer(m_obuffer); std::wstring const wbuffer = getBuffer(m_obuffer);
if (m_isConsoleOutput) { if (m_isConsoleOutput) {
DWORD charsWritten; DWORD charsWritten;
success = success =
::WriteConsoleW(m_hOutput, wbuffer.c_str(), (DWORD)wbuffer.size(), ::WriteConsoleW(m_hOutput, wbuffer.c_str(), (DWORD)wbuffer.size(),
&charsWritten, NULL) == 0 &charsWritten, nullptr) == 0
? false ? false
: true; : true;
} else { } else {
...@@ -124,8 +124,9 @@ protected: ...@@ -124,8 +124,9 @@ protected:
std::string buffer; std::string buffer;
success = encodeOutputBuffer(wbuffer, buffer); success = encodeOutputBuffer(wbuffer, buffer);
if (success) { if (success) {
success = ::WriteFile(m_hOutput, buffer.c_str(), success =
(DWORD)buffer.size(), &bytesWritten, NULL) == 0 ::WriteFile(m_hOutput, buffer.c_str(), (DWORD)buffer.size(),
&bytesWritten, nullptr) == 0
? false ? false
: true; : true;
} }
...@@ -152,7 +153,7 @@ protected: ...@@ -152,7 +153,7 @@ protected:
DWORD charsRead; DWORD charsRead;
if (ReadConsoleW(m_hInput, wbuffer, if (ReadConsoleW(m_hInput, wbuffer,
(sizeof(wbuffer) / sizeof(wbuffer[0])), &charsRead, (sizeof(wbuffer) / sizeof(wbuffer[0])), &charsRead,
NULL) == 0 || nullptr) == 0 ||
charsRead == 0) { charsRead == 0) {
_setg(true); _setg(true);
return Traits::eof(); return Traits::eof();
...@@ -168,7 +169,7 @@ protected: ...@@ -168,7 +169,7 @@ protected:
return Traits::eof(); return Traits::eof();
} }
char* buffer = new char[size.LowPart]; char* buffer = new char[size.LowPart];
while (ReadFile(m_hInput, buffer, size.LowPart, &bytesRead, NULL) == while (ReadFile(m_hInput, buffer, size.LowPart, &bytesRead, nullptr) ==
0) { 0) {
if (GetLastError() == ERROR_MORE_DATA) { if (GetLastError() == ERROR_MORE_DATA) {
strbuffer += std::string(buffer, bytesRead); strbuffer += std::string(buffer, bytesRead);
...@@ -319,26 +320,27 @@ private: ...@@ -319,26 +320,27 @@ private:
this->setp((char_type*)m_obuffer.data(), this->setp((char_type*)m_obuffer.data(),
(char_type*)m_obuffer.data() + m_obuffer.size()); (char_type*)m_obuffer.data() + m_obuffer.size());
} }
bool encodeOutputBuffer(const std::wstring wbuffer, std::string& buffer) bool encodeOutputBuffer(std::wstring const wbuffer, std::string& buffer)
{ {
if (wbuffer.size() == 0) { if (wbuffer.size() == 0) {
buffer = std::string(); buffer = std::string();
return true; return true;
} }
const int length = int const length =
WideCharToMultiByte(m_activeOutputCodepage, 0, wbuffer.c_str(), WideCharToMultiByte(m_activeOutputCodepage, 0, wbuffer.c_str(),
(int)wbuffer.size(), NULL, 0, NULL, NULL); (int)wbuffer.size(), nullptr, 0, nullptr, nullptr);
char* buf = new char[length]; char* buf = new char[length];
const bool success = bool const success =
WideCharToMultiByte(m_activeOutputCodepage, 0, wbuffer.c_str(), WideCharToMultiByte(m_activeOutputCodepage, 0, wbuffer.c_str(),
(int)wbuffer.size(), buf, length, NULL, NULL) > 0 (int)wbuffer.size(), buf, length, nullptr,
nullptr) > 0
? true ? true
: false; : false;
buffer = std::string(buf, length); buffer = std::string(buf, length);
delete[] buf; delete[] buf;
return success; return success;
} }
bool decodeInputBuffer(const std::string buffer, std::wstring& wbuffer) bool decodeInputBuffer(std::string const buffer, std::wstring& wbuffer)
{ {
size_t length = buffer.length(); size_t length = buffer.length();
if (length == 0) { if (length == 0) {
...@@ -346,19 +348,19 @@ private: ...@@ -346,19 +348,19 @@ private:
return true; return true;
} }
int actualCodepage = m_activeInputCodepage; int actualCodepage = m_activeInputCodepage;
const char BOM_UTF8[] = { char(0xEF), char(0xBB), char(0xBF) }; char const BOM_UTF8[] = { char(0xEF), char(0xBB), char(0xBF) };
const char* data = buffer.data(); char const* data = buffer.data();
const size_t BOMsize = sizeof(BOM_UTF8); size_t const BOMsize = sizeof(BOM_UTF8);
if (length >= BOMsize && std::memcmp(data, BOM_UTF8, BOMsize) == 0) { if (length >= BOMsize && std::memcmp(data, BOM_UTF8, BOMsize) == 0) {
// PowerShell uses UTF-8 with BOM for pipes // PowerShell uses UTF-8 with BOM for pipes
actualCodepage = CP_UTF8; actualCodepage = CP_UTF8;
data += BOMsize; data += BOMsize;
length -= BOMsize; length -= BOMsize;
} }
const size_t wlength = static_cast<size_t>(MultiByteToWideChar( size_t const wlength = static_cast<size_t>(MultiByteToWideChar(
actualCodepage, 0, data, static_cast<int>(length), NULL, 0)); actualCodepage, 0, data, static_cast<int>(length), nullptr, 0));
wchar_t* wbuf = new wchar_t[wlength]; wchar_t* wbuf = new wchar_t[wlength];
const bool success = bool const success =
MultiByteToWideChar(actualCodepage, 0, data, static_cast<int>(length), MultiByteToWideChar(actualCodepage, 0, data, static_cast<int>(length),
wbuf, static_cast<int>(wlength)) > 0 wbuf, static_cast<int>(wlength)) > 0
? true ? true
...@@ -367,19 +369,19 @@ private: ...@@ -367,19 +369,19 @@ private:
delete[] wbuf; delete[] wbuf;
return success; return success;
} }
std::wstring getBuffer(const std::basic_string<char> buffer) std::wstring getBuffer(std::basic_string<char> const buffer)
{ {
return Encoding::ToWide(buffer); return Encoding::ToWide(buffer);
} }
std::wstring getBuffer(const std::basic_string<wchar_t> buffer) std::wstring getBuffer(std::basic_string<wchar_t> const buffer)
{ {
return buffer; return buffer;
} }
void setBuffer(const std::wstring wbuffer, std::basic_string<char>& target) void setBuffer(std::wstring const wbuffer, std::basic_string<char>& target)
{ {
target = Encoding::ToNarrow(wbuffer); target = Encoding::ToNarrow(wbuffer);
} }
void setBuffer(const std::wstring wbuffer, void setBuffer(std::wstring const wbuffer,
std::basic_string<wchar_t>& target) std::basic_string<wchar_t>& target)
{ {
target = wbuffer; target = wbuffer;
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include KWSYS_HEADER(Encoding.hxx) #include KWSYS_HEADER(Encoding.hxx)
#include KWSYS_HEADER(SystemTools.hxx)
// Work-around CMake dependency scanning limitation. This must // Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers. // duplicate the above list of headers.
#if 0 #if 0
...@@ -16,15 +18,48 @@ ...@@ -16,15 +18,48 @@
#endif #endif
#include <string> #include <string>
#include <utility>
#include <vector> #include <vector>
#if defined(_WIN32) && !defined(__CYGWIN__)
# include <windows.h>
# include <ctype.h>
# include <fcntl.h>
# include <io.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <sys/stat.h>
# include <sys/types.h>
#endif
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
class DirectoryInternals class DirectoryInternals
{ {
public: public:
struct FileData
{
std::string Name;
#if defined(_WIN32) && !defined(__CYGWIN__)
WIN32_FIND_DATAW FindData;
#endif
FileData(std::string name
#if defined(_WIN32) && !defined(__CYGWIN__)
,
WIN32_FIND_DATAW data
#endif
)
: Name(std::move(name))
#if defined(_WIN32) && !defined(__CYGWIN__)
, FindData(std::move(data))
#endif
{
}
};
// Array of Files // Array of Files
std::vector<std::string> Files; std::vector<FileData> Files;
// Path to Open'ed directory // Path to Open'ed directory
std::string Path; std::string Path;
...@@ -35,6 +70,18 @@ Directory::Directory() ...@@ -35,6 +70,18 @@ Directory::Directory()
this->Internal = new DirectoryInternals; this->Internal = new DirectoryInternals;
} }
Directory::Directory(Directory&& other)
{
this->Internal = other.Internal;
other.Internal = nullptr;
}
Directory& Directory::operator=(Directory&& other)
{
std::swap(this->Internal, other.Internal);
return *this;
}
Directory::~Directory() Directory::~Directory()
{ {
delete this->Internal; delete this->Internal;
...@@ -45,15 +92,50 @@ unsigned long Directory::GetNumberOfFiles() const ...@@ -45,15 +92,50 @@ unsigned long Directory::GetNumberOfFiles() const
return static_cast<unsigned long>(this->Internal->Files.size()); return static_cast<unsigned long>(this->Internal->Files.size());
} }
const char* Directory::GetFile(unsigned long dindex) const char const* Directory::GetFile(unsigned long dindex) const
{
return this->Internal->Files[dindex].Name.c_str();
}
std::string const& Directory::GetFileName(std::size_t i) const
{ {
if (dindex >= this->Internal->Files.size()) { return this->Internal->Files[i].Name;
return KWSYS_NULLPTR; }
std::string Directory::GetFilePath(std::size_t i) const
{
std::string abs = this->Internal->Path;
if (!abs.empty() && abs.back() != '/') {
abs += '/';
} }
return this->Internal->Files[dindex].c_str(); abs += this->Internal->Files[i].Name;
return abs;
}
bool Directory::FileIsDirectory(std::size_t i) const
{
#if defined(_WIN32) && !defined(__CYGWIN__)
auto const& data = this->Internal->Files[i].FindData;
return (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
#else
std::string const& path = this->GetFilePath(i);
return kwsys::SystemTools::FileIsDirectory(path);
#endif
} }
const char* Directory::GetPath() const bool Directory::FileIsSymlink(std::size_t i) const
{
std::string const& path = this->GetFilePath(i);
#if defined(_WIN32) && !defined(__CYGWIN__)
auto const& data = this->Internal->Files[i].FindData;
return kwsys::SystemTools::FileIsSymlinkWithAttr(
Encoding::ToWindowsExtendedPath(path), data.dwFileAttributes);
#else
return kwsys::SystemTools::FileIsSymlink(path);
#endif
}
char const* Directory::GetPath() const
{ {
return this->Internal->Path.c_str(); return this->Internal->Path.c_str();
} }
...@@ -69,96 +151,99 @@ void Directory::Clear() ...@@ -69,96 +151,99 @@ void Directory::Clear()
// First Windows platforms // First Windows platforms
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
# include <windows.h>
# include <ctype.h>
# include <fcntl.h>
# include <io.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <sys/stat.h>
# include <sys/types.h>
// Wide function names can vary depending on compiler:
# ifdef __BORLANDC__
# define _wfindfirst_func __wfindfirst
# define _wfindnext_func __wfindnext
# else
# define _wfindfirst_func _wfindfirst
# define _wfindnext_func _wfindnext
# endif
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
bool Directory::Load(const std::string& name) Status Directory::Load(std::string const& name, std::string* errorMessage)
{ {
this->Clear(); this->Clear();
# if (defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__) HANDLE srchHandle;
// Older Visual C++ and Embarcadero compilers.
long srchHandle;
# else // Newer Visual C++
intptr_t srchHandle;
# endif
char* buf; char* buf;
size_t bufLength;
size_t n = name.size(); size_t n = name.size();
if (*name.rbegin() == '/' || *name.rbegin() == '\\') { if (name.back() == '/' || name.back() == '\\') {
buf = new char[n + 1 + 1]; bufLength = n + 1 + 1;
sprintf(buf, "%s*", name.c_str()); buf = new char[bufLength];
snprintf(buf, bufLength, "%s*", name.c_str());
} else { } else {
// Make sure the slashes in the wildcard suffix are consistent with the // Make sure the slashes in the wildcard suffix are consistent with the
// rest of the path // rest of the path
buf = new char[n + 2 + 1]; bufLength = n + 2 + 1;
buf = new char[bufLength];
if (name.find('\\') != std::string::npos) { if (name.find('\\') != std::string::npos) {
sprintf(buf, "%s\\*", name.c_str()); snprintf(buf, bufLength, "%s\\*", name.c_str());
} else { } else {
sprintf(buf, "%s/*", name.c_str()); snprintf(buf, bufLength, "%s/*", name.c_str());
} }
} }
struct _wfinddata_t data; // data of current file WIN32_FIND_DATAW data; // data of current file
// Now put them into the file array // Now put them into the file array
srchHandle = _wfindfirst_func( srchHandle =
(wchar_t*)Encoding::ToWindowsExtendedPath(buf).c_str(), &data); FindFirstFileW(Encoding::ToWindowsExtendedPath(buf).c_str(), &data);
delete[] buf; delete[] buf;
if (srchHandle == -1) { if (srchHandle == INVALID_HANDLE_VALUE) {
return 0; Status status = Status::POSIX_errno();
if (errorMessage) {
*errorMessage = status.GetString();
}
return status;
} }
// Loop through names // Loop through names
do { do {
this->Internal->Files.push_back(Encoding::ToNarrow(data.name)); this->Internal->Files.emplace_back(Encoding::ToNarrow(data.cFileName),
} while (_wfindnext_func(srchHandle, &data) != -1); data);
} while (FindNextFileW(srchHandle, &data));
this->Internal->Path = name; this->Internal->Path = name;
return _findclose(srchHandle) != -1; if (!FindClose(srchHandle)) {
Status status = Status::POSIX_errno();
if (errorMessage) {
*errorMessage = status.GetString();
}
return status;
}
return Status::Success();
} }
unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name) unsigned long Directory::GetNumberOfFilesInDirectory(std::string const& name,
std::string* errorMessage)
{ {
# if (defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__) HANDLE srchHandle;
// Older Visual C++ and Embarcadero compilers.
long srchHandle;
# else // Newer Visual C++
intptr_t srchHandle;
# endif
char* buf; char* buf;
size_t bufLength;
size_t n = name.size(); size_t n = name.size();
if (*name.rbegin() == '/') { if (name.back() == '/') {
bufLength = n + 1 + 1;
buf = new char[n + 1 + 1]; buf = new char[n + 1 + 1];
sprintf(buf, "%s*", name.c_str()); snprintf(buf, bufLength, "%s*", name.c_str());
} else { } else {
bufLength = n + 2 + 1;
buf = new char[n + 2 + 1]; buf = new char[n + 2 + 1];
sprintf(buf, "%s/*", name.c_str()); snprintf(buf, bufLength, "%s/*", name.c_str());
} }
struct _wfinddata_t data; // data of current file WIN32_FIND_DATAW data; // data of current file
// Now put them into the file array // Now put them into the file array
srchHandle = srchHandle = FindFirstFileW(Encoding::ToWide(buf).c_str(), &data);
_wfindfirst_func((wchar_t*)Encoding::ToWide(buf).c_str(), &data);
delete[] buf; delete[] buf;
if (srchHandle == -1) { if (srchHandle == INVALID_HANDLE_VALUE) {
if (errorMessage) {
if (unsigned int errorId = GetLastError()) {
LPSTR message = nullptr;
DWORD size = FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr, errorId, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&message, 0, nullptr);
*errorMessage = std::string(message, size);
LocalFree(message);
} else {
*errorMessage = "Unknown error.";
}
}
return 0; return 0;
} }
...@@ -166,8 +251,8 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name) ...@@ -166,8 +251,8 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
unsigned long count = 0; unsigned long count = 0;
do { do {
count++; count++;
} while (_wfindnext_func(srchHandle, &data) != -1); } while (FindNextFileW(srchHandle, &data));
_findclose(srchHandle); FindClose(srchHandle);
return count; return count;
} }
...@@ -180,9 +265,11 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name) ...@@ -180,9 +265,11 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
# include <sys/types.h> # include <sys/types.h>
# include <dirent.h> # include <dirent.h>
# include <errno.h>
# include <string.h>
// PGI with glibc has trouble with dirent and large file support: // PGI with glibc has trouble with dirent and large file support:
// http://www.pgroup.com/userforum/viewtopic.php? // https://www.pgroup.com/userforum/viewtopic.php?
// p=1992&sid=f16167f51964f1a68fe5041b8eb213b6 // p=1992&sid=f16167f51964f1a68fe5041b8eb213b6
// Work around the problem by mapping dirent the same way as readdir. // Work around the problem by mapping dirent the same way as readdir.
# if defined(__PGI) && defined(__GLIBC__) # if defined(__PGI) && defined(__GLIBC__)
...@@ -197,29 +284,46 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name) ...@@ -197,29 +284,46 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
bool Directory::Load(const std::string& name) Status Directory::Load(std::string const& name, std::string* errorMessage)
{ {
this->Clear(); this->Clear();
errno = 0;
DIR* dir = opendir(name.c_str()); DIR* dir = opendir(name.c_str());
if (!dir) { if (!dir) {
return 0; if (errorMessage) {
*errorMessage = std::string(strerror(errno));
}
return Status::POSIX_errno();
} }
errno = 0;
for (kwsys_dirent* d = readdir(dir); d; d = readdir(dir)) { for (kwsys_dirent* d = readdir(dir); d; d = readdir(dir)) {
this->Internal->Files.push_back(d->d_name); this->Internal->Files.emplace_back(d->d_name);
} }
if (errno != 0) {
if (errorMessage) {
*errorMessage = std::string(strerror(errno));
}
return Status::POSIX_errno();
}
this->Internal->Path = name; this->Internal->Path = name;
closedir(dir); closedir(dir);
return 1; return Status::Success();
} }
unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name) unsigned long Directory::GetNumberOfFilesInDirectory(std::string const& name,
std::string* errorMessage)
{ {
errno = 0;
DIR* dir = opendir(name.c_str()); DIR* dir = opendir(name.c_str());
if (!dir) { if (!dir) {
if (errorMessage) {
*errorMessage = std::string(strerror(errno));
}
return 0; return 0;
} }
...@@ -227,6 +331,13 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name) ...@@ -227,6 +331,13 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const std::string& name)
for (kwsys_dirent* d = readdir(dir); d; d = readdir(dir)) { for (kwsys_dirent* d = readdir(dir); d; d = readdir(dir)) {
count++; count++;
} }
if (errno != 0) {
if (errorMessage) {
*errorMessage = std::string(strerror(errno));
}
return false;
}
closedir(dir); closedir(dir);
return count; return count;
} }
......
...@@ -4,7 +4,9 @@ ...@@ -4,7 +4,9 @@
#define @KWSYS_NAMESPACE@_Directory_hxx #define @KWSYS_NAMESPACE@_Directory_hxx
#include <@KWSYS_NAMESPACE@/Configure.h> #include <@KWSYS_NAMESPACE@/Configure.h>
#include <@KWSYS_NAMESPACE@/Status.hxx>
#include <cstddef>
#include <string> #include <string>
namespace @KWSYS_NAMESPACE@ { namespace @KWSYS_NAMESPACE@ {
...@@ -23,14 +25,18 @@ class @KWSYS_NAMESPACE@_EXPORT Directory ...@@ -23,14 +25,18 @@ class @KWSYS_NAMESPACE@_EXPORT Directory
{ {
public: public:
Directory(); Directory();
Directory(Directory&& other);
Directory(Directory const&) = delete;
Directory& operator=(Directory const&) = delete;
Directory& operator=(Directory&& other);
bool operator==(Directory const&) = delete;
~Directory(); ~Directory();
/** /**
* Load the specified directory and load the names of the files * Load the specified directory and load the names of the files
* in that directory. 0 is returned if the directory can not be * in that directory.
* opened, 1 if it is opened.
*/ */
bool Load(const std::string&); Status Load(std::string const&, std::string* errorMessage = nullptr);
/** /**
* Return the number of files in the current directory. * Return the number of files in the current directory.
...@@ -41,17 +47,38 @@ public: ...@@ -41,17 +47,38 @@ public:
* Return the number of files in the specified directory. * Return the number of files in the specified directory.
* A higher performance static method. * A higher performance static method.
*/ */
static unsigned long GetNumberOfFilesInDirectory(const std::string&); static unsigned long GetNumberOfFilesInDirectory(
std::string const&, std::string* errorMessage = nullptr);
/** /**
* Return the file at the given index, the indexing is 0 based * Return the file at the given index, the indexing is 0 based
*/ */
const char* GetFile(unsigned long) const; char const* GetFile(unsigned long) const;
/**
* Return the name of the file at the given 0-based index.
*/
std::string const& GetFileName(std::size_t i) const;
/**
* Return the absolute path to the file at the given 0-based index.
*/
std::string GetFilePath(std::size_t i) const;
/**
* Return whether the file at the given 0-based index is a directory.
*/
bool FileIsDirectory(std::size_t i) const;
/**
* Return whether the file at the given 0-based index is a symlink.
*/
bool FileIsSymlink(std::size_t i) const;
/** /**
* Return the path to Open'ed directory * Return the path to Open'ed directory
*/ */
const char* GetPath() const; char const* GetPath() const;
/** /**
* Clear the internal structure. Used internally at beginning of Load(...) * Clear the internal structure. Used internally at beginning of Load(...)
...@@ -62,10 +89,7 @@ public: ...@@ -62,10 +89,7 @@ public:
private: private:
// Private implementation details. // Private implementation details.
DirectoryInternals* Internal; DirectoryInternals* Internal;
}; // End Class: Directory
Directory(const Directory&); // Not implemented.
void operator=(const Directory&); // Not implemented.
}; // End Class: Directory
} // namespace @KWSYS_NAMESPACE@ } // namespace @KWSYS_NAMESPACE@
......
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing#kwsys for details. */ file Copyright.txt or https://cmake.org/licensing#kwsys for details. */
#if defined(_WIN32)
# define NOMINMAX // hide min,max to not conflict with <limits>
#endif
#include "kwsysPrivate.h" #include "kwsysPrivate.h"
#include KWSYS_HEADER(DynamicLoader.hxx) #include KWSYS_HEADER(DynamicLoader.hxx)
#include KWSYS_HEADER(Configure.hxx) #include KWSYS_HEADER(Configure.hxx)
#include KWSYS_HEADER(Encoding.hxx)
// Work-around CMake dependency scanning limitation. This must // Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers. // duplicate the above list of headers.
...@@ -25,6 +30,28 @@ ...@@ -25,6 +30,28 @@
// Each part of the ifdef contains a complete implementation for // Each part of the ifdef contains a complete implementation for
// the static methods of DynamicLoader. // the static methods of DynamicLoader.
#define CHECK_OPEN_FLAGS(var, supported, ret) \
do { \
/* Check for unknown flags. */ \
if ((var & AllOpenFlags) != var) { \
return ret; \
} \
\
/* Check for unsupported flags. */ \
if ((var & (supported)) != var) { \
return ret; \
} \
} while (0)
namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
std::string const& libname)
{
return DynamicLoader::OpenLibrary(libname, 0);
}
}
#if !KWSYS_SUPPORTS_SHARED_LIBS #if !KWSYS_SUPPORTS_SHARED_LIBS
// Implementation for environments without dynamic libs // Implementation for environments without dynamic libs
# include <string.h> // for strerror() # include <string.h> // for strerror()
...@@ -32,7 +59,7 @@ ...@@ -32,7 +59,7 @@
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
const std::string& libname) std::string const& libname, int flags)
{ {
return 0; return 0;
} }
...@@ -47,12 +74,12 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) ...@@ -47,12 +74,12 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
} }
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, const std::string& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
return 0; return 0;
} }
const char* DynamicLoader::LastError() char const* DynamicLoader::LastError()
{ {
return "General error"; return "General error";
} }
...@@ -67,8 +94,10 @@ const char* DynamicLoader::LastError() ...@@ -67,8 +94,10 @@ const char* DynamicLoader::LastError()
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
const std::string& libname) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, 0, 0);
return shl_load(libname.c_str(), BIND_DEFERRED | DYNAMIC_PATH, 0L); return shl_load(libname.c_str(), BIND_DEFERRED | DYNAMIC_PATH, 0L);
} }
...@@ -81,7 +110,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) ...@@ -81,7 +110,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
} }
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, const std::string& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
void* addr; void* addr;
int status; int status;
...@@ -98,7 +127,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( ...@@ -98,7 +127,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result); return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result);
} }
const char* DynamicLoader::LastError() char const* DynamicLoader::LastError()
{ {
// TODO: Need implementation with errno/strerror // TODO: Need implementation with errno/strerror
/* If successful, shl_findsym returns an integer (int) value zero. If /* If successful, shl_findsym returns an integer (int) value zero. If
...@@ -130,8 +159,10 @@ const char* DynamicLoader::LastError() ...@@ -130,8 +159,10 @@ const char* DynamicLoader::LastError()
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
const std::string& libname) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, 0, 0);
NSObjectFileImageReturnCode rc; NSObjectFileImageReturnCode rc;
NSObjectFileImage image = 0; NSObjectFileImage image = 0;
...@@ -159,7 +190,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) ...@@ -159,7 +190,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
} }
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, const std::string& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
void* result = 0; void* result = 0;
// Need to prepend symbols with '_' on Apple-gcc compilers // Need to prepend symbols with '_' on Apple-gcc compilers
...@@ -174,7 +205,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( ...@@ -174,7 +205,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result); return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result);
} }
const char* DynamicLoader::LastError() char const* DynamicLoader::LastError()
{ {
return 0; return 0;
} }
...@@ -185,19 +216,22 @@ const char* DynamicLoader::LastError() ...@@ -185,19 +216,22 @@ const char* DynamicLoader::LastError()
// Implementation for Windows win32 code but not cygwin // Implementation for Windows win32 code but not cygwin
# include <windows.h> # include <windows.h>
# include <stdio.h>
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
const std::string& libname) std::string const& libname, int flags)
{ {
DynamicLoader::LibraryHandle lh; CHECK_OPEN_FLAGS(flags, SearchBesideLibrary, nullptr);
int length = MultiByteToWideChar(CP_UTF8, 0, libname.c_str(), -1, NULL, 0);
wchar_t* wchars = new wchar_t[length + 1]; DWORD llFlags = 0;
wchars[0] = '\0'; if (flags & SearchBesideLibrary) {
MultiByteToWideChar(CP_UTF8, 0, libname.c_str(), -1, wchars, length); llFlags |= LOAD_WITH_ALTERED_SEARCH_PATH;
lh = LoadLibraryW(wchars); }
delete[] wchars;
return lh; return LoadLibraryExW(Encoding::ToWindowsExtendedPath(libname).c_str(),
nullptr, llFlags);
} }
int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
...@@ -206,23 +240,12 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) ...@@ -206,23 +240,12 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
} }
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, const std::string& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
// TODO: The calling convention affects the name of the symbol. We // TODO: The calling convention affects the name of the symbol. We
// should have a tool to help get the symbol with the desired // should have a tool to help get the symbol with the desired
// calling convention. Currently we assume cdecl. // calling convention. Currently we assume cdecl.
// //
// Borland:
// __cdecl = "_func" (default)
// __fastcall = "@_func"
// __stdcall = "func"
//
// Watcom:
// __cdecl = "_func"
// __fastcall = "@_func@X"
// __stdcall = "_func@X"
// __watcall = "func_" (default)
//
// MSVC: // MSVC:
// __cdecl = "func" (default) // __cdecl = "func" (default)
// __fastcall = "@_func@X" // __fastcall = "@_func@X"
...@@ -231,40 +254,43 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( ...@@ -231,40 +254,43 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
// Note that the "@X" part of the name above is the total size (in // Note that the "@X" part of the name above is the total size (in
// bytes) of the arguments on the stack. // bytes) of the arguments on the stack.
void* result; void* result;
# if defined(__BORLANDC__) || defined(__WATCOMC__) char const* rsym = sym.c_str();
// Need to prepend symbols with '_'
std::string ssym = '_' + sym;
const char* rsym = ssym.c_str();
# else
const char* rsym = sym.c_str();
# endif
result = (void*)GetProcAddress(lib, rsym); result = (void*)GetProcAddress(lib, rsym);
// Hack to cast pointer-to-data to pointer-to-function.
# ifdef __WATCOMC__
return *(DynamicLoader::SymbolPointer*)(&result);
# else
return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result); return *reinterpret_cast<DynamicLoader::SymbolPointer*>(&result);
# endif
} }
const char* DynamicLoader::LastError() # define DYNLOAD_ERROR_BUFFER_SIZE 1024
{
LPVOID lpMsgBuf = NULL;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, char const* DynamicLoader::LastError()
NULL, GetLastError(), {
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language wchar_t lpMsgBuf[DYNLOAD_ERROR_BUFFER_SIZE + 1];
(LPTSTR)&lpMsgBuf, 0, NULL);
DWORD error = GetLastError();
DWORD length = FormatMessageW(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
lpMsgBuf, DYNLOAD_ERROR_BUFFER_SIZE, nullptr);
static char str[DYNLOAD_ERROR_BUFFER_SIZE + 1];
if (length < 1) {
/* FormatMessage failed. Use a default message. */
snprintf(str, DYNLOAD_ERROR_BUFFER_SIZE,
"DynamicLoader encountered error 0x%lX. "
"FormatMessage failed with error 0x%lX",
error, GetLastError());
return str;
}
if (!lpMsgBuf) { if (!WideCharToMultiByte(CP_UTF8, 0, lpMsgBuf, -1, str,
return NULL; DYNLOAD_ERROR_BUFFER_SIZE, nullptr, nullptr)) {
/* WideCharToMultiByte failed. Use a default message. */
snprintf(str, DYNLOAD_ERROR_BUFFER_SIZE,
"DynamicLoader encountered error 0x%lX. "
"WideCharToMultiByte failed with error 0x%lX",
error, GetLastError());
} }
static char* str = 0;
delete[] str;
str = strcpy(new char[strlen((char*)lpMsgBuf) + 1], (char*)lpMsgBuf);
// Free the buffer.
LocalFree(lpMsgBuf);
return str; return str;
} }
...@@ -282,8 +308,10 @@ namespace KWSYS_NAMESPACE { ...@@ -282,8 +308,10 @@ namespace KWSYS_NAMESPACE {
static image_id last_dynamic_err = B_OK; static image_id last_dynamic_err = B_OK;
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
const std::string& libname) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, 0, 0);
// image_id's are integers, errors are negative. Add one just in case we // image_id's are integers, errors are negative. Add one just in case we
// get a valid image_id of zero (is that even possible?). // get a valid image_id of zero (is that even possible?).
image_id rc = load_add_on(libname.c_str()); image_id rc = load_add_on(libname.c_str());
...@@ -313,7 +341,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) ...@@ -313,7 +341,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
} }
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, const std::string& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
// Hack to cast pointer-to-data to pointer-to-function. // Hack to cast pointer-to-data to pointer-to-function.
union union
...@@ -322,7 +350,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( ...@@ -322,7 +350,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::SymbolPointer psym; DynamicLoader::SymbolPointer psym;
} result; } result;
result.psym = NULL; result.psym = nullptr;
if (!lib) { if (!lib) {
last_dynamic_err = B_BAD_VALUE; last_dynamic_err = B_BAD_VALUE;
...@@ -334,15 +362,15 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( ...@@ -334,15 +362,15 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
get_image_symbol(lib - 1, sym.c_str(), B_SYMBOL_TYPE_ANY, &result.pvoid); get_image_symbol(lib - 1, sym.c_str(), B_SYMBOL_TYPE_ANY, &result.pvoid);
if (rc != B_OK) { if (rc != B_OK) {
last_dynamic_err = rc; last_dynamic_err = rc;
result.psym = NULL; result.psym = nullptr;
} }
} }
return result.psym; return result.psym;
} }
const char* DynamicLoader::LastError() char const* DynamicLoader::LastError()
{ {
const char* retval = strerror(last_dynamic_err); char const* retval = strerror(last_dynamic_err);
last_dynamic_err = B_OK; last_dynamic_err = B_OK;
return retval; return retval;
} }
...@@ -360,8 +388,10 @@ const char* DynamicLoader::LastError() ...@@ -360,8 +388,10 @@ const char* DynamicLoader::LastError()
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
const std::string& libname) std::string const& libname, int flags)
{ {
CHECK_OPEN_FLAGS(flags, 0, nullptr);
char* name = (char*)calloc(1, libname.size() + 1); char* name = (char*)calloc(1, libname.size() + 1);
dld_init(program_invocation_name); dld_init(program_invocation_name);
strncpy(name, libname.c_str(), libname.size()); strncpy(name, libname.c_str(), libname.size());
...@@ -377,7 +407,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) ...@@ -377,7 +407,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
} }
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, const std::string& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
// Hack to cast pointer-to-data to pointer-to-function. // Hack to cast pointer-to-data to pointer-to-function.
union union
...@@ -389,7 +419,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( ...@@ -389,7 +419,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
return result.psym; return result.psym;
} }
const char* DynamicLoader::LastError() char const* DynamicLoader::LastError()
{ {
return dld_strerror(dld_errno); return dld_strerror(dld_errno);
} }
...@@ -404,9 +434,16 @@ const char* DynamicLoader::LastError() ...@@ -404,9 +434,16 @@ const char* DynamicLoader::LastError()
namespace KWSYS_NAMESPACE { namespace KWSYS_NAMESPACE {
DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary( DynamicLoader::LibraryHandle DynamicLoader::OpenLibrary(
const std::string& libname) std::string const& libname, int flags)
{ {
return dlopen(libname.c_str(), RTLD_LAZY); CHECK_OPEN_FLAGS(flags, RTLDGlobal, nullptr);
int llFlags = RTLD_LAZY;
if (flags & RTLDGlobal) {
llFlags |= RTLD_GLOBAL;
}
return dlopen(libname.c_str(), llFlags);
} }
int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
...@@ -420,7 +457,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib) ...@@ -420,7 +457,7 @@ int DynamicLoader::CloseLibrary(DynamicLoader::LibraryHandle lib)
} }
DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
DynamicLoader::LibraryHandle lib, const std::string& sym) DynamicLoader::LibraryHandle lib, std::string const& sym)
{ {
// Hack to cast pointer-to-data to pointer-to-function. // Hack to cast pointer-to-data to pointer-to-function.
union union
...@@ -432,7 +469,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress( ...@@ -432,7 +469,7 @@ DynamicLoader::SymbolPointer DynamicLoader::GetSymbolAddress(
return result.psym; return result.psym;
} }
const char* DynamicLoader::LastError() char const* DynamicLoader::LastError()
{ {
return dlerror(); return dlerror();
} }
......
...@@ -66,26 +66,44 @@ public: ...@@ -66,26 +66,44 @@ public:
// Return type from DynamicLoader::GetSymbolAddress. // Return type from DynamicLoader::GetSymbolAddress.
typedef void (*SymbolPointer)(); typedef void (*SymbolPointer)();
enum OpenFlags
{
// Search for dependent libraries beside the library being loaded.
//
// This is currently only supported on Windows.
SearchBesideLibrary = 0x00000001,
// Make loaded symbols visible globally
//
// This is currently only supported on *nix systems.
RTLDGlobal = 0x00000002,
AllOpenFlags = SearchBesideLibrary | RTLDGlobal
};
/** Load a dynamic library into the current process. /** Load a dynamic library into the current process.
* The returned LibraryHandle can be used to access the symbols in the * The returned LibraryHandle can be used to access the symbols in the
* library. */ * library. The optional second argument is a set of flags to use when
static LibraryHandle OpenLibrary(const std::string&); * opening the library. If unrecognized or unsupported flags are specified,
* the library is not opened. */
static LibraryHandle OpenLibrary(std::string const&);
static LibraryHandle OpenLibrary(std::string const&, int);
/** Attempt to detach a dynamic library from the /** Attempt to detach a dynamic library from the
* process. A value of true is returned if it is successful. */ * process. A value of true is returned if it is successful. */
static int CloseLibrary(LibraryHandle); static int CloseLibrary(LibraryHandle);
/** Find the address of the symbol in the given library. */ /** Find the address of the symbol in the given library. */
static SymbolPointer GetSymbolAddress(LibraryHandle, const std::string&); static SymbolPointer GetSymbolAddress(LibraryHandle, std::string const&);
/** Return the default module prefix for the current platform. */ /** Return the default module prefix for the current platform. */
static const char* LibPrefix() { return "@KWSYS_DynamicLoader_PREFIX@"; } static char const* LibPrefix() { return "@KWSYS_DynamicLoader_PREFIX@"; }
/** Return the default module suffix for the current platform. */ /** Return the default module suffix for the current platform. */
static const char* LibExtension() { return "@KWSYS_DynamicLoader_SUFFIX@"; } static char const* LibExtension() { return "@KWSYS_DynamicLoader_SUFFIX@"; }
/** Return the last error produced from a calls made on this class. */ /** Return the last error produced from a calls made on this class. */
static const char* LastError(); static char const* LastError();
}; // End Class: DynamicLoader }; // End Class: DynamicLoader
} // namespace @KWSYS_NAMESPACE@ } // namespace @KWSYS_NAMESPACE@
......
...@@ -31,22 +31,22 @@ extern "C" { ...@@ -31,22 +31,22 @@ extern "C" {
On Windows, UTF-8 is assumed, and on other platforms, On Windows, UTF-8 is assumed, and on other platforms,
the current locale is assumed. the current locale is assumed.
*/ */
kwsysEXPORT size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* src, kwsysEXPORT size_t kwsysEncoding_mbstowcs(wchar_t* dest, char const* src,
size_t n); size_t n);
/* Convert a narrow string to a wide string. /* Convert a narrow string to a wide string.
This can return NULL if the conversion fails. */ This can return NULL if the conversion fails. */
kwsysEXPORT wchar_t* kwsysEncoding_DupToWide(const char* src); kwsysEXPORT wchar_t* kwsysEncoding_DupToWide(char const* src);
/* Convert a wide string to a narrow string. /* Convert a wide string to a narrow string.
On Windows, UTF-8 is assumed, and on other platforms, On Windows, UTF-8 is assumed, and on other platforms,
the current locale is assumed. */ the current locale is assumed. */
kwsysEXPORT size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* src, kwsysEXPORT size_t kwsysEncoding_wcstombs(char* dest, wchar_t const* src,
size_t n); size_t n);
/* Convert a wide string to a narrow string. /* Convert a wide string to a narrow string.
This can return NULL if the conversion fails. */ This can return NULL if the conversion fails. */
kwsysEXPORT char* kwsysEncoding_DupToNarrow(const wchar_t* str); kwsysEXPORT char* kwsysEncoding_DupToNarrow(wchar_t const* str);
#if defined(__cplusplus) #if defined(__cplusplus)
} /* extern "C" */ } /* extern "C" */
......
...@@ -31,8 +31,8 @@ public: ...@@ -31,8 +31,8 @@ public:
// argc and wide argv. This is useful if wmain() is used. // argc and wide argv. This is useful if wmain() is used.
CommandLineArguments(int argc, wchar_t const* const* argv); CommandLineArguments(int argc, wchar_t const* const* argv);
~CommandLineArguments(); ~CommandLineArguments();
CommandLineArguments(const CommandLineArguments&); CommandLineArguments(CommandLineArguments const&);
CommandLineArguments& operator=(const CommandLineArguments&); CommandLineArguments& operator=(CommandLineArguments const&);
int argc() const; int argc() const;
char const* const* argv() const; char const* const* argv() const;
...@@ -50,14 +50,14 @@ public: ...@@ -50,14 +50,14 @@ public:
// Convert a narrow string to a wide string. // Convert a narrow string to a wide string.
// On Windows, UTF-8 is assumed, and on other platforms, // On Windows, UTF-8 is assumed, and on other platforms,
// the current locale is assumed. // the current locale is assumed.
static std::wstring ToWide(const std::string& str); static std::wstring ToWide(std::string const& str);
static std::wstring ToWide(const char* str); static std::wstring ToWide(char const* str);
// Convert a wide string to a narrow string. // Convert a wide string to a narrow string.
// On Windows, UTF-8 is assumed, and on other platforms, // On Windows, UTF-8 is assumed, and on other platforms,
// the current locale is assumed. // the current locale is assumed.
static std::string ToNarrow(const std::wstring& str); static std::string ToNarrow(std::wstring const& str);
static std::string ToNarrow(const wchar_t* str); static std::string ToNarrow(wchar_t const* str);
# if defined(_WIN32) # if defined(_WIN32)
/** /**
...@@ -68,6 +68,8 @@ public: ...@@ -68,6 +68,8 @@ public:
* absolute paths with Windows-style backslashes. * absolute paths with Windows-style backslashes.
**/ **/
static std::wstring ToWindowsExtendedPath(std::string const&); static std::wstring ToWindowsExtendedPath(std::string const&);
static std::wstring ToWindowsExtendedPath(char const* source);
static std::wstring ToWindowsExtendedPath(std::wstring const& wsource);
# endif # endif
#endif // @KWSYS_NAMESPACE@_STL_HAS_WSTRING #endif // @KWSYS_NAMESPACE@_STL_HAS_WSTRING
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
# include <windows.h> # include <windows.h>
#endif #endif
size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* str, size_t n) size_t kwsysEncoding_mbstowcs(wchar_t* dest, char const* str, size_t n)
{ {
if (str == 0) { if (str == 0) {
return (size_t)-1; return (size_t)-1;
...@@ -29,7 +29,7 @@ size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* str, size_t n) ...@@ -29,7 +29,7 @@ size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* str, size_t n)
#endif #endif
} }
wchar_t* kwsysEncoding_DupToWide(const char* str) wchar_t* kwsysEncoding_DupToWide(char const* str)
{ {
wchar_t* ret = NULL; wchar_t* ret = NULL;
size_t length = kwsysEncoding_mbstowcs(NULL, str, 0) + 1; size_t length = kwsysEncoding_mbstowcs(NULL, str, 0) + 1;
...@@ -43,7 +43,7 @@ wchar_t* kwsysEncoding_DupToWide(const char* str) ...@@ -43,7 +43,7 @@ wchar_t* kwsysEncoding_DupToWide(const char* str)
return ret; return ret;
} }
size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* str, size_t n) size_t kwsysEncoding_wcstombs(char* dest, wchar_t const* str, size_t n)
{ {
if (str == 0) { if (str == 0) {
return (size_t)-1; return (size_t)-1;
...@@ -57,10 +57,10 @@ size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* str, size_t n) ...@@ -57,10 +57,10 @@ size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* str, size_t n)
#endif #endif
} }
char* kwsysEncoding_DupToNarrow(const wchar_t* str) char* kwsysEncoding_DupToNarrow(wchar_t const* str)
{ {
char* ret = NULL; char* ret = NULL;
size_t length = kwsysEncoding_wcstombs(0, str, 0) + 1; size_t length = kwsysEncoding_wcstombs(NULL, str, 0) + 1;
if (length > 0) { if (length > 0) {
ret = (char*)malloc(length); ret = (char*)malloc(length);
if (ret) { if (ret) {
......