annotate clang/lib/AST/FormatStringParsing.h @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===----- FormatStringParsing.h - Format String Parsing --------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This provides some shared functions between printf and scanf format string
anatofuz
parents:
diff changeset
10 // parsing code.
anatofuz
parents:
diff changeset
11 //
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 #ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
anatofuz
parents:
diff changeset
15 #define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
18 #include "clang/AST/Type.h"
anatofuz
parents:
diff changeset
19 #include "clang/AST/FormatString.h"
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 namespace clang {
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 class LangOptions;
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 template <typename T>
anatofuz
parents:
diff changeset
26 class UpdateOnReturn {
anatofuz
parents:
diff changeset
27 T &ValueToUpdate;
anatofuz
parents:
diff changeset
28 const T &ValueToCopy;
anatofuz
parents:
diff changeset
29 public:
anatofuz
parents:
diff changeset
30 UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
anatofuz
parents:
diff changeset
31 : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 ~UpdateOnReturn() {
anatofuz
parents:
diff changeset
34 ValueToUpdate = ValueToCopy;
anatofuz
parents:
diff changeset
35 }
anatofuz
parents:
diff changeset
36 };
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 namespace analyze_format_string {
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 OptionalAmount ParseAmount(const char *&Beg, const char *E);
anatofuz
parents:
diff changeset
41 OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
anatofuz
parents:
diff changeset
42 unsigned &argIndex);
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 OptionalAmount ParsePositionAmount(FormatStringHandler &H,
anatofuz
parents:
diff changeset
45 const char *Start, const char *&Beg,
anatofuz
parents:
diff changeset
46 const char *E, PositionContext p);
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 bool ParseFieldWidth(FormatStringHandler &H,
anatofuz
parents:
diff changeset
49 FormatSpecifier &CS,
anatofuz
parents:
diff changeset
50 const char *Start, const char *&Beg, const char *E,
anatofuz
parents:
diff changeset
51 unsigned *argIndex);
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 bool ParseArgPosition(FormatStringHandler &H,
anatofuz
parents:
diff changeset
54 FormatSpecifier &CS, const char *Start,
anatofuz
parents:
diff changeset
55 const char *&Beg, const char *E);
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 bool ParseVectorModifier(FormatStringHandler &H,
anatofuz
parents:
diff changeset
58 FormatSpecifier &FS, const char *&Beg, const char *E,
anatofuz
parents:
diff changeset
59 const LangOptions &LO);
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 /// Returns true if a LengthModifier was parsed and installed in the
anatofuz
parents:
diff changeset
62 /// FormatSpecifier& argument, and false otherwise.
anatofuz
parents:
diff changeset
63 bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,
anatofuz
parents:
diff changeset
64 const LangOptions &LO, bool IsScanf = false);
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 /// Returns true if the invalid specifier in \p SpecifierBegin is a UTF-8
anatofuz
parents:
diff changeset
67 /// string; check that it won't go further than \p FmtStrEnd and write
anatofuz
parents:
diff changeset
68 /// up the total size in \p Len.
anatofuz
parents:
diff changeset
69 bool ParseUTF8InvalidSpecifier(const char *SpecifierBegin,
anatofuz
parents:
diff changeset
70 const char *FmtStrEnd, unsigned &Len);
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 template <typename T> class SpecifierResult {
anatofuz
parents:
diff changeset
73 T FS;
anatofuz
parents:
diff changeset
74 const char *Start;
anatofuz
parents:
diff changeset
75 bool Stop;
anatofuz
parents:
diff changeset
76 public:
anatofuz
parents:
diff changeset
77 SpecifierResult(bool stop = false)
anatofuz
parents:
diff changeset
78 : Start(nullptr), Stop(stop) {}
anatofuz
parents:
diff changeset
79 SpecifierResult(const char *start,
anatofuz
parents:
diff changeset
80 const T &fs)
anatofuz
parents:
diff changeset
81 : FS(fs), Start(start), Stop(false) {}
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 const char *getStart() const { return Start; }
anatofuz
parents:
diff changeset
84 bool shouldStop() const { return Stop; }
anatofuz
parents:
diff changeset
85 bool hasValue() const { return Start != nullptr; }
anatofuz
parents:
diff changeset
86 const T &getValue() const {
anatofuz
parents:
diff changeset
87 assert(hasValue());
anatofuz
parents:
diff changeset
88 return FS;
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90 const T &getValue() { return FS; }
anatofuz
parents:
diff changeset
91 };
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 } // end analyze_format_string namespace
anatofuz
parents:
diff changeset
94 } // end clang namespace
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 #endif