]> granicus.if.org Git - clang/blob - lib/Analysis/FormatStringParsing.h
Add missing header file.
[clang] / lib / Analysis / FormatStringParsing.h
1 #ifndef LLVM_CLANG_FORMAT_PARSING_H
2 #define LLVM_CLANG_FORMAT_PARSING_H
3
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"
8
9 template <typename T>
10 class UpdateOnReturn {
11   T &ValueToUpdate;
12   const T &ValueToCopy;
13 public:
14   UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
15     : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
16
17   ~UpdateOnReturn() {
18     ValueToUpdate = ValueToCopy;
19   }
20 };
21
22 namespace clang {
23 namespace analyze_format_string {
24   
25 OptionalAmount ParseAmount(const char *&Beg, const char *E);
26 OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
27                                       unsigned &argIndex);
28
29 OptionalAmount ParsePositionAmount(FormatStringHandler &H,
30                                    const char *Start, const char *&Beg,
31                                    const char *E, PositionContext p);
32   
33 bool ParseFieldWidth(FormatStringHandler &H,
34                      FormatSpecifier &CS,
35                      const char *Start, const char *&Beg, const char *E,
36                      unsigned *argIndex);
37     
38 bool ParseArgPosition(FormatStringHandler &H,
39                       FormatSpecifier &CS, const char *Start,
40                       const char *&Beg, const char *E);
41
42 /// Returns true if a LengthModifier was parsed and installed in the
43 /// FormatSpecifier& argument, and false otherwise.
44 bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E);
45   
46 template <typename T> class SpecifierResult {
47   T FS;
48   const char *Start;
49   bool Stop;
50 public:
51   SpecifierResult(bool stop = false)
52   : Start(0), Stop(stop) {}
53   SpecifierResult(const char *start,
54                   const T &fs)
55   : FS(fs), Start(start), Stop(false) {}
56   
57   const char *getStart() const { return Start; }
58   bool shouldStop() const { return Stop; }
59   bool hasValue() const { return Start != 0; }
60   const T &getValue() const {
61     assert(hasValue());
62     return FS;
63   }
64   const T &getValue() { return FS; }
65 };
66   
67 } // end analyze_format_string namespace
68 } // end clang namespace
69
70 #endif
71