blob: 49d9735f806dd825ec0b17cf9852426b3208d169 [file] [log] [blame]
Ted Kremenekd20b24c2010-07-16 02:11:26 +00001#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
9template <typename T>
10class UpdateOnReturn {
11 T &ValueToUpdate;
12 const T &ValueToCopy;
13public:
14 UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
15 : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
16
17 ~UpdateOnReturn() {
18 ValueToUpdate = ValueToCopy;
19 }
20};
21
22namespace clang {
23namespace analyze_format_string {
24
25OptionalAmount ParseAmount(const char *&Beg, const char *E);
26OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
27 unsigned &argIndex);
28
29OptionalAmount ParsePositionAmount(FormatStringHandler &H,
30 const char *Start, const char *&Beg,
31 const char *E, PositionContext p);
32
33bool ParseFieldWidth(FormatStringHandler &H,
34 FormatSpecifier &CS,
35 const char *Start, const char *&Beg, const char *E,
36 unsigned *argIndex);
37
38bool 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.
44bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E);
45
46template <typename T> class SpecifierResult {
47 T FS;
48 const char *Start;
49 bool Stop;
50public:
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