File: cl_helpers.cpp

package info (click to toggle)
ldc 1%3A1.30.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 59,248 kB
  • sloc: cpp: 61,598; ansic: 14,545; sh: 1,014; makefile: 972; asm: 510; objc: 135; exp: 48; python: 12
file content (73 lines) | stat: -rw-r--r-- 1,734 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//===-- cl_helpers.cpp ----------------------------------------------------===//
//
//                         LDC – the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//

#include "gen/cl_helpers.h"

#include "dmd/errors.h"
#include "dmd/ldcbindings.h"
#include "dmd/root/rmem.h"
#include <algorithm>
#include <cctype> // isupper, tolower
#include <stdarg.h>
#include <utility>

namespace opts {

DString dupPathString(llvm::StringRef src) {
  const auto length = src.size();
  char *r = static_cast<char *>(mem.xmalloc(length + 1));
  memcpy(r, src.data(), length);
#if _WIN32
  std::replace(r, r + length, '/', '\\');
#endif
  r[length] = '\0';
  return {length, r};
}

DString fromPathString(const cl::opt<std::string> &src) {
  if (src.getNumOccurrences() != 0) {
    if (src.empty()) {
      error(Loc(), "Expected argument to '-%s'", src.ArgStr.str().c_str());
    }
    return dupPathString(src);
  }
  return {0, nullptr};
}

MultiSetter::MultiSetter(bool invert, CHECKENABLE *p, ...) {
  this->invert = invert;
  if (p) {
    locations.push_back(p);
    va_list va;
    va_start(va, p);
    while ((p = va_arg(va, CHECKENABLE *))) {
      locations.push_back(p);
    }
    va_end(va);
  }
}

void MultiSetter::operator=(bool val) {
  for (auto &l : locations) {
    *l = (val != invert) ? CHECKENABLEon : CHECKENABLEoff;
  }
}

void StringsAdapter::push_back(const char *cstr) {
  if (!cstr || !*cstr) {
    error(Loc(), "Expected argument to '-%s'", name);
  }

  if (!*arrp) {
    *arrp = createStrings();
  }
  (*arrp)->push(mem.xstrdup(cstr));
}

} // namespace opts