CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
92 lines
3.1 KiB
C++
92 lines
3.1 KiB
C++
//===----- FormatStringParsing.h - Format String Parsing --------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This provides some shared functions between printf and scanf format string
|
|
// parsing code.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
|
|
#define LLVM_CLANG_LIB_ANALYSIS_FORMATSTRINGPARSING_H
|
|
|
|
#include "clang/AST/ASTContext.h"
|
|
#include "clang/AST/FormatString.h"
|
|
#include "clang/AST/Type.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);
|
|
|
|
bool ParseVectorModifier(FormatStringHandler &H, FormatSpecifier &FS,
|
|
const char *&Beg, const char *E,
|
|
const LangOptions &LO);
|
|
|
|
/// 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);
|
|
|
|
/// Returns true if the invalid specifier in \p SpecifierBegin is a UTF-8
|
|
/// string; check that it won't go further than \p FmtStrEnd and write
|
|
/// up the total size in \p Len.
|
|
bool ParseUTF8InvalidSpecifier(const char *SpecifierBegin,
|
|
const char *FmtStrEnd, unsigned &Len);
|
|
|
|
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; }
|
|
};
|
|
|
|
} // namespace analyze_format_string
|
|
} // namespace clang
|
|
|
|
#endif
|