You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.3 KiB
88 lines
2.3 KiB
#include <stdio.h>
|
|
|
|
/*
|
|
Define GENERATED_HEADER macro to allow c++ files to include headers
|
|
generated based on different configuration types.
|
|
*/
|
|
|
|
/* clang-format off */
|
|
#define GENERATED_HEADER(x) GENERATED_HEADER0(CONFIG_TYPE/x)
|
|
/* clang-format on */
|
|
#define GENERATED_HEADER0(x) GENERATED_HEADER1(x)
|
|
#define GENERATED_HEADER1(x) <x>
|
|
|
|
#include GENERATED_HEADER(path_to_objs.h)
|
|
|
|
#include <vector>
|
|
std::vector<std::string> expandList(std::string const& arg)
|
|
{
|
|
std::vector<std::string> output;
|
|
// If argument is empty or no `;` just copy the current string
|
|
if (arg.empty() || arg.find(';') == std::string::npos) {
|
|
output.emplace_back(arg);
|
|
return output;
|
|
}
|
|
|
|
std::string newArg;
|
|
// Break the string at non-escaped semicolons not nested in [].
|
|
int squareNesting = 0;
|
|
auto last = arg.begin();
|
|
auto const cend = arg.end();
|
|
for (auto c = last; c != cend; ++c) {
|
|
switch (*c) {
|
|
case '\\': {
|
|
// We only want to allow escaping of semicolons. Other
|
|
// escapes should not be processed here.
|
|
auto cnext = c + 1;
|
|
if ((cnext != cend) && *cnext == ';') {
|
|
newArg.append(last, c);
|
|
// Skip over the escape character
|
|
last = cnext;
|
|
c = cnext;
|
|
}
|
|
} break;
|
|
case '[': {
|
|
++squareNesting;
|
|
} break;
|
|
case ']': {
|
|
--squareNesting;
|
|
} break;
|
|
case ';': {
|
|
// Break the string here if we are not nested inside square
|
|
// brackets.
|
|
if (squareNesting == 0) {
|
|
newArg.append(last, c);
|
|
// Skip over the semicolon
|
|
last = c + 1;
|
|
if (!newArg.empty()) {
|
|
// Add the last argument if the string is not empty.
|
|
output.push_back(newArg);
|
|
newArg.clear();
|
|
}
|
|
}
|
|
} break;
|
|
default: {
|
|
// Just append this character.
|
|
} break;
|
|
}
|
|
}
|
|
newArg.append(last, cend);
|
|
if (!newArg.empty()) {
|
|
// Add the last argument if the string is not empty.
|
|
output.push_back(std::move(newArg));
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
// determine that the number of object files specified in obj_paths
|
|
// is equal to the number of arch's
|
|
|
|
std::vector<std::string> paths = expandList(obj_paths);
|
|
const bool correctSize = (paths.size() == ExpectedISPCObjects);
|
|
|
|
return (correctSize) ? 0 : 1;
|
|
}
|