1 #ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
2 #define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
4 #include "clang/AST/ASTContext.h"
5 #include "clang/AST/Type.h"
6 #include "clang/Analysis/Analyses/FormatString.h"
7 #include "llvm/Support/raw_ostream.h"
14 class UpdateOnReturn {
18 UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
19 : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
22 ValueToUpdate = ValueToCopy;
26 namespace analyze_format_string {
28 OptionalAmount ParseAmount(const char *&Beg, const char *E);
29 OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
32 OptionalAmount ParsePositionAmount(FormatStringHandler &H,
33 const char *Start, const char *&Beg,
34 const char *E, PositionContext p);
36 bool ParseFieldWidth(FormatStringHandler &H,
38 const char *Start, const char *&Beg, const char *E,
41 bool ParseArgPosition(FormatStringHandler &H,
42 FormatSpecifier &CS, const char *Start,
43 const char *&Beg, const char *E);
45 /// Returns true if a LengthModifier was parsed and installed in the
46 /// FormatSpecifier& argument, and false otherwise.
47 bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,
48 const LangOptions &LO, bool IsScanf = false);
50 template <typename T> class SpecifierResult {
55 SpecifierResult(bool stop = false)
56 : Start(nullptr), Stop(stop) {}
57 SpecifierResult(const char *start,
59 : FS(fs), Start(start), Stop(false) {}
61 const char *getStart() const { return Start; }
62 bool shouldStop() const { return Stop; }
63 bool hasValue() const { return Start != nullptr; }
64 const T &getValue() const {
68 const T &getValue() { return FS; }
71 } // end analyze_format_string namespace
72 } // end clang namespace