diff options
Diffstat (limited to 'lib/sanitizer_common/sanitizer_flags.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_flags.cc | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_flags.cc b/lib/sanitizer_common/sanitizer_flags.cc new file mode 100644 index 0000000..cdeeb78 --- /dev/null +++ b/lib/sanitizer_common/sanitizer_flags.cc @@ -0,0 +1,82 @@ +//===-- sanitizer_flags.cc ------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is a part of ThreadSanitizer/AddressSanitizer runtime. +// +//===----------------------------------------------------------------------===// + +#include "sanitizer_flags.h" + +#include "sanitizer_common.h" +#include "sanitizer_libc.h" + +namespace __sanitizer { + +static char *GetFlagValue(const char *env, const char *name) { + if (env == 0) + return 0; + const char *pos = internal_strstr(env, name); + const char *end; + if (pos == 0) + return 0; + pos += internal_strlen(name); + if (pos[0] != '=') { + end = pos; + } else { + pos += 1; + if (pos[0] == '"') { + pos += 1; + end = internal_strchr(pos, '"'); + } else if (pos[0] == '\'') { + pos += 1; + end = internal_strchr(pos, '\''); + } else { + end = internal_strchr(pos, ' '); + } + if (end == 0) + end = pos + internal_strlen(pos); + } + int len = end - pos; + char *f = (char*)InternalAlloc(len + 1); + internal_memcpy(f, pos, len); + f[len] = '\0'; + return f; +} + +void ParseFlag(const char *env, bool *flag, const char *name) { + char *val = GetFlagValue(env, name); + if (val == 0) + return; + if (0 == internal_strcmp(val, "0") || + 0 == internal_strcmp(val, "no") || + 0 == internal_strcmp(val, "false")) + *flag = false; + if (0 == internal_strcmp(val, "1") || + 0 == internal_strcmp(val, "yes") || + 0 == internal_strcmp(val, "true")) + *flag = true; + InternalFree(val); +} + +void ParseFlag(const char *env, int *flag, const char *name) { + char *val = GetFlagValue(env, name); + if (val == 0) + return; + *flag = internal_atoll(val); + InternalFree(val); +} + +void ParseFlag(const char *env, const char **flag, const char *name) { + const char *val = GetFlagValue(env, name); + if (val == 0) + return; + *flag = val; +} + +} // namespace __sanitizer |