void MappingNode::getValue (const std::string &key, std::string *v) { ScalarNode *node = (ScalarNode*)getValue(key); if (!node) return; *v = node->getValue(); }
void MappingNode::getValue (const std::string &key, int *i) { ScalarNode *node = (ScalarNode*)getValue(key); if (!node) return; const std::string &v = node->getValue(); *i = atoi(v.c_str()); }
void MappingNode::getValue (const std::string &key, bool *b) { ScalarNode *node = (ScalarNode*)getValue(key); if (!node) return; const std::string &v = node->getValue(); *b = v == "true"; }
std::unique_ptr<Input::HNode> Input::createHNodes(Node *N) { SmallString<128> StringStorage; if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) { StringRef KeyStr = SN->getValue(StringStorage); if (!StringStorage.empty()) { // Copy string to permanent storage KeyStr = StringStorage.str().copy(StringAllocator); } return llvm::make_unique<ScalarHNode>(N, KeyStr); } else if (BlockScalarNode *BSN = dyn_cast<BlockScalarNode>(N)) { StringRef ValueCopy = BSN->getValue().copy(StringAllocator); return llvm::make_unique<ScalarHNode>(N, ValueCopy); } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) { auto SQHNode = llvm::make_unique<SequenceHNode>(N); for (Node &SN : *SQ) { auto Entry = createHNodes(&SN); if (EC) break; SQHNode->Entries.push_back(std::move(Entry)); } return std::move(SQHNode); } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) { auto mapHNode = llvm::make_unique<MapHNode>(N); for (KeyValueNode &KVN : *Map) { Node *KeyNode = KVN.getKey(); ScalarNode *Key = dyn_cast<ScalarNode>(KeyNode); Node *Value = KVN.getValue(); if (!Key || !Value) { if (!Key) setError(KeyNode, "Map key must be a scalar"); if (!Value) setError(KeyNode, "Map value must not be empty"); break; } StringStorage.clear(); StringRef KeyStr = Key->getValue(StringStorage); if (!StringStorage.empty()) { // Copy string to permanent storage KeyStr = StringStorage.str().copy(StringAllocator); } auto ValueHNode = createHNodes(Value); if (EC) break; mapHNode->Mapping[KeyStr] = std::move(ValueHNode); } return std::move(mapHNode); } else if (isa<NullNode>(N)) { return llvm::make_unique<EmptyHNode>(N); } else { setError(N, "unknown node kind"); return nullptr; } }
Input::HNode *Input::createHNodes(Node *N) { SmallString<128> StringStorage; if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) { StringRef KeyStr = SN->getValue(StringStorage); if (!StringStorage.empty()) { // Copy string to permanent storage unsigned Len = StringStorage.size(); char *Buf = StringAllocator.Allocate<char>(Len); memcpy(Buf, &StringStorage[0], Len); KeyStr = StringRef(Buf, Len); } return new ScalarHNode(N, KeyStr); } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) { SequenceHNode *SQHNode = new SequenceHNode(N); for (Node &SN : *SQ) { HNode *Entry = this->createHNodes(&SN); if (EC) break; SQHNode->Entries.push_back(Entry); } return SQHNode; } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) { MapHNode *mapHNode = new MapHNode(N); for (KeyValueNode &KVN : *Map) { Node *KeyNode = KVN.getKey(); ScalarNode *KeyScalar = dyn_cast<ScalarNode>(KeyNode); if (!KeyScalar) { setError(KeyNode, "Map key must be a scalar"); break; } StringStorage.clear(); StringRef KeyStr = KeyScalar->getValue(StringStorage); if (!StringStorage.empty()) { // Copy string to permanent storage unsigned Len = StringStorage.size(); char *Buf = StringAllocator.Allocate<char>(Len); memcpy(Buf, &StringStorage[0], Len); KeyStr = StringRef(Buf, Len); } HNode *ValueHNode = this->createHNodes(KVN.getValue()); if (EC) break; mapHNode->Mapping[KeyStr] = ValueHNode; } return mapHNode; } else if (isa<NullNode>(N)) { return new EmptyHNode(N); } else { setError(N, "unknown node kind"); return nullptr; } }
Input::HNode *Input::createHNodes(Node *N) { SmallString<128> StringStorage; if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) { StringRef KeyStr = SN->getValue(StringStorage); if (!StringStorage.empty()) { // Copy string to permanent storage unsigned Len = StringStorage.size(); char *Buf = StringAllocator.Allocate<char>(Len); memcpy(Buf, &StringStorage[0], Len); KeyStr = StringRef(Buf, Len); } return new ScalarHNode(N, KeyStr); } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) { SequenceHNode *SQHNode = new SequenceHNode(N); for (SequenceNode::iterator i = SQ->begin(), End = SQ->end(); i != End; ++i) { HNode *Entry = this->createHNodes(i); if (EC) break; SQHNode->Entries.push_back(Entry); } return SQHNode; } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) { MapHNode *mapHNode = new MapHNode(N); for (MappingNode::iterator i = Map->begin(), End = Map->end(); i != End; ++i) { ScalarNode *KeyScalar = dyn_cast<ScalarNode>(i->getKey()); StringStorage.clear(); StringRef KeyStr = KeyScalar->getValue(StringStorage); if (!StringStorage.empty()) { // Copy string to permanent storage unsigned Len = StringStorage.size(); char *Buf = StringAllocator.Allocate<char>(Len); memcpy(Buf, &StringStorage[0], Len); KeyStr = StringRef(Buf, Len); } HNode *ValueHNode = this->createHNodes(i->getValue()); if (EC) break; mapHNode->Mapping[KeyStr] = ValueHNode; } return mapHNode; } else if (isa<NullNode>(N)) { return new EmptyHNode(N); } else { setError(N, "unknown node kind"); return NULL; } }
void YamlEmitter::addMappingItem(int mappingid, const std::string &key, YamlNode *node) { if (node->getType() == SCALAR) { ScalarNode *sclr = static_cast<ScalarNode *>(node); int temp1; if ((temp1 = yaml_document_add_scalar(&document_, NULL, (yaml_char_t *) key.c_str(), -1, YAML_PLAIN_SCALAR_STYLE)) == 0) throw YamlEmitterException("Could not add scalar to document"); int temp2; if ((temp2 = yaml_document_add_scalar(&document_, NULL, (yaml_char_t *) sclr->getValue().c_str(), -1, YAML_PLAIN_SCALAR_STYLE)) == 0) throw YamlEmitterException("Could not add scalar to document"); if (yaml_document_append_mapping_pair(&document_, mappingid, temp1, temp2) == 0) throw YamlEmitterException("Could not append mapping pair to mapping"); } else if (node->getType() == MAPPING) { MappingNode *map = static_cast<MappingNode *>(node); int temp1; if ((temp1 = yaml_document_add_scalar(&document_, NULL, (yaml_char_t *) key.c_str(), -1, YAML_PLAIN_SCALAR_STYLE)) == 0) throw YamlEmitterException("Could not add scalar to document"); int temp2; if ((temp2 = yaml_document_add_mapping(&document_, NULL, YAML_BLOCK_MAPPING_STYLE)) == 0) throw YamlEmitterException("Could not add scalar to document"); if (yaml_document_append_mapping_pair(&document_, mappingid, temp1, temp2) == 0) throw YamlEmitterException("Could not add mapping pair to mapping"); addMappingItems(temp2, map->getMapping()); } else if (node->getType() == SEQUENCE) { SequenceNode *seqnode = static_cast<SequenceNode *>(node); int temp1; if ((temp1 = yaml_document_add_scalar(&document_, NULL, (yaml_char_t *) key.c_str(), -1, YAML_PLAIN_SCALAR_STYLE)) == 0) throw YamlEmitterException("Could not add scalar to document"); int temp2; if ((temp2 = yaml_document_add_sequence(&document_, NULL, YAML_BLOCK_SEQUENCE_STYLE)) == 0) throw YamlEmitterException("Could not add scalar to document"); if (yaml_document_append_mapping_pair(&document_, mappingid, temp1, temp2) == 0) throw YamlEmitterException("Could not append mapping pair to mapping"); Sequence *seq = seqnode->getSequence(); for (const auto &it : *seq) { YamlNode *yamlNode = it; int id; if ((id = yaml_document_add_mapping(&document_, NULL, YAML_BLOCK_MAPPING_STYLE)) == 0) throw YamlEmitterException("Could not add account mapping to document"); if (yaml_document_append_sequence_item(&document_, temp2, id) == 0) throw YamlEmitterException("Could not append account mapping to sequence"); MappingNode *mapnode = static_cast<MappingNode*>(yamlNode); addMappingItems(id, mapnode->getMapping()); } } else throw YamlEmitterException("Unknown node type while adding mapping node"); }