Path: blob/main/contrib/llvm-project/clang/utils/TableGen/ClangCommentHTMLNamedCharacterReferenceEmitter.cpp
35231 views
//===--- ClangCommentHTMLNamedCharacterReferenceEmitter.cpp -----------------=//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 tablegen backend emits an efficient function to translate HTML named9// character references to UTF-8 sequences.10//11//===----------------------------------------------------------------------===//1213#include "TableGenBackends.h"14#include "llvm/ADT/SmallString.h"15#include "llvm/Support/ConvertUTF.h"16#include "llvm/TableGen/Error.h"17#include "llvm/TableGen/Record.h"18#include "llvm/TableGen/StringMatcher.h"19#include "llvm/TableGen/TableGenBackend.h"20#include <vector>2122using namespace llvm;2324/// Convert a code point to the corresponding UTF-8 sequence represented25/// as a C string literal.26///27/// \returns true on success.28static bool translateCodePointToUTF8(unsigned CodePoint,29SmallVectorImpl<char> &CLiteral) {30char Translated[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];31char *TranslatedPtr = Translated;32if (!ConvertCodePointToUTF8(CodePoint, TranslatedPtr))33return false;3435StringRef UTF8(Translated, TranslatedPtr - Translated);3637raw_svector_ostream OS(CLiteral);38OS << "\"";39for (size_t i = 0, e = UTF8.size(); i != e; ++i) {40OS << "\\x";41OS.write_hex(static_cast<unsigned char>(UTF8[i]));42}43OS << "\"";4445return true;46}4748void clang::EmitClangCommentHTMLNamedCharacterReferences(RecordKeeper &Records,49raw_ostream &OS) {50std::vector<Record *> Tags = Records.getAllDerivedDefinitions("NCR");51std::vector<StringMatcher::StringPair> NameToUTF8;52SmallString<32> CLiteral;53for (std::vector<Record *>::iterator I = Tags.begin(), E = Tags.end();54I != E; ++I) {55Record &Tag = **I;56std::string Spelling = std::string(Tag.getValueAsString("Spelling"));57uint64_t CodePoint = Tag.getValueAsInt("CodePoint");58CLiteral.clear();59CLiteral.append("return ");60if (!translateCodePointToUTF8(CodePoint, CLiteral)) {61SrcMgr.PrintMessage(Tag.getLoc().front(),62SourceMgr::DK_Error,63Twine("invalid code point"));64continue;65}66CLiteral.append(";");6768StringMatcher::StringPair Match(Spelling, std::string(CLiteral));69NameToUTF8.push_back(Match);70}7172emitSourceFileHeader("HTML named character reference to UTF-8 translation",73OS, Records);7475OS << "StringRef translateHTMLNamedCharacterReferenceToUTF8(\n"76" StringRef Name) {\n";77StringMatcher("Name", NameToUTF8, OS).Emit();78OS << " return StringRef();\n"79<< "}\n\n";80}818283