86 while (true) { |
86 while (true) { |
87 yaml_event_t event; |
87 yaml_event_t event; |
88 |
88 |
89 if (!yaml_parser_parse(&yamlParser, &event)) { |
89 if (!yaml_parser_parse(&yamlParser, &event)) { |
90 // FIXME: throw exception |
90 // FIXME: throw exception |
91 std::wcerr << L"YAML error" << std::endl; |
|
92 return; |
91 return; |
93 } |
92 } |
94 |
93 |
95 |
94 |
96 if (event.type == YAML_STREAM_END_EVENT) { |
95 if (event.type == YAML_STREAM_END_EVENT) { |
97 std::cerr << "YAML_STREAM_END_EVENT" << std::endl; |
|
98 yaml_event_delete(&event); |
96 yaml_event_delete(&event); |
99 break; |
97 break; |
100 } else if (event.type == YAML_STREAM_START_EVENT) { |
98 } else if (event.type == YAML_STREAM_START_EVENT) { |
101 std::cerr << "YAML_STREAM_START_EVENT" << std::endl; |
|
102 } else if (event.type == YAML_NO_EVENT) { |
99 } else if (event.type == YAML_NO_EVENT) { |
103 std::cerr << "YAML_NO_EVENT" << std::endl; |
|
104 current->add_child("null"); // TODO: null? |
100 current->add_child("null"); // TODO: null? |
105 } else if (event.type == YAML_DOCUMENT_START_EVENT) { |
101 } else if (event.type == YAML_DOCUMENT_START_EVENT) { |
106 std::cerr << "YAML_DOCUMENT_START_EVENT" << std::endl; |
|
107 } else if (event.type == YAML_DOCUMENT_END_EVENT) { |
102 } else if (event.type == YAML_DOCUMENT_END_EVENT) { |
108 std::cerr << "YAML_DOCUMENT_END_EVENT" << std::endl; |
|
109 } else if (event.type == YAML_ALIAS_EVENT) { |
103 } else if (event.type == YAML_ALIAS_EVENT) { |
110 std::cerr << "YAML_ALIAS_EVENT" << std::endl; |
|
111 // TODO: alias? |
104 // TODO: alias? |
112 } else if (event.type == YAML_SCALAR_EVENT) { |
105 } else if (event.type == YAML_SCALAR_EVENT) { |
113 if (mode.back() == Mode::SEQUENCE) { |
106 if (mode.back() == Mode::SEQUENCE) { |
114 std::cerr << "YAML_SCALAR_EVENT: Mode::SEQUENCE: " << event.data.scalar.value << std::endl; |
|
115 current->add_child(itemName)->add_child_text(y2x(event.data.scalar.value)); |
107 current->add_child(itemName)->add_child_text(y2x(event.data.scalar.value)); |
116 } else if (mode.back() == Mode::MAPPING) { |
108 } else if (mode.back() == Mode::MAPPING) { |
117 std::cerr << "YAML_SCALAR_EVENT: Mode::MAPPING: " << event.data.scalar.value << std::endl; |
|
118 current = current->add_child(y2xname(event.data.scalar.value)); |
109 current = current->add_child(y2xname(event.data.scalar.value)); |
119 mode.push_back(Mode::MAP_KEY); |
110 mode.push_back(Mode::MAP_KEY); |
120 } else if (mode.back() == Mode::MAP_KEY) { |
111 } else if (mode.back() == Mode::MAP_KEY) { |
121 std::cerr << "YAML_SCALAR_EVENT: Mode::MAP_KEY: " << event.data.scalar.value << std::endl; |
|
122 current->add_child_text(y2x(event.data.scalar.value)); |
112 current->add_child_text(y2x(event.data.scalar.value)); |
123 current = parentOrSelf(current); |
113 current = parentOrSelf(current); |
124 mode.pop_back(); |
114 mode.pop_back(); |
125 } else if (mode.back() == Mode::ROOT) { |
115 } else if (mode.back() == Mode::ROOT) { |
126 current->add_child_text(y2x(event.data.scalar.value)); |
116 current->add_child_text(y2x(event.data.scalar.value)); |
127 } else { |
117 } else { |
128 std::cerr << "YAML_SCALAR_EVENT: ???" << std::endl; |
118 // TODO: process YAML_SCALAR_EVENT |
129 } |
119 } |
130 |
120 |
131 } else if (event.type == YAML_SEQUENCE_START_EVENT) { |
121 } else if (event.type == YAML_SEQUENCE_START_EVENT) { |
132 std::cerr << "YAML_SEQUENCE_START_EVENT" << std::endl; |
|
133 xmlpp::Element* parent = current->get_parent(); |
122 xmlpp::Element* parent = current->get_parent(); |
134 if (parent) { |
123 if (parent) { |
135 itemName = current->get_name(); |
124 itemName = current->get_name(); |
136 parent->remove_child(current); |
125 parent->remove_child(current); |
137 current = parent; |
126 current = parent; |
139 itemName = "item"; |
128 itemName = "item"; |
140 } |
129 } |
141 if (mode.back() == Mode::MAP_KEY) mode.pop_back(); |
130 if (mode.back() == Mode::MAP_KEY) mode.pop_back(); |
142 mode.push_back(Mode::SEQUENCE); |
131 mode.push_back(Mode::SEQUENCE); |
143 } else if (event.type == YAML_SEQUENCE_END_EVENT) { |
132 } else if (event.type == YAML_SEQUENCE_END_EVENT) { |
144 std::cerr << "YAML_SEQUENCE_END_EVENT" << std::endl; |
|
145 mode.pop_back(); // TODO: assert sequence? |
133 mode.pop_back(); // TODO: assert sequence? |
146 } else if (event.type == YAML_MAPPING_START_EVENT) { |
134 } else if (event.type == YAML_MAPPING_START_EVENT) { |
147 |
135 |
148 if (mode.back() == Mode::ROOT) { |
136 if (mode.back() == Mode::ROOT) { |
149 std::cerr << "YAML_MAPPING_START_EVENT: Mode:ROOT" << std::endl; |
|
150 } else if (mode.back() == Mode::SEQUENCE) { |
137 } else if (mode.back() == Mode::SEQUENCE) { |
151 std::cerr << "YAML_MAPPING_START_EVENT: Mode::SEQUENCE" << std::endl; |
|
152 current = current->add_child(itemName); |
138 current = current->add_child(itemName); |
153 } else if (mode.back() == Mode::MAP_KEY) { |
139 } else if (mode.back() == Mode::MAP_KEY) { |
154 std::cerr << "YAML_MAPPING_START_EVENT: Mode::MAP_KEY" << std::endl; |
|
155 mode.pop_back(); |
140 mode.pop_back(); |
156 } else { |
141 } else { |
157 std::cerr << "YAML_MAPPING_START_EVENT: Mode::?" << std::endl; |
|
158 // TODO: map might be a key of another map → wrap/nest |
142 // TODO: map might be a key of another map → wrap/nest |
159 } |
143 } |
160 |
144 |
161 mode.push_back(Mode::MAPPING); |
145 mode.push_back(Mode::MAPPING); |
162 } else if (event.type == YAML_MAPPING_END_EVENT) { |
146 } else if (event.type == YAML_MAPPING_END_EVENT) { |
163 std::cerr << "YAML_MAPPING_END_EVENT" << std::endl; |
|
164 current = parentOrSelf(current); |
147 current = parentOrSelf(current); |
165 mode.pop_back(); // TODO: assert map? |
148 mode.pop_back(); // TODO: assert map? |
166 } else { |
149 } else { |
167 std::cerr << "???" << std::endl; |
150 // TODO: unsupported type? |
168 } |
151 } |
169 |
152 |
170 yaml_event_delete(&event); |
153 yaml_event_delete(&event); |
171 } |
154 } |
172 |
155 |