10b57cec5SDimitry Andric //===-- flags_parser.h ------------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef SCUDO_FLAGS_PARSER_H_ 100b57cec5SDimitry Andric #define SCUDO_FLAGS_PARSER_H_ 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "report.h" 130b57cec5SDimitry Andric #include "string_utils.h" 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric #include <stddef.h> 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric namespace scudo { 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric enum class FlagType : u8 { 200b57cec5SDimitry Andric FT_bool, 210b57cec5SDimitry Andric FT_int, 220b57cec5SDimitry Andric }; 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric class FlagParser { 250b57cec5SDimitry Andric public: 260b57cec5SDimitry Andric void registerFlag(const char *Name, const char *Desc, FlagType Type, 270b57cec5SDimitry Andric void *Var); 280b57cec5SDimitry Andric void parseString(const char *S); 290b57cec5SDimitry Andric void printFlagDescriptions(); 30*5f757f3fSDimitry Andric void parseStringPair(const char *Name, const char *Value); 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric private: 33fe6060f1SDimitry Andric static const u32 MaxFlags = 20; 340b57cec5SDimitry Andric struct Flag { 350b57cec5SDimitry Andric const char *Name; 360b57cec5SDimitry Andric const char *Desc; 370b57cec5SDimitry Andric FlagType Type; 380b57cec5SDimitry Andric void *Var; 390b57cec5SDimitry Andric } Flags[MaxFlags]; 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric u32 NumberOfFlags = 0; 420b57cec5SDimitry Andric const char *Buffer = nullptr; 430b57cec5SDimitry Andric uptr Pos = 0; 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric void reportFatalError(const char *Error); 460b57cec5SDimitry Andric void skipWhitespace(); 470b57cec5SDimitry Andric void parseFlags(); 480b57cec5SDimitry Andric void parseFlag(); 49*5f757f3fSDimitry Andric bool runHandler(const char *Name, const char *Value, char Sep); 500b57cec5SDimitry Andric }; 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric void reportUnrecognizedFlags(); 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric } // namespace scudo 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric #endif // SCUDO_FLAGS_PARSER_H_ 57