Path: blob/main/contrib/llvm-project/clang/lib/AST/FormatStringParsing.h
35260 views
//===----- FormatStringParsing.h - Format String Parsing --------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This provides some shared functions between printf and scanf format string9// parsing code.10//11//===----------------------------------------------------------------------===//1213#ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H14#define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H1516#include "clang/AST/ASTContext.h"17#include "clang/AST/Type.h"18#include "clang/AST/FormatString.h"1920namespace clang {2122class LangOptions;2324template <typename T>25class UpdateOnReturn {26T &ValueToUpdate;27const T &ValueToCopy;28public:29UpdateOnReturn(T &valueToUpdate, const T &valueToCopy)30: ValueToUpdate(valueToUpdate), ValueToCopy(valueToCopy) {}3132~UpdateOnReturn() {33ValueToUpdate = ValueToCopy;34}35};3637namespace analyze_format_string {3839OptionalAmount ParseAmount(const char *&Beg, const char *E);40OptionalAmount ParseNonPositionAmount(const char *&Beg, const char *E,41unsigned &argIndex);4243OptionalAmount ParsePositionAmount(FormatStringHandler &H,44const char *Start, const char *&Beg,45const char *E, PositionContext p);4647bool ParseFieldWidth(FormatStringHandler &H,48FormatSpecifier &CS,49const char *Start, const char *&Beg, const char *E,50unsigned *argIndex);5152bool ParseArgPosition(FormatStringHandler &H,53FormatSpecifier &CS, const char *Start,54const char *&Beg, const char *E);5556bool ParseVectorModifier(FormatStringHandler &H,57FormatSpecifier &FS, const char *&Beg, const char *E,58const LangOptions &LO);5960/// Returns true if a LengthModifier was parsed and installed in the61/// FormatSpecifier& argument, and false otherwise.62bool ParseLengthModifier(FormatSpecifier &FS, const char *&Beg, const char *E,63const LangOptions &LO, bool IsScanf = false);6465/// Returns true if the invalid specifier in \p SpecifierBegin is a UTF-866/// string; check that it won't go further than \p FmtStrEnd and write67/// up the total size in \p Len.68bool ParseUTF8InvalidSpecifier(const char *SpecifierBegin,69const char *FmtStrEnd, unsigned &Len);7071template <typename T> class SpecifierResult {72T FS;73const char *Start;74bool Stop;75public:76SpecifierResult(bool stop = false)77: Start(nullptr), Stop(stop) {}78SpecifierResult(const char *start,79const T &fs)80: FS(fs), Start(start), Stop(false) {}8182const char *getStart() const { return Start; }83bool shouldStop() const { return Stop; }84bool hasValue() const { return Start != nullptr; }85const T &getValue() const {86assert(hasValue());87return FS;88}89const T &getValue() { return FS; }90};9192} // end analyze_format_string namespace93} // end clang namespace9495#endif969798