FormatStringParsing.h revision 3c46e8db99196179b30e7ac5c20c4efd5f3926d7
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 11d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenektemplate <typename T> 12d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekclass UpdateOnReturn { 13d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek T &ValueToUpdate; 14d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const T &ValueToCopy; 15d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekpublic: 16d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek UpdateOnReturn(T &valueToUpdate, const T &valueToCopy) 17d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek : ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {} 18d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 19d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek ~UpdateOnReturn() { 20d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek ValueToUpdate = ValueToCopy; 21d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek } 22d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek}; 23d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 24d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremeneknamespace analyze_format_string { 25d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 26d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParseAmount(const char *&Beg, const char *E); 27d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E, 28d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek unsigned &argIndex); 29d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 30d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed KremenekOptionalAmount ParsePositionAmount(FormatStringHandler &H, 31d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *Start, const char *&Beg, 32d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *E, PositionContext p); 33d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 34d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseFieldWidth(FormatStringHandler &H, 35d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek FormatSpecifier &CS, 36d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *Start, const char *&Beg, const char *E, 37d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek unsigned *argIndex); 38d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 39d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseArgPosition(FormatStringHandler &H, 40d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek FormatSpecifier &CS, const char *Start, 41d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *&Beg, const char *E); 42d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 43d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek/// Returns true if a LengthModifier was parsed and installed in the 44d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek/// FormatSpecifier& argument, and false otherwise. 45d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekbool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E); 46d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 47d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenektemplate <typename T> class SpecifierResult { 48d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek T FS; 49d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *Start; 50d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek bool Stop; 51d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenekpublic: 52d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek SpecifierResult(bool stop = false) 53d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek : Start(0), Stop(stop) {} 54d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek SpecifierResult(const char *start, 55d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const T &fs) 56d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek : FS(fs), Start(start), Stop(false) {} 57d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 58d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const char *getStart() const { return Start; } 59d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek bool shouldStop() const { return Stop; } 60d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek bool hasValue() const { return Start != 0; } 61d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const T &getValue() const { 62d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek assert(hasValue()); 63d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek return FS; 64d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek } 65d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek const T &getValue() { return FS; } 66d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek}; 67d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 68d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek} // end analyze_format_string namespace 69d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek} // end clang namespace 70d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 71d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek#endif 72d20b24c4c35c7bd0135705add9cd3526e3b2c8cbTed Kremenek 73