FormatStringParsing.h revision 3c46e8db99196179b30e7ac5c20c4efd5f3926d7
1d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#ifndef LLVM_CLANG_FORMAT_PARSING_H
2d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#define LLVM_CLANG_FORMAT_PARSING_H
3d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
4d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#include "clang/Analysis/Analyses/FormatString.h"
5d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#include "clang/AST/ASTContext.h"
6d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#include "clang/AST/Type.h"
7d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#include "llvm/Support/raw_ostream.h"
8d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
93c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmannamespace clang {
103c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman
11d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenektemplate <typename T>
12d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekclass UpdateOnReturn {
13d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  T &ValueToUpdate;
14d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const T &ValueToCopy;
15d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekpublic:
16d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
17d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek    : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
18d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
19d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  ~UpdateOnReturn() {
20d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek    ValueToUpdate = ValueToCopy;
21d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  }
22d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek};
23d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
24d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremeneknamespace analyze_format_string {
25d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
26d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParseAmount(const char *&Beg, const char *E);
27d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
28d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                                      unsigned &argIndex);
29d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
30d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParsePositionAmount(FormatStringHandler &H,
31d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                                   const char *Start, const char *&Beg,
32d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                                   const char *E, PositionContext p);
33d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
34d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseFieldWidth(FormatStringHandler &H,
35d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                     FormatSpecifier &CS,
36d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                     const char *Start, const char *&Beg, const char *E,
37d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                     unsigned *argIndex);
38d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
39d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseArgPosition(FormatStringHandler &H,
40d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                      FormatSpecifier &CS, const char *Start,
41d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                      const char *&Beg, const char *E);
42d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
43d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek/// Returns true if a LengthModifier was parsed and installed in the
44d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek/// FormatSpecifier& argument, and false otherwise.
45d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E);
46d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
47d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenektemplate <typename T> class SpecifierResult {
48d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  T FS;
49d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const char *Start;
50d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  bool Stop;
51d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekpublic:
52d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  SpecifierResult(bool stop = false)
53d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  : Start(0), Stop(stop) {}
54d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  SpecifierResult(const char *start,
55d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                  const T &fs)
56d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  : FS(fs), Start(start), Stop(false) {}
57d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
58d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const char *getStart() const { return Start; }
59d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  bool shouldStop() const { return Stop; }
60d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  bool hasValue() const { return Start != 0; }
61d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const T &getValue() const {
62d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek    assert(hasValue());
63d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek    return FS;
64d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  }
65d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const T &getValue() { return FS; }
66d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek};
67d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
68d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek} // end analyze_format_string namespace
69d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek} // end clang namespace
70d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
71d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#endif
72d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
73