FormatStringParsing.h revision 249423
11638Srgrimes#ifndef LLVM_CLANG_FORMAT_PARSING_H
250476Speter#define LLVM_CLANG_FORMAT_PARSING_H
31638Srgrimes
4115103Strhodes#include "clang/AST/ASTContext.h"
5115103Strhodes#include "clang/AST/Type.h"
6115103Strhodes#include "clang/Analysis/Analyses/FormatString.h"
7115103Strhodes#include "llvm/Support/raw_ostream.h"
83470Srgrimes
9115103Strhodesnamespace clang {
10115103Strhodes
111638Srgrimesclass LangOptions;
12115103Strhodes
13115103Strhodestemplate <typename T>
14115103Strhodesclass UpdateOnReturn {
15115103Strhodes  T &ValueToUpdate;
16115103Strhodes  const T &ValueToCopy;
17115103Strhodespublic:
18115103Strhodes  UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
19115103Strhodes    : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
20291786Sbdrewery
2123559Swosch  ~UpdateOnReturn() {
2223559Swosch    ValueToUpdate = ValueToCopy;
23115103Strhodes  }
24115103Strhodes};
2523559Swosch
26115103Strhodesnamespace analyze_format_string {
2723559Swosch
2823559SwoschOptionalAmount ParseAmount(const char *&Beg, const char *E);
2923559SwoschOptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
30115103Strhodes                                      unsigned &argIndex);
31115103Strhodes
32115103StrhodesOptionalAmount ParsePositionAmount(FormatStringHandler &H,
3323559Swosch                                   const char *Start, const char *&Beg,
3423559Swosch                                   const char *E, PositionContext p);
3523559Swosch
36115103Strhodesbool ParseFieldWidth(FormatStringHandler &H,
37115103Strhodes                     FormatSpecifier &CS,
3823559Swosch                     const char *Start, const char *&Beg, const char *E,
3923559Swosch                     unsigned *argIndex);
40152265Sharti
4123559Swoschbool ParseArgPosition(FormatStringHandler &H,
42115103Strhodes                      FormatSpecifier &CS, const char *Start,
43264483Sjmmv                      const char *&Beg, const char *E);
44115103Strhodes
4523559Swosch/// Returns true if a LengthModifier was parsed and installed in the
46115103Strhodes/// FormatSpecifier& argument, and false otherwise.
4723559Swoschbool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,
48115103Strhodes                         const LangOptions &LO, bool IsScanf = false);
49115103Strhodes
501638Srgrimestemplate <typename T> class SpecifierResult {
51115103Strhodes  T FS;
5223578Swosch  const char *Start;
53115103Strhodes  bool Stop;
54115103Strhodespublic:
55115103Strhodes  SpecifierResult(bool stop = false)
56115103Strhodes  : Start(0), Stop(stop) {}
57115103Strhodes  SpecifierResult(const char *start,
58115103Strhodes                  const T &fs)
59115103Strhodes  : FS(fs), Start(start), Stop(false) {}
60115103Strhodes
61115103Strhodes  const char *getStart() const { return Start; }
62115103Strhodes  bool shouldStop() const { return Stop; }
63115103Strhodes  bool hasValue() const { return Start != 0; }
641638Srgrimes  const T &getValue() const {
651638Srgrimes    assert(hasValue());
661638Srgrimes    return FS;
671638Srgrimes  }
68115103Strhodes  const T &getValue() { return FS; }
691638Srgrimes};
701638Srgrimes
711638Srgrimes} // end analyze_format_string namespace
721638Srgrimes} // end clang namespace
731638Srgrimes
741638Srgrimes#endif
751638Srgrimes