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
4302fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::Input(StringRef InputContent, void *Ctxt)
4402fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik  : IO(Ctxt),
4502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    Strm(new Stream(InputContent, SrcMgr)),
4602fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    CurrentNode(NULL) {
478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DocIterator = Strm->begin();
488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::~Input() {
5102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik
5202fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik}
5302fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik
54ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramererror_code Input::error() {
558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return EC;
568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
58ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Input::setDiagHandler(SourceMgr::DiagHandlerTy Handler, void *Ctxt) {
598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  SrcMgr.setDiagHandler(Handler, Ctxt);
608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::outputting() {
638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::setCurrentDocument() {
67ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (DocIterator != Strm->end()) {
688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Node *N = DocIterator->getRoot();
69ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (isa<NullNode>(N)) {
708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      // Empty files are allowed and ignored
718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ++DocIterator;
728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return setCurrentDocument();
738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
7402fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    TopNode.reset(this->createHNodes(N));
7502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    CurrentNode = TopNode.get();
768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::nextDocument() {
828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ++DocIterator;
838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginMapping() {
86ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
88ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
89ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (MN) {
908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    MN->ValidKeys.clear();
918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
94ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault,
95ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                         void *&SaveInfo) {
968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  UseDefault = false;
97ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
99ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
100ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!MN) {
1018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "not a mapping");
1028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
1038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MN->ValidKeys.push_back(Key);
1058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  HNode *Value = MN->Mapping[Key];
106ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!Value) {
107ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (Required)
1088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      setError(CurrentNode, Twine("missing required key '") + Key + "'");
1098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    else
1108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      UseDefault = true;
111ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return false;
1128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  SaveInfo = CurrentNode;
1148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  CurrentNode = Value;
1158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
1168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightKey(void *saveInfo) {
119ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(saveInfo);
1208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endMapping() {
123ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
125ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
126ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!MN)
1278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
128ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  for (MapHNode::NameToNode::iterator i = MN->Mapping.begin(),
129ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer       End = MN->Mapping.end(); i != End; ++i) {
1309e8eafa0f0ad36c3e4397e97b67b8245b04ba618Dmitri Gribenko    if (!MN->isValidKey(i->first())) {
1319e8eafa0f0ad36c3e4397e97b67b8245b04ba618Dmitri Gribenko      setError(i->second, Twine("unknown key '") + i->first() + "'");
1328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      break;
1338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
1348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginSequence() {
138ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
1398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return SQ->Entries.size();
1408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
1428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
143ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endSequence() {
1458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
146ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightElement(unsigned Index, void *&SaveInfo) {
148ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
150ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
1518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SaveInfo = CurrentNode;
1528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    CurrentNode = SQ->Entries[Index];
1538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
1548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
1568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
157ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightElement(void *SaveInfo) {
159ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
1608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginFlowSequence() {
163ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
1648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return SQ->Entries.size();
1658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
1678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
168ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightFlowElement(unsigned index, void *&SaveInfo) {
170ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
172ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
1738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SaveInfo = CurrentNode;
1748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    CurrentNode = SQ->Entries[index];
1758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
1768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
1788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
179ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightFlowElement(void *SaveInfo) {
181ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
1828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
183ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endFlowSequence() {
1858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginEnumScalar() {
1888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ScalarMatchFound = false;
1898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::matchEnumScalar(const char *Str, bool) {
192ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarMatchFound)
1938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
194ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
195ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (SN->value().equals(Str)) {
1968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ScalarMatchFound = true;
1978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return true;
1988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
1998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
2018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endEnumScalar() {
204ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!ScalarMatchFound) {
2058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "unknown enumerated scalar");
2068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::beginBitSetScalar(bool &DoClear) {
2108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  BitValuesUsed.clear();
211ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    BitValuesUsed.insert(BitValuesUsed.begin(), SQ->Entries.size(), false);
213ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
2148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "expected sequence of bit values");
2158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DoClear = true;
2178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
2188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::bitSetMatch(const char *Str, bool) {
221ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
2228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
223ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    unsigned Index = 0;
225ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (std::vector<HNode *>::iterator i = SQ->Entries.begin(),
226ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer         End = SQ->Entries.end(); i != End; ++i) {
227ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (ScalarHNode *SN = dyn_cast<ScalarHNode>(*i)) {
228ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer        if (SN->value().equals(Str)) {
2298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          BitValuesUsed[Index] = true;
2308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          return true;
2318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        }
232ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      } else {
2338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        setError(CurrentNode, "unexpected scalar in sequence of bit values");
2348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
2358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ++Index;
2368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
237ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
2388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "expected sequence of bit values");
2398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
2418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endBitSetScalar() {
244ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
2458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
246ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    assert(BitValuesUsed.size() == SQ->Entries.size());
248ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (unsigned i = 0; i < SQ->Entries.size(); ++i) {
249ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (!BitValuesUsed[i]) {
2508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        setError(SQ->Entries[i], "unknown bit value");
2518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        return;
2528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
2538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
2548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::scalarString(StringRef &S) {
258ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
2598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    S = SN->value();
260ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
2618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "unexpected scalar");
2628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(HNode *hnode, const Twine &message) {
2668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->setError(hnode->_node, message);
2678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(Node *node, const Twine &message) {
2708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Strm->printError(node, message);
2718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EC = make_error_code(errc::invalid_argument);
2728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikInput::HNode *Input::createHNodes(Node *N) {
275ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<128> StringStorage;
276ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) {
2778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StringRef KeyStr = SN->getValue(StringStorage);
278ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (!StringStorage.empty()) {
2798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      // Copy string to permanent storage
2808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      unsigned Len = StringStorage.size();
28102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik      char *Buf = StringAllocator.Allocate<char>(Len);
2828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      memcpy(Buf, &StringStorage[0], Len);
2838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      KeyStr = StringRef(Buf, Len);
2848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
28502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    return new ScalarHNode(N, KeyStr);
286ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) {
28702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    SequenceHNode *SQHNode = new SequenceHNode(N);
288ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (SequenceNode::iterator i = SQ->begin(), End = SQ->end(); i != End;
289ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer         ++i) {
2908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      HNode *Entry = this->createHNodes(i);
291ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (EC)
2928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        break;
2938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      SQHNode->Entries.push_back(Entry);
2948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
2958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return SQHNode;
296ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) {
29702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    MapHNode *mapHNode = new MapHNode(N);
298ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (MappingNode::iterator i = Map->begin(), End = Map->end(); i != End;
299ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer         ++i) {
300ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      ScalarNode *KeyScalar = dyn_cast<ScalarNode>(i->getKey());
3018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      StringStorage.clear();
302ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      StringRef KeyStr = KeyScalar->getValue(StringStorage);
303ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (!StringStorage.empty()) {
3048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        // Copy string to permanent storage
3058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        unsigned Len = StringStorage.size();
30602fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik        char *Buf = StringAllocator.Allocate<char>(Len);
3078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        memcpy(Buf, &StringStorage[0], Len);
3088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        KeyStr = StringRef(Buf, Len);
3098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
310ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      HNode *ValueHNode = this->createHNodes(i->getValue());
311ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (EC)
3128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        break;
3138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      mapHNode->Mapping[KeyStr] = ValueHNode;
3148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
3158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return mapHNode;
316ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (isa<NullNode>(N)) {
31702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    return new EmptyHNode(N);
318ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
3198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(N, "unknown node kind");
3208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return NULL;
3218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::MapHNode::isValidKey(StringRef Key) {
3256227d5c690504c7ada5780c00a635b282c46e275Craig Topper  for (SmallVectorImpl<const char *>::iterator i = ValidKeys.begin(),
326ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer       End = ValidKeys.end(); i != End; ++i) {
327ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (Key.equals(*i))
3288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return true;
3298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
3318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(const Twine &Message) {
3348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->setError(CurrentNode, Message);
3358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
33702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::MapHNode::~MapHNode() {
33802fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik  for (MapHNode::NameToNode::iterator i = Mapping.begin(), End = Mapping.end();
33902fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik                                                                i != End; ++i) {
34002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    delete i->second;
34102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik  }
34202fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik}
34302fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik
34402fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::SequenceHNode::~SequenceHNode() {
34502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik  for (std::vector<HNode*>::iterator i = Entries.begin(), End = Entries.end();
34602fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik                                                                i != End; ++i) {
34702fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    delete *i;
34802fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik  }
34902fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik}
35002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik
35102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik
35202fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik
3538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
3548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Output
3558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
3568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
357ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerOutput::Output(raw_ostream &yout, void *context)
358ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    : IO(context),
359ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      Out(yout),
360ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      Column(0),
361ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      ColumnAtFlowStart(0),
362ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedBitValueComma(false),
363ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedFlowSequenceComma(false),
364ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      EnumerationMatchFound(false),
365ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedsNewLine(false) {
3668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikOutput::~Output() {
3698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::outputting() {
3728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
3738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginMapping() {
3768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inMapFirstKey);
3778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = true;
3788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endMapping() {
3818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
3828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightKey(const char *Key, bool Required, bool SameAsDefault,
385ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                          bool &UseDefault, void *&) {
3868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  UseDefault = false;
387ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Required || !SameAsDefault) {
3888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->newLineCheck();
3898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->paddedKey(Key);
3908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
3918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
3938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
395ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightKey(void *) {
396ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (StateStack.back() == inMapFirstKey) {
3978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StateStack.pop_back();
3988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StateStack.push_back(inMapOtherKey);
3998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginDocuments() {
4038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine("---");
4048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightDocument(unsigned index) {
407ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (index > 0)
4088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine("\n---");
4098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
4108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::postflightDocument() {
4138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endDocuments() {
4168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("\n...\n");
4178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginSequence() {
4208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inSeq);
4218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = true;
4228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
4238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
424ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
4258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endSequence() {
4268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
4278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
428ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
429ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightElement(unsigned, void *&) {
4308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
4318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
432ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
433ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightElement(void *) {
4348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginFlowSequence() {
4378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inFlowSeq);
43850c30427405142f1b587edee846606184ae6af8eNick Kledzik  this->newLineCheck();
4398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ColumnAtFlowStart = Column;
4408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("[ ");
4418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedFlowSequenceComma = false;
4428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
4438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
444ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
4458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endFlowSequence() {
4468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
4478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine(" ]");
4488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
449ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
450ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightFlowElement(unsigned, void *&) {
451ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (NeedFlowSequenceComma)
4528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(", ");
453ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Column > 70) {
4548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("\n");
455ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (int i = 0; i < ColumnAtFlowStart; ++i)
4568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(" ");
4578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Column = ColumnAtFlowStart;
4588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("  ");
4598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
4618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
462ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
463ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightFlowElement(void *) {
4648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedFlowSequenceComma = true;
4658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginEnumScalar() {
4688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EnumerationMatchFound = false;
4698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::matchEnumScalar(const char *Str, bool Match) {
472ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Match && !EnumerationMatchFound) {
4738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->newLineCheck();
4748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine(Str);
4758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EnumerationMatchFound = true;
4768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
4788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endEnumScalar() {
481ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!EnumerationMatchFound)
4828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm_unreachable("bad runtime enum value");
4838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::beginBitSetScalar(bool &DoClear) {
4868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->newLineCheck();
4878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("[ ");
4888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedBitValueComma = false;
4898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DoClear = false;
4908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
4918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::bitSetMatch(const char *Str, bool Matches) {
494ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Matches) {
495ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (NeedBitValueComma)
4968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(", ");
4978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->output(Str);
4988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    NeedBitValueComma = true;
4998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
5018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endBitSetScalar() {
5048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine(" ]");
5058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::scalarString(StringRef &S) {
5088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->newLineCheck();
5098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  if (S.find('\n') == StringRef::npos) {
5108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    // No embedded new-line chars, just print string.
5118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine(S);
5128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
5138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned i = 0;
5158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned j = 0;
5168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned End = S.size();
5178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("'"); // Starting single quote.
5188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  const char *Base = S.data();
5198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  while (j < End) {
5208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    // Escape a single quote by doubling it.
5218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    if (S[j] == '\'') {
5228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(StringRef(&Base[i], j - i + 1));
5238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output("'");
5248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      i = j + 1;
5258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
5268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    ++j;
5278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(StringRef(&Base[i], j - i));
5298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine("'"); // Ending single quote.
5308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::setError(const Twine &message) {
5338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::output(StringRef s) {
5368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Column += s.size();
5378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Out << s;
5388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputUpToEndOfLine(StringRef s) {
5418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->output(s);
5422b45dd58b22da40bb08e82d1564ccecca4a700f5Richard Smith  if (StateStack.empty() || StateStack.back() != inFlowSeq)
5438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    NeedsNewLine = true;
5448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputNewLine() {
5478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Out << "\n";
5488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Column = 0;
5498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq at top, indent as if map, then add "- "
5528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq in middle, use "- " if firstKey, else use "  "
5538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
5548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::newLineCheck() {
556ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!NeedsNewLine)
5578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
5588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = false;
5598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputNewLine();
5618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  assert(StateStack.size() > 0);
5638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned Indent = StateStack.size() - 1;
5648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  bool OutputDash = false;
5658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
566ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (StateStack.back() == inSeq) {
5678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    OutputDash = true;
568ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if ((StateStack.size() > 1) && (StateStack.back() == inMapFirstKey) &&
569ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer             (StateStack[StateStack.size() - 2] == inSeq)) {
5708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    --Indent;
5718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    OutputDash = true;
5728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
574ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  for (unsigned i = 0; i < Indent; ++i) {
5758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("  ");
5768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
577ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (OutputDash) {
5788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("- ");
5798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::paddedKey(StringRef key) {
5848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(key);
5858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(":");
5868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  const char *spaces = "                ";
587ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (key.size() < strlen(spaces))
5888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(&spaces[key.size()]);
5898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  else
5908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(" ");
5918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
5948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  traits for built-in types
5958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
5968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
597ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<bool>::output(const bool &Val, void *, raw_ostream &Out) {
598ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << (Val ? "true" : "false");
599ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
601ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) {
602ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Scalar.equals("true")) {
603ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    Val = true;
6048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return StringRef();
605ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (Scalar.equals("false")) {
606ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    Val = false;
6078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return StringRef();
6088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
609ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return "invalid boolean";
610ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
612ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<StringRef>::output(const StringRef &Val, void *,
613ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                     raw_ostream &Out) {
614ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
615ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
617ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<StringRef>::input(StringRef Scalar, void *,
618ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                         StringRef &Val) {
619ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = Scalar;
620ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
621ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
623ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint8_t>::output(const uint8_t &Val, void *,
624ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
625ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  // use temp uin32_t because ostream thinks uint8_t is a character
626ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint32_t Num = Val;
627ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Num;
628ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
630ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint8_t>::input(StringRef Scalar, void *, uint8_t &Val) {
631ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
632ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
633ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
634ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFF)
635ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
636ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
637ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
638ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
640ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint16_t>::output(const uint16_t &Val, void *,
641ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
642ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
643ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
645ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint16_t>::input(StringRef Scalar, void *,
646ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint16_t &Val) {
647ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
648ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
649ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
650ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFF)
651ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
652ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
653ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
654ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
656ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint32_t>::output(const uint32_t &Val, void *,
657ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
658ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
659ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
661ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint32_t>::input(StringRef Scalar, void *,
662ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint32_t &Val) {
663ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
664ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
665ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
666ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFFFFFFUL)
667ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
668ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
669ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
670ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
672ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint64_t>::output(const uint64_t &Val, void *,
673ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
674ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
675ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
677ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint64_t>::input(StringRef Scalar, void *,
678ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint64_t &Val) {
679ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long N;
680ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, N))
681ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
682ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
683ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
684ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
686ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int8_t>::output(const int8_t &Val, void *, raw_ostream &Out) {
687ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  // use temp in32_t because ostream thinks int8_t is a character
688ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  int32_t Num = Val;
689ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Num;
690ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
6918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
692ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int8_t>::input(StringRef Scalar, void *, int8_t &Val) {
693ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
694ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
695ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
696ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > 127) || (N < -128))
697ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
698ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
699ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
700ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
702ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int16_t>::output(const int16_t &Val, void *,
703ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
704ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
705ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
707ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int16_t>::input(StringRef Scalar, void *, int16_t &Val) {
708ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
709ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
710ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
711ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > INT16_MAX) || (N < INT16_MIN))
712ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
713ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
714ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
715ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
717ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int32_t>::output(const int32_t &Val, void *,
718ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
719ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
720ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
722ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int32_t>::input(StringRef Scalar, void *, int32_t &Val) {
723ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
724ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
725ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
726ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > INT32_MAX) || (N < INT32_MIN))
727ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
728ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
729ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
730ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
732ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int64_t>::output(const int64_t &Val, void *,
733ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
734ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
735ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
737ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int64_t>::input(StringRef Scalar, void *, int64_t &Val) {
738ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
739ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
740ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
741ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
742ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
743ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
745ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) {
746ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("%g", Val);
747ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
749ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) {
750ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<32> buff(Scalar.begin(), Scalar.end());
751ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  char *end;
752ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = strtod(buff.c_str(), &end);
753ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (*end != '\0')
754ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid floating point number";
755ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
756ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
758ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) {
759ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("%g", Val);
760ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
762ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) {
763ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<32> buff(Scalar.begin(), Scalar.end());
764ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  char *end;
765ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = strtod(buff.c_str(), &end);
766ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (*end != '\0')
767ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid floating point number";
768ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
769ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
771ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) {
772ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint8_t Num = Val;
773ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%02X", Num);
774ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
776ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex8>::input(StringRef Scalar, void *, Hex8 &Val) {
777ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
778ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
779ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex8 number";
780ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFF)
781ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex8 number";
782ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
783ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
784ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
786ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex16>::output(const Hex16 &Val, void *, raw_ostream &Out) {
787ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint16_t Num = Val;
788ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%04X", Num);
789ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
791ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex16>::input(StringRef Scalar, void *, Hex16 &Val) {
792ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
793ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
794ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex16 number";
795ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFF)
796ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex16 number";
797ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
798ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
799ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
801ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex32>::output(const Hex32 &Val, void *, raw_ostream &Out) {
802ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint32_t Num = Val;
803ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%08X", Num);
804ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
806ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex32>::input(StringRef Scalar, void *, Hex32 &Val) {
807ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
808ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
809ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex32 number";
810ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFFFFFFUL)
811ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex32 number";
812ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
813ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
814ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
816ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex64>::output(const Hex64 &Val, void *, raw_ostream &Out) {
817ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint64_t Num = Val;
818ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%016llX", Num);
819ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
821ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex64>::input(StringRef Scalar, void *, Hex64 &Val) {
822ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long Num;
823ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, Num))
824ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex64 number";
825ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = Num;
826ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
827ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
828