blob: d5415217150b798ef45d4fab886baa4c7ec252c2 [file] [log] [blame]
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +00001#ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
2#define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
Ted Kremenek575e89d2010-07-16 02:11:26 +00003
Ted Kremenek575e89d2010-07-16 02:11:26 +00004#include "clang/AST/ASTContext.h"
5#include "clang/AST/Type.h"
Chandler Carruth3a022472012-12-04 09:13:33 +00006#include "clang/Analysis/Analyses/FormatString.h"
Ted Kremenek575e89d2010-07-16 02:11:26 +00007#include "llvm/Support/raw_ostream.h"
8
Dan Gohman28ade552010-07-26 21:25:24 +00009namespace clang {
10
Hans Wennborg23926bd2011-12-15 10:25:47 +000011class LangOptions;
12
Ted Kremenek575e89d2010-07-16 02:11:26 +000013template <typename T>
14class UpdateOnReturn {
15 T &ValueToUpdate;
16 const T &ValueToCopy;
17public:
18 UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
19 : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
20
21 ~UpdateOnReturn() {
22 ValueToUpdate = ValueToCopy;
23 }
24};
25
Ted Kremenek575e89d2010-07-16 02:11:26 +000026namespace analyze_format_string {
27
28OptionalAmount ParseAmount(const char *&Beg, const char *E);
29OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
30 unsigned &argIndex);
31
32OptionalAmount ParsePositionAmount(FormatStringHandler &H,
33 const char *Start, const char *&Beg,
34 const char *E, PositionContext p);
35
36bool ParseFieldWidth(FormatStringHandler &H,
37 FormatSpecifier &CS,
38 const char *Start, const char *&Beg, const char *E,
39 unsigned *argIndex);
40
41bool ParseArgPosition(FormatStringHandler &H,
42 FormatSpecifier &CS, const char *Start,
43 const char *&Beg, const char *E);
44
45/// Returns true if a LengthModifier was parsed and installed in the
46/// FormatSpecifier& argument, and false otherwise.
Hans Wennborg23926bd2011-12-15 10:25:47 +000047bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,
48 const LangOptions &LO, bool IsScanf = false);
Ted Kremenek575e89d2010-07-16 02:11:26 +000049
50template <typename T> class SpecifierResult {
51 T FS;
52 const char *Start;
53 bool Stop;
54public:
55 SpecifierResult(bool stop = false)
Craig Topper25542942014-05-20 04:30:07 +000056 : Start(nullptr), Stop(stop) {}
Ted Kremenek575e89d2010-07-16 02:11:26 +000057 SpecifierResult(const char *start,
58 const T &fs)
59 : FS(fs), Start(start), Stop(false) {}
60
61 const char *getStart() const { return Start; }
62 bool shouldStop() const { return Stop; }
Craig Topper25542942014-05-20 04:30:07 +000063 bool hasValue() const { return Start != nullptr; }
Ted Kremenek575e89d2010-07-16 02:11:26 +000064 const T &getValue() const {
65 assert(hasValue());
66 return FS;
67 }
68 const T &getValue() { return FS; }
69};
70
Alexander Kornienko3d9d9292015-06-22 09:47:44 +000071} // namespace analyze_format_string
72} // namespace clang
Ted Kremenek575e89d2010-07-16 02:11:26 +000073
74#endif