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
104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/YAMLTraits.h"
114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/SmallString.h"
128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/ADT/Twine.h"
138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/Casting.h"
144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/Errc.h"
158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/ErrorHandling.h"
1611b07f66b0633b838d18288141de59feb761f225Benjamin Kramer#include "llvm/Support/Format.h"
176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Support/LineIterator.h"
188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/YAMLParser.h"
1911b07f66b0633b838d18288141de59feb761f225Benjamin Kramer#include "llvm/Support/raw_ostream.h"
202e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama#include <cctype>
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <cstring>
22ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerusing namespace llvm;
23ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerusing namespace yaml;
248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  IO
278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikIO::IO(void *Context) : Ctxt(Context) {
308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikIO::~IO() {
338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid *IO::getContext() {
368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return Ctxt;
378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid IO::setContext(void *Context) {
408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Ctxt = Context;
418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Input
458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
476919bec07f9c4ee57a0e99f263b63546b386f22bAlexander KornienkoInput::Input(StringRef InputContent,
486919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko             void *Ctxt,
496919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko             SourceMgr::DiagHandlerTy DiagHandler,
506919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko             void *DiagHandlerCtxt)
51e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama  : IO(Ctxt),
5202fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    Strm(new Stream(InputContent, SrcMgr)),
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CurrentNode(nullptr) {
546919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  if (DiagHandler)
556919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    SrcMgr.setDiagHandler(DiagHandler, DiagHandlerCtxt);
568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DocIterator = Strm->begin();
578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5902fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::~Input() {
6002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik}
6102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik
62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstd::error_code Input::error() { return EC; }
638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
64354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka// Pin the vtables to this file.
65354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid Input::HNode::anchor() {}
66354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid Input::EmptyHNode::anchor() {}
67354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid Input::ScalarHNode::anchor() {}
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid Input::MapHNode::anchor() {}
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid Input::SequenceHNode::anchor() {}
70354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool Input::outputting() {
728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::setCurrentDocument() {
76ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (DocIterator != Strm->end()) {
778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Node *N = DocIterator->getRoot();
786919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    if (!N) {
796919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko      assert(Strm->failed() && "Root is NULL iff parsing failed");
806919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko      EC = make_error_code(errc::invalid_argument);
816919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko      return false;
826919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    }
836919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
84ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (isa<NullNode>(N)) {
858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      // Empty files are allowed and ignored
868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ++DocIterator;
878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return setCurrentDocument();
888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    TopNode = this->createHNodes(N);
9002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik    CurrentNode = TopNode.get();
918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
96c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesbool Input::nextDocument() {
97c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  return ++DocIterator != Strm->end();
988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
99163568698c3bf439fe89833842cf9de7331dfacdNAKAMURA Takumi
1006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarconst Node *Input::getCurrentNode() const {
1016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return CurrentNode ? CurrentNode->_node : nullptr;
1026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1044e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzikbool Input::mapTag(StringRef Tag, bool Default) {
1052b8d813851c19596c6591c54721082217f0ab5efNAKAMURA Takumi  std::string foundTag = CurrentNode->_node->getVerbatimTag();
1064e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  if (foundTag.empty()) {
1074e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    // If no tag found and 'Tag' is the default, say it was found.
1084e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    return Default;
1094e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  }
1104e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  // Return true iff found tag matches supplied tag.
1114e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  return Tag.equals(foundTag);
1124e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik}
1138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginMapping() {
115ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
1176919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  // CurrentNode can be null if the document is empty.
1186919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  MapHNode *MN = dyn_cast_or_null<MapHNode>(CurrentNode);
119ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (MN) {
1208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    MN->ValidKeys.clear();
1218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
124ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault,
125ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                         void *&SaveInfo) {
1268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  UseDefault = false;
127ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
1296919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
1306919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  // CurrentNode is null for empty documents, which is an error in case required
1316919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  // nodes are present.
1326919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  if (!CurrentNode) {
1336919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    if (Required)
1346919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko      EC = make_error_code(errc::invalid_argument);
1356919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko    return false;
1366919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  }
1376919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko
138ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
139ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!MN) {
1408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "not a mapping");
1418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
1428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  MN->ValidKeys.push_back(Key);
14437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  HNode *Value = MN->Mapping[Key].get();
145ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!Value) {
146ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (Required)
1478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      setError(CurrentNode, Twine("missing required key '") + Key + "'");
1488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    else
1498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      UseDefault = true;
150ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return false;
1518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  SaveInfo = CurrentNode;
1538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  CurrentNode = Value;
1548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
1558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightKey(void *saveInfo) {
158ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(saveInfo);
1598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endMapping() {
162ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
1638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
1646919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  // CurrentNode can be null if the document is empty.
1656919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  MapHNode *MN = dyn_cast_or_null<MapHNode>(CurrentNode);
166ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!MN)
1678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  for (const auto &NN : MN->Mapping) {
169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (!MN->isValidKey(NN.first())) {
17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      setError(NN.second.get(), Twine("unknown key '") + NN.first() + "'");
1718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      break;
1728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
1738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
1758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
1766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid Input::beginFlowMapping() { beginMapping(); }
1776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid Input::endFlowMapping() { endMapping(); }
1796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginSequence() {
1814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode))
1828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return SQ->Entries.size();
1834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (isa<EmptyHNode>(CurrentNode))
1844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return 0;
1854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Treat case where there's a scalar "null" value as an empty sequence.
1864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
1874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    if (isNull(SN->value()))
1884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return 0;
1898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
1904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Any other type of HNode is an error.
1914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  setError(CurrentNode, "not a sequence");
1928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
1938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
194ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endSequence() {
1968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
197ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
1988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightElement(unsigned Index, void *&SaveInfo) {
199ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
2008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
201ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SaveInfo = CurrentNode;
20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CurrentNode = SQ->Entries[Index].get();
2048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
2058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
2078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
208ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
2098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightElement(void *SaveInfo) {
210ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
2118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarunsigned Input::beginFlowSequence() { return beginSequence(); }
214ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
2158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightFlowElement(unsigned index, void *&SaveInfo) {
216ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
2178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
218ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    SaveInfo = CurrentNode;
22037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CurrentNode = SQ->Entries[index].get();
2218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
2228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
2248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
225ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
2268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightFlowElement(void *SaveInfo) {
227ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
2288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
229ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
2308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endFlowSequence() {
2318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginEnumScalar() {
2348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ScalarMatchFound = false;
2358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::matchEnumScalar(const char *Str, bool) {
238ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarMatchFound)
2398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
240ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
241ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (SN->value().equals(Str)) {
2428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ScalarMatchFound = true;
2438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return true;
2448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
2458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
2478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
249ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool Input::matchEnumFallback() {
250ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (ScalarMatchFound)
251ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
252ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ScalarMatchFound = true;
253ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return true;
254ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
255ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
2568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endEnumScalar() {
257ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!ScalarMatchFound) {
2588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "unknown enumerated scalar");
2598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::beginBitSetScalar(bool &DoClear) {
2638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  BitValuesUsed.clear();
264ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    BitValuesUsed.insert(BitValuesUsed.begin(), SQ->Entries.size(), false);
266ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
2678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "expected sequence of bit values");
2688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DoClear = true;
2708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
2718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::bitSetMatch(const char *Str, bool) {
274ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
2758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return false;
276ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    unsigned Index = 0;
27837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    for (auto &N : SQ->Entries) {
27937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (ScalarHNode *SN = dyn_cast<ScalarHNode>(N.get())) {
280ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer        if (SN->value().equals(Str)) {
2818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          BitValuesUsed[Index] = true;
2828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik          return true;
2838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        }
284ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      } else {
2858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        setError(CurrentNode, "unexpected scalar in sequence of bit values");
2868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
2878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      ++Index;
2888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
289ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
2908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "expected sequence of bit values");
2918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
2928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
2938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
2948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
2958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endBitSetScalar() {
296ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (EC)
2978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
298ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
2998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    assert(BitValuesUsed.size() == SQ->Entries.size());
300ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (unsigned i = 0; i < SQ->Entries.size(); ++i) {
301ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (!BitValuesUsed[i]) {
30237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        setError(SQ->Entries[i].get(), "unknown bit value");
3038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        return;
3048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
3058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
3068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid Input::scalarString(StringRef &S, bool) {
310ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
3118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    S = SN->value();
312ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
3138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(CurrentNode, "unexpected scalar");
3148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid Input::blockScalarString(StringRef &S) { scalarString(S, false); }
3186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(HNode *hnode, const Twine &message) {
3206919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko  assert(hnode && "HNode must not be NULL");
3218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->setError(hnode->_node, message);
3228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(Node *node, const Twine &message) {
3258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Strm->printError(node, message);
3268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EC = make_error_code(errc::invalid_argument);
3278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
32937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstd::unique_ptr<Input::HNode> Input::createHNodes(Node *N) {
330ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<128> StringStorage;
331ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) {
3328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StringRef KeyStr = SN->getValue(StringStorage);
333ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (!StringStorage.empty()) {
3348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      // Copy string to permanent storage
335f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      KeyStr = StringStorage.str().copy(StringAllocator);
3368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
33737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return llvm::make_unique<ScalarHNode>(N, KeyStr);
3386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  } else if (BlockScalarNode *BSN = dyn_cast<BlockScalarNode>(N)) {
339f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    StringRef ValueCopy = BSN->getValue().copy(StringAllocator);
340f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return llvm::make_unique<ScalarHNode>(N, ValueCopy);
341ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) {
34237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    auto SQHNode = llvm::make_unique<SequenceHNode>(N);
343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    for (Node &SN : *SQ) {
34437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      auto Entry = this->createHNodes(&SN);
345ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (EC)
3468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        break;
34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      SQHNode->Entries.push_back(std::move(Entry));
3488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
34937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return std::move(SQHNode);
350ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) {
35137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    auto mapHNode = llvm::make_unique<MapHNode>(N);
352dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    for (KeyValueNode &KVN : *Map) {
35337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Node *KeyNode = KVN.getKey();
35437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      ScalarNode *KeyScalar = dyn_cast<ScalarNode>(KeyNode);
35537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      if (!KeyScalar) {
35637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        setError(KeyNode, "Map key must be a scalar");
35737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        break;
35837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      }
3598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      StringStorage.clear();
360ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      StringRef KeyStr = KeyScalar->getValue(StringStorage);
361ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (!StringStorage.empty()) {
3628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        // Copy string to permanent storage
363f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        KeyStr = StringStorage.str().copy(StringAllocator);
3648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      }
36537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      auto ValueHNode = this->createHNodes(KVN.getValue());
366ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      if (EC)
3678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik        break;
36837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      mapHNode->Mapping[KeyStr] = std::move(ValueHNode);
3698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
37037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return std::move(mapHNode);
371ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (isa<NullNode>(N)) {
37237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return llvm::make_unique<EmptyHNode>(N);
373ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else {
3748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    setError(N, "unknown node kind");
375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
3768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::MapHNode::isValidKey(StringRef Key) {
380dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  for (const char *K : ValidKeys) {
381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (Key.equals(K))
3828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      return true;
3838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
3848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
3858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(const Twine &Message) {
3888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->setError(CurrentNode, Message);
3898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
3908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
391d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballmanbool Input::canElideEmptySequence() {
392d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  return false;
393d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman}
394d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
3958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
3968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  Output
3978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
3988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
3996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarOutput::Output(raw_ostream &yout, void *context, int WrapColumn)
400ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    : IO(context),
401ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      Out(yout),
4026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      WrapColumn(WrapColumn),
403ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      Column(0),
404ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      ColumnAtFlowStart(0),
4056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      ColumnAtMapFlowStart(0),
406ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedBitValueComma(false),
407ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedFlowSequenceComma(false),
408ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      EnumerationMatchFound(false),
409ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer      NeedsNewLine(false) {
4108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikOutput::~Output() {
4138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool Output::outputting() {
4168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
4178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginMapping() {
4208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inMapFirstKey);
4218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = true;
4228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4244e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzikbool Output::mapTag(StringRef Tag, bool Use) {
4254e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  if (Use) {
426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // If this tag is being written inside a sequence we should write the start
427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // of the sequence before writing the tag, otherwise the tag won't be
428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // attached to the element in the sequence, but rather the sequence itself.
429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    bool SequenceElement =
430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        StateStack.size() > 1 && (StateStack[StateStack.size() - 2] == inSeq ||
431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          StateStack[StateStack.size() - 2] == inFlowSeq);
432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SequenceElement && StateStack.back() == inMapFirstKey) {
433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      this->newLineCheck();
434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    } else {
435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      this->output(" ");
436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
4374e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik    this->output(Tag);
438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SequenceElement) {
439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // If we're writing the tag during the first element of a map, the tag
440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // takes the place of the first element in the sequence.
441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (StateStack.back() == inMapFirstKey) {
442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        StateStack.pop_back();
443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        StateStack.push_back(inMapOtherKey);
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // Tags inside maps in sequences should act as keys in the map from a
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // formatting perspective, so we always want a newline in a sequence.
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      NeedsNewLine = true;
448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
4494e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  }
4504e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik  return Use;
4514e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik}
4524e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik
4538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endMapping() {
4548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
4558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightKey(const char *Key, bool Required, bool SameAsDefault,
458ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                          bool &UseDefault, void *&) {
4598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  UseDefault = false;
460ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Required || !SameAsDefault) {
4616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    auto State = StateStack.back();
4626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (State == inFlowMapFirstKey || State == inFlowMapOtherKey) {
4636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      flowKey(Key);
4646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    } else {
4656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      this->newLineCheck();
4666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      this->paddedKey(Key);
4676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
4688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return true;
4698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
4718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
473ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightKey(void *) {
474ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (StateStack.back() == inMapFirstKey) {
4758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StateStack.pop_back();
4768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    StateStack.push_back(inMapOtherKey);
4776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  } else if (StateStack.back() == inFlowMapFirstKey) {
4786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    StateStack.pop_back();
4796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    StateStack.push_back(inFlowMapOtherKey);
4808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
4818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid Output::beginFlowMapping() {
4846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  StateStack.push_back(inFlowMapFirstKey);
4856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  this->newLineCheck();
4866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ColumnAtMapFlowStart = Column;
4876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  output("{ ");
4886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
4896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid Output::endFlowMapping() {
4916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  StateStack.pop_back();
4926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  this->outputUpToEndOfLine(" }");
4936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
4946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginDocuments() {
4968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine("---");
4978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
4988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
4998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightDocument(unsigned index) {
500ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (index > 0)
5018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine("\n---");
5028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
5038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::postflightDocument() {
5068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endDocuments() {
5098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("\n...\n");
5108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginSequence() {
5138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inSeq);
5148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = true;
5158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
5168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
517ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
5188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endSequence() {
5198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
5208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
521ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
522ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightElement(unsigned, void *&) {
5238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
5248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
525ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
526ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightElement(void *) {
5278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginFlowSequence() {
5308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.push_back(inFlowSeq);
53150c30427405142f1b587edee846606184ae6af8eNick Kledzik  this->newLineCheck();
5328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  ColumnAtFlowStart = Column;
5338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("[ ");
5348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedFlowSequenceComma = false;
5358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return 0;
5368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
537ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
5388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endFlowSequence() {
5398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  StateStack.pop_back();
5408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine(" ]");
5418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
542ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
543ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightFlowElement(unsigned, void *&) {
544ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (NeedFlowSequenceComma)
5458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(", ");
5466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (WrapColumn && Column > WrapColumn) {
5478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("\n");
548ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    for (int i = 0; i < ColumnAtFlowStart; ++i)
5498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(" ");
5508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    Column = ColumnAtFlowStart;
5518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("  ");
5528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
5548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
555ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer
556ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightFlowElement(void *) {
5578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedFlowSequenceComma = true;
5588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginEnumScalar() {
5618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  EnumerationMatchFound = false;
5628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::matchEnumScalar(const char *Str, bool Match) {
565ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Match && !EnumerationMatchFound) {
5668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->newLineCheck();
5678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine(Str);
5688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    EnumerationMatchFound = true;
5698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
5708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
5718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
573ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool Output::matchEnumFallback() {
574ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (EnumerationMatchFound)
575ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return false;
576ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  EnumerationMatchFound = true;
577ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return true;
578ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
579ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
5808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endEnumScalar() {
581ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!EnumerationMatchFound)
5828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    llvm_unreachable("bad runtime enum value");
5838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::beginBitSetScalar(bool &DoClear) {
5868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->newLineCheck();
5878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("[ ");
5888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedBitValueComma = false;
5898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  DoClear = false;
5908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return true;
5918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
5928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
5938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::bitSetMatch(const char *Str, bool Matches) {
594ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Matches) {
595ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    if (NeedBitValueComma)
5968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(", ");
5978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->output(Str);
5988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    NeedBitValueComma = true;
5998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
6008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  return false;
6018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endBitSetScalar() {
6048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine(" ]");
6058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
607dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid Output::scalarString(StringRef &S, bool MustQuote) {
6088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->newLineCheck();
6092e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  if (S.empty()) {
6102e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    // Print '' for the empty string because leaving the field empty is not
6112e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    // allowed.
6122e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    this->outputUpToEndOfLine("''");
6132e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama    return;
6142e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama  }
615dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!MustQuote) {
616dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Only quote if we must.
6178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    this->outputUpToEndOfLine(S);
6188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
6198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
6208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned i = 0;
6218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned j = 0;
6228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned End = S.size();
6238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output("'"); // Starting single quote.
6248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  const char *Base = S.data();
6258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  while (j < End) {
6268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    // Escape a single quote by doubling it.
6278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    if (S[j] == '\'') {
6288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output(StringRef(&Base[i], j - i + 1));
6298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      output("'");
6308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik      i = j + 1;
6318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    }
6328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    ++j;
6338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
6348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(StringRef(&Base[i], j - i));
6358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputUpToEndOfLine("'"); // Ending single quote.
6368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid Output::blockScalarString(StringRef &S) {
6396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!StateStack.empty())
6406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    newLineCheck();
6416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  output(" |");
6426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  outputNewLine();
6436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned Indent = StateStack.empty() ? 1 : StateStack.size();
6456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  auto Buffer = MemoryBuffer::getMemBuffer(S, "", false);
6476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  for (line_iterator Lines(*Buffer, false); !Lines.is_at_end(); ++Lines) {
6486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    for (unsigned I = 0; I < Indent; ++I) {
6496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      output("  ");
6506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
6516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    output(*Lines);
6526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    outputNewLine();
6536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
6546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
6556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::setError(const Twine &message) {
6578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
659d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballmanbool Output::canElideEmptySequence() {
660d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  // Normally, with an optional key/value where the value is an empty sequence,
661d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  // the whole key/value can be not written.  But, that produces wrong yaml
662d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  // if the key/value is the only thing in the map and the map is used in
663d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  // a sequence.  This detects if the this sequence is the first key/value
664d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  // in map that itself is embedded in a sequnce.
665e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama  if (StateStack.size() < 2)
666d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    return true;
667e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama  if (StateStack.back() != inMapFirstKey)
668d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman    return true;
669d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman  return (StateStack[StateStack.size()-2] != inSeq);
670d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman}
671d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman
6728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::output(StringRef s) {
6738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Column += s.size();
6748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Out << s;
6758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputUpToEndOfLine(StringRef s) {
6788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->output(s);
6796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (StateStack.empty() || (StateStack.back() != inFlowSeq &&
6806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                             StateStack.back() != inFlowMapFirstKey &&
6816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                             StateStack.back() != inFlowMapOtherKey))
6828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    NeedsNewLine = true;
6838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputNewLine() {
6868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Out << "\n";
6878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  Column = 0;
6888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
6898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq at top, indent as if map, then add "- "
6918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq in middle, use "- " if firstKey, else use "  "
6928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//
6938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::newLineCheck() {
695ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (!NeedsNewLine)
6968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return;
6978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  NeedsNewLine = false;
6988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
6998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  this->outputNewLine();
7008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  assert(StateStack.size() > 0);
7028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  unsigned Indent = StateStack.size() - 1;
7038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  bool OutputDash = false;
7048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
705ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (StateStack.back() == inSeq) {
7068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    OutputDash = true;
7076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  } else if ((StateStack.size() > 1) && ((StateStack.back() == inMapFirstKey) ||
7086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar             (StateStack.back() == inFlowSeq) ||
7096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar             (StateStack.back() == inFlowMapFirstKey)) &&
710ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer             (StateStack[StateStack.size() - 2] == inSeq)) {
7118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    --Indent;
7128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    OutputDash = true;
7138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
7148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
715ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  for (unsigned i = 0; i < Indent; ++i) {
7168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("  ");
7178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
718ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (OutputDash) {
7198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output("- ");
7208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
7218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
7238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::paddedKey(StringRef key) {
7258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(key);
7268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  output(":");
7278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  const char *spaces = "                ";
728ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (key.size() < strlen(spaces))
7298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(&spaces[key.size()]);
7308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  else
7318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    output(" ");
7328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik}
7338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
7346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid Output::flowKey(StringRef Key) {
7356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (StateStack.back() == inFlowMapOtherKey)
7366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    output(", ");
7376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (WrapColumn && Column > WrapColumn) {
7386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    output("\n");
7396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    for (int I = 0; I < ColumnAtMapFlowStart; ++I)
7406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      output(" ");
7416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Column = ColumnAtMapFlowStart;
7426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    output("  ");
7436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
7446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  output(Key);
7456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  output(": ");
7466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
7476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
7488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
7498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//  traits for built-in types
7508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===//
7518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
752ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<bool>::output(const bool &Val, void *, raw_ostream &Out) {
753ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << (Val ? "true" : "false");
754ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
756ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) {
757ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (Scalar.equals("true")) {
758ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    Val = true;
7598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return StringRef();
760ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  } else if (Scalar.equals("false")) {
761ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    Val = false;
7628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik    return StringRef();
7638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik  }
764ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return "invalid boolean";
765ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
767ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<StringRef>::output(const StringRef &Val, void *,
768ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                     raw_ostream &Out) {
769ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
770ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
772ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<StringRef>::input(StringRef Scalar, void *,
773ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                         StringRef &Val) {
774ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = Scalar;
775ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
776ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
777ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
77836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid ScalarTraits<std::string>::output(const std::string &Val, void *,
77936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                     raw_ostream &Out) {
78036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Out << Val;
78136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
78236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
78336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesStringRef ScalarTraits<std::string>::input(StringRef Scalar, void *,
78436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                         std::string &Val) {
78536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Val = Scalar.str();
78636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return StringRef();
78736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
7888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
789ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint8_t>::output(const uint8_t &Val, void *,
790ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
791ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  // use temp uin32_t because ostream thinks uint8_t is a character
792ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint32_t Num = Val;
793ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Num;
794ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
7958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
796ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint8_t>::input(StringRef Scalar, void *, uint8_t &Val) {
797ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
798ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
799ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
800ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFF)
801ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
802ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
803ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
804ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
806ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint16_t>::output(const uint16_t &Val, void *,
807ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
808ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
809ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
811ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint16_t>::input(StringRef Scalar, void *,
812ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint16_t &Val) {
813ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
814ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
815ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
816ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFF)
817ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
818ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
819ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
820ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
822ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint32_t>::output(const uint32_t &Val, void *,
823ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
824ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
825ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
827ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint32_t>::input(StringRef Scalar, void *,
828ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint32_t &Val) {
829ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
830ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
831ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
832ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFFFFFFUL)
833ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
834ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
835ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
836ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
838ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint64_t>::output(const uint64_t &Val, void *,
839ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                    raw_ostream &Out) {
840ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
841ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
843ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint64_t>::input(StringRef Scalar, void *,
844ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                        uint64_t &Val) {
845ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long N;
846ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, N))
847ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
848ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
849ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
850ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
852ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int8_t>::output(const int8_t &Val, void *, raw_ostream &Out) {
853ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  // use temp in32_t because ostream thinks int8_t is a character
854ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  int32_t Num = Val;
855ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Num;
856ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
858ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int8_t>::input(StringRef Scalar, void *, int8_t &Val) {
859ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
860ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
861ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
862ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > 127) || (N < -128))
863ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
864ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
865ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
866ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
868ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int16_t>::output(const int16_t &Val, void *,
869ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
870ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
871ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
873ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int16_t>::input(StringRef Scalar, void *, int16_t &Val) {
874ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
875ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
876ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
877ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > INT16_MAX) || (N < INT16_MIN))
878ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
879ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
880ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
881ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
883ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int32_t>::output(const int32_t &Val, void *,
884ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
885ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
886ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
888ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int32_t>::input(StringRef Scalar, void *, int32_t &Val) {
889ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
890ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
891ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
892ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if ((N > INT32_MAX) || (N < INT32_MIN))
893ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range number";
894ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
895ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
896ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
8978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
898ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int64_t>::output(const int64_t &Val, void *,
899ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer                                   raw_ostream &Out) {
900ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << Val;
901ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
903ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int64_t>::input(StringRef Scalar, void *, int64_t &Val) {
904ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  long long N;
905ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsSignedInteger(Scalar, 0, N))
906ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid number";
907ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = N;
908ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
909ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
911ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) {
912ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("%g", Val);
913ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
915ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) {
916ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<32> buff(Scalar.begin(), Scalar.end());
917ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  char *end;
918ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = strtod(buff.c_str(), &end);
919ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (*end != '\0')
920ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid floating point number";
921ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
922ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
924ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) {
925ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("%g", Val);
926ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
928ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) {
929ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  SmallString<32> buff(Scalar.begin(), Scalar.end());
930ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  char *end;
931ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = strtod(buff.c_str(), &end);
932ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (*end != '\0')
933ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid floating point number";
934ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
935ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
937ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) {
938ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint8_t Num = Val;
939ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%02X", Num);
940ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
942ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex8>::input(StringRef Scalar, void *, Hex8 &Val) {
943ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
944ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
945ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex8 number";
946ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFF)
947ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex8 number";
948ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
949ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
950ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
952ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex16>::output(const Hex16 &Val, void *, raw_ostream &Out) {
953ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint16_t Num = Val;
954ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%04X", Num);
955ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
957ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex16>::input(StringRef Scalar, void *, Hex16 &Val) {
958ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
959ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
960ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex16 number";
961ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFF)
962ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex16 number";
963ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
964ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
965ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
967ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex32>::output(const Hex32 &Val, void *, raw_ostream &Out) {
968ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint32_t Num = Val;
969ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%08X", Num);
970ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
972ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex32>::input(StringRef Scalar, void *, Hex32 &Val) {
973ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long n;
974ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, n))
975ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex32 number";
976ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (n > 0xFFFFFFFFUL)
977ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "out of range hex32 number";
978ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = n;
979ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
980ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
982ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex64>::output(const Hex64 &Val, void *, raw_ostream &Out) {
983ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  uint64_t Num = Val;
984ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Out << format("0x%016llX", Num);
985ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
9868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik
987ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex64>::input(StringRef Scalar, void *, Hex64 &Val) {
988ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  unsigned long long Num;
989ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  if (getAsUnsignedInteger(Scalar, 0, Num))
990ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer    return "invalid hex64 number";
991ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  Val = Num;
992ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer  return StringRef();
993ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer}
994