1aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko//===--- CommentCommandTraits.cpp - Comment command properties --*- C++ -*-===// 2aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 3aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// The LLVM Compiler Infrastructure 4aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 5aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// This file is distributed under the University of Illinois Open Source 6aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// License. See LICENSE.TXT for details. 7aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 8aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko//===----------------------------------------------------------------------===// 9aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 10aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#include "clang/AST/CommentCommandTraits.h" 11e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko#include "llvm/ADT/STLExtras.h" 12aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 13aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkonamespace clang { 14aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkonamespace comments { 15aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 16e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko#include "clang/AST/CommentCommandInfo.inc" 17aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 18e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri GribenkoCommandTraits::CommandTraits(llvm::BumpPtrAllocator &Allocator) : 19e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko NextID(llvm::array_lengthof(Commands)), Allocator(Allocator) 20e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko{ } 21aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 22e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getCommandInfoOrNULL(StringRef Name) const { 23e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (const CommandInfo *Info = getBuiltinCommandInfo(Name)) 24e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Info; 25e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return getRegisteredCommandInfo(Name); 26aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} 27aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 28e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getCommandInfo(unsigned CommandID) const { 29e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (const CommandInfo *Info = getBuiltinCommandInfo(CommandID)) 30e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Info; 31e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return getRegisteredCommandInfo(CommandID); 32e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko} 33aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 34e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::registerUnknownCommand(StringRef CommandName) { 35e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko char *Name = Allocator.Allocate<char>(CommandName.size()); 36e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko memcpy(Name, CommandName.data(), CommandName.size()); 37e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko Name[CommandName.size() + 1] = '\0'; 38aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 39e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko // Value-initialize (=zero-initialize in this case) a new CommandInfo. 40e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko CommandInfo *Info = new (Allocator) CommandInfo(); 41e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko Info->Name = Name; 42e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko Info->ID = NextID++; 43aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 44e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko RegisteredCommands.push_back(Info); 45aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 46e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Info; 47aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} 48aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 49e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getBuiltinCommandInfo( 50e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) { 51e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (CommandID < llvm::array_lengthof(Commands)) 52e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return &Commands[CommandID]; 53e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return NULL; 5462290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko} 5562290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko 56e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getRegisteredCommandInfo( 57e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko StringRef Name) const { 58e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko for (unsigned i = 0, e = RegisteredCommands.size(); i != e; ++i) { 59e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (RegisteredCommands[i]->Name == Name) 60e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return RegisteredCommands[i]; 61e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 62e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return NULL; 63aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} 64aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 65e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoconst CommandInfo *CommandTraits::getRegisteredCommandInfo( 66e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned CommandID) const { 67e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return RegisteredCommands[CommandID - llvm::array_lengthof(Commands)]; 68aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} 69aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 70aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} // end namespace comments 71aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} // end namespace clang 72aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 73