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