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