#include "clang/AST/CommentLexer.h"
#include "clang/AST/CommentCommandTraits.h"
#include "clang/Basic/ConvertUTF.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Support/ErrorHandling.h"
namespace clang {
namespace comments {
void Token::dump(const Lexer &L, const SourceManager &SM) const {
llvm::errs() << "comments::Token Kind=" << Kind << " ";
Loc.dump(SM);
llvm::errs() << " " << Length << " \"" << L.getSpelling(*this, SM) << "\"\n";
}
namespace {
bool isHTMLNamedCharacterReferenceCharacter(char C) {
return (C >= 'a' && C <= 'z') ||
(C >= 'A' && C <= 'Z');
}
bool isHTMLDecimalCharacterReferenceCharacter(char C) {
return C >= '0' && C <= '9';
}
bool isHTMLHexCharacterReferenceCharacter(char C) {
return (C >= '0' && C <= '9') ||
(C >= 'a' && C <= 'f') ||
(C >= 'A' && C <= 'F');
}
#include "clang/AST/CommentHTMLTags.inc"
} // unnamed namespace
static unsigned getCodePoint(StringRef Name) {
unsigned CodePoint = 0;
for (unsigned i = 0, e = Name.size(); i != e; ++i) {
CodePoint *= 16;
const char C = Name[i];
assert(isHTMLHexCharacterReferenceCharacter(C));
CodePoint += llvm::hexDigitValue(C);
}
return CodePoint;
}
StringRef Lexer::helperResolveHTMLHexCharacterReference(unsigned CodePoint) const {
char *Resolved = Allocator.Allocate<char>(UNI_MAX_UTF8_BYTES_PER_CODE_POINT);
char *ResolvedPtr = Resolved;
if (ConvertCodePointToUTF8(CodePoint, ResolvedPtr))
return StringRef(Resolved, ResolvedPtr - Resolved);
else
return StringRef();
}
StringRef Lexer::resolveHTMLHexCharacterReference(StringRef Name) const {
unsigned CodePoint = getCodePoint(Name);
return helperResolveHTMLHexCharacterReference(CodePoint);
}
StringRef Lexer::resolveHTMLNamedCharacterReference(StringRef Name) const {
return llvm::StringSwitch<StringRef>(Name)
.Case("amp", "&")
.Case("lt", "<")
.Case("gt", ">")
.Case("quot", "\"")
.Case("apos", "\'")
.Default("");
}
StringRef Lexer::HTMLDoxygenCharacterReference(StringRef Name) const {
return llvm::StringSwitch<StringRef>(Name)
.Case("copy", helperResolveHTMLHexCharacterReference(0x000A9))
.Case("trade", helperResolveHTMLHexCharacterReference(0x02122))
.Case("reg", helperResolveHTMLHexCharacterReference(0x000AE))
.Case("lt", helperResolveHTMLHexCharacterReference(0x0003C))
.Case("gt", helperResolveHTMLHexCharacterReference(0x0003C))
.Case("amp", helperResolveHTMLHexCharacterReference(0x00026))
.Case("apos", helperResolveHTMLHexCharacterReference(0x00027))
.Case("quot", helperResolveHTMLHexCharacterReference(0x00022))
.Case("lsquo", helperResolveHTMLHexCharacterReference(0x02018))
.Case("rsquo", helperResolveHTMLHexCharacterReference(0x02019))
.Case("ldquo", helperResolveHTMLHexCharacterReference(0x0201C))
.Case("rdquo", helperResolveHTMLHexCharacterReference(0x0201D))
.Case("ndash", helperResolveHTMLHexCharacterReference(0x02013))
.Case("mdash", helperResolveHTMLHexCharacterReference(0x02014))
.Case("Auml", helperResolveHTMLHexCharacterReference(0x000C4))
.Case("Euml", helperResolveHTMLHexCharacterReference(0x000CB))
.Case("Iuml", helperResolveHTMLHexCharacterReference(0x000CF))
.Case("Ouml", helperResolveHTMLHexCharacterReference(0x000D6))
.Case("Uuml", helperResolveHTMLHexCharacterReference(0x000DC))
.Case("Yuml", helperResolveHTMLHexCharacterReference(0x00178))
.Case("auml", helperResolveHTMLHexCharacterReference(0x000E4))
.Case("euml",<