1 #ifndef LLVM_CLANG_FORMAT_PARSING_H
2 #define LLVM_CLANG_FORMAT_PARSING_H
4 #include "clang/Analysis/Analyses/FormatString.h"
5 #include "clang/AST/ASTContext.h"
6 #include "clang/AST/Type.h"
7 #include "llvm/Support/raw_ostream.h"
12 class UpdateOnReturn {
16 UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
17 : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
20 ValueToUpdate = ValueToCopy;
24 namespace analyze_format_string {
26 OptionalAmount ParseAmount(const char *&Beg, const char *E);
27 OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
30 OptionalAmount ParsePositionAmount(FormatStringHandler &H,
31 const char *Start, const char *&Beg,
32 const char *E, PositionContext p);
34 bool ParseFieldWidth(FormatStringHandler &H,
36 const char *Start, const char *&Beg, const char *E,
39 bool ParseArgPosition(FormatStringHandler &H,
40 FormatSpecifier &CS, const char *Start,
41 const char *&Beg, const char *E);
43 /// Returns true if a LengthModifier was parsed and installed in the
44 /// FormatSpecifier& argument, and false otherwise.
45 bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E);
47 template <typename T> class SpecifierResult {
52 SpecifierResult(bool stop = false)
53 : Start(0), Stop(stop) {}
54 SpecifierResult(const char *start,
56 : FS(fs), Start(start), Stop(false) {}
58 const char *getStart() const { return Start; }
59 bool shouldStop() const { return Stop; }
60 bool hasValue() const { return Start != 0; }
61 const T &getValue() const {
65 const T &getValue() { return FS; }
68 } // end analyze_format_string namespace
69 } // end clang namespace