1d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#ifndef LLVM_CLANG_FORMAT_PARSING_H 2d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#define LLVM_CLANG_FORMAT_PARSING_H 3d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 4d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#include "clang/Analysis/Analyses/FormatString.h" 5d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#include "clang/AST/ASTContext.h" 6d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#include "clang/AST/Type.h" 7d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#include "llvm/Support/raw_ostream.h" 8d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 93c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohmannamespace clang { 103c46e8db99196179b30e7ac5c20c4efd5f3926d7Dan Gohman 11d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborgclass LangOptions; 12d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg 13d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenektemplate <typename T> 14d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekclass UpdateOnReturn { 15d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek T &ValueToUpdate; 16d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const T &ValueToCopy; 17d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekpublic: 18d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek UpdateOnReturn(T &valueToUpdate, const T &valueToCopy) 19d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {} 20d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 21d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek ~UpdateOnReturn() { 22d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek ValueToUpdate = ValueToCopy; 23d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek } 24d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek}; 25d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 26d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremeneknamespace analyze_format_string { 27d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 28d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParseAmount(const char *&Beg, const char *E); 29d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E, 30d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek unsigned &argIndex); 31d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 32d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParsePositionAmount(FormatStringHandler &H, 33d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *Start, const char *&Beg, 34d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *E, PositionContext p); 35d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 36d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseFieldWidth(FormatStringHandler &H, 37d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek FormatSpecifier &CS, 38d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *Start, const char *&Beg, const char *E, 39d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek unsigned *argIndex); 40d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 41d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseArgPosition(FormatStringHandler &H, 42d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek FormatSpecifier &CS, const char *Start, 43d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *&Beg, const char *E); 44d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 45d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek/// Returns true if a LengthModifier was parsed and installed in the 46d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek/// FormatSpecifier& argument, and false otherwise. 47d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborgbool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E, 48d02deebce5f1b283101e035a7f5d5bab0d2068ecHans Wennborg const LangOptions &LO, bool IsScanf = false); 49d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 50d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenektemplate <typename T> class SpecifierResult { 51d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek T FS; 52d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *Start; 53d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek bool Stop; 54d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekpublic: 55d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek SpecifierResult(bool stop = false) 56d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek : Start(0), Stop(stop) {} 57d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek SpecifierResult(const char *start, 58d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const T &fs) 59d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek : FS(fs), Start(start), Stop(false) {} 60d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 61d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *getStart() const { return Start; } 62d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek bool shouldStop() const { return Stop; } 63d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek bool hasValue() const { return Start != 0; } 64d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const T &getValue() const { 65d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek assert(hasValue()); 66d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek return FS; 67d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek } 68d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const T &getValue() { return FS; } 69d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek}; 70d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 71d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek} // end analyze_format_string namespace 72d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek} // end clang namespace 73d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 74d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#endif 75