11 #ifndef UT_PackageUtils_H
12 #define UT_PackageUtils_H
23 #include <hboost/any.hpp>
39 static const char *path_sep()
44 static char path_sep_char()
49 static const char *vardef_sep()
67 static bool buildVarDependency(
69 const char * var_value,
83 , myUnsetVars(unset_vars)
84 , myVarsDepMap(vars_dep_map)
85 , myVarsCircDepMap(vars_circ_dep)
103 auto && it = myVarsDepMap.find(myVarName);
104 if (it != myVarsDepMap.end())
106 it->second.insert(var);
111 var_dep_set.insert(var);
113 myVarsDepMap[myVarName] = var_dep_set;
118 myCircularDependency =
false;
119 if (checkCircularDep(myVarName, var))
121 auto && it = myVarsCircDepMap.find(myVarName);
122 if (it != myVarsCircDepMap.end())
124 it->second.insert(var);
129 var_circ_dep_set.insert(var);
131 myVarsCircDepMap[myVarName] = var_circ_dep_set;
134 myCircularDependency =
true;
141 myUnsetVars.append(var,
true );
154 auto && dependent = myVarsDepMap.find(dependent_var);
155 if (dependent == myVarsDepMap.end())
160 auto && dependee = myVarsDepMap.find(dependee_var);
161 if (dependee == myVarsDepMap.end())
167 if (dependent->second.contains(dependee_var) && dependee->second.contains(dependent_var))
173 return checkImplicitCircularDep(dependent_var, dependent->second);
185 if (dependee_set.
contains(dependent_var))
190 for (
auto && dependee_var : dependee_set)
192 auto && dependee = myVarsDepMap.find(dependee_var);
194 if (dependee == myVarsDepMap.end())
199 if (checkImplicitCircularDep(dependent_var, dependee->second))
208 bool myCircularDependency =
false;
216 callback(
const char *
arg,
void *user_data)
218 Data&
data = *(Data*)user_data;
220 return data.process(arg);
224 Lookup::Data
data(var_name, unset_vars, vars_dep_map, vars_circ_dep);
228 return !
data.myCircularDependency;
240 Data() : myWantMarkerFlag(false)
245 bool myWantMarkerFlag;
251 callback(
const char *arg,
void *
data)
253 const char *value = Lookup::getValue(arg, data);
255 Lookup::Data*
p = (Lookup::Data*)data;
256 if (p->myWantMarkerFlag)
258 return value ? value :
"&";
267 getValue(
const char *arg,
void* data)
269 Lookup::Data* p = (Lookup::Data*)data;
272 if (tokens.
size() > 1)
284 right_token = tokens[1];
287 right_token += vardef_sep();
288 right_token += tokens[i];
291 p->myWB = utils::expandVar(right_token.
c_str(), p->myWantMarkerFlag);
292 return p->myWB.buffer();
299 data.myWantMarkerFlag = want_marker;
318 static bool isCmdShell()
322 if (shell && strstr(shell,
"cmd.exe"))
330 static const char *pathSepShell()
342 static void normalizePath(
UT_String& path_var)
354 template <
typename T,
typename... Args>
357 return UTmakeShared<T>(std::forward<Args>(
args)...);
377 return SYSversionCompare(
427 return compare(other,
false ) == 0;
437 if (tokens.
size() > 4)
442 else if (tokens.
size()==1)
444 hver.
myMajor = SYSatoi(tokens[0].c_str());
446 else if (tokens.
size()==2)
448 hver.
myMajor = SYSatoi(tokens[0].c_str());
449 hver.
myMinor = SYSatoi(tokens[1].c_str());
451 else if (tokens.
size()==3)
453 hver.
myMajor = SYSatoi(tokens[0].c_str());
454 hver.
myMinor = SYSatoi(tokens[1].c_str());
455 hver.
myBuild = SYSatoi(tokens[2].c_str());
459 hver.
myMajor = SYSatoi(tokens[0].c_str());
460 hver.
myMinor = SYSatoi(tokens[1].c_str());
461 hver.
myBuild = SYSatoi(tokens[2].c_str());
462 hver.
myPatch = SYSatoi(tokens[3].c_str());
523 void set(
const char *value)
559 if (
typeid(
fpreal64) == myValue.type())
561 wb.
format(
"{}", hboost::any_cast<fpreal64>(myValue));
563 else if (
typeid(
int64) == myValue.type())
565 wb.
format(
"{}", hboost::any_cast<int64>(myValue));
567 else if (
typeid(
bool) == myValue.type())
569 wb.
format(
"{}", hboost::any_cast<bool>(myValue) ?
"1" :
"0");
573 wb.
format(
"{}",hboost::any_cast<std::string>(myValue));
575 else if (
typeid(
HVersion) == myValue.type())
577 auto && hver = hboost::any_cast<
HVersion>(myValue);
578 wb.
format(
"{}.{}.{}.{}",hver.myMajor,hver.myMinor,hver.myBuild,hver.myPatch);
584 template <
typename T>
585 T const &
get()
const
587 return hboost::any_cast<
T const &>(myValue);
590 template <
typename T>
593 return typeid(
T) == myValue.type();
598 return !myValue.empty();
607 auto && lhs = hboost::any_cast<
std::string>(myValue);
609 return compareIgnoreCase(lhs, rhs);
617 if (isA<int64>() && other.
isA<
int64>())
619 return get<int64>() == other.
get<
int64>();
627 if (isA<bool>() && other.
isA<
bool>())
629 return get<bool>() == other.
get<
bool>();
640 return get<HVersion>() == hver;
649 throw std::runtime_error(
"utils::Value::isEqual: unsupported type");
667 return get<HVersion>() > hver;
678 throw std::runtime_error(
"utils::Value::isGreater: unsupported types");
704 return get<HVersion>() < hver;
715 throw std::runtime_error(
"utils::Value::isLess: unsupported types");
729 if (
valid() && isA<std::string>())
731 auto && to_replace = get<std::string>();
745 return ((s1.size() == s2.size()) &&
747 [](
char & c1,
char & c2)
749 return (c1 == c2 || std::toupper(c1) == std::toupper(c2));
772 : myHasErrorFlag(false)
773 , myLog(&myDefaultLog)
782 myHasErrorFlag =
true;
785 template<
typename ...Args >
788 addToBuffer(
klog_error, formatMsg(msg, std::forward<Args>(
args)...));
789 myHasErrorFlag =
true;
797 template<
typename ...Args >
800 addToBuffer(
klog_info, formatMsg(msg, std::forward<Args>(
args)...));
805 addToBuffer(
nullptr, msg);
808 template<
typename ...Args >
811 addToBuffer(
nullptr, formatMsg(msg, std::forward<Args>(
args)...));
819 template<
typename ...Args >
827 myDefaultLog.
clear();
829 myEntryArray.
clear();
834 for (
auto && entry : myEntryArray)
836 os << entry.c_str() << std::endl;
837 auto && it = myEntryMap.find(entry);
838 os << it->second.c_str() << std::endl;
843 os << myDefaultLog.
c_str() << std::endl;
860 std::cout << title << std::endl;
865 std::cerr << title << std::endl;
875 myLog = &myDefaultLog;
880 if (!myEntryMap.count(entry))
883 myEntryArray.
append(entry);
885 myLog = &myEntryMap[entry];
890 return myHasErrorFlag;
908 template<
typename ...Args >
916 void addToBuffer(
const char* prefix,
const char* msg)
947 #endif // UT_PackageUtils_H
bool isGreaterEqual(utils::Value const &other) const
bool isGreater(utils::Value const &other) const
bool operator>(HVersion const &other) const
const UT_StringHolder klog_warning
void start(char const *entry)
bool operator>=(HVersion const &other) const
SYS_FORCE_INLINE void clear()
int compare(HVersion const &other, bool full=true) const
internal::named_arg< T, char > arg(string_view name, const T &arg)
bool operator<(HVersion const &other) const
GLenum GLsizei GLsizei GLsizei GLsizei GLbitfield flags
SYS_FORCE_INLINE const char * buffer() const
void info(char const *msg, Args &&...args)
An output stream object that owns its own string buffer storage.
bool contains(const UT_StringRef &ref) const
void message(char const *msg)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
void message(char const *msg, Args &&...args)
bool substitute(char const *find, char const *replace_with)
bool operator<=(HVersion const &other) const
const UT_WorkBuffer & str()
Returns a read-only reference to the underlying UT_WorkBuffer.
UT_StringHolder toString() const
const char * c_str() const
unsigned length() const
Return length of string.
void toStream(std::ostream &os) const
void error(char const *msg, Args &&...args)
UT_StringHolder toString() const
int tokenize(char *argv[], int max_args, char separator)
bool any(const vbool4 &v)
std::shared_ptr< T > UT_SharedPtr
Wrapper around std::shared_ptr.
GLint GLenum GLsizei GLint GLsizei const void * data
UT_WorkBuffer toWorkBuffer() const
bool isLess(utils::Value const &other) const
hboost::any const & value() const
Value(UT_StringRef const &value)
static UT_SharedPtr< T > make(Args &&...args)
void set(const char *value)
UT_API int UTVariableScan(UT_WorkBuffer &outstr, const char *instr, UTVarCallback lookup, void *userdata, bool tildeexpand=true, bool commentsexpand=true)
bool isEqual(utils::Value const &other, bool ignore_case=false) const
SYS_FORCE_INLINE const char * c_str() const
void error(char const *msg)
void warning(char const *msg, Args &&...args)
unsigned int substitute(const char *find, const char *replacement, bool all=true)
bool operator==(HVersion const &other) const
const UT_StringHolder klog_info
void append(Logger const &logger)
UT_StringMap< UT_StringHolder > EntryMap
UT_StringArray EntryArray
GLsizei const GLchar *const * string
size_t format(const char *fmt, const Args &...args)
int substitute(const char *find, const char *replacement, bool all=true)
void log(char const *title, Flags flags=Flags::all) const
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat s1
FMT_CONSTEXPR bool find(Ptr first, Ptr last, T value, Ptr &out)
bool equal(T1 a, T2 b, T3 t)
const UT_StringHolder klog_error
void info(char const *msg)
void clear()
Resets list to an empty list.
static HVersion convert(UT_StringRef const &str)
void warning(char const *msg)
const UT_StringHolder kvardef_sep
GLsizei const GLfloat * value
bool isLessEqual(utils::Value const &other) const
tools_API const char * HoudiniGetenv(const char *name)
SYS_FORCE_INLINE bool isstring() const