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" 178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik#include "llvm/Support/YAMLParser.h" 1811b07f66b0633b838d18288141de59feb761f225Benjamin Kramer#include "llvm/Support/raw_ostream.h" 192e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama#include <cctype> 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <cstring> 21ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerusing namespace llvm; 22ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerusing namespace yaml; 238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// IO 268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikIO::IO(void *Context) : Ctxt(Context) { 298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikIO::~IO() { 328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid *IO::getContext() { 358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return Ctxt; 368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid IO::setContext(void *Context) { 398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Ctxt = Context; 408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Input 448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 466919bec07f9c4ee57a0e99f263b63546b386f22bAlexander KornienkoInput::Input(StringRef InputContent, 476919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko void *Ctxt, 486919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko SourceMgr::DiagHandlerTy DiagHandler, 496919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko void *DiagHandlerCtxt) 50e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama : IO(Ctxt), 5102fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik Strm(new Stream(InputContent, SrcMgr)), 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CurrentNode(nullptr) { 536919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko if (DiagHandler) 546919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko SrcMgr.setDiagHandler(DiagHandler, DiagHandlerCtxt); 558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DocIterator = Strm->begin(); 568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5802fa38344c1cf1f27d59da5c3358d19bbb752f01Nick KledzikInput::~Input() { 5902fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik} 6002fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik 61c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesstd::error_code Input::error() { return EC; } 628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 63354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka// Pin the vtables to this file. 64354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid Input::HNode::anchor() {} 65354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid Input::EmptyHNode::anchor() {} 66354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid Input::ScalarHNode::anchor() {} 6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid Input::MapHNode::anchor() {} 6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid Input::SequenceHNode::anchor() {} 69354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool Input::outputting() { 718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::setCurrentDocument() { 75ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (DocIterator != Strm->end()) { 768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Node *N = DocIterator->getRoot(); 776919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko if (!N) { 786919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko assert(Strm->failed() && "Root is NULL iff parsing failed"); 796919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko EC = make_error_code(errc::invalid_argument); 806919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko return false; 816919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko } 826919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko 83ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (isa<NullNode>(N)) { 848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Empty files are allowed and ignored 858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++DocIterator; 868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return setCurrentDocument(); 878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 8837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines TopNode = this->createHNodes(N); 8902fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik CurrentNode = TopNode.get(); 908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 928ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 95c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesbool Input::nextDocument() { 96c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return ++DocIterator != Strm->end(); 978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 98163568698c3bf439fe89833842cf9de7331dfacdNAKAMURA Takumi 994e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzikbool Input::mapTag(StringRef Tag, bool Default) { 1002b8d813851c19596c6591c54721082217f0ab5efNAKAMURA Takumi std::string foundTag = CurrentNode->_node->getVerbatimTag(); 1014e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik if (foundTag.empty()) { 1024e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik // If no tag found and 'Tag' is the default, say it was found. 1034e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik return Default; 1044e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik } 1054e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik // Return true iff found tag matches supplied tag. 1064e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik return Tag.equals(foundTag); 1074e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik} 1088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginMapping() { 110ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 1126919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko // CurrentNode can be null if the document is empty. 1136919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko MapHNode *MN = dyn_cast_or_null<MapHNode>(CurrentNode); 114ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (MN) { 1158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik MN->ValidKeys.clear(); 1168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 119ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault, 120ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer void *&SaveInfo) { 1218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = false; 122ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1246919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko 1256919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko // CurrentNode is null for empty documents, which is an error in case required 1266919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko // nodes are present. 1276919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko if (!CurrentNode) { 1286919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko if (Required) 1296919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko EC = make_error_code(errc::invalid_argument); 1306919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko return false; 1316919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko } 1326919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko 133ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer MapHNode *MN = dyn_cast<MapHNode>(CurrentNode); 134ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!MN) { 1358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "not a mapping"); 1368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik MN->ValidKeys.push_back(Key); 13937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HNode *Value = MN->Mapping[Key].get(); 140ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!Value) { 141ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Required) 1428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, Twine("missing required key '") + Key + "'"); 1438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik else 1448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = true; 145ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return false; 1468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 1488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik CurrentNode = Value; 1498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightKey(void *saveInfo) { 153ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(saveInfo); 1548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endMapping() { 157ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 1596919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko // CurrentNode can be null if the document is empty. 1606919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko MapHNode *MN = dyn_cast_or_null<MapHNode>(CurrentNode); 161ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!MN) 1628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (const auto &NN : MN->Mapping) { 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MN->isValidKey(NN.first())) { 16537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines setError(NN.second.get(), Twine("unknown key '") + NN.first() + "'"); 1668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 1678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 1708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 1718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Input::beginSequence() { 1724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) 1738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return SQ->Entries.size(); 1744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (isa<EmptyHNode>(CurrentNode)) 1754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return 0; 1764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Treat case where there's a scalar "null" value as an empty sequence. 1774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) { 1784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (isNull(SN->value())) 1794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return 0; 1808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Any other type of HNode is an error. 1824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar setError(CurrentNode, "not a sequence"); 1838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 1848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 185ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endSequence() { 1878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 188ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 1898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightElement(unsigned Index, void *&SaveInfo) { 190ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 1918ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 192ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 1938ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 19437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurrentNode = SQ->Entries[Index].get(); 1958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 1968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 1978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 1988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 199ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 2008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightElement(void *SaveInfo) { 201ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(SaveInfo); 2028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarunsigned Input::beginFlowSequence() { return beginSequence(); } 205ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 2068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::preflightFlowElement(unsigned index, void *&SaveInfo) { 207ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 209ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik SaveInfo = CurrentNode; 21137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CurrentNode = SQ->Entries[index].get(); 2128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 2138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 2158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 216ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 2178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::postflightFlowElement(void *SaveInfo) { 218ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer CurrentNode = reinterpret_cast<HNode *>(SaveInfo); 2198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 220ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 2218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endFlowSequence() { 2228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::beginEnumScalar() { 2258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ScalarMatchFound = false; 2268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::matchEnumScalar(const char *Str, bool) { 229ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarMatchFound) 2308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 231ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) { 232ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SN->value().equals(Str)) { 2338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ScalarMatchFound = true; 2348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 2358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 2388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 240ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool Input::matchEnumFallback() { 241ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (ScalarMatchFound) 242ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return false; 243ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ScalarMatchFound = true; 244ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return true; 245ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 246ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 2478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endEnumScalar() { 248ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!ScalarMatchFound) { 2498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unknown enumerated scalar"); 2508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::beginBitSetScalar(bool &DoClear) { 2548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed.clear(); 255ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed.insert(BitValuesUsed.begin(), SQ->Entries.size(), false); 257ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "expected sequence of bit values"); 2598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DoClear = true; 2618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 2628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::bitSetMatch(const char *Str, bool) { 265ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 267ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Index = 0; 26937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines for (auto &N : SQ->Entries) { 27037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (ScalarHNode *SN = dyn_cast<ScalarHNode>(N.get())) { 271ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SN->value().equals(Str)) { 2728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik BitValuesUsed[Index] = true; 2738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 2748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 275ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unexpected scalar in sequence of bit values"); 2778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++Index; 2798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 280ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 2818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "expected sequence of bit values"); 2828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 2848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 2868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::endBitSetScalar() { 287ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 2888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 289ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) { 2908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik assert(BitValuesUsed.size() == SQ->Entries.size()); 291ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (unsigned i = 0; i < SQ->Entries.size(); ++i) { 292ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!BitValuesUsed[i]) { 29337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines setError(SQ->Entries[i].get(), "unknown bit value"); 2948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 2958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2978ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 2988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 2998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 300dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid Input::scalarString(StringRef &S, bool) { 301ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) { 3028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik S = SN->value(); 303ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 3048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(CurrentNode, "unexpected scalar"); 3058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(HNode *hnode, const Twine &message) { 3096919bec07f9c4ee57a0e99f263b63546b386f22bAlexander Kornienko assert(hnode && "HNode must not be NULL"); 3108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->setError(hnode->_node, message); 3118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(Node *node, const Twine &message) { 3148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Strm->printError(node, message); 3158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EC = make_error_code(errc::invalid_argument); 3168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 31837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstd::unique_ptr<Input::HNode> Input::createHNodes(Node *N) { 319ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<128> StringStorage; 320ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) { 3218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StringRef KeyStr = SN->getValue(StringStorage); 322ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!StringStorage.empty()) { 3238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Copy string to permanent storage 3248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Len = StringStorage.size(); 32502fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik char *Buf = StringAllocator.Allocate<char>(Len); 3268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik memcpy(Buf, &StringStorage[0], Len); 3278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik KeyStr = StringRef(Buf, Len); 3288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 32937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return llvm::make_unique<ScalarHNode>(N, KeyStr); 330ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) { 33137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines auto SQHNode = llvm::make_unique<SequenceHNode>(N); 332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (Node &SN : *SQ) { 33337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines auto Entry = this->createHNodes(&SN); 334ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 3358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 33637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SQHNode->Entries.push_back(std::move(Entry)); 3378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 33837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return std::move(SQHNode); 339ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) { 34037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines auto mapHNode = llvm::make_unique<MapHNode>(N); 341dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (KeyValueNode &KVN : *Map) { 34237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines Node *KeyNode = KVN.getKey(); 34337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ScalarNode *KeyScalar = dyn_cast<ScalarNode>(KeyNode); 34437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!KeyScalar) { 34537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines setError(KeyNode, "Map key must be a scalar"); 34637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines break; 34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 3488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StringStorage.clear(); 349ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer StringRef KeyStr = KeyScalar->getValue(StringStorage); 350ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!StringStorage.empty()) { 3518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Copy string to permanent storage 3528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Len = StringStorage.size(); 35302fa38344c1cf1f27d59da5c3358d19bbb752f01Nick Kledzik char *Buf = StringAllocator.Allocate<char>(Len); 3548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik memcpy(Buf, &StringStorage[0], Len); 3558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik KeyStr = StringRef(Buf, Len); 3568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 35737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines auto ValueHNode = this->createHNodes(KVN.getValue()); 358ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (EC) 3598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik break; 36037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines mapHNode->Mapping[KeyStr] = std::move(ValueHNode); 3618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 36237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return std::move(mapHNode); 363ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (isa<NullNode>(N)) { 36437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return llvm::make_unique<EmptyHNode>(N); 365ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else { 3668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik setError(N, "unknown node kind"); 367dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 3688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Input::MapHNode::isValidKey(StringRef Key) { 372dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (const char *K : ValidKeys) { 373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Key.equals(K)) 3748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 3758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 3768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 3778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 3798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Input::setError(const Twine &Message) { 3808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->setError(CurrentNode, Message); 3818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 3828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 383d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballmanbool Input::canElideEmptySequence() { 384d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman return false; 385d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman} 386d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman 3878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 3888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// Output 3898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 3908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 391ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerOutput::Output(raw_ostream &yout, void *context) 392ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer : IO(context), 393ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out(yout), 394ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Column(0), 395ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer ColumnAtFlowStart(0), 396ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedBitValueComma(false), 397ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedFlowSequenceComma(false), 398ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer EnumerationMatchFound(false), 399ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer NeedsNewLine(false) { 4008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick KledzikOutput::~Output() { 4038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool Output::outputting() { 4068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginMapping() { 4108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inMapFirstKey); 4118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 4128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4144e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzikbool Output::mapTag(StringRef Tag, bool Use) { 4154e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik if (Use) { 4164e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik this->output(" "); 4174e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik this->output(Tag); 4184e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik } 4194e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik return Use; 4204e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik} 4214e7c22a90b28828e4a28751b65ae24091f7df4ecNick Kledzik 4228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endMapping() { 4238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 4248ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightKey(const char *Key, bool Required, bool SameAsDefault, 427ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer bool &UseDefault, void *&) { 4288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik UseDefault = false; 429ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Required || !SameAsDefault) { 4308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 4318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->paddedKey(Key); 4328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 4358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 437ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightKey(void *) { 438ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (StateStack.back() == inMapFirstKey) { 4398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 4408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inMapOtherKey); 4418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 4428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginDocuments() { 4458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("---"); 4468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::preflightDocument(unsigned index) { 449ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (index > 0) 4508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("\n---"); 4518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::postflightDocument() { 4558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endDocuments() { 4588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("\n...\n"); 4598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginSequence() { 4628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inSeq); 4638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 4648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 4658ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 466ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 4678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endSequence() { 4688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 4698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 470ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 471ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightElement(unsigned, void *&) { 4728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 4738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 474ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 475ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightElement(void *) { 4768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 4778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 4788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikunsigned Output::beginFlowSequence() { 4798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.push_back(inFlowSeq); 48050c30427405142f1b587edee846606184ae6af8eNick Kledzik this->newLineCheck(); 4818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ColumnAtFlowStart = Column; 4828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("[ "); 4838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedFlowSequenceComma = false; 4848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return 0; 4858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 486ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 4878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endFlowSequence() { 4888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik StateStack.pop_back(); 4898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(" ]"); 4908ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 491ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 492ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramerbool Output::preflightFlowElement(unsigned, void *&) { 493ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (NeedFlowSequenceComma) 4948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(", "); 495ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Column > 70) { 4968ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("\n"); 497ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (int i = 0; i < ColumnAtFlowStart; ++i) 4988ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 4998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column = ColumnAtFlowStart; 5008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 5018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5028ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 5038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 504ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer 505ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid Output::postflightFlowElement(void *) { 5068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedFlowSequenceComma = true; 5078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::beginEnumScalar() { 5108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EnumerationMatchFound = false; 5118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::matchEnumScalar(const char *Str, bool Match) { 514ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Match && !EnumerationMatchFound) { 5158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 5168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(Str); 5178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik EnumerationMatchFound = true; 5188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 5208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 522ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool Output::matchEnumFallback() { 523ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (EnumerationMatchFound) 524ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return false; 525ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines EnumerationMatchFound = true; 526ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return true; 527ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 528ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 5298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endEnumScalar() { 530ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!EnumerationMatchFound) 5318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik llvm_unreachable("bad runtime enum value"); 5328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::beginBitSetScalar(bool &DoClear) { 5358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 5368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("[ "); 5378ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedBitValueComma = false; 5388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik DoClear = false; 5398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return true; 5408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5428ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikbool Output::bitSetMatch(const char *Str, bool Matches) { 543ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Matches) { 544ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (NeedBitValueComma) 5458ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(", "); 5468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->output(Str); 5478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedBitValueComma = true; 5488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return false; 5508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::endBitSetScalar() { 5538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(" ]"); 5548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 556dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid Output::scalarString(StringRef &S, bool MustQuote) { 5578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->newLineCheck(); 5582e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama if (S.empty()) { 5592e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama // Print '' for the empty string because leaving the field empty is not 5602e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama // allowed. 5612e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama this->outputUpToEndOfLine("''"); 5622e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama return; 5632e942d5402ddfadb04853a6f9dab2128af7a1d5eRui Ueyama } 564dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MustQuote) { 565dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Only quote if we must. 5668ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine(S); 5678ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 5688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned i = 0; 5708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned j = 0; 5718ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned End = S.size(); 5728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("'"); // Starting single quote. 5738ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik const char *Base = S.data(); 5748ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik while (j < End) { 5758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik // Escape a single quote by doubling it. 5768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik if (S[j] == '\'') { 5778ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(StringRef(&Base[i], j - i + 1)); 5788ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("'"); 5798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik i = j + 1; 5808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5818ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik ++j; 5828ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 5838ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(StringRef(&Base[i], j - i)); 5848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputUpToEndOfLine("'"); // Ending single quote. 5858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5868ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 5878ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::setError(const Twine &message) { 5888ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 5898ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 590d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballmanbool Output::canElideEmptySequence() { 591d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman // Normally, with an optional key/value where the value is an empty sequence, 592d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman // the whole key/value can be not written. But, that produces wrong yaml 593d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman // if the key/value is the only thing in the map and the map is used in 594d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman // a sequence. This detects if the this sequence is the first key/value 595d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman // in map that itself is embedded in a sequnce. 596e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama if (StateStack.size() < 2) 597d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman return true; 598e9cf283e081cb68f0276aa4b893f290b9c26a0c7Rui Ueyama if (StateStack.back() != inMapFirstKey) 599d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman return true; 600d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman return (StateStack[StateStack.size()-2] != inSeq); 601d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman} 602d5f33aa33fbf865e15a3dced11b847e88f6a8239Aaron Ballman 6038ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::output(StringRef s) { 6048ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column += s.size(); 6058ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Out << s; 6068ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 6078ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputUpToEndOfLine(StringRef s) { 6098ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->output(s); 6102b45dd58b22da40bb08e82d1564ccecca4a700f5Richard Smith if (StateStack.empty() || StateStack.back() != inFlowSeq) 6118ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = true; 6128ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 6138ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6148ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::outputNewLine() { 6158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Out << "\n"; 6168ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik Column = 0; 6178ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 6188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6198ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq at top, indent as if map, then add "- " 6208ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// if seq in middle, use "- " if firstKey, else use " " 6218ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// 6228ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::newLineCheck() { 624ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (!NeedsNewLine) 6258ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return; 6268ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik NeedsNewLine = false; 6278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6288ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik this->outputNewLine(); 6298ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6308ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik assert(StateStack.size() > 0); 6318ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik unsigned Indent = StateStack.size() - 1; 6328ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik bool OutputDash = false; 6338ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 634ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (StateStack.back() == inSeq) { 6358ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik OutputDash = true; 636ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if ((StateStack.size() > 1) && (StateStack.back() == inMapFirstKey) && 637ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer (StateStack[StateStack.size() - 2] == inSeq)) { 6388ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik --Indent; 6398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik OutputDash = true; 6408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 6418ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 642ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer for (unsigned i = 0; i < Indent; ++i) { 6438ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 6448ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 645ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (OutputDash) { 6468ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output("- "); 6478ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 6488ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 6508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6518ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzikvoid Output::paddedKey(StringRef key) { 6528ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(key); 6538ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(":"); 6548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik const char *spaces = " "; 655ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (key.size() < strlen(spaces)) 6568ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(&spaces[key.size()]); 6578ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik else 6588ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik output(" "); 6598ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik} 6608ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 6618ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 6628ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik// traits for built-in types 6638ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik//===----------------------------------------------------------------------===// 6648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 665ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<bool>::output(const bool &Val, void *, raw_ostream &Out) { 666ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << (Val ? "true" : "false"); 667ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6688ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 669ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) { 670ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (Scalar.equals("true")) { 671ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = true; 6728ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return StringRef(); 673ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer } else if (Scalar.equals("false")) { 674ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = false; 6758ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik return StringRef(); 6768ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik } 677ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid boolean"; 678ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 680ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<StringRef>::output(const StringRef &Val, void *, 681ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 682ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 683ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 6848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 685ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<StringRef>::input(StringRef Scalar, void *, 686ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer StringRef &Val) { 687ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = Scalar; 688ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 689ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 690ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 69136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid ScalarTraits<std::string>::output(const std::string &Val, void *, 69236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &Out) { 69336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Out << Val; 69436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 69536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 69636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesStringRef ScalarTraits<std::string>::input(StringRef Scalar, void *, 69736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string &Val) { 69836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Val = Scalar.str(); 69936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return StringRef(); 70036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 7018ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 702ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint8_t>::output(const uint8_t &Val, void *, 703ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 704ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer // use temp uin32_t because ostream thinks uint8_t is a character 705ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t Num = Val; 706ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Num; 707ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7088ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 709ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint8_t>::input(StringRef Scalar, void *, uint8_t &Val) { 710ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 711ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 712ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 713ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFF) 714ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 715ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 716ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 717ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7188ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 719ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint16_t>::output(const uint16_t &Val, void *, 720ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 721ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 722ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 724ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint16_t>::input(StringRef Scalar, void *, 725ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint16_t &Val) { 726ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 727ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 728ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 729ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFF) 730ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 731ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 732ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 733ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7348ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 735ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint32_t>::output(const uint32_t &Val, void *, 736ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 737ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 738ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7398ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 740ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint32_t>::input(StringRef Scalar, void *, 741ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t &Val) { 742ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 743ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 744ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 745ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFFFFFFUL) 746ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 747ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 748ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 749ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7508ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 751ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<uint64_t>::output(const uint64_t &Val, void *, 752ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 753ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 754ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7558ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 756ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<uint64_t>::input(StringRef Scalar, void *, 757ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint64_t &Val) { 758ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long N; 759ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, N)) 760ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 761ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 762ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 763ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 765ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int8_t>::output(const int8_t &Val, void *, raw_ostream &Out) { 766ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer // use temp in32_t because ostream thinks int8_t is a character 767ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer int32_t Num = Val; 768ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Num; 769ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7708ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 771ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int8_t>::input(StringRef Scalar, void *, int8_t &Val) { 772ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 773ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 774ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 775ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > 127) || (N < -128)) 776ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 777ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 778ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 779ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7808ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 781ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int16_t>::output(const int16_t &Val, void *, 782ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 783ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 784ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7858ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 786ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int16_t>::input(StringRef Scalar, void *, int16_t &Val) { 787ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 788ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 789ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 790ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > INT16_MAX) || (N < INT16_MIN)) 791ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 792ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 793ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 794ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 7958ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 796ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int32_t>::output(const int32_t &Val, void *, 797ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 798ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 799ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8008ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 801ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int32_t>::input(StringRef Scalar, void *, int32_t &Val) { 802ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 803ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 804ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 805ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if ((N > INT32_MAX) || (N < INT32_MIN)) 806ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range number"; 807ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 808ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 809ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8108ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 811ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<int64_t>::output(const int64_t &Val, void *, 812ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer raw_ostream &Out) { 813ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << Val; 814ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8158ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 816ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<int64_t>::input(StringRef Scalar, void *, int64_t &Val) { 817ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer long long N; 818ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsSignedInteger(Scalar, 0, N)) 819ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid number"; 820ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = N; 821ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 822ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8238ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 824ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) { 825ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("%g", Val); 826ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8278ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 828ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) { 829ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<32> buff(Scalar.begin(), Scalar.end()); 830ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer char *end; 831ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = strtod(buff.c_str(), &end); 832ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (*end != '\0') 833ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid floating point number"; 834ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 835ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8368ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 837ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) { 838ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("%g", Val); 839ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8408ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 841ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) { 842ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer SmallString<32> buff(Scalar.begin(), Scalar.end()); 843ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer char *end; 844ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = strtod(buff.c_str(), &end); 845ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (*end != '\0') 846ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid floating point number"; 847ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 848ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8498ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 850ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) { 851ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint8_t Num = Val; 852ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%02X", Num); 853ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8548ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 855ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex8>::input(StringRef Scalar, void *, Hex8 &Val) { 856ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 857ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 858ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex8 number"; 859ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFF) 860ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex8 number"; 861ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 862ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 863ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8648ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 865ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex16>::output(const Hex16 &Val, void *, raw_ostream &Out) { 866ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint16_t Num = Val; 867ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%04X", Num); 868ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8698ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 870ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex16>::input(StringRef Scalar, void *, Hex16 &Val) { 871ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 872ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 873ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex16 number"; 874ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFF) 875ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex16 number"; 876ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 877ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 878ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8798ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 880ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex32>::output(const Hex32 &Val, void *, raw_ostream &Out) { 881ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint32_t Num = Val; 882ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%08X", Num); 883ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8848ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 885ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex32>::input(StringRef Scalar, void *, Hex32 &Val) { 886ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long n; 887ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, n)) 888ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex32 number"; 889ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (n > 0xFFFFFFFFUL) 890ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "out of range hex32 number"; 891ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = n; 892ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 893ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8948ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 895ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramervoid ScalarTraits<Hex64>::output(const Hex64 &Val, void *, raw_ostream &Out) { 896ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer uint64_t Num = Val; 897ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Out << format("0x%016llX", Num); 898ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 8998ceb8b764f266ff00a590c88a7ecc654b13a8f0bNick Kledzik 900ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin KramerStringRef ScalarTraits<Hex64>::input(StringRef Scalar, void *, Hex64 &Val) { 901ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer unsigned long long Num; 902ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer if (getAsUnsignedInteger(Scalar, 0, Num)) 903ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return "invalid hex64 number"; 904ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer Val = Num; 905ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer return StringRef(); 906ae3ce26f995f4747516a756f73d152c7188ff43bBenjamin Kramer} 907