forked from OSchip/llvm-project
75 lines
2.2 KiB
C++
75 lines
2.2 KiB
C++
#ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
|
|
#define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
|
|
|
|
#include "clang/AST/ASTContext.h"
|
|
#include "clang/AST/Type.h"
|
|
#include "clang/Analysis/Analyses/FormatString.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
namespace clang {
|
|
|
|
class LangOptions;
|
|
|
|
template <typename T>
|
|
class UpdateOnReturn {
|
|
T &ValueToUpdate;
|
|
const T &ValueToCopy;
|
|
public:
|
|
UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)
|
|
: ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}
|
|
|
|
~UpdateOnReturn() {
|
|
ValueToUpdate = ValueToCopy;
|
|
}
|
|
};
|
|
|
|
namespace analyze_format_string {
|
|
|
|
OptionalAmount ParseAmount(const char *&Beg, const char *E);
|
|
OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,
|
|
unsigned &argIndex);
|
|
|
|
OptionalAmount ParsePositionAmount(FormatStringHandler &H,
|
|
const char *Start, const char *&Beg,
|
|
const char *E, PositionContext p);
|
|
|
|
bool ParseFieldWidth(FormatStringHandler &H,
|
|
FormatSpecifier &CS,
|
|
const char *Start, const char *&Beg, const char *E,
|
|
unsigned *argIndex);
|
|
|
|
bool ParseArgPosition(FormatStringHandler &H,
|
|
FormatSpecifier &CS, const char *Start,
|
|
const char *&Beg, const char *E);
|
|
|
|
/// Returns true if a LengthModifier was parsed and installed in the
|
|
/// FormatSpecifier& argument, and false otherwise.
|
|
bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,
|
|
const LangOptions &LO, bool IsScanf = false);
|
|
|
|
template <typename T> class SpecifierResult {
|
|
T FS;
|
|
const char *Start;
|
|
bool Stop;
|
|
public:
|
|
SpecifierResult(bool stop = false)
|
|
: Start(nullptr), Stop(stop) {}
|
|
SpecifierResult(const char *start,
|
|
const T &fs)
|
|
: FS(fs), Start(start), Stop(false) {}
|
|
|
|
const char *getStart() const { return Start; }
|
|
bool shouldStop() const { return Stop; }
|
|
bool hasValue() const { return Start != nullptr; }
|
|
const T &getValue() const {
|
|
assert(hasValue());
|
|
return FS;
|
|
}
|
|
const T &getValue() { return FS; }
|
|
};
|
|
|
|
} // end analyze_format_string namespace
|
|
} // end clang namespace
|
|
|
|
#endif
|