Clang Project

clang_source_code/lib/AST/FormatStringParsing.h
1#ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
2#define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
3
4#include "clang/AST/ASTContext.h"
5#include "clang/AST/Type.h"
6#include "clang/AST/FormatString.h"
7
8namespace clang {
9
10class LangOptions;
11
12template <typename T>
13class UpdateOnReturn {
14  T &ValueToUpdate;
15  const T &ValueToCopy;
16public:
17  UpdateOnReturn(T &valueToUpdateconst T &valueToCopy)
18    : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
19
20  ~UpdateOnReturn() {
21    ValueToUpdate = ValueToCopy;
22  }
23};
24
25namespace analyze_format_string {
26
27OptionalAmount ParseAmount(const char *&Begconst char *E);
28OptionalAmount ParseNonPositionAmount(const char *&Begconst char *E,
29                                      unsigned &argIndex);
30
31OptionalAmount ParsePositionAmount(FormatStringHandler &H,
32                                   const char *Startconst char *&Beg,
33                                   const char *EPositionContext p);
34
35bool ParseFieldWidth(FormatStringHandler &H,
36                     FormatSpecifier &CS,
37                     const char *Startconst char *&Begconst char *E,
38                     unsigned *argIndex);
39
40bool ParseArgPosition(FormatStringHandler &H,
41                      FormatSpecifier &CSconst char *Start,
42                      const char *&Begconst char *E);
43
44bool ParseVectorModifier(FormatStringHandler &H,
45                         FormatSpecifier &FSconst char *&Begconst char *E,
46                         const LangOptions &LO);
47
48/// Returns true if a LengthModifier was parsed and installed in the
49/// FormatSpecifier& argument, and false otherwise.
50bool ParseLengthModifier(FormatSpecifier &FSconst char *&Begconst char *E,
51                         const LangOptions &LObool IsScanf = false);
52
53/// Returns true if the invalid specifier in \p SpecifierBegin is a UTF-8
54/// string; check that it won't go further than \p FmtStrEnd and write
55/// up the total size in \p Len.
56bool ParseUTF8InvalidSpecifier(const char *SpecifierBegin,
57                               const char *FmtStrEndunsigned &Len);
58
59template <typename T> class SpecifierResult {
60  T FS;
61  const char *Start;
62  bool Stop;
63public:
64  SpecifierResult(bool stop = false)
65  : Start(nullptr), Stop(stop) {}
66  SpecifierResult(const char *start,
67                  const T &fs)
68  : FS(fs), Start(start), Stop(false) {}
69
70  const char *getStart() const { return Start; }
71  bool shouldStop() const { return Stop; }
72  bool hasValue() const { return Start != nullptr; }
73  const T &getValue() const {
74    assert(hasValue());
75    return FS;
76  }
77  const T &getValue() { return FS; }
78};
79
80// end analyze_format_string namespace
81// end clang namespace
82
83#endif
84
clang::UpdateOnReturn::ValueToUpdate
clang::UpdateOnReturn::ValueToCopy
clang::analyze_format_string::SpecifierResult::FS
clang::analyze_format_string::SpecifierResult::Start
clang::analyze_format_string::SpecifierResult::Stop
clang::analyze_format_string::SpecifierResult::getStart
clang::analyze_format_string::SpecifierResult::shouldStop
clang::analyze_format_string::SpecifierResult::hasValue
clang::analyze_format_string::SpecifierResult::getValue
clang::analyze_format_string::SpecifierResult::getValue