YAMLTraits.cpp revision 2b45dd58b22da40bb08e82d1564ccecca4a700f5
18ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===- lib/Support/YAMLTraits.cpp -----------------------------------------===//
28ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
38ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//                             The LLVM Linker
48ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
58ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// This file is distributed under the University of Illinois Open Source
68ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// License. See LICENSE.TXT for details.
78ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
88ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
98ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/YAMLTraits.h"
118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/ADT/Twine.h"
128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/Casting.h"
138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/ErrorHandling.h"
1411b07f66b0633b838d18288141de59feb761f225Benjamin Kramer#include "llvm/Support/Format.h"
158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/YAMLParser.h"
1611b07f66b0633b838d18288141de59feb761f225Benjamin Kramer#include "llvm/Support/raw_ostream.h"
178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include <cstring>
18ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerusing namespace llvm;
19ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerusing namespace yaml;
208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  IO
238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikIO::IO(void *Context) : Ctxt(Context) {
268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikIO::~IO() {
298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid *IO::getContext() {
328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return Ctxt;
338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid IO::setContext(void *Context) {
368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Ctxt = Context;
378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Input
418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
43ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerInput::Input(StringRef InputContent, void *Ctxt) : IO(Ctxt), CurrentNode(NULL) {
448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Strm = new Stream(InputContent, SrcMgr);
458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DocIterator = Strm->begin();
468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
48ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramererror_code Input::error() {
498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return EC;
508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
52ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Input::setDiagHandler(SourceMgr::DiagHandlerTy Handler, void *Ctxt) {
538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  SrcMgr.setDiagHandler(Handler, Ctxt);
548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::outputting() {
578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::setCurrentDocument() {
61ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (DocIterator != Strm->end()) {
628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Node *N = DocIterator->getRoot();
63ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (isa<NullNode>(N)) {
648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      // Empty files are allowed and ignored
658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ++DocIterator;
668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return setCurrentDocument();
678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    CurrentNode = this->createHNodes(N);
698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::nextDocument() {
758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ++DocIterator;
768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginMapping() {
79ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
81ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
82ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (MN) {
838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    MN->ValidKeys.clear();
848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
87ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault,
88ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                         void *&SaveInfo) {
898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  UseDefault = false;
90ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
92ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
93ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!MN) {
948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "not a mapping");
958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MN->ValidKeys.push_back(Key);
988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  HNode *Value = MN->Mapping[Key];
99ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!Value) {
100ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (Required)
1018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      setError(CurrentNode, Twine("missing required key '") + Key + "'");
1028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    else
1038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      UseDefault = true;
104ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return false;
1058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  SaveInfo = CurrentNode;
1078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  CurrentNode = Value;
1088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
1098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightKey(void *saveInfo) {
112ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(saveInfo);
1138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endMapping() {
116ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
118ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
119ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!MN)
1208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
121ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  for (MapHNode::NameToNode::iterator i = MN->Mapping.begin(),
122ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer       End = MN->Mapping.end(); i != End; ++i) {
123ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (!MN->isValidKey(i->first)) {
124ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      setError(i->second, Twine("unknown key '") + i->first + "'");
1258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      break;
1268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
1278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginSequence() {
131ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
1328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return SQ->Entries.size();
1338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
1358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
136ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endSequence() {
1388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
139ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightElement(unsigned Index, void *&SaveInfo) {
141ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
143ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
1448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SaveInfo = CurrentNode;
1458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    CurrentNode = SQ->Entries[Index];
1468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
1478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
1498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
150ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightElement(void *SaveInfo) {
152ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
1538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginFlowSequence() {
156ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
1578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return SQ->Entries.size();
1588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
1608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
161ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightFlowElement(unsigned index, void *&SaveInfo) {
163ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
165ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
1668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SaveInfo = CurrentNode;
1678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    CurrentNode = SQ->Entries[index];
1688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
1698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
1718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
172ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightFlowElement(void *SaveInfo) {
174ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
1758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
176ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endFlowSequence() {
1788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginEnumScalar() {
1818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ScalarMatchFound = false;
1828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::matchEnumScalar(const char *Str, bool) {
185ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarMatchFound)
1868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
187ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
188ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (SN->value().equals(Str)) {
1898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ScalarMatchFound = true;
1908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return true;
1918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
1928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
1948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endEnumScalar() {
197ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!ScalarMatchFound) {
1988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "unknown enumerated scalar");
1998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::beginBitSetScalar(bool &DoClear) {
2038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  BitValuesUsed.clear();
204ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    BitValuesUsed.insert(BitValuesUsed.begin(), SQ->Entries.size(), false);
206ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
2078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "expected sequence of bit values");
2088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DoClear = true;
2108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
2118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::bitSetMatch(const char *Str, bool) {
214ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
2158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
216ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    unsigned Index = 0;
218ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (std::vector<HNode *>::iterator i = SQ->Entries.begin(),
219ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer         End = SQ->Entries.end(); i != End; ++i) {
220ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (ScalarHNode *SN = dyn_cast<ScalarHNode>(*i)) {
221ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer        if (SN->value().equals(Str)) {
2228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          BitValuesUsed[Index] = true;
2238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          return true;
2248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        }
225ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      } else {
2268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        setError(CurrentNode, "unexpected scalar in sequence of bit values");
2278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
2288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ++Index;
2298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
230ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
2318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "expected sequence of bit values");
2328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
2348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endBitSetScalar() {
237ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
2388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
239ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    assert(BitValuesUsed.size() == SQ->Entries.size());
241ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (unsigned i = 0; i < SQ->Entries.size(); ++i) {
242ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (!BitValuesUsed[i]) {
2438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        setError(SQ->Entries[i], "unknown bit value");
2448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        return;
2458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
2468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
2478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::scalarString(StringRef &S) {
251ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
2528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    S = SN->value();
253ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
2548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "unexpected scalar");
2558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(HNode *hnode, const Twine &message) {
2598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->setError(hnode->_node, message);
2608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(Node *node, const Twine &message) {
2638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Strm->printError(node, message);
2648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EC = make_error_code(errc::invalid_argument);
2658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikInput::HNode *Input::createHNodes(Node *N) {
268ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<128> StringStorage;
269ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) {
2708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StringRef KeyStr = SN->getValue(StringStorage);
271ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (!StringStorage.empty()) {
2728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      // Copy string to permanent storage
2738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      unsigned Len = StringStorage.size();
274ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      char *Buf = Allocator.Allocate<char>(Len);
2758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      memcpy(Buf, &StringStorage[0], Len);
2768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      KeyStr = StringRef(Buf, Len);
2778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
2788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return new (Allocator) ScalarHNode(N, KeyStr);
279ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) {
2808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SequenceHNode *SQHNode = new (Allocator) SequenceHNode(N);
281ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (SequenceNode::iterator i = SQ->begin(), End = SQ->end(); i != End;
282ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer         ++i) {
2838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      HNode *Entry = this->createHNodes(i);
284ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (EC)
2858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        break;
2868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      SQHNode->Entries.push_back(Entry);
2878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
2888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return SQHNode;
289ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) {
2908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    MapHNode *mapHNode = new (Allocator) MapHNode(N);
291ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (MappingNode::iterator i = Map->begin(), End = Map->end(); i != End;
292ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer         ++i) {
293ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      ScalarNode *KeyScalar = dyn_cast<ScalarNode>(i->getKey());
2948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      StringStorage.clear();
295ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      StringRef KeyStr = KeyScalar->getValue(StringStorage);
296ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (!StringStorage.empty()) {
2978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        // Copy string to permanent storage
2988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        unsigned Len = StringStorage.size();
299ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer        char *Buf = Allocator.Allocate<char>(Len);
3008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        memcpy(Buf, &StringStorage[0], Len);
3018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        KeyStr = StringRef(Buf, Len);
3028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
303ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      HNode *ValueHNode = this->createHNodes(i->getValue());
304ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (EC)
3058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        break;
3068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      mapHNode->Mapping[KeyStr] = ValueHNode;
3078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
3088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return mapHNode;
309ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (isa<NullNode>(N)) {
3108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return new (Allocator) EmptyHNode(N);
311ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
3128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(N, "unknown node kind");
3138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return NULL;
3148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::MapHNode::isValidKey(StringRef Key) {
318ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  for (SmallVector<const char *, 6>::iterator i = ValidKeys.begin(),
319ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer       End = ValidKeys.end(); i != End; ++i) {
320ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (Key.equals(*i))
3218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return true;
3228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
3248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(const Twine &Message) {
3278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->setError(CurrentNode, Message);
3288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
3318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Output
3328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
3338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
334ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerOutput::Output(raw_ostream &yout, void *context)
335ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    : IO(context),
336ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      Out(yout),
337ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      Column(0),
338ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      ColumnAtFlowStart(0),
339ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedBitValueComma(false),
340ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedFlowSequenceComma(false),
341ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      EnumerationMatchFound(false),
342ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedsNewLine(false) {
3438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikOutput::~Output() {
3468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::outputting() {
3498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
3508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginMapping() {
3538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inMapFirstKey);
3548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = true;
3558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endMapping() {
3588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
3598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightKey(const char *Key, bool Required, bool SameAsDefault,
362ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                          bool &UseDefault, void *&) {
3638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  UseDefault = false;
364ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Required || !SameAsDefault) {
3658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->newLineCheck();
3668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->paddedKey(Key);
3678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
3688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
3708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
372ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightKey(void *) {
373ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (StateStack.back() == inMapFirstKey) {
3748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StateStack.pop_back();
3758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StateStack.push_back(inMapOtherKey);
3768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginDocuments() {
3808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine("---");
3818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightDocument(unsigned index) {
384ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (index > 0)
3858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine("\n---");
3868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
3878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::postflightDocument() {
3908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endDocuments() {
3938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("\n...\n");
3948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginSequence() {
3978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inSeq);
3988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = true;
3998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
4008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
401ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
4028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endSequence() {
4038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
4048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
405ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
406ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightElement(unsigned, void *&) {
4078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
4088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
409ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
410ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightElement(void *) {
4118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginFlowSequence() {
4148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->newLineCheck();
4158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inFlowSeq);
4168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ColumnAtFlowStart = Column;
4178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("[ ");
4188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedFlowSequenceComma = false;
4198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
4208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
421ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
4228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endFlowSequence() {
4238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
4248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine(" ]");
4258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
426ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
427ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightFlowElement(unsigned, void *&) {
428ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (NeedFlowSequenceComma)
4298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(", ");
430ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Column > 70) {
4318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("\n");
432ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (int i = 0; i < ColumnAtFlowStart; ++i)
4338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(" ");
4348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Column = ColumnAtFlowStart;
4358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("  ");
4368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
4388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
439ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
440ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightFlowElement(void *) {
4418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedFlowSequenceComma = true;
4428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginEnumScalar() {
4458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EnumerationMatchFound = false;
4468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::matchEnumScalar(const char *Str, bool Match) {
449ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Match && !EnumerationMatchFound) {
4508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->newLineCheck();
4518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine(Str);
4528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EnumerationMatchFound = true;
4538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
4558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endEnumScalar() {
458ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!EnumerationMatchFound)
4598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm_unreachable("bad runtime enum value");
4608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::beginBitSetScalar(bool &DoClear) {
4638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->newLineCheck();
4648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("[ ");
4658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedBitValueComma = false;
4668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DoClear = false;
4678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
4688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::bitSetMatch(const char *Str, bool Matches) {
471ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Matches) {
472ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (NeedBitValueComma)
4738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(", ");
4748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->output(Str);
4758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    NeedBitValueComma = true;
4768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
4788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endBitSetScalar() {
4818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine(" ]");
4828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::scalarString(StringRef &S) {
4858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->newLineCheck();
4868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  if (S.find('\n') == StringRef::npos) {
4878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    // No embedded new-line chars, just print string.
4888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine(S);
4898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
4908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned i = 0;
4928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned j = 0;
4938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned End = S.size();
4948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("'"); // Starting single quote.
4958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  const char *Base = S.data();
4968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  while (j < End) {
4978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    // Escape a single quote by doubling it.
4988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    if (S[j] == '\'') {
4998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(StringRef(&Base[i], j - i + 1));
5008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output("'");
5018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      i = j + 1;
5028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
5038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    ++j;
5048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(StringRef(&Base[i], j - i));
5068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine("'"); // Ending single quote.
5078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::setError(const Twine &message) {
5108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::output(StringRef s) {
5138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Column += s.size();
5148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Out << s;
5158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputUpToEndOfLine(StringRef s) {
5188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->output(s);
5192b45dd58b22da40bb08e82d1564ccecca4a700f5Richard Smith  if (StateStack.empty() || StateStack.back() != inFlowSeq)
5208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    NeedsNewLine = true;
5218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputNewLine() {
5248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Out << "\n";
5258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Column = 0;
5268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq at top, indent as if map, then add "- "
5298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq in middle, use "- " if firstKey, else use "  "
5308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
5318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::newLineCheck() {
533ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!NeedsNewLine)
5348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
5358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = false;
5368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputNewLine();
5388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  assert(StateStack.size() > 0);
5408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned Indent = StateStack.size() - 1;
5418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  bool OutputDash = false;
5428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
543ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (StateStack.back() == inSeq) {
5448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    OutputDash = true;
545ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if ((StateStack.size() > 1) && (StateStack.back() == inMapFirstKey) &&
546ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer             (StateStack[StateStack.size() - 2] == inSeq)) {
5478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    --Indent;
5488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    OutputDash = true;
5498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
551ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  for (unsigned i = 0; i < Indent; ++i) {
5528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("  ");
5538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
554ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (OutputDash) {
5558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("- ");
5568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::paddedKey(StringRef key) {
5618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(key);
5628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(":");
5638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  const char *spaces = "                ";
564ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (key.size() < strlen(spaces))
5658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(&spaces[key.size()]);
5668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  else
5678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(" ");
5688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
5718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  traits for built-in types
5728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
5738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
574ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<bool>::output(const bool &Val, void *, raw_ostream &Out) {
575ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << (Val ? "true" : "false");
576ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
5778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
578ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) {
579ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Scalar.equals("true")) {
580ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    Val = true;
5818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return StringRef();
582ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (Scalar.equals("false")) {
583ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    Val = false;
5848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return StringRef();
5858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
586ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return "invalid boolean";
587ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
5888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
589ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<StringRef>::output(const StringRef &Val, void *,
590ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                     raw_ostream &Out) {
591ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
592ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
5938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
594ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<StringRef>::input(StringRef Scalar, void *,
595ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                         StringRef &Val) {
596ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = Scalar;
597ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
598ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
5998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
600ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint8_t>::output(const uint8_t &Val, void *,
601ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
602ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  // use temp uin32_t because ostream thinks uint8_t is a character
603ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint32_t Num = Val;
604ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Num;
605ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
607ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint8_t>::input(StringRef Scalar, void *, uint8_t &Val) {
608ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
609ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
610ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
611ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFF)
612ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
613ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
614ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
615ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
617ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint16_t>::output(const uint16_t &Val, void *,
618ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
619ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
620ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
622ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint16_t>::input(StringRef Scalar, void *,
623ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint16_t &Val) {
624ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
625ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
626ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
627ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFF)
628ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
629ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
630ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
631ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
633ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint32_t>::output(const uint32_t &Val, void *,
634ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
635ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
636ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
638ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint32_t>::input(StringRef Scalar, void *,
639ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint32_t &Val) {
640ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
641ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
642ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
643ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFFFFFFUL)
644ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
645ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
646ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
647ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
649ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint64_t>::output(const uint64_t &Val, void *,
650ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
651ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
652ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
654ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint64_t>::input(StringRef Scalar, void *,
655ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint64_t &Val) {
656ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long N;
657ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, N))
658ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
659ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
660ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
661ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
663ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int8_t>::output(const int8_t &Val, void *, raw_ostream &Out) {
664ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  // use temp in32_t because ostream thinks int8_t is a character
665ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  int32_t Num = Val;
666ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Num;
667ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
669ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int8_t>::input(StringRef Scalar, void *, int8_t &Val) {
670ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
671ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
672ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
673ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > 127) || (N < -128))
674ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
675ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
676ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
677ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
679ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int16_t>::output(const int16_t &Val, void *,
680ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
681ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
682ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
684ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int16_t>::input(StringRef Scalar, void *, int16_t &Val) {
685ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
686ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
687ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
688ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > INT16_MAX) || (N < INT16_MIN))
689ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
690ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
691ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
692ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
694ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int32_t>::output(const int32_t &Val, void *,
695ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
696ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
697ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
699ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int32_t>::input(StringRef Scalar, void *, int32_t &Val) {
700ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
701ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
702ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
703ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > INT32_MAX) || (N < INT32_MIN))
704ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
705ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
706ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
707ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
709ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int64_t>::output(const int64_t &Val, void *,
710ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
711ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
712ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
714ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int64_t>::input(StringRef Scalar, void *, int64_t &Val) {
715ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
716ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
717ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
718ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
719ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
720ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
722ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) {
723ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("%g", Val);
724ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
726ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) {
727ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<32> buff(Scalar.begin(), Scalar.end());
728ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  char *end;
729ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = strtod(buff.c_str(), &end);
730ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (*end != '\0')
731ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid floating point number";
732ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
733ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
735ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) {
736ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("%g", Val);
737ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
739ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) {
740ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<32> buff(Scalar.begin(), Scalar.end());
741ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  char *end;
742ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = strtod(buff.c_str(), &end);
743ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (*end != '\0')
744ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid floating point number";
745ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
746ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
748ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) {
749ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint8_t Num = Val;
750ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%02X", Num);
751ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
753ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex8>::input(StringRef Scalar, void *, Hex8 &Val) {
754ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
755ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
756ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex8 number";
757ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFF)
758ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex8 number";
759ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
760ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
761ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
763ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex16>::output(const Hex16 &Val, void *, raw_ostream &Out) {
764ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint16_t Num = Val;
765ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%04X", Num);
766ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
768ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex16>::input(StringRef Scalar, void *, Hex16 &Val) {
769ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
770ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
771ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex16 number";
772ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFF)
773ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex16 number";
774ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
775ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
776ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
778ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex32>::output(const Hex32 &Val, void *, raw_ostream &Out) {
779ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint32_t Num = Val;
780ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%08X", Num);
781ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
783ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex32>::input(StringRef Scalar, void *, Hex32 &Val) {
784ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
785ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
786ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex32 number";
787ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFFFFFFUL)
788ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex32 number";
789ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
790ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
791ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
793ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex64>::output(const Hex64 &Val, void *, raw_ostream &Out) {
794ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint64_t Num = Val;
795ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%016llX", Num);
796ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
798ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex64>::input(StringRef Scalar, void *, Hex64 &Val) {
799ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long Num;
800ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, Num))
801ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex64 number";
802ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = Num;
803ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
804ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
805