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
11d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborgclass LangOptions;
12d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg
13d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenektemplate <typename T>
14d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekclass UpdateOnReturn {
15d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  T &ValueToUpdate;
16d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const T &ValueToCopy;
17d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekpublic:
18d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
19d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek    : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
20d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
21d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  ~UpdateOnReturn() {
22d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek    ValueToUpdate = ValueToCopy;
23d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  }
24d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek};
25d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
26d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremeneknamespace analyze_format_string {
27d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
28d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParseAmount(const char *&Beg, const char *E);
29d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
30d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                                      unsigned &argIndex);
31d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
32d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParsePositionAmount(FormatStringHandler &H,
33d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                                   const char *Start, const char *&Beg,
34d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                                   const char *E, PositionContext p);
35d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
36d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseFieldWidth(FormatStringHandler &H,
37d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                     FormatSpecifier &CS,
38d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                     const char *Start, const char *&Beg, const char *E,
39d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                     unsigned *argIndex);
40d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
41d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseArgPosition(FormatStringHandler &H,
42d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                      FormatSpecifier &CS, const char *Start,
43d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                      const char *&Beg, const char *E);
44d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
45d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek/// Returns true if a LengthModifier was parsed and installed in the
46d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek/// FormatSpecifier& argument, and false otherwise.
47d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborgbool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,
48d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg                         const LangOptions &LO, bool IsScanf = false);
49d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
50d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenektemplate <typename T> class SpecifierResult {
51d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  T FS;
52d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const char *Start;
53d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  bool Stop;
54d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekpublic:
55d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  SpecifierResult(bool stop = false)
56d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  : Start(0), Stop(stop) {}
57d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  SpecifierResult(const char *start,
58d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek                  const T &fs)
59d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  : FS(fs), Start(start), Stop(false) {}
60d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
61d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const char *getStart() const { return Start; }
62d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  bool shouldStop() const { return Stop; }
63d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  bool hasValue() const { return Start != 0; }
64d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const T &getValue() const {
65d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek    assert(hasValue());
66d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek    return FS;
67d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  }
68d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek  const T &getValue() { return FS; }
69d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek};
70d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
71d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek} // end analyze_format_string namespace
72d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek} // end clang namespace
73d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek
74d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#endif
75