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