1 //===-- sanitizer_flags.cc ------------------------------------------------===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is a part of ThreadSanitizer/AddressSanitizer runtime.
10 //===----------------------------------------------------------------------===//
12 #include "sanitizer_flags.h"
14 #include "sanitizer_common.h"
15 #include "sanitizer_libc.h"
17 namespace __sanitizer
{
19 static bool GetFlagValue(const char *env
, const char *name
,
20 const char **value
, int *value_length
) {
23 const char *pos
= internal_strstr(env
, name
);
27 pos
+= internal_strlen(name
);
34 end
= internal_strchr(pos
, '"');
35 } else if (pos
[0] == '\'') {
37 end
= internal_strchr(pos
, '\'');
39 // Read until the next space or colon.
40 end
= pos
+ internal_strcspn(pos
, " :");
43 end
= pos
+ internal_strlen(pos
);
46 *value_length
= end
- pos
;
50 static bool StartsWith(const char *flag
, int flag_length
, const char *value
) {
53 int value_length
= internal_strlen(value
);
54 return (flag_length
>= value_length
) &&
55 (0 == internal_strncmp(flag
, value
, value_length
));
58 void ParseFlag(const char *env
, bool *flag
, const char *name
) {
61 if (!GetFlagValue(env
, name
, &value
, &value_length
))
63 if (StartsWith(value
, value_length
, "0") ||
64 StartsWith(value
, value_length
, "no") ||
65 StartsWith(value
, value_length
, "false"))
67 if (StartsWith(value
, value_length
, "1") ||
68 StartsWith(value
, value_length
, "yes") ||
69 StartsWith(value
, value_length
, "true"))
73 void ParseFlag(const char *env
, int *flag
, const char *name
) {
76 if (!GetFlagValue(env
, name
, &value
, &value_length
))
78 *flag
= internal_atoll(value
);
81 static LowLevelAllocator allocator_for_flags
;
83 void ParseFlag(const char *env
, const char **flag
, const char *name
) {
86 if (!GetFlagValue(env
, name
, &value
, &value_length
))
88 // Copy the flag value. Don't use locks here, as flags are parsed at
90 char *value_copy
= (char*)(allocator_for_flags
.Allocate(value_length
+ 1));
91 internal_memcpy(value_copy
, value
, value_length
);
92 value_copy
[value_length
] = '\0';
96 } // namespace __sanitizer