1a5f9918aSopenharmony_ci
2a5f9918aSopenharmony_ciimport yaml
3a5f9918aSopenharmony_ci
4a5f9918aSopenharmony_cidef get_version_string():
5a5f9918aSopenharmony_ci    cdef const char *value
6a5f9918aSopenharmony_ci    value = yaml_get_version_string()
7a5f9918aSopenharmony_ci    return PyUnicode_FromString(value)
8a5f9918aSopenharmony_ci
9a5f9918aSopenharmony_cidef get_version():
10a5f9918aSopenharmony_ci    cdef int major, minor, patch
11a5f9918aSopenharmony_ci    yaml_get_version(&major, &minor, &patch)
12a5f9918aSopenharmony_ci    return (major, minor, patch)
13a5f9918aSopenharmony_ci
14a5f9918aSopenharmony_ci#Mark = yaml.error.Mark
15a5f9918aSopenharmony_ciYAMLError = yaml.error.YAMLError
16a5f9918aSopenharmony_ciReaderError = yaml.reader.ReaderError
17a5f9918aSopenharmony_ciScannerError = yaml.scanner.ScannerError
18a5f9918aSopenharmony_ciParserError = yaml.parser.ParserError
19a5f9918aSopenharmony_ciComposerError = yaml.composer.ComposerError
20a5f9918aSopenharmony_ciConstructorError = yaml.constructor.ConstructorError
21a5f9918aSopenharmony_ciEmitterError = yaml.emitter.EmitterError
22a5f9918aSopenharmony_ciSerializerError = yaml.serializer.SerializerError
23a5f9918aSopenharmony_ciRepresenterError = yaml.representer.RepresenterError
24a5f9918aSopenharmony_ci
25a5f9918aSopenharmony_ciStreamStartToken = yaml.tokens.StreamStartToken
26a5f9918aSopenharmony_ciStreamEndToken = yaml.tokens.StreamEndToken
27a5f9918aSopenharmony_ciDirectiveToken = yaml.tokens.DirectiveToken
28a5f9918aSopenharmony_ciDocumentStartToken = yaml.tokens.DocumentStartToken
29a5f9918aSopenharmony_ciDocumentEndToken = yaml.tokens.DocumentEndToken
30a5f9918aSopenharmony_ciBlockSequenceStartToken = yaml.tokens.BlockSequenceStartToken
31a5f9918aSopenharmony_ciBlockMappingStartToken = yaml.tokens.BlockMappingStartToken
32a5f9918aSopenharmony_ciBlockEndToken = yaml.tokens.BlockEndToken
33a5f9918aSopenharmony_ciFlowSequenceStartToken = yaml.tokens.FlowSequenceStartToken
34a5f9918aSopenharmony_ciFlowMappingStartToken = yaml.tokens.FlowMappingStartToken
35a5f9918aSopenharmony_ciFlowSequenceEndToken = yaml.tokens.FlowSequenceEndToken
36a5f9918aSopenharmony_ciFlowMappingEndToken = yaml.tokens.FlowMappingEndToken
37a5f9918aSopenharmony_ciKeyToken = yaml.tokens.KeyToken
38a5f9918aSopenharmony_ciValueToken = yaml.tokens.ValueToken
39a5f9918aSopenharmony_ciBlockEntryToken = yaml.tokens.BlockEntryToken
40a5f9918aSopenharmony_ciFlowEntryToken = yaml.tokens.FlowEntryToken
41a5f9918aSopenharmony_ciAliasToken = yaml.tokens.AliasToken
42a5f9918aSopenharmony_ciAnchorToken = yaml.tokens.AnchorToken
43a5f9918aSopenharmony_ciTagToken = yaml.tokens.TagToken
44a5f9918aSopenharmony_ciScalarToken = yaml.tokens.ScalarToken
45a5f9918aSopenharmony_ci
46a5f9918aSopenharmony_ciStreamStartEvent = yaml.events.StreamStartEvent
47a5f9918aSopenharmony_ciStreamEndEvent = yaml.events.StreamEndEvent
48a5f9918aSopenharmony_ciDocumentStartEvent = yaml.events.DocumentStartEvent
49a5f9918aSopenharmony_ciDocumentEndEvent = yaml.events.DocumentEndEvent
50a5f9918aSopenharmony_ciAliasEvent = yaml.events.AliasEvent
51a5f9918aSopenharmony_ciScalarEvent = yaml.events.ScalarEvent
52a5f9918aSopenharmony_ciSequenceStartEvent = yaml.events.SequenceStartEvent
53a5f9918aSopenharmony_ciSequenceEndEvent = yaml.events.SequenceEndEvent
54a5f9918aSopenharmony_ciMappingStartEvent = yaml.events.MappingStartEvent
55a5f9918aSopenharmony_ciMappingEndEvent = yaml.events.MappingEndEvent
56a5f9918aSopenharmony_ci
57a5f9918aSopenharmony_ciScalarNode = yaml.nodes.ScalarNode
58a5f9918aSopenharmony_ciSequenceNode = yaml.nodes.SequenceNode
59a5f9918aSopenharmony_ciMappingNode = yaml.nodes.MappingNode
60a5f9918aSopenharmony_ci
61a5f9918aSopenharmony_cicdef class Mark:
62a5f9918aSopenharmony_ci    cdef readonly object name
63a5f9918aSopenharmony_ci    cdef readonly size_t index
64a5f9918aSopenharmony_ci    cdef readonly size_t line
65a5f9918aSopenharmony_ci    cdef readonly size_t column
66a5f9918aSopenharmony_ci    cdef readonly buffer
67a5f9918aSopenharmony_ci    cdef readonly pointer
68a5f9918aSopenharmony_ci
69a5f9918aSopenharmony_ci    def __init__(self, object name, size_t index, size_t line, size_t column,
70a5f9918aSopenharmony_ci            object buffer, object pointer):
71a5f9918aSopenharmony_ci        self.name = name
72a5f9918aSopenharmony_ci        self.index = index
73a5f9918aSopenharmony_ci        self.line = line
74a5f9918aSopenharmony_ci        self.column = column
75a5f9918aSopenharmony_ci        self.buffer = buffer
76a5f9918aSopenharmony_ci        self.pointer = pointer
77a5f9918aSopenharmony_ci
78a5f9918aSopenharmony_ci    def get_snippet(self):
79a5f9918aSopenharmony_ci        return None
80a5f9918aSopenharmony_ci
81a5f9918aSopenharmony_ci    def __str__(self):
82a5f9918aSopenharmony_ci        where = "  in \"%s\", line %d, column %d"   \
83a5f9918aSopenharmony_ci                % (self.name, self.line+1, self.column+1)
84a5f9918aSopenharmony_ci        return where
85a5f9918aSopenharmony_ci
86a5f9918aSopenharmony_ci#class YAMLError(Exception):
87a5f9918aSopenharmony_ci#    pass
88a5f9918aSopenharmony_ci#
89a5f9918aSopenharmony_ci#class MarkedYAMLError(YAMLError):
90a5f9918aSopenharmony_ci#
91a5f9918aSopenharmony_ci#    def __init__(self, context=None, context_mark=None,
92a5f9918aSopenharmony_ci#            problem=None, problem_mark=None, note=None):
93a5f9918aSopenharmony_ci#        self.context = context
94a5f9918aSopenharmony_ci#        self.context_mark = context_mark
95a5f9918aSopenharmony_ci#        self.problem = problem
96a5f9918aSopenharmony_ci#        self.problem_mark = problem_mark
97a5f9918aSopenharmony_ci#        self.note = note
98a5f9918aSopenharmony_ci#
99a5f9918aSopenharmony_ci#    def __str__(self):
100a5f9918aSopenharmony_ci#        lines = []
101a5f9918aSopenharmony_ci#        if self.context is not None:
102a5f9918aSopenharmony_ci#            lines.append(self.context)
103a5f9918aSopenharmony_ci#        if self.context_mark is not None  \
104a5f9918aSopenharmony_ci#            and (self.problem is None or self.problem_mark is None
105a5f9918aSopenharmony_ci#                    or self.context_mark.name != self.problem_mark.name
106a5f9918aSopenharmony_ci#                    or self.context_mark.line != self.problem_mark.line
107a5f9918aSopenharmony_ci#                    or self.context_mark.column != self.problem_mark.column):
108a5f9918aSopenharmony_ci#            lines.append(str(self.context_mark))
109a5f9918aSopenharmony_ci#        if self.problem is not None:
110a5f9918aSopenharmony_ci#            lines.append(self.problem)
111a5f9918aSopenharmony_ci#        if self.problem_mark is not None:
112a5f9918aSopenharmony_ci#            lines.append(str(self.problem_mark))
113a5f9918aSopenharmony_ci#        if self.note is not None:
114a5f9918aSopenharmony_ci#            lines.append(self.note)
115a5f9918aSopenharmony_ci#        return '\n'.join(lines)
116a5f9918aSopenharmony_ci#
117a5f9918aSopenharmony_ci#class ReaderError(YAMLError):
118a5f9918aSopenharmony_ci#
119a5f9918aSopenharmony_ci#    def __init__(self, name, position, character, encoding, reason):
120a5f9918aSopenharmony_ci#        self.name = name
121a5f9918aSopenharmony_ci#        self.character = character
122a5f9918aSopenharmony_ci#        self.position = position
123a5f9918aSopenharmony_ci#        self.encoding = encoding
124a5f9918aSopenharmony_ci#        self.reason = reason
125a5f9918aSopenharmony_ci#
126a5f9918aSopenharmony_ci#    def __str__(self):
127a5f9918aSopenharmony_ci#        if isinstance(self.character, str):
128a5f9918aSopenharmony_ci#            return "'%s' codec can't decode byte #x%02x: %s\n"  \
129a5f9918aSopenharmony_ci#                    "  in \"%s\", position %d"    \
130a5f9918aSopenharmony_ci#                    % (self.encoding, ord(self.character), self.reason,
131a5f9918aSopenharmony_ci#                            self.name, self.position)
132a5f9918aSopenharmony_ci#        else:
133a5f9918aSopenharmony_ci#            return "unacceptable character #x%04x: %s\n"    \
134a5f9918aSopenharmony_ci#                    "  in \"%s\", position %d"    \
135a5f9918aSopenharmony_ci#                    % (ord(self.character), self.reason,
136a5f9918aSopenharmony_ci#                            self.name, self.position)
137a5f9918aSopenharmony_ci#
138a5f9918aSopenharmony_ci#class ScannerError(MarkedYAMLError):
139a5f9918aSopenharmony_ci#    pass
140a5f9918aSopenharmony_ci#
141a5f9918aSopenharmony_ci#class ParserError(MarkedYAMLError):
142a5f9918aSopenharmony_ci#    pass
143a5f9918aSopenharmony_ci#
144a5f9918aSopenharmony_ci#class EmitterError(YAMLError):
145a5f9918aSopenharmony_ci#    pass
146a5f9918aSopenharmony_ci#
147a5f9918aSopenharmony_ci#cdef class Token:
148a5f9918aSopenharmony_ci#    cdef readonly Mark start_mark
149a5f9918aSopenharmony_ci#    cdef readonly Mark end_mark
150a5f9918aSopenharmony_ci#    def __init__(self, Mark start_mark, Mark end_mark):
151a5f9918aSopenharmony_ci#        self.start_mark = start_mark
152a5f9918aSopenharmony_ci#        self.end_mark = end_mark
153a5f9918aSopenharmony_ci#
154a5f9918aSopenharmony_ci#cdef class StreamStartToken(Token):
155a5f9918aSopenharmony_ci#    cdef readonly object encoding
156a5f9918aSopenharmony_ci#    def __init__(self, Mark start_mark, Mark end_mark, encoding):
157a5f9918aSopenharmony_ci#        self.start_mark = start_mark
158a5f9918aSopenharmony_ci#        self.end_mark = end_mark
159a5f9918aSopenharmony_ci#        self.encoding = encoding
160a5f9918aSopenharmony_ci#
161a5f9918aSopenharmony_ci#cdef class StreamEndToken(Token):
162a5f9918aSopenharmony_ci#    pass
163a5f9918aSopenharmony_ci#
164a5f9918aSopenharmony_ci#cdef class DirectiveToken(Token):
165a5f9918aSopenharmony_ci#    cdef readonly object name
166a5f9918aSopenharmony_ci#    cdef readonly object value
167a5f9918aSopenharmony_ci#    def __init__(self, name, value, Mark start_mark, Mark end_mark):
168a5f9918aSopenharmony_ci#        self.name = name
169a5f9918aSopenharmony_ci#        self.value = value
170a5f9918aSopenharmony_ci#        self.start_mark = start_mark
171a5f9918aSopenharmony_ci#        self.end_mark = end_mark
172a5f9918aSopenharmony_ci#
173a5f9918aSopenharmony_ci#cdef class DocumentStartToken(Token):
174a5f9918aSopenharmony_ci#    pass
175a5f9918aSopenharmony_ci#
176a5f9918aSopenharmony_ci#cdef class DocumentEndToken(Token):
177a5f9918aSopenharmony_ci#    pass
178a5f9918aSopenharmony_ci#
179a5f9918aSopenharmony_ci#cdef class BlockSequenceStartToken(Token):
180a5f9918aSopenharmony_ci#    pass
181a5f9918aSopenharmony_ci#
182a5f9918aSopenharmony_ci#cdef class BlockMappingStartToken(Token):
183a5f9918aSopenharmony_ci#    pass
184a5f9918aSopenharmony_ci#
185a5f9918aSopenharmony_ci#cdef class BlockEndToken(Token):
186a5f9918aSopenharmony_ci#    pass
187a5f9918aSopenharmony_ci#
188a5f9918aSopenharmony_ci#cdef class FlowSequenceStartToken(Token):
189a5f9918aSopenharmony_ci#    pass
190a5f9918aSopenharmony_ci#
191a5f9918aSopenharmony_ci#cdef class FlowMappingStartToken(Token):
192a5f9918aSopenharmony_ci#    pass
193a5f9918aSopenharmony_ci#
194a5f9918aSopenharmony_ci#cdef class FlowSequenceEndToken(Token):
195a5f9918aSopenharmony_ci#    pass
196a5f9918aSopenharmony_ci#
197a5f9918aSopenharmony_ci#cdef class FlowMappingEndToken(Token):
198a5f9918aSopenharmony_ci#    pass
199a5f9918aSopenharmony_ci#
200a5f9918aSopenharmony_ci#cdef class KeyToken(Token):
201a5f9918aSopenharmony_ci#    pass
202a5f9918aSopenharmony_ci#
203a5f9918aSopenharmony_ci#cdef class ValueToken(Token):
204a5f9918aSopenharmony_ci#    pass
205a5f9918aSopenharmony_ci#
206a5f9918aSopenharmony_ci#cdef class BlockEntryToken(Token):
207a5f9918aSopenharmony_ci#    pass
208a5f9918aSopenharmony_ci#
209a5f9918aSopenharmony_ci#cdef class FlowEntryToken(Token):
210a5f9918aSopenharmony_ci#    pass
211a5f9918aSopenharmony_ci#
212a5f9918aSopenharmony_ci#cdef class AliasToken(Token):
213a5f9918aSopenharmony_ci#    cdef readonly object value
214a5f9918aSopenharmony_ci#    def __init__(self, value, Mark start_mark, Mark end_mark):
215a5f9918aSopenharmony_ci#        self.value = value
216a5f9918aSopenharmony_ci#        self.start_mark = start_mark
217a5f9918aSopenharmony_ci#        self.end_mark = end_mark
218a5f9918aSopenharmony_ci#
219a5f9918aSopenharmony_ci#cdef class AnchorToken(Token):
220a5f9918aSopenharmony_ci#    cdef readonly object value
221a5f9918aSopenharmony_ci#    def __init__(self, value, Mark start_mark, Mark end_mark):
222a5f9918aSopenharmony_ci#        self.value = value
223a5f9918aSopenharmony_ci#        self.start_mark = start_mark
224a5f9918aSopenharmony_ci#        self.end_mark = end_mark
225a5f9918aSopenharmony_ci#
226a5f9918aSopenharmony_ci#cdef class TagToken(Token):
227a5f9918aSopenharmony_ci#    cdef readonly object value
228a5f9918aSopenharmony_ci#    def __init__(self, value, Mark start_mark, Mark end_mark):
229a5f9918aSopenharmony_ci#        self.value = value
230a5f9918aSopenharmony_ci#        self.start_mark = start_mark
231a5f9918aSopenharmony_ci#        self.end_mark = end_mark
232a5f9918aSopenharmony_ci#
233a5f9918aSopenharmony_ci#cdef class ScalarToken(Token):
234a5f9918aSopenharmony_ci#    cdef readonly object value
235a5f9918aSopenharmony_ci#    cdef readonly object plain
236a5f9918aSopenharmony_ci#    cdef readonly object style
237a5f9918aSopenharmony_ci#    def __init__(self, value, plain, Mark start_mark, Mark end_mark, style=None):
238a5f9918aSopenharmony_ci#        self.value = value
239a5f9918aSopenharmony_ci#        self.plain = plain
240a5f9918aSopenharmony_ci#        self.start_mark = start_mark
241a5f9918aSopenharmony_ci#        self.end_mark = end_mark
242a5f9918aSopenharmony_ci#        self.style = style
243a5f9918aSopenharmony_ci
244a5f9918aSopenharmony_cicdef class CParser:
245a5f9918aSopenharmony_ci
246a5f9918aSopenharmony_ci    cdef yaml_parser_t parser
247a5f9918aSopenharmony_ci    cdef yaml_event_t parsed_event
248a5f9918aSopenharmony_ci
249a5f9918aSopenharmony_ci    cdef object stream
250a5f9918aSopenharmony_ci    cdef object stream_name
251a5f9918aSopenharmony_ci    cdef object current_token
252a5f9918aSopenharmony_ci    cdef object current_event
253a5f9918aSopenharmony_ci    cdef object anchors
254a5f9918aSopenharmony_ci    cdef object stream_cache
255a5f9918aSopenharmony_ci    cdef int stream_cache_len
256a5f9918aSopenharmony_ci    cdef int stream_cache_pos
257a5f9918aSopenharmony_ci    cdef int unicode_source
258a5f9918aSopenharmony_ci
259a5f9918aSopenharmony_ci    def __init__(self, stream):
260a5f9918aSopenharmony_ci        cdef is_readable
261a5f9918aSopenharmony_ci        if yaml_parser_initialize(&self.parser) == 0:
262a5f9918aSopenharmony_ci            raise MemoryError
263a5f9918aSopenharmony_ci        self.parsed_event.type = YAML_NO_EVENT
264a5f9918aSopenharmony_ci        is_readable = 1
265a5f9918aSopenharmony_ci        try:
266a5f9918aSopenharmony_ci            stream.read
267a5f9918aSopenharmony_ci        except AttributeError:
268a5f9918aSopenharmony_ci            is_readable = 0
269a5f9918aSopenharmony_ci        self.unicode_source = 0
270a5f9918aSopenharmony_ci        if is_readable:
271a5f9918aSopenharmony_ci            self.stream = stream
272a5f9918aSopenharmony_ci            try:
273a5f9918aSopenharmony_ci                self.stream_name = stream.name
274a5f9918aSopenharmony_ci            except AttributeError:
275a5f9918aSopenharmony_ci                self.stream_name = u'<file>'
276a5f9918aSopenharmony_ci            self.stream_cache = None
277a5f9918aSopenharmony_ci            self.stream_cache_len = 0
278a5f9918aSopenharmony_ci            self.stream_cache_pos = 0
279a5f9918aSopenharmony_ci            yaml_parser_set_input(&self.parser, input_handler, <void *>self)
280a5f9918aSopenharmony_ci        else:
281a5f9918aSopenharmony_ci            if PyUnicode_CheckExact(stream) != 0:
282a5f9918aSopenharmony_ci                stream = PyUnicode_AsUTF8String(stream)
283a5f9918aSopenharmony_ci                self.stream_name = u'<unicode string>'
284a5f9918aSopenharmony_ci                self.unicode_source = 1
285a5f9918aSopenharmony_ci            else:
286a5f9918aSopenharmony_ci                self.stream_name = u'<byte string>'
287a5f9918aSopenharmony_ci            if PyBytes_CheckExact(stream) == 0:
288a5f9918aSopenharmony_ci                raise TypeError(u"a string or stream input is required")
289a5f9918aSopenharmony_ci            self.stream = stream
290a5f9918aSopenharmony_ci            yaml_parser_set_input_string(&self.parser, PyBytes_AS_Yaml_STRING(stream), PyBytes_GET_SIZE(stream))
291a5f9918aSopenharmony_ci        self.current_token = None
292a5f9918aSopenharmony_ci        self.current_event = None
293a5f9918aSopenharmony_ci        self.anchors = {}
294a5f9918aSopenharmony_ci
295a5f9918aSopenharmony_ci    def __dealloc__(self):
296a5f9918aSopenharmony_ci        yaml_parser_delete(&self.parser)
297a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
298a5f9918aSopenharmony_ci
299a5f9918aSopenharmony_ci    def dispose(self):
300a5f9918aSopenharmony_ci        pass
301a5f9918aSopenharmony_ci
302a5f9918aSopenharmony_ci    cdef object _parser_error(self):
303a5f9918aSopenharmony_ci        if self.parser.error == YAML_MEMORY_ERROR:
304a5f9918aSopenharmony_ci            return MemoryError
305a5f9918aSopenharmony_ci        elif self.parser.error == YAML_READER_ERROR:
306a5f9918aSopenharmony_ci            return ReaderError(self.stream_name, self.parser.problem_offset,
307a5f9918aSopenharmony_ci                    self.parser.problem_value, u'?', PyUnicode_FromString(self.parser.problem))
308a5f9918aSopenharmony_ci        elif self.parser.error == YAML_SCANNER_ERROR    \
309a5f9918aSopenharmony_ci                or self.parser.error == YAML_PARSER_ERROR:
310a5f9918aSopenharmony_ci            context_mark = None
311a5f9918aSopenharmony_ci            problem_mark = None
312a5f9918aSopenharmony_ci            if self.parser.context != NULL:
313a5f9918aSopenharmony_ci                context_mark = Mark(self.stream_name,
314a5f9918aSopenharmony_ci                        self.parser.context_mark.index,
315a5f9918aSopenharmony_ci                        self.parser.context_mark.line,
316a5f9918aSopenharmony_ci                        self.parser.context_mark.column, None, None)
317a5f9918aSopenharmony_ci            if self.parser.problem != NULL:
318a5f9918aSopenharmony_ci                problem_mark = Mark(self.stream_name,
319a5f9918aSopenharmony_ci                        self.parser.problem_mark.index,
320a5f9918aSopenharmony_ci                        self.parser.problem_mark.line,
321a5f9918aSopenharmony_ci                        self.parser.problem_mark.column, None, None)
322a5f9918aSopenharmony_ci            context = None
323a5f9918aSopenharmony_ci            if self.parser.context != NULL:
324a5f9918aSopenharmony_ci                context = PyUnicode_FromString(self.parser.context)
325a5f9918aSopenharmony_ci            problem = PyUnicode_FromString(self.parser.problem)
326a5f9918aSopenharmony_ci            if self.parser.error == YAML_SCANNER_ERROR:
327a5f9918aSopenharmony_ci                return ScannerError(context, context_mark, problem, problem_mark)
328a5f9918aSopenharmony_ci            else:
329a5f9918aSopenharmony_ci                return ParserError(context, context_mark, problem, problem_mark)
330a5f9918aSopenharmony_ci        raise ValueError(u"no parser error")
331a5f9918aSopenharmony_ci
332a5f9918aSopenharmony_ci    def raw_scan(self):
333a5f9918aSopenharmony_ci        cdef yaml_token_t token
334a5f9918aSopenharmony_ci        cdef int done
335a5f9918aSopenharmony_ci        cdef int count
336a5f9918aSopenharmony_ci        count = 0
337a5f9918aSopenharmony_ci        done = 0
338a5f9918aSopenharmony_ci        while done == 0:
339a5f9918aSopenharmony_ci            if yaml_parser_scan(&self.parser, &token) == 0:
340a5f9918aSopenharmony_ci                error = self._parser_error()
341a5f9918aSopenharmony_ci                raise error
342a5f9918aSopenharmony_ci            if token.type == YAML_NO_TOKEN:
343a5f9918aSopenharmony_ci                done = 1
344a5f9918aSopenharmony_ci            else:
345a5f9918aSopenharmony_ci                count = count+1
346a5f9918aSopenharmony_ci            yaml_token_delete(&token)
347a5f9918aSopenharmony_ci        return count
348a5f9918aSopenharmony_ci
349a5f9918aSopenharmony_ci    cdef object _scan(self):
350a5f9918aSopenharmony_ci        cdef yaml_token_t token
351a5f9918aSopenharmony_ci        if yaml_parser_scan(&self.parser, &token) == 0:
352a5f9918aSopenharmony_ci            error = self._parser_error()
353a5f9918aSopenharmony_ci            raise error
354a5f9918aSopenharmony_ci        token_object = self._token_to_object(&token)
355a5f9918aSopenharmony_ci        yaml_token_delete(&token)
356a5f9918aSopenharmony_ci        return token_object
357a5f9918aSopenharmony_ci
358a5f9918aSopenharmony_ci    cdef object _token_to_object(self, yaml_token_t *token):
359a5f9918aSopenharmony_ci        start_mark = Mark(self.stream_name,
360a5f9918aSopenharmony_ci                token.start_mark.index,
361a5f9918aSopenharmony_ci                token.start_mark.line,
362a5f9918aSopenharmony_ci                token.start_mark.column,
363a5f9918aSopenharmony_ci                None, None)
364a5f9918aSopenharmony_ci        end_mark = Mark(self.stream_name,
365a5f9918aSopenharmony_ci                token.end_mark.index,
366a5f9918aSopenharmony_ci                token.end_mark.line,
367a5f9918aSopenharmony_ci                token.end_mark.column,
368a5f9918aSopenharmony_ci                None, None)
369a5f9918aSopenharmony_ci        if token.type == YAML_NO_TOKEN:
370a5f9918aSopenharmony_ci            return None
371a5f9918aSopenharmony_ci        elif token.type == YAML_STREAM_START_TOKEN:
372a5f9918aSopenharmony_ci            encoding = None
373a5f9918aSopenharmony_ci            if token.data.stream_start.encoding == YAML_UTF8_ENCODING:
374a5f9918aSopenharmony_ci                if self.unicode_source == 0:
375a5f9918aSopenharmony_ci                    encoding = u"utf-8"
376a5f9918aSopenharmony_ci            elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING:
377a5f9918aSopenharmony_ci                encoding = u"utf-16-le"
378a5f9918aSopenharmony_ci            elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING:
379a5f9918aSopenharmony_ci                encoding = u"utf-16-be"
380a5f9918aSopenharmony_ci            return StreamStartToken(start_mark, end_mark, encoding)
381a5f9918aSopenharmony_ci        elif token.type == YAML_STREAM_END_TOKEN:
382a5f9918aSopenharmony_ci            return StreamEndToken(start_mark, end_mark)
383a5f9918aSopenharmony_ci        elif token.type == YAML_VERSION_DIRECTIVE_TOKEN:
384a5f9918aSopenharmony_ci            return DirectiveToken(u"YAML",
385a5f9918aSopenharmony_ci                    (token.data.version_directive.major,
386a5f9918aSopenharmony_ci                        token.data.version_directive.minor),
387a5f9918aSopenharmony_ci                    start_mark, end_mark)
388a5f9918aSopenharmony_ci        elif token.type == YAML_TAG_DIRECTIVE_TOKEN:
389a5f9918aSopenharmony_ci            handle = PyUnicode_FromYamlString(token.data.tag_directive.handle)
390a5f9918aSopenharmony_ci            prefix = PyUnicode_FromYamlString(token.data.tag_directive.prefix)
391a5f9918aSopenharmony_ci            return DirectiveToken(u"TAG", (handle, prefix),
392a5f9918aSopenharmony_ci                    start_mark, end_mark)
393a5f9918aSopenharmony_ci        elif token.type == YAML_DOCUMENT_START_TOKEN:
394a5f9918aSopenharmony_ci            return DocumentStartToken(start_mark, end_mark)
395a5f9918aSopenharmony_ci        elif token.type == YAML_DOCUMENT_END_TOKEN:
396a5f9918aSopenharmony_ci            return DocumentEndToken(start_mark, end_mark)
397a5f9918aSopenharmony_ci        elif token.type == YAML_BLOCK_SEQUENCE_START_TOKEN:
398a5f9918aSopenharmony_ci            return BlockSequenceStartToken(start_mark, end_mark)
399a5f9918aSopenharmony_ci        elif token.type == YAML_BLOCK_MAPPING_START_TOKEN:
400a5f9918aSopenharmony_ci            return BlockMappingStartToken(start_mark, end_mark)
401a5f9918aSopenharmony_ci        elif token.type == YAML_BLOCK_END_TOKEN:
402a5f9918aSopenharmony_ci            return BlockEndToken(start_mark, end_mark)
403a5f9918aSopenharmony_ci        elif token.type == YAML_FLOW_SEQUENCE_START_TOKEN:
404a5f9918aSopenharmony_ci            return FlowSequenceStartToken(start_mark, end_mark)
405a5f9918aSopenharmony_ci        elif token.type == YAML_FLOW_SEQUENCE_END_TOKEN:
406a5f9918aSopenharmony_ci            return FlowSequenceEndToken(start_mark, end_mark)
407a5f9918aSopenharmony_ci        elif token.type == YAML_FLOW_MAPPING_START_TOKEN:
408a5f9918aSopenharmony_ci            return FlowMappingStartToken(start_mark, end_mark)
409a5f9918aSopenharmony_ci        elif token.type == YAML_FLOW_MAPPING_END_TOKEN:
410a5f9918aSopenharmony_ci            return FlowMappingEndToken(start_mark, end_mark)
411a5f9918aSopenharmony_ci        elif token.type == YAML_BLOCK_ENTRY_TOKEN:
412a5f9918aSopenharmony_ci            return BlockEntryToken(start_mark, end_mark)
413a5f9918aSopenharmony_ci        elif token.type == YAML_FLOW_ENTRY_TOKEN:
414a5f9918aSopenharmony_ci            return FlowEntryToken(start_mark, end_mark)
415a5f9918aSopenharmony_ci        elif token.type == YAML_KEY_TOKEN:
416a5f9918aSopenharmony_ci            return KeyToken(start_mark, end_mark)
417a5f9918aSopenharmony_ci        elif token.type == YAML_VALUE_TOKEN:
418a5f9918aSopenharmony_ci            return ValueToken(start_mark, end_mark)
419a5f9918aSopenharmony_ci        elif token.type == YAML_ALIAS_TOKEN:
420a5f9918aSopenharmony_ci            value = PyUnicode_FromYamlString(token.data.alias.value)
421a5f9918aSopenharmony_ci            return AliasToken(value, start_mark, end_mark)
422a5f9918aSopenharmony_ci        elif token.type == YAML_ANCHOR_TOKEN:
423a5f9918aSopenharmony_ci            value = PyUnicode_FromYamlString(token.data.anchor.value)
424a5f9918aSopenharmony_ci            return AnchorToken(value, start_mark, end_mark)
425a5f9918aSopenharmony_ci        elif token.type == YAML_TAG_TOKEN:
426a5f9918aSopenharmony_ci            handle = PyUnicode_FromYamlString(token.data.tag.handle)
427a5f9918aSopenharmony_ci            suffix = PyUnicode_FromYamlString(token.data.tag.suffix)
428a5f9918aSopenharmony_ci            if not handle:
429a5f9918aSopenharmony_ci                handle = None
430a5f9918aSopenharmony_ci            return TagToken((handle, suffix), start_mark, end_mark)
431a5f9918aSopenharmony_ci        elif token.type == YAML_SCALAR_TOKEN:
432a5f9918aSopenharmony_ci            value = PyUnicode_DecodeUTF8(<char *>token.data.scalar.value,
433a5f9918aSopenharmony_ci                    token.data.scalar.length, 'strict')
434a5f9918aSopenharmony_ci            plain = False
435a5f9918aSopenharmony_ci            style = None
436a5f9918aSopenharmony_ci            if token.data.scalar.style == YAML_PLAIN_SCALAR_STYLE:
437a5f9918aSopenharmony_ci                plain = True
438a5f9918aSopenharmony_ci                style = u''
439a5f9918aSopenharmony_ci            elif token.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE:
440a5f9918aSopenharmony_ci                style = u'\''
441a5f9918aSopenharmony_ci            elif token.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE:
442a5f9918aSopenharmony_ci                style = u'"'
443a5f9918aSopenharmony_ci            elif token.data.scalar.style == YAML_LITERAL_SCALAR_STYLE:
444a5f9918aSopenharmony_ci                style = u'|'
445a5f9918aSopenharmony_ci            elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE:
446a5f9918aSopenharmony_ci                style = u'>'
447a5f9918aSopenharmony_ci            return ScalarToken(value, plain,
448a5f9918aSopenharmony_ci                    start_mark, end_mark, style)
449a5f9918aSopenharmony_ci        else:
450a5f9918aSopenharmony_ci            raise ValueError(u"unknown token type")
451a5f9918aSopenharmony_ci
452a5f9918aSopenharmony_ci    def get_token(self):
453a5f9918aSopenharmony_ci        if self.current_token is not None:
454a5f9918aSopenharmony_ci            value = self.current_token
455a5f9918aSopenharmony_ci            self.current_token = None
456a5f9918aSopenharmony_ci        else:
457a5f9918aSopenharmony_ci            value = self._scan()
458a5f9918aSopenharmony_ci        return value
459a5f9918aSopenharmony_ci
460a5f9918aSopenharmony_ci    def peek_token(self):
461a5f9918aSopenharmony_ci        if self.current_token is None:
462a5f9918aSopenharmony_ci            self.current_token = self._scan()
463a5f9918aSopenharmony_ci        return self.current_token
464a5f9918aSopenharmony_ci
465a5f9918aSopenharmony_ci    def check_token(self, *choices):
466a5f9918aSopenharmony_ci        if self.current_token is None:
467a5f9918aSopenharmony_ci            self.current_token = self._scan()
468a5f9918aSopenharmony_ci        if self.current_token is None:
469a5f9918aSopenharmony_ci            return False
470a5f9918aSopenharmony_ci        if not choices:
471a5f9918aSopenharmony_ci            return True
472a5f9918aSopenharmony_ci        token_class = self.current_token.__class__
473a5f9918aSopenharmony_ci        for choice in choices:
474a5f9918aSopenharmony_ci            if token_class is choice:
475a5f9918aSopenharmony_ci                return True
476a5f9918aSopenharmony_ci        return False
477a5f9918aSopenharmony_ci
478a5f9918aSopenharmony_ci    def raw_parse(self):
479a5f9918aSopenharmony_ci        cdef yaml_event_t event
480a5f9918aSopenharmony_ci        cdef int done
481a5f9918aSopenharmony_ci        cdef int count
482a5f9918aSopenharmony_ci        count = 0
483a5f9918aSopenharmony_ci        done = 0
484a5f9918aSopenharmony_ci        while done == 0:
485a5f9918aSopenharmony_ci            if yaml_parser_parse(&self.parser, &event) == 0:
486a5f9918aSopenharmony_ci                error = self._parser_error()
487a5f9918aSopenharmony_ci                raise error
488a5f9918aSopenharmony_ci            if event.type == YAML_NO_EVENT:
489a5f9918aSopenharmony_ci                done = 1
490a5f9918aSopenharmony_ci            else:
491a5f9918aSopenharmony_ci                count = count+1
492a5f9918aSopenharmony_ci            yaml_event_delete(&event)
493a5f9918aSopenharmony_ci        return count
494a5f9918aSopenharmony_ci
495a5f9918aSopenharmony_ci    cdef object _parse(self):
496a5f9918aSopenharmony_ci        cdef yaml_event_t event
497a5f9918aSopenharmony_ci        if yaml_parser_parse(&self.parser, &event) == 0:
498a5f9918aSopenharmony_ci            error = self._parser_error()
499a5f9918aSopenharmony_ci            raise error
500a5f9918aSopenharmony_ci        event_object = self._event_to_object(&event)
501a5f9918aSopenharmony_ci        yaml_event_delete(&event)
502a5f9918aSopenharmony_ci        return event_object
503a5f9918aSopenharmony_ci
504a5f9918aSopenharmony_ci    cdef object _event_to_object(self, yaml_event_t *event):
505a5f9918aSopenharmony_ci        cdef yaml_tag_directive_t *tag_directive
506a5f9918aSopenharmony_ci        start_mark = Mark(self.stream_name,
507a5f9918aSopenharmony_ci                event.start_mark.index,
508a5f9918aSopenharmony_ci                event.start_mark.line,
509a5f9918aSopenharmony_ci                event.start_mark.column,
510a5f9918aSopenharmony_ci                None, None)
511a5f9918aSopenharmony_ci        end_mark = Mark(self.stream_name,
512a5f9918aSopenharmony_ci                event.end_mark.index,
513a5f9918aSopenharmony_ci                event.end_mark.line,
514a5f9918aSopenharmony_ci                event.end_mark.column,
515a5f9918aSopenharmony_ci                None, None)
516a5f9918aSopenharmony_ci        if event.type == YAML_NO_EVENT:
517a5f9918aSopenharmony_ci            return None
518a5f9918aSopenharmony_ci        elif event.type == YAML_STREAM_START_EVENT:
519a5f9918aSopenharmony_ci            encoding = None
520a5f9918aSopenharmony_ci            if event.data.stream_start.encoding == YAML_UTF8_ENCODING:
521a5f9918aSopenharmony_ci                if self.unicode_source == 0:
522a5f9918aSopenharmony_ci                    encoding = u"utf-8"
523a5f9918aSopenharmony_ci            elif event.data.stream_start.encoding == YAML_UTF16LE_ENCODING:
524a5f9918aSopenharmony_ci                encoding = u"utf-16-le"
525a5f9918aSopenharmony_ci            elif event.data.stream_start.encoding == YAML_UTF16BE_ENCODING:
526a5f9918aSopenharmony_ci                encoding = u"utf-16-be"
527a5f9918aSopenharmony_ci            return StreamStartEvent(start_mark, end_mark, encoding)
528a5f9918aSopenharmony_ci        elif event.type == YAML_STREAM_END_EVENT:
529a5f9918aSopenharmony_ci            return StreamEndEvent(start_mark, end_mark)
530a5f9918aSopenharmony_ci        elif event.type == YAML_DOCUMENT_START_EVENT:
531a5f9918aSopenharmony_ci            explicit = False
532a5f9918aSopenharmony_ci            if event.data.document_start.implicit == 0:
533a5f9918aSopenharmony_ci                explicit = True
534a5f9918aSopenharmony_ci            version = None
535a5f9918aSopenharmony_ci            if event.data.document_start.version_directive != NULL:
536a5f9918aSopenharmony_ci                version = (event.data.document_start.version_directive.major,
537a5f9918aSopenharmony_ci                        event.data.document_start.version_directive.minor)
538a5f9918aSopenharmony_ci            tags = None
539a5f9918aSopenharmony_ci            if event.data.document_start.tag_directives.start != NULL:
540a5f9918aSopenharmony_ci                tags = {}
541a5f9918aSopenharmony_ci                tag_directive = event.data.document_start.tag_directives.start
542a5f9918aSopenharmony_ci                while tag_directive != event.data.document_start.tag_directives.end:
543a5f9918aSopenharmony_ci                    handle = PyUnicode_FromYamlString(tag_directive.handle)
544a5f9918aSopenharmony_ci                    prefix = PyUnicode_FromYamlString(tag_directive.prefix)
545a5f9918aSopenharmony_ci                    tags[handle] = prefix
546a5f9918aSopenharmony_ci                    tag_directive = tag_directive+1
547a5f9918aSopenharmony_ci            return DocumentStartEvent(start_mark, end_mark,
548a5f9918aSopenharmony_ci                    explicit, version, tags)
549a5f9918aSopenharmony_ci        elif event.type == YAML_DOCUMENT_END_EVENT:
550a5f9918aSopenharmony_ci            explicit = False
551a5f9918aSopenharmony_ci            if event.data.document_end.implicit == 0:
552a5f9918aSopenharmony_ci                explicit = True
553a5f9918aSopenharmony_ci            return DocumentEndEvent(start_mark, end_mark, explicit)
554a5f9918aSopenharmony_ci        elif event.type == YAML_ALIAS_EVENT:
555a5f9918aSopenharmony_ci            anchor = PyUnicode_FromYamlString(event.data.alias.anchor)
556a5f9918aSopenharmony_ci            return AliasEvent(anchor, start_mark, end_mark)
557a5f9918aSopenharmony_ci        elif event.type == YAML_SCALAR_EVENT:
558a5f9918aSopenharmony_ci            anchor = None
559a5f9918aSopenharmony_ci            if event.data.scalar.anchor != NULL:
560a5f9918aSopenharmony_ci                anchor = PyUnicode_FromYamlString(event.data.scalar.anchor)
561a5f9918aSopenharmony_ci            tag = None
562a5f9918aSopenharmony_ci            if event.data.scalar.tag != NULL:
563a5f9918aSopenharmony_ci                tag = PyUnicode_FromYamlString(event.data.scalar.tag)
564a5f9918aSopenharmony_ci            value = PyUnicode_DecodeUTF8(<char *>event.data.scalar.value,
565a5f9918aSopenharmony_ci                    event.data.scalar.length, 'strict')
566a5f9918aSopenharmony_ci            plain_implicit = False
567a5f9918aSopenharmony_ci            if event.data.scalar.plain_implicit == 1:
568a5f9918aSopenharmony_ci                plain_implicit = True
569a5f9918aSopenharmony_ci            quoted_implicit = False
570a5f9918aSopenharmony_ci            if event.data.scalar.quoted_implicit == 1:
571a5f9918aSopenharmony_ci                quoted_implicit = True
572a5f9918aSopenharmony_ci            style = None
573a5f9918aSopenharmony_ci            if event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE:
574a5f9918aSopenharmony_ci                style = u''
575a5f9918aSopenharmony_ci            elif event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE:
576a5f9918aSopenharmony_ci                style = u'\''
577a5f9918aSopenharmony_ci            elif event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE:
578a5f9918aSopenharmony_ci                style = u'"'
579a5f9918aSopenharmony_ci            elif event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE:
580a5f9918aSopenharmony_ci                style = u'|'
581a5f9918aSopenharmony_ci            elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE:
582a5f9918aSopenharmony_ci                style = u'>'
583a5f9918aSopenharmony_ci            return ScalarEvent(anchor, tag,
584a5f9918aSopenharmony_ci                    (plain_implicit, quoted_implicit),
585a5f9918aSopenharmony_ci                    value, start_mark, end_mark, style)
586a5f9918aSopenharmony_ci        elif event.type == YAML_SEQUENCE_START_EVENT:
587a5f9918aSopenharmony_ci            anchor = None
588a5f9918aSopenharmony_ci            if event.data.sequence_start.anchor != NULL:
589a5f9918aSopenharmony_ci                anchor = PyUnicode_FromYamlString(event.data.sequence_start.anchor)
590a5f9918aSopenharmony_ci            tag = None
591a5f9918aSopenharmony_ci            if event.data.sequence_start.tag != NULL:
592a5f9918aSopenharmony_ci                tag = PyUnicode_FromYamlString(event.data.sequence_start.tag)
593a5f9918aSopenharmony_ci            implicit = False
594a5f9918aSopenharmony_ci            if event.data.sequence_start.implicit == 1:
595a5f9918aSopenharmony_ci                implicit = True
596a5f9918aSopenharmony_ci            flow_style = None
597a5f9918aSopenharmony_ci            if event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE:
598a5f9918aSopenharmony_ci                flow_style = True
599a5f9918aSopenharmony_ci            elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE:
600a5f9918aSopenharmony_ci                flow_style = False
601a5f9918aSopenharmony_ci            return SequenceStartEvent(anchor, tag, implicit,
602a5f9918aSopenharmony_ci                    start_mark, end_mark, flow_style)
603a5f9918aSopenharmony_ci        elif event.type == YAML_MAPPING_START_EVENT:
604a5f9918aSopenharmony_ci            anchor = None
605a5f9918aSopenharmony_ci            if event.data.mapping_start.anchor != NULL:
606a5f9918aSopenharmony_ci                anchor = PyUnicode_FromYamlString(event.data.mapping_start.anchor)
607a5f9918aSopenharmony_ci            tag = None
608a5f9918aSopenharmony_ci            if event.data.mapping_start.tag != NULL:
609a5f9918aSopenharmony_ci                tag = PyUnicode_FromYamlString(event.data.mapping_start.tag)
610a5f9918aSopenharmony_ci            implicit = False
611a5f9918aSopenharmony_ci            if event.data.mapping_start.implicit == 1:
612a5f9918aSopenharmony_ci                implicit = True
613a5f9918aSopenharmony_ci            flow_style = None
614a5f9918aSopenharmony_ci            if event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE:
615a5f9918aSopenharmony_ci                flow_style = True
616a5f9918aSopenharmony_ci            elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE:
617a5f9918aSopenharmony_ci                flow_style = False
618a5f9918aSopenharmony_ci            return MappingStartEvent(anchor, tag, implicit,
619a5f9918aSopenharmony_ci                    start_mark, end_mark, flow_style)
620a5f9918aSopenharmony_ci        elif event.type == YAML_SEQUENCE_END_EVENT:
621a5f9918aSopenharmony_ci            return SequenceEndEvent(start_mark, end_mark)
622a5f9918aSopenharmony_ci        elif event.type == YAML_MAPPING_END_EVENT:
623a5f9918aSopenharmony_ci            return MappingEndEvent(start_mark, end_mark)
624a5f9918aSopenharmony_ci        else:
625a5f9918aSopenharmony_ci            raise ValueError(u"unknown event type")
626a5f9918aSopenharmony_ci
627a5f9918aSopenharmony_ci    def get_event(self):
628a5f9918aSopenharmony_ci        if self.current_event is not None:
629a5f9918aSopenharmony_ci            value = self.current_event
630a5f9918aSopenharmony_ci            self.current_event = None
631a5f9918aSopenharmony_ci        else:
632a5f9918aSopenharmony_ci            value = self._parse()
633a5f9918aSopenharmony_ci        return value
634a5f9918aSopenharmony_ci
635a5f9918aSopenharmony_ci    def peek_event(self):
636a5f9918aSopenharmony_ci        if self.current_event is None:
637a5f9918aSopenharmony_ci            self.current_event = self._parse()
638a5f9918aSopenharmony_ci        return self.current_event
639a5f9918aSopenharmony_ci
640a5f9918aSopenharmony_ci    def check_event(self, *choices):
641a5f9918aSopenharmony_ci        if self.current_event is None:
642a5f9918aSopenharmony_ci            self.current_event = self._parse()
643a5f9918aSopenharmony_ci        if self.current_event is None:
644a5f9918aSopenharmony_ci            return False
645a5f9918aSopenharmony_ci        if not choices:
646a5f9918aSopenharmony_ci            return True
647a5f9918aSopenharmony_ci        event_class = self.current_event.__class__
648a5f9918aSopenharmony_ci        for choice in choices:
649a5f9918aSopenharmony_ci            if event_class is choice:
650a5f9918aSopenharmony_ci                return True
651a5f9918aSopenharmony_ci        return False
652a5f9918aSopenharmony_ci
653a5f9918aSopenharmony_ci    def check_node(self):
654a5f9918aSopenharmony_ci        self._parse_next_event()
655a5f9918aSopenharmony_ci        if self.parsed_event.type == YAML_STREAM_START_EVENT:
656a5f9918aSopenharmony_ci            yaml_event_delete(&self.parsed_event)
657a5f9918aSopenharmony_ci            self._parse_next_event()
658a5f9918aSopenharmony_ci        if self.parsed_event.type != YAML_STREAM_END_EVENT:
659a5f9918aSopenharmony_ci            return True
660a5f9918aSopenharmony_ci        return False
661a5f9918aSopenharmony_ci
662a5f9918aSopenharmony_ci    def get_node(self):
663a5f9918aSopenharmony_ci        self._parse_next_event()
664a5f9918aSopenharmony_ci        if self.parsed_event.type != YAML_STREAM_END_EVENT:
665a5f9918aSopenharmony_ci            return self._compose_document()
666a5f9918aSopenharmony_ci
667a5f9918aSopenharmony_ci    def get_single_node(self):
668a5f9918aSopenharmony_ci        self._parse_next_event()
669a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
670a5f9918aSopenharmony_ci        self._parse_next_event()
671a5f9918aSopenharmony_ci        document = None
672a5f9918aSopenharmony_ci        if self.parsed_event.type != YAML_STREAM_END_EVENT:
673a5f9918aSopenharmony_ci            document = self._compose_document()
674a5f9918aSopenharmony_ci        self._parse_next_event()
675a5f9918aSopenharmony_ci        if self.parsed_event.type != YAML_STREAM_END_EVENT:
676a5f9918aSopenharmony_ci            mark = Mark(self.stream_name,
677a5f9918aSopenharmony_ci                    self.parsed_event.start_mark.index,
678a5f9918aSopenharmony_ci                    self.parsed_event.start_mark.line,
679a5f9918aSopenharmony_ci                    self.parsed_event.start_mark.column,
680a5f9918aSopenharmony_ci                    None, None)
681a5f9918aSopenharmony_ci            raise ComposerError(u"expected a single document in the stream",
682a5f9918aSopenharmony_ci                    document.start_mark, u"but found another document", mark)
683a5f9918aSopenharmony_ci        return document
684a5f9918aSopenharmony_ci
685a5f9918aSopenharmony_ci    cdef object _compose_document(self):
686a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
687a5f9918aSopenharmony_ci        node = self._compose_node(None, None)
688a5f9918aSopenharmony_ci        self._parse_next_event()
689a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
690a5f9918aSopenharmony_ci        self.anchors = {}
691a5f9918aSopenharmony_ci        return node
692a5f9918aSopenharmony_ci
693a5f9918aSopenharmony_ci    cdef object _compose_node(self, object parent, object index):
694a5f9918aSopenharmony_ci        self._parse_next_event()
695a5f9918aSopenharmony_ci        if self.parsed_event.type == YAML_ALIAS_EVENT:
696a5f9918aSopenharmony_ci            anchor = PyUnicode_FromYamlString(self.parsed_event.data.alias.anchor)
697a5f9918aSopenharmony_ci            if anchor not in self.anchors:
698a5f9918aSopenharmony_ci                mark = Mark(self.stream_name,
699a5f9918aSopenharmony_ci                        self.parsed_event.start_mark.index,
700a5f9918aSopenharmony_ci                        self.parsed_event.start_mark.line,
701a5f9918aSopenharmony_ci                        self.parsed_event.start_mark.column,
702a5f9918aSopenharmony_ci                        None, None)
703a5f9918aSopenharmony_ci                raise ComposerError(None, None, u"found undefined alias", mark)
704a5f9918aSopenharmony_ci            yaml_event_delete(&self.parsed_event)
705a5f9918aSopenharmony_ci            return self.anchors[anchor]
706a5f9918aSopenharmony_ci        anchor = None
707a5f9918aSopenharmony_ci        if self.parsed_event.type == YAML_SCALAR_EVENT  \
708a5f9918aSopenharmony_ci                and self.parsed_event.data.scalar.anchor != NULL:
709a5f9918aSopenharmony_ci            anchor = PyUnicode_FromYamlString(self.parsed_event.data.scalar.anchor)
710a5f9918aSopenharmony_ci        elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT    \
711a5f9918aSopenharmony_ci                and self.parsed_event.data.sequence_start.anchor != NULL:
712a5f9918aSopenharmony_ci            anchor = PyUnicode_FromYamlString(self.parsed_event.data.sequence_start.anchor)
713a5f9918aSopenharmony_ci        elif self.parsed_event.type == YAML_MAPPING_START_EVENT    \
714a5f9918aSopenharmony_ci                and self.parsed_event.data.mapping_start.anchor != NULL:
715a5f9918aSopenharmony_ci            anchor = PyUnicode_FromYamlString(self.parsed_event.data.mapping_start.anchor)
716a5f9918aSopenharmony_ci        if anchor is not None:
717a5f9918aSopenharmony_ci            if anchor in self.anchors:
718a5f9918aSopenharmony_ci                mark = Mark(self.stream_name,
719a5f9918aSopenharmony_ci                        self.parsed_event.start_mark.index,
720a5f9918aSopenharmony_ci                        self.parsed_event.start_mark.line,
721a5f9918aSopenharmony_ci                        self.parsed_event.start_mark.column,
722a5f9918aSopenharmony_ci                        None, None)
723a5f9918aSopenharmony_ci                raise ComposerError(u"found duplicate anchor; first occurrence",
724a5f9918aSopenharmony_ci                        self.anchors[anchor].start_mark, u"second occurrence", mark)
725a5f9918aSopenharmony_ci        self.descend_resolver(parent, index)
726a5f9918aSopenharmony_ci        if self.parsed_event.type == YAML_SCALAR_EVENT:
727a5f9918aSopenharmony_ci            node = self._compose_scalar_node(anchor)
728a5f9918aSopenharmony_ci        elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT:
729a5f9918aSopenharmony_ci            node = self._compose_sequence_node(anchor)
730a5f9918aSopenharmony_ci        elif self.parsed_event.type == YAML_MAPPING_START_EVENT:
731a5f9918aSopenharmony_ci            node = self._compose_mapping_node(anchor)
732a5f9918aSopenharmony_ci        self.ascend_resolver()
733a5f9918aSopenharmony_ci        return node
734a5f9918aSopenharmony_ci
735a5f9918aSopenharmony_ci    cdef _compose_scalar_node(self, object anchor):
736a5f9918aSopenharmony_ci        start_mark = Mark(self.stream_name,
737a5f9918aSopenharmony_ci                self.parsed_event.start_mark.index,
738a5f9918aSopenharmony_ci                self.parsed_event.start_mark.line,
739a5f9918aSopenharmony_ci                self.parsed_event.start_mark.column,
740a5f9918aSopenharmony_ci                None, None)
741a5f9918aSopenharmony_ci        end_mark = Mark(self.stream_name,
742a5f9918aSopenharmony_ci                self.parsed_event.end_mark.index,
743a5f9918aSopenharmony_ci                self.parsed_event.end_mark.line,
744a5f9918aSopenharmony_ci                self.parsed_event.end_mark.column,
745a5f9918aSopenharmony_ci                None, None)
746a5f9918aSopenharmony_ci        value = PyUnicode_DecodeUTF8(<char *>self.parsed_event.data.scalar.value,
747a5f9918aSopenharmony_ci                self.parsed_event.data.scalar.length, 'strict')
748a5f9918aSopenharmony_ci        plain_implicit = False
749a5f9918aSopenharmony_ci        if self.parsed_event.data.scalar.plain_implicit == 1:
750a5f9918aSopenharmony_ci            plain_implicit = True
751a5f9918aSopenharmony_ci        quoted_implicit = False
752a5f9918aSopenharmony_ci        if self.parsed_event.data.scalar.quoted_implicit == 1:
753a5f9918aSopenharmony_ci            quoted_implicit = True
754a5f9918aSopenharmony_ci        if self.parsed_event.data.scalar.tag == NULL    \
755a5f9918aSopenharmony_ci                or (self.parsed_event.data.scalar.tag[0] == c'!'
756a5f9918aSopenharmony_ci                        and self.parsed_event.data.scalar.tag[1] == c'\0'):
757a5f9918aSopenharmony_ci            tag = self.resolve(ScalarNode, value, (plain_implicit, quoted_implicit))
758a5f9918aSopenharmony_ci        else:
759a5f9918aSopenharmony_ci            tag = PyUnicode_FromYamlString(self.parsed_event.data.scalar.tag)
760a5f9918aSopenharmony_ci        style = None
761a5f9918aSopenharmony_ci        if self.parsed_event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE:
762a5f9918aSopenharmony_ci            style = u''
763a5f9918aSopenharmony_ci        elif self.parsed_event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE:
764a5f9918aSopenharmony_ci            style = u'\''
765a5f9918aSopenharmony_ci        elif self.parsed_event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE:
766a5f9918aSopenharmony_ci            style = u'"'
767a5f9918aSopenharmony_ci        elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE:
768a5f9918aSopenharmony_ci            style = u'|'
769a5f9918aSopenharmony_ci        elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE:
770a5f9918aSopenharmony_ci            style = u'>'
771a5f9918aSopenharmony_ci        node = ScalarNode(tag, value, start_mark, end_mark, style)
772a5f9918aSopenharmony_ci        if anchor is not None:
773a5f9918aSopenharmony_ci            self.anchors[anchor] = node
774a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
775a5f9918aSopenharmony_ci        return node
776a5f9918aSopenharmony_ci
777a5f9918aSopenharmony_ci    cdef _compose_sequence_node(self, object anchor):
778a5f9918aSopenharmony_ci        cdef int index
779a5f9918aSopenharmony_ci        start_mark = Mark(self.stream_name,
780a5f9918aSopenharmony_ci                self.parsed_event.start_mark.index,
781a5f9918aSopenharmony_ci                self.parsed_event.start_mark.line,
782a5f9918aSopenharmony_ci                self.parsed_event.start_mark.column,
783a5f9918aSopenharmony_ci                None, None)
784a5f9918aSopenharmony_ci        implicit = False
785a5f9918aSopenharmony_ci        if self.parsed_event.data.sequence_start.implicit == 1:
786a5f9918aSopenharmony_ci            implicit = True
787a5f9918aSopenharmony_ci        if self.parsed_event.data.sequence_start.tag == NULL    \
788a5f9918aSopenharmony_ci                or (self.parsed_event.data.sequence_start.tag[0] == c'!'
789a5f9918aSopenharmony_ci                        and self.parsed_event.data.sequence_start.tag[1] == c'\0'):
790a5f9918aSopenharmony_ci            tag = self.resolve(SequenceNode, None, implicit)
791a5f9918aSopenharmony_ci        else:
792a5f9918aSopenharmony_ci            tag = PyUnicode_FromYamlString(self.parsed_event.data.sequence_start.tag)
793a5f9918aSopenharmony_ci        flow_style = None
794a5f9918aSopenharmony_ci        if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE:
795a5f9918aSopenharmony_ci            flow_style = True
796a5f9918aSopenharmony_ci        elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE:
797a5f9918aSopenharmony_ci            flow_style = False
798a5f9918aSopenharmony_ci        value = []
799a5f9918aSopenharmony_ci        node = SequenceNode(tag, value, start_mark, None, flow_style)
800a5f9918aSopenharmony_ci        if anchor is not None:
801a5f9918aSopenharmony_ci            self.anchors[anchor] = node
802a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
803a5f9918aSopenharmony_ci        index = 0
804a5f9918aSopenharmony_ci        self._parse_next_event()
805a5f9918aSopenharmony_ci        while self.parsed_event.type != YAML_SEQUENCE_END_EVENT:
806a5f9918aSopenharmony_ci            value.append(self._compose_node(node, index))
807a5f9918aSopenharmony_ci            index = index+1
808a5f9918aSopenharmony_ci            self._parse_next_event()
809a5f9918aSopenharmony_ci        node.end_mark = Mark(self.stream_name,
810a5f9918aSopenharmony_ci                self.parsed_event.end_mark.index,
811a5f9918aSopenharmony_ci                self.parsed_event.end_mark.line,
812a5f9918aSopenharmony_ci                self.parsed_event.end_mark.column,
813a5f9918aSopenharmony_ci                None, None)
814a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
815a5f9918aSopenharmony_ci        return node
816a5f9918aSopenharmony_ci
817a5f9918aSopenharmony_ci    cdef _compose_mapping_node(self, object anchor):
818a5f9918aSopenharmony_ci        start_mark = Mark(self.stream_name,
819a5f9918aSopenharmony_ci                self.parsed_event.start_mark.index,
820a5f9918aSopenharmony_ci                self.parsed_event.start_mark.line,
821a5f9918aSopenharmony_ci                self.parsed_event.start_mark.column,
822a5f9918aSopenharmony_ci                None, None)
823a5f9918aSopenharmony_ci        implicit = False
824a5f9918aSopenharmony_ci        if self.parsed_event.data.mapping_start.implicit == 1:
825a5f9918aSopenharmony_ci            implicit = True
826a5f9918aSopenharmony_ci        if self.parsed_event.data.mapping_start.tag == NULL    \
827a5f9918aSopenharmony_ci                or (self.parsed_event.data.mapping_start.tag[0] == c'!'
828a5f9918aSopenharmony_ci                        and self.parsed_event.data.mapping_start.tag[1] == c'\0'):
829a5f9918aSopenharmony_ci            tag = self.resolve(MappingNode, None, implicit)
830a5f9918aSopenharmony_ci        else:
831a5f9918aSopenharmony_ci            tag = PyUnicode_FromYamlString(self.parsed_event.data.mapping_start.tag)
832a5f9918aSopenharmony_ci        flow_style = None
833a5f9918aSopenharmony_ci        if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE:
834a5f9918aSopenharmony_ci            flow_style = True
835a5f9918aSopenharmony_ci        elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE:
836a5f9918aSopenharmony_ci            flow_style = False
837a5f9918aSopenharmony_ci        value = []
838a5f9918aSopenharmony_ci        node = MappingNode(tag, value, start_mark, None, flow_style)
839a5f9918aSopenharmony_ci        if anchor is not None:
840a5f9918aSopenharmony_ci            self.anchors[anchor] = node
841a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
842a5f9918aSopenharmony_ci        self._parse_next_event()
843a5f9918aSopenharmony_ci        while self.parsed_event.type != YAML_MAPPING_END_EVENT:
844a5f9918aSopenharmony_ci            item_key = self._compose_node(node, None)
845a5f9918aSopenharmony_ci            item_value = self._compose_node(node, item_key)
846a5f9918aSopenharmony_ci            value.append((item_key, item_value))
847a5f9918aSopenharmony_ci            self._parse_next_event()
848a5f9918aSopenharmony_ci        node.end_mark = Mark(self.stream_name,
849a5f9918aSopenharmony_ci                self.parsed_event.end_mark.index,
850a5f9918aSopenharmony_ci                self.parsed_event.end_mark.line,
851a5f9918aSopenharmony_ci                self.parsed_event.end_mark.column,
852a5f9918aSopenharmony_ci                None, None)
853a5f9918aSopenharmony_ci        yaml_event_delete(&self.parsed_event)
854a5f9918aSopenharmony_ci        return node
855a5f9918aSopenharmony_ci
856a5f9918aSopenharmony_ci    cdef int _parse_next_event(self) except 0:
857a5f9918aSopenharmony_ci        if self.parsed_event.type == YAML_NO_EVENT:
858a5f9918aSopenharmony_ci            if yaml_parser_parse(&self.parser, &self.parsed_event) == 0:
859a5f9918aSopenharmony_ci                error = self._parser_error()
860a5f9918aSopenharmony_ci                raise error
861a5f9918aSopenharmony_ci        return 1
862a5f9918aSopenharmony_ci
863a5f9918aSopenharmony_cicdef int input_handler(void *data, unsigned char *buffer, size_t size, size_t *read) except 0:
864a5f9918aSopenharmony_ci    cdef CParser parser
865a5f9918aSopenharmony_ci    parser = <CParser>data
866a5f9918aSopenharmony_ci    if parser.stream_cache is None:
867a5f9918aSopenharmony_ci        value = parser.stream.read(size)
868a5f9918aSopenharmony_ci        if PyUnicode_CheckExact(value) != 0:
869a5f9918aSopenharmony_ci            value = PyUnicode_AsUTF8String(value)
870a5f9918aSopenharmony_ci            parser.unicode_source = 1
871a5f9918aSopenharmony_ci        if PyBytes_CheckExact(value) == 0:
872a5f9918aSopenharmony_ci            raise TypeError(u"a string value is expected")
873a5f9918aSopenharmony_ci        parser.stream_cache = value
874a5f9918aSopenharmony_ci        parser.stream_cache_pos = 0
875a5f9918aSopenharmony_ci        parser.stream_cache_len = PyBytes_GET_SIZE(value)
876a5f9918aSopenharmony_ci    if (parser.stream_cache_len - parser.stream_cache_pos) < <int>size:
877a5f9918aSopenharmony_ci        size = parser.stream_cache_len - parser.stream_cache_pos
878a5f9918aSopenharmony_ci    if size > 0:
879a5f9918aSopenharmony_ci        memcpy(buffer, PyBytes_AS_STRING(parser.stream_cache)
880a5f9918aSopenharmony_ci                            + parser.stream_cache_pos, size)
881a5f9918aSopenharmony_ci    read[0] = size
882a5f9918aSopenharmony_ci    parser.stream_cache_pos += size
883a5f9918aSopenharmony_ci    if parser.stream_cache_pos == parser.stream_cache_len:
884a5f9918aSopenharmony_ci        parser.stream_cache = None
885a5f9918aSopenharmony_ci    return 1
886a5f9918aSopenharmony_ci
887a5f9918aSopenharmony_cicdef class CEmitter:
888a5f9918aSopenharmony_ci
889a5f9918aSopenharmony_ci    cdef yaml_emitter_t emitter
890a5f9918aSopenharmony_ci
891a5f9918aSopenharmony_ci    cdef object stream
892a5f9918aSopenharmony_ci
893a5f9918aSopenharmony_ci    cdef int document_start_implicit
894a5f9918aSopenharmony_ci    cdef int document_end_implicit
895a5f9918aSopenharmony_ci    cdef object use_version
896a5f9918aSopenharmony_ci    cdef object use_tags
897a5f9918aSopenharmony_ci
898a5f9918aSopenharmony_ci    cdef object serialized_nodes
899a5f9918aSopenharmony_ci    cdef object anchors
900a5f9918aSopenharmony_ci    cdef int last_alias_id
901a5f9918aSopenharmony_ci    cdef int closed
902a5f9918aSopenharmony_ci    cdef int dump_unicode
903a5f9918aSopenharmony_ci    cdef object use_encoding
904a5f9918aSopenharmony_ci
905a5f9918aSopenharmony_ci    def __init__(self, stream, canonical=None, indent=None, width=None,
906a5f9918aSopenharmony_ci            allow_unicode=None, line_break=None, encoding=None,
907a5f9918aSopenharmony_ci            explicit_start=None, explicit_end=None, version=None, tags=None):
908a5f9918aSopenharmony_ci        if yaml_emitter_initialize(&self.emitter) == 0:
909a5f9918aSopenharmony_ci            raise MemoryError
910a5f9918aSopenharmony_ci        self.stream = stream
911a5f9918aSopenharmony_ci        self.dump_unicode = 0
912a5f9918aSopenharmony_ci        if hasattr(stream, u'encoding'):
913a5f9918aSopenharmony_ci            self.dump_unicode = 1
914a5f9918aSopenharmony_ci        self.use_encoding = encoding
915a5f9918aSopenharmony_ci        yaml_emitter_set_output(&self.emitter, output_handler, <void *>self)    
916a5f9918aSopenharmony_ci        if canonical:
917a5f9918aSopenharmony_ci            yaml_emitter_set_canonical(&self.emitter, 1)
918a5f9918aSopenharmony_ci        if indent is not None:
919a5f9918aSopenharmony_ci            yaml_emitter_set_indent(&self.emitter, indent)
920a5f9918aSopenharmony_ci        if width is not None:
921a5f9918aSopenharmony_ci            yaml_emitter_set_width(&self.emitter, width)
922a5f9918aSopenharmony_ci        if allow_unicode:
923a5f9918aSopenharmony_ci            yaml_emitter_set_unicode(&self.emitter, 1)
924a5f9918aSopenharmony_ci        if line_break is not None:
925a5f9918aSopenharmony_ci            if line_break == '\r':
926a5f9918aSopenharmony_ci                yaml_emitter_set_break(&self.emitter, YAML_CR_BREAK)
927a5f9918aSopenharmony_ci            elif line_break == '\n':
928a5f9918aSopenharmony_ci                yaml_emitter_set_break(&self.emitter, YAML_LN_BREAK)
929a5f9918aSopenharmony_ci            elif line_break == '\r\n':
930a5f9918aSopenharmony_ci                yaml_emitter_set_break(&self.emitter, YAML_CRLN_BREAK)
931a5f9918aSopenharmony_ci        self.document_start_implicit = 1
932a5f9918aSopenharmony_ci        if explicit_start:
933a5f9918aSopenharmony_ci            self.document_start_implicit = 0
934a5f9918aSopenharmony_ci        self.document_end_implicit = 1
935a5f9918aSopenharmony_ci        if explicit_end:
936a5f9918aSopenharmony_ci            self.document_end_implicit = 0
937a5f9918aSopenharmony_ci        self.use_version = version
938a5f9918aSopenharmony_ci        self.use_tags = tags
939a5f9918aSopenharmony_ci        self.serialized_nodes = {}
940a5f9918aSopenharmony_ci        self.anchors = {}
941a5f9918aSopenharmony_ci        self.last_alias_id = 0
942a5f9918aSopenharmony_ci        self.closed = -1
943a5f9918aSopenharmony_ci
944a5f9918aSopenharmony_ci    def __dealloc__(self):
945a5f9918aSopenharmony_ci        yaml_emitter_delete(&self.emitter)
946a5f9918aSopenharmony_ci
947a5f9918aSopenharmony_ci    def dispose(self):
948a5f9918aSopenharmony_ci        pass
949a5f9918aSopenharmony_ci
950a5f9918aSopenharmony_ci    cdef object _emitter_error(self):
951a5f9918aSopenharmony_ci        if self.emitter.error == YAML_MEMORY_ERROR:
952a5f9918aSopenharmony_ci            return MemoryError
953a5f9918aSopenharmony_ci        elif self.emitter.error == YAML_EMITTER_ERROR:
954a5f9918aSopenharmony_ci            problem = PyUnicode_FromString(self.emitter.problem)
955a5f9918aSopenharmony_ci            return EmitterError(problem)
956a5f9918aSopenharmony_ci        raise ValueError(u"no emitter error")
957a5f9918aSopenharmony_ci
958a5f9918aSopenharmony_ci    cdef int _object_to_event(self, object event_object, yaml_event_t *event) except 0:
959a5f9918aSopenharmony_ci        cdef yaml_encoding_t encoding
960a5f9918aSopenharmony_ci        cdef yaml_version_directive_t version_directive_value
961a5f9918aSopenharmony_ci        cdef yaml_version_directive_t *version_directive
962a5f9918aSopenharmony_ci        cdef yaml_tag_directive_t tag_directives_value[128]
963a5f9918aSopenharmony_ci        cdef yaml_tag_directive_t *tag_directives_start
964a5f9918aSopenharmony_ci        cdef yaml_tag_directive_t *tag_directives_end
965a5f9918aSopenharmony_ci        cdef int implicit
966a5f9918aSopenharmony_ci        cdef int plain_implicit
967a5f9918aSopenharmony_ci        cdef int quoted_implicit
968a5f9918aSopenharmony_ci        cdef yaml_char_t *anchor
969a5f9918aSopenharmony_ci        cdef yaml_char_t *tag
970a5f9918aSopenharmony_ci        cdef yaml_char_t *value
971a5f9918aSopenharmony_ci        cdef int length
972a5f9918aSopenharmony_ci        cdef yaml_scalar_style_t scalar_style
973a5f9918aSopenharmony_ci        cdef yaml_sequence_style_t sequence_style
974a5f9918aSopenharmony_ci        cdef yaml_mapping_style_t mapping_style
975a5f9918aSopenharmony_ci        event_class = event_object.__class__
976a5f9918aSopenharmony_ci        if event_class is StreamStartEvent:
977a5f9918aSopenharmony_ci            encoding = YAML_UTF8_ENCODING
978a5f9918aSopenharmony_ci            if event_object.encoding == u'utf-16-le' or event_object.encoding == 'utf-16-le':
979a5f9918aSopenharmony_ci                encoding = YAML_UTF16LE_ENCODING
980a5f9918aSopenharmony_ci            elif event_object.encoding == u'utf-16-be' or event_object.encoding == 'utf-16-be':
981a5f9918aSopenharmony_ci                encoding = YAML_UTF16BE_ENCODING
982a5f9918aSopenharmony_ci            if event_object.encoding is None:
983a5f9918aSopenharmony_ci                self.dump_unicode = 1
984a5f9918aSopenharmony_ci            if self.dump_unicode == 1:
985a5f9918aSopenharmony_ci                encoding = YAML_UTF8_ENCODING
986a5f9918aSopenharmony_ci            yaml_stream_start_event_initialize(event, encoding)
987a5f9918aSopenharmony_ci        elif event_class is StreamEndEvent:
988a5f9918aSopenharmony_ci            yaml_stream_end_event_initialize(event)
989a5f9918aSopenharmony_ci        elif event_class is DocumentStartEvent:
990a5f9918aSopenharmony_ci            version_directive = NULL
991a5f9918aSopenharmony_ci            if event_object.version:
992a5f9918aSopenharmony_ci                version_directive_value.major = event_object.version[0]
993a5f9918aSopenharmony_ci                version_directive_value.minor = event_object.version[1]
994a5f9918aSopenharmony_ci                version_directive = &version_directive_value
995a5f9918aSopenharmony_ci            tag_directives_start = NULL
996a5f9918aSopenharmony_ci            tag_directives_end = NULL
997a5f9918aSopenharmony_ci            if event_object.tags:
998a5f9918aSopenharmony_ci                if len(event_object.tags) > 128:
999a5f9918aSopenharmony_ci                    raise ValueError(u"too many tags")
1000a5f9918aSopenharmony_ci                tag_directives_start = tag_directives_value
1001a5f9918aSopenharmony_ci                tag_directives_end = tag_directives_value
1002a5f9918aSopenharmony_ci                cache = []
1003a5f9918aSopenharmony_ci                for handle in event_object.tags:
1004a5f9918aSopenharmony_ci                    prefix = event_object.tags[handle]
1005a5f9918aSopenharmony_ci                    if PyUnicode_CheckExact(handle):
1006a5f9918aSopenharmony_ci                        handle = PyUnicode_AsUTF8String(handle)
1007a5f9918aSopenharmony_ci                        cache.append(handle)
1008a5f9918aSopenharmony_ci                    if not PyBytes_CheckExact(handle):
1009a5f9918aSopenharmony_ci                        raise TypeError(u"tag handle must be a string")
1010a5f9918aSopenharmony_ci                    tag_directives_end.handle = PyBytes_AS_Yaml_STRING(handle)
1011a5f9918aSopenharmony_ci                    if PyUnicode_CheckExact(prefix):
1012a5f9918aSopenharmony_ci                        prefix = PyUnicode_AsUTF8String(prefix)
1013a5f9918aSopenharmony_ci                        cache.append(prefix)
1014a5f9918aSopenharmony_ci                    if not PyBytes_CheckExact(prefix):
1015a5f9918aSopenharmony_ci                        raise TypeError(u"tag prefix must be a string")
1016a5f9918aSopenharmony_ci                    tag_directives_end.prefix = PyBytes_AS_Yaml_STRING(prefix)
1017a5f9918aSopenharmony_ci                    tag_directives_end = tag_directives_end+1
1018a5f9918aSopenharmony_ci            implicit = 1
1019a5f9918aSopenharmony_ci            if event_object.explicit:
1020a5f9918aSopenharmony_ci                implicit = 0
1021a5f9918aSopenharmony_ci            if yaml_document_start_event_initialize(event, version_directive,
1022a5f9918aSopenharmony_ci                    tag_directives_start, tag_directives_end, implicit) == 0:
1023a5f9918aSopenharmony_ci                raise MemoryError
1024a5f9918aSopenharmony_ci        elif event_class is DocumentEndEvent:
1025a5f9918aSopenharmony_ci            implicit = 1
1026a5f9918aSopenharmony_ci            if event_object.explicit:
1027a5f9918aSopenharmony_ci                implicit = 0
1028a5f9918aSopenharmony_ci            yaml_document_end_event_initialize(event, implicit)
1029a5f9918aSopenharmony_ci        elif event_class is AliasEvent:
1030a5f9918aSopenharmony_ci            anchor = NULL
1031a5f9918aSopenharmony_ci            anchor_object = event_object.anchor
1032a5f9918aSopenharmony_ci            if PyUnicode_CheckExact(anchor_object):
1033a5f9918aSopenharmony_ci                anchor_object = PyUnicode_AsUTF8String(anchor_object)
1034a5f9918aSopenharmony_ci            if not PyBytes_CheckExact(anchor_object):
1035a5f9918aSopenharmony_ci                raise TypeError(u"anchor must be a string")
1036a5f9918aSopenharmony_ci            anchor = PyBytes_AS_Yaml_STRING(anchor_object)
1037a5f9918aSopenharmony_ci            if yaml_alias_event_initialize(event, anchor) == 0:
1038a5f9918aSopenharmony_ci                raise MemoryError
1039a5f9918aSopenharmony_ci        elif event_class is ScalarEvent:
1040a5f9918aSopenharmony_ci            anchor = NULL
1041a5f9918aSopenharmony_ci            anchor_object = event_object.anchor
1042a5f9918aSopenharmony_ci            if anchor_object is not None:
1043a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(anchor_object):
1044a5f9918aSopenharmony_ci                    anchor_object = PyUnicode_AsUTF8String(anchor_object)
1045a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(anchor_object):
1046a5f9918aSopenharmony_ci                    raise TypeError(u"anchor must be a string")
1047a5f9918aSopenharmony_ci                anchor = PyBytes_AS_Yaml_STRING(anchor_object)
1048a5f9918aSopenharmony_ci            tag = NULL
1049a5f9918aSopenharmony_ci            tag_object = event_object.tag
1050a5f9918aSopenharmony_ci            if tag_object is not None:
1051a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(tag_object):
1052a5f9918aSopenharmony_ci                    tag_object = PyUnicode_AsUTF8String(tag_object)
1053a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(tag_object):
1054a5f9918aSopenharmony_ci                    raise TypeError(u"tag must be a string")
1055a5f9918aSopenharmony_ci                tag = PyBytes_AS_Yaml_STRING(tag_object)
1056a5f9918aSopenharmony_ci            value_object = event_object.value
1057a5f9918aSopenharmony_ci            if PyUnicode_CheckExact(value_object):
1058a5f9918aSopenharmony_ci                value_object = PyUnicode_AsUTF8String(value_object)
1059a5f9918aSopenharmony_ci            if not PyBytes_CheckExact(value_object):
1060a5f9918aSopenharmony_ci                raise TypeError(u"value must be a string")
1061a5f9918aSopenharmony_ci            value = PyBytes_AS_Yaml_STRING(value_object)
1062a5f9918aSopenharmony_ci            length = PyBytes_GET_SIZE(value_object)
1063a5f9918aSopenharmony_ci            plain_implicit = 0
1064a5f9918aSopenharmony_ci            quoted_implicit = 0
1065a5f9918aSopenharmony_ci            if event_object.implicit is not None:
1066a5f9918aSopenharmony_ci                plain_implicit = event_object.implicit[0]
1067a5f9918aSopenharmony_ci                quoted_implicit = event_object.implicit[1]
1068a5f9918aSopenharmony_ci            style_object = event_object.style
1069a5f9918aSopenharmony_ci            scalar_style = YAML_PLAIN_SCALAR_STYLE
1070a5f9918aSopenharmony_ci            if style_object == "'" or style_object == u"'":
1071a5f9918aSopenharmony_ci                scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE
1072a5f9918aSopenharmony_ci            elif style_object == "\"" or style_object == u"\"":
1073a5f9918aSopenharmony_ci                scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE
1074a5f9918aSopenharmony_ci            elif style_object == "|" or style_object == u"|":
1075a5f9918aSopenharmony_ci                scalar_style = YAML_LITERAL_SCALAR_STYLE
1076a5f9918aSopenharmony_ci            elif style_object == ">" or style_object == u">":
1077a5f9918aSopenharmony_ci                scalar_style = YAML_FOLDED_SCALAR_STYLE
1078a5f9918aSopenharmony_ci            if yaml_scalar_event_initialize(event, anchor, tag, value, length,
1079a5f9918aSopenharmony_ci                    plain_implicit, quoted_implicit, scalar_style) == 0:
1080a5f9918aSopenharmony_ci                raise MemoryError
1081a5f9918aSopenharmony_ci        elif event_class is SequenceStartEvent:
1082a5f9918aSopenharmony_ci            anchor = NULL
1083a5f9918aSopenharmony_ci            anchor_object = event_object.anchor
1084a5f9918aSopenharmony_ci            if anchor_object is not None:
1085a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(anchor_object):
1086a5f9918aSopenharmony_ci                    anchor_object = PyUnicode_AsUTF8String(anchor_object)
1087a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(anchor_object):
1088a5f9918aSopenharmony_ci                    raise TypeError(u"anchor must be a string")
1089a5f9918aSopenharmony_ci                anchor = PyBytes_AS_Yaml_STRING(anchor_object)
1090a5f9918aSopenharmony_ci            tag = NULL
1091a5f9918aSopenharmony_ci            tag_object = event_object.tag
1092a5f9918aSopenharmony_ci            if tag_object is not None:
1093a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(tag_object):
1094a5f9918aSopenharmony_ci                    tag_object = PyUnicode_AsUTF8String(tag_object)
1095a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(tag_object):
1096a5f9918aSopenharmony_ci                    raise TypeError(u"tag must be a string")
1097a5f9918aSopenharmony_ci                tag = PyBytes_AS_Yaml_STRING(tag_object)
1098a5f9918aSopenharmony_ci            implicit = 0
1099a5f9918aSopenharmony_ci            if event_object.implicit:
1100a5f9918aSopenharmony_ci                implicit = 1
1101a5f9918aSopenharmony_ci            sequence_style = YAML_BLOCK_SEQUENCE_STYLE
1102a5f9918aSopenharmony_ci            if event_object.flow_style:
1103a5f9918aSopenharmony_ci                sequence_style = YAML_FLOW_SEQUENCE_STYLE
1104a5f9918aSopenharmony_ci            if yaml_sequence_start_event_initialize(event, anchor, tag,
1105a5f9918aSopenharmony_ci                    implicit, sequence_style) == 0:
1106a5f9918aSopenharmony_ci                raise MemoryError
1107a5f9918aSopenharmony_ci        elif event_class is MappingStartEvent:
1108a5f9918aSopenharmony_ci            anchor = NULL
1109a5f9918aSopenharmony_ci            anchor_object = event_object.anchor
1110a5f9918aSopenharmony_ci            if anchor_object is not None:
1111a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(anchor_object):
1112a5f9918aSopenharmony_ci                    anchor_object = PyUnicode_AsUTF8String(anchor_object)
1113a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(anchor_object):
1114a5f9918aSopenharmony_ci                    raise TypeError(u"anchor must be a string")
1115a5f9918aSopenharmony_ci                anchor = PyBytes_AS_Yaml_STRING(anchor_object)
1116a5f9918aSopenharmony_ci            tag = NULL
1117a5f9918aSopenharmony_ci            tag_object = event_object.tag
1118a5f9918aSopenharmony_ci            if tag_object is not None:
1119a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(tag_object):
1120a5f9918aSopenharmony_ci                    tag_object = PyUnicode_AsUTF8String(tag_object)
1121a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(tag_object):
1122a5f9918aSopenharmony_ci                    raise TypeError(u"tag must be a string")
1123a5f9918aSopenharmony_ci                tag = PyBytes_AS_Yaml_STRING(tag_object)
1124a5f9918aSopenharmony_ci            implicit = 0
1125a5f9918aSopenharmony_ci            if event_object.implicit:
1126a5f9918aSopenharmony_ci                implicit = 1
1127a5f9918aSopenharmony_ci            mapping_style = YAML_BLOCK_MAPPING_STYLE
1128a5f9918aSopenharmony_ci            if event_object.flow_style:
1129a5f9918aSopenharmony_ci                mapping_style = YAML_FLOW_MAPPING_STYLE
1130a5f9918aSopenharmony_ci            if yaml_mapping_start_event_initialize(event, anchor, tag,
1131a5f9918aSopenharmony_ci                    implicit, mapping_style) == 0:
1132a5f9918aSopenharmony_ci                raise MemoryError
1133a5f9918aSopenharmony_ci        elif event_class is SequenceEndEvent:
1134a5f9918aSopenharmony_ci            yaml_sequence_end_event_initialize(event)
1135a5f9918aSopenharmony_ci        elif event_class is MappingEndEvent:
1136a5f9918aSopenharmony_ci            yaml_mapping_end_event_initialize(event)
1137a5f9918aSopenharmony_ci        else:
1138a5f9918aSopenharmony_ci            raise TypeError(u"invalid event %s" % event_object)
1139a5f9918aSopenharmony_ci        return 1
1140a5f9918aSopenharmony_ci
1141a5f9918aSopenharmony_ci    def emit(self, event_object):
1142a5f9918aSopenharmony_ci        cdef yaml_event_t event
1143a5f9918aSopenharmony_ci        self._object_to_event(event_object, &event)
1144a5f9918aSopenharmony_ci        if yaml_emitter_emit(&self.emitter, &event) == 0:
1145a5f9918aSopenharmony_ci            error = self._emitter_error()
1146a5f9918aSopenharmony_ci            raise error
1147a5f9918aSopenharmony_ci
1148a5f9918aSopenharmony_ci    def open(self):
1149a5f9918aSopenharmony_ci        cdef yaml_event_t event
1150a5f9918aSopenharmony_ci        cdef yaml_encoding_t encoding
1151a5f9918aSopenharmony_ci        if self.closed == -1:
1152a5f9918aSopenharmony_ci            if self.use_encoding == u'utf-16-le' or self.use_encoding == 'utf-16-le':
1153a5f9918aSopenharmony_ci                encoding = YAML_UTF16LE_ENCODING
1154a5f9918aSopenharmony_ci            elif self.use_encoding == u'utf-16-be' or self.use_encoding == 'utf-16-be':
1155a5f9918aSopenharmony_ci                encoding = YAML_UTF16BE_ENCODING
1156a5f9918aSopenharmony_ci            else:
1157a5f9918aSopenharmony_ci                encoding = YAML_UTF8_ENCODING
1158a5f9918aSopenharmony_ci            if self.use_encoding is None:
1159a5f9918aSopenharmony_ci                self.dump_unicode = 1
1160a5f9918aSopenharmony_ci            if self.dump_unicode == 1:
1161a5f9918aSopenharmony_ci                encoding = YAML_UTF8_ENCODING
1162a5f9918aSopenharmony_ci            yaml_stream_start_event_initialize(&event, encoding)
1163a5f9918aSopenharmony_ci            if yaml_emitter_emit(&self.emitter, &event) == 0:
1164a5f9918aSopenharmony_ci                error = self._emitter_error()
1165a5f9918aSopenharmony_ci                raise error
1166a5f9918aSopenharmony_ci            self.closed = 0
1167a5f9918aSopenharmony_ci        elif self.closed == 1:
1168a5f9918aSopenharmony_ci            raise SerializerError(u"serializer is closed")
1169a5f9918aSopenharmony_ci        else:
1170a5f9918aSopenharmony_ci            raise SerializerError(u"serializer is already opened")
1171a5f9918aSopenharmony_ci
1172a5f9918aSopenharmony_ci    def close(self):
1173a5f9918aSopenharmony_ci        cdef yaml_event_t event
1174a5f9918aSopenharmony_ci        if self.closed == -1:
1175a5f9918aSopenharmony_ci            raise SerializerError(u"serializer is not opened")
1176a5f9918aSopenharmony_ci        elif self.closed == 0:
1177a5f9918aSopenharmony_ci            yaml_stream_end_event_initialize(&event)
1178a5f9918aSopenharmony_ci            if yaml_emitter_emit(&self.emitter, &event) == 0:
1179a5f9918aSopenharmony_ci                error = self._emitter_error()
1180a5f9918aSopenharmony_ci                raise error
1181a5f9918aSopenharmony_ci            self.closed = 1
1182a5f9918aSopenharmony_ci
1183a5f9918aSopenharmony_ci    def serialize(self, node):
1184a5f9918aSopenharmony_ci        cdef yaml_event_t event
1185a5f9918aSopenharmony_ci        cdef yaml_version_directive_t version_directive_value
1186a5f9918aSopenharmony_ci        cdef yaml_version_directive_t *version_directive
1187a5f9918aSopenharmony_ci        cdef yaml_tag_directive_t tag_directives_value[128]
1188a5f9918aSopenharmony_ci        cdef yaml_tag_directive_t *tag_directives_start
1189a5f9918aSopenharmony_ci        cdef yaml_tag_directive_t *tag_directives_end
1190a5f9918aSopenharmony_ci        if self.closed == -1:
1191a5f9918aSopenharmony_ci            raise SerializerError(u"serializer is not opened")
1192a5f9918aSopenharmony_ci        elif self.closed == 1:
1193a5f9918aSopenharmony_ci            raise SerializerError(u"serializer is closed")
1194a5f9918aSopenharmony_ci        cache = []
1195a5f9918aSopenharmony_ci        version_directive = NULL
1196a5f9918aSopenharmony_ci        if self.use_version:
1197a5f9918aSopenharmony_ci            version_directive_value.major = self.use_version[0]
1198a5f9918aSopenharmony_ci            version_directive_value.minor = self.use_version[1]
1199a5f9918aSopenharmony_ci            version_directive = &version_directive_value
1200a5f9918aSopenharmony_ci        tag_directives_start = NULL
1201a5f9918aSopenharmony_ci        tag_directives_end = NULL
1202a5f9918aSopenharmony_ci        if self.use_tags:
1203a5f9918aSopenharmony_ci            if len(self.use_tags) > 128:
1204a5f9918aSopenharmony_ci                raise ValueError(u"too many tags")
1205a5f9918aSopenharmony_ci            tag_directives_start = tag_directives_value
1206a5f9918aSopenharmony_ci            tag_directives_end = tag_directives_value
1207a5f9918aSopenharmony_ci            for handle in self.use_tags:
1208a5f9918aSopenharmony_ci                prefix = self.use_tags[handle]
1209a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(handle):
1210a5f9918aSopenharmony_ci                    handle = PyUnicode_AsUTF8String(handle)
1211a5f9918aSopenharmony_ci                    cache.append(handle)
1212a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(handle):
1213a5f9918aSopenharmony_ci                    raise TypeError(u"tag handle must be a string")
1214a5f9918aSopenharmony_ci                tag_directives_end.handle = PyBytes_AS_Yaml_STRING(handle)
1215a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(prefix):
1216a5f9918aSopenharmony_ci                    prefix = PyUnicode_AsUTF8String(prefix)
1217a5f9918aSopenharmony_ci                    cache.append(prefix)
1218a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(prefix):
1219a5f9918aSopenharmony_ci                    raise TypeError(u"tag prefix must be a string")
1220a5f9918aSopenharmony_ci                tag_directives_end.prefix = PyBytes_AS_Yaml_STRING(prefix)
1221a5f9918aSopenharmony_ci                tag_directives_end = tag_directives_end+1
1222a5f9918aSopenharmony_ci        if yaml_document_start_event_initialize(&event, version_directive,
1223a5f9918aSopenharmony_ci                tag_directives_start, tag_directives_end,
1224a5f9918aSopenharmony_ci                self.document_start_implicit) == 0:
1225a5f9918aSopenharmony_ci            raise MemoryError
1226a5f9918aSopenharmony_ci        if yaml_emitter_emit(&self.emitter, &event) == 0:
1227a5f9918aSopenharmony_ci            error = self._emitter_error()
1228a5f9918aSopenharmony_ci            raise error
1229a5f9918aSopenharmony_ci        self._anchor_node(node)
1230a5f9918aSopenharmony_ci        self._serialize_node(node, None, None)
1231a5f9918aSopenharmony_ci        yaml_document_end_event_initialize(&event, self.document_end_implicit)
1232a5f9918aSopenharmony_ci        if yaml_emitter_emit(&self.emitter, &event) == 0:
1233a5f9918aSopenharmony_ci            error = self._emitter_error()
1234a5f9918aSopenharmony_ci            raise error
1235a5f9918aSopenharmony_ci        self.serialized_nodes = {}
1236a5f9918aSopenharmony_ci        self.anchors = {}
1237a5f9918aSopenharmony_ci        self.last_alias_id = 0
1238a5f9918aSopenharmony_ci
1239a5f9918aSopenharmony_ci    cdef int _anchor_node(self, object node) except 0:
1240a5f9918aSopenharmony_ci        if node in self.anchors:
1241a5f9918aSopenharmony_ci            if self.anchors[node] is None:
1242a5f9918aSopenharmony_ci                self.last_alias_id = self.last_alias_id+1
1243a5f9918aSopenharmony_ci                self.anchors[node] = u"id%03d" % self.last_alias_id
1244a5f9918aSopenharmony_ci        else:
1245a5f9918aSopenharmony_ci            self.anchors[node] = None
1246a5f9918aSopenharmony_ci            node_class = node.__class__
1247a5f9918aSopenharmony_ci            if node_class is SequenceNode:
1248a5f9918aSopenharmony_ci                for item in node.value:
1249a5f9918aSopenharmony_ci                    self._anchor_node(item)
1250a5f9918aSopenharmony_ci            elif node_class is MappingNode:
1251a5f9918aSopenharmony_ci                for key, value in node.value:
1252a5f9918aSopenharmony_ci                    self._anchor_node(key)
1253a5f9918aSopenharmony_ci                    self._anchor_node(value)
1254a5f9918aSopenharmony_ci        return 1
1255a5f9918aSopenharmony_ci
1256a5f9918aSopenharmony_ci    cdef int _serialize_node(self, object node, object parent, object index) except 0:
1257a5f9918aSopenharmony_ci        cdef yaml_event_t event
1258a5f9918aSopenharmony_ci        cdef int implicit
1259a5f9918aSopenharmony_ci        cdef int plain_implicit
1260a5f9918aSopenharmony_ci        cdef int quoted_implicit
1261a5f9918aSopenharmony_ci        cdef yaml_char_t *anchor
1262a5f9918aSopenharmony_ci        cdef yaml_char_t *tag
1263a5f9918aSopenharmony_ci        cdef yaml_char_t *value
1264a5f9918aSopenharmony_ci        cdef int length
1265a5f9918aSopenharmony_ci        cdef int item_index
1266a5f9918aSopenharmony_ci        cdef yaml_scalar_style_t scalar_style
1267a5f9918aSopenharmony_ci        cdef yaml_sequence_style_t sequence_style
1268a5f9918aSopenharmony_ci        cdef yaml_mapping_style_t mapping_style
1269a5f9918aSopenharmony_ci        anchor_object = self.anchors[node]
1270a5f9918aSopenharmony_ci        anchor = NULL
1271a5f9918aSopenharmony_ci        if anchor_object is not None:
1272a5f9918aSopenharmony_ci            if PyUnicode_CheckExact(anchor_object):
1273a5f9918aSopenharmony_ci                anchor_object = PyUnicode_AsUTF8String(anchor_object)
1274a5f9918aSopenharmony_ci            if not PyBytes_CheckExact(anchor_object):
1275a5f9918aSopenharmony_ci                raise TypeError(u"anchor must be a string")
1276a5f9918aSopenharmony_ci            anchor = PyBytes_AS_Yaml_STRING(anchor_object)
1277a5f9918aSopenharmony_ci        if node in self.serialized_nodes:
1278a5f9918aSopenharmony_ci            if yaml_alias_event_initialize(&event, anchor) == 0:
1279a5f9918aSopenharmony_ci                raise MemoryError
1280a5f9918aSopenharmony_ci            if yaml_emitter_emit(&self.emitter, &event) == 0:
1281a5f9918aSopenharmony_ci                error = self._emitter_error()
1282a5f9918aSopenharmony_ci                raise error
1283a5f9918aSopenharmony_ci        else:
1284a5f9918aSopenharmony_ci            node_class = node.__class__
1285a5f9918aSopenharmony_ci            self.serialized_nodes[node] = True
1286a5f9918aSopenharmony_ci            self.descend_resolver(parent, index)
1287a5f9918aSopenharmony_ci            if node_class is ScalarNode:
1288a5f9918aSopenharmony_ci                plain_implicit = 0
1289a5f9918aSopenharmony_ci                quoted_implicit = 0
1290a5f9918aSopenharmony_ci                tag_object = node.tag
1291a5f9918aSopenharmony_ci                if self.resolve(ScalarNode, node.value, (True, False)) == tag_object:
1292a5f9918aSopenharmony_ci                    plain_implicit = 1
1293a5f9918aSopenharmony_ci                if self.resolve(ScalarNode, node.value, (False, True)) == tag_object:
1294a5f9918aSopenharmony_ci                    quoted_implicit = 1
1295a5f9918aSopenharmony_ci                tag = NULL
1296a5f9918aSopenharmony_ci                if tag_object is not None:
1297a5f9918aSopenharmony_ci                    if PyUnicode_CheckExact(tag_object):
1298a5f9918aSopenharmony_ci                        tag_object = PyUnicode_AsUTF8String(tag_object)
1299a5f9918aSopenharmony_ci                    if not PyBytes_CheckExact(tag_object):
1300a5f9918aSopenharmony_ci                        raise TypeError(u"tag must be a string")
1301a5f9918aSopenharmony_ci                    tag = PyBytes_AS_Yaml_STRING(tag_object)
1302a5f9918aSopenharmony_ci                value_object = node.value
1303a5f9918aSopenharmony_ci                if PyUnicode_CheckExact(value_object):
1304a5f9918aSopenharmony_ci                    value_object = PyUnicode_AsUTF8String(value_object)
1305a5f9918aSopenharmony_ci                if not PyBytes_CheckExact(value_object):
1306a5f9918aSopenharmony_ci                    raise TypeError(u"value must be a string")
1307a5f9918aSopenharmony_ci                value = PyBytes_AS_Yaml_STRING(value_object)
1308a5f9918aSopenharmony_ci                length = PyBytes_GET_SIZE(value_object)
1309a5f9918aSopenharmony_ci                style_object = node.style
1310a5f9918aSopenharmony_ci                scalar_style = YAML_PLAIN_SCALAR_STYLE
1311a5f9918aSopenharmony_ci                if style_object == "'" or style_object == u"'":
1312a5f9918aSopenharmony_ci                    scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE
1313a5f9918aSopenharmony_ci                elif style_object == "\"" or style_object == u"\"":
1314a5f9918aSopenharmony_ci                    scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE
1315a5f9918aSopenharmony_ci                elif style_object == "|" or style_object == u"|":
1316a5f9918aSopenharmony_ci                    scalar_style = YAML_LITERAL_SCALAR_STYLE
1317a5f9918aSopenharmony_ci                elif style_object == ">" or style_object == u">":
1318a5f9918aSopenharmony_ci                    scalar_style = YAML_FOLDED_SCALAR_STYLE
1319a5f9918aSopenharmony_ci                if yaml_scalar_event_initialize(&event, anchor, tag, value, length,
1320a5f9918aSopenharmony_ci                        plain_implicit, quoted_implicit, scalar_style) == 0:
1321a5f9918aSopenharmony_ci                    raise MemoryError
1322a5f9918aSopenharmony_ci                if yaml_emitter_emit(&self.emitter, &event) == 0:
1323a5f9918aSopenharmony_ci                    error = self._emitter_error()
1324a5f9918aSopenharmony_ci                    raise error
1325a5f9918aSopenharmony_ci            elif node_class is SequenceNode:
1326a5f9918aSopenharmony_ci                implicit = 0
1327a5f9918aSopenharmony_ci                tag_object = node.tag
1328a5f9918aSopenharmony_ci                if self.resolve(SequenceNode, node.value, True) == tag_object:
1329a5f9918aSopenharmony_ci                    implicit = 1
1330a5f9918aSopenharmony_ci                tag = NULL
1331a5f9918aSopenharmony_ci                if tag_object is not None:
1332a5f9918aSopenharmony_ci                    if PyUnicode_CheckExact(tag_object):
1333a5f9918aSopenharmony_ci                        tag_object = PyUnicode_AsUTF8String(tag_object)
1334a5f9918aSopenharmony_ci                    if not PyBytes_CheckExact(tag_object):
1335a5f9918aSopenharmony_ci                        raise TypeError(u"tag must be a string")
1336a5f9918aSopenharmony_ci                    tag = PyBytes_AS_Yaml_STRING(tag_object)
1337a5f9918aSopenharmony_ci                sequence_style = YAML_BLOCK_SEQUENCE_STYLE
1338a5f9918aSopenharmony_ci                if node.flow_style:
1339a5f9918aSopenharmony_ci                    sequence_style = YAML_FLOW_SEQUENCE_STYLE
1340a5f9918aSopenharmony_ci                if yaml_sequence_start_event_initialize(&event, anchor, tag,
1341a5f9918aSopenharmony_ci                        implicit, sequence_style) == 0:
1342a5f9918aSopenharmony_ci                    raise MemoryError
1343a5f9918aSopenharmony_ci                if yaml_emitter_emit(&self.emitter, &event) == 0:
1344a5f9918aSopenharmony_ci                    error = self._emitter_error()
1345a5f9918aSopenharmony_ci                    raise error
1346a5f9918aSopenharmony_ci                item_index = 0
1347a5f9918aSopenharmony_ci                for item in node.value:
1348a5f9918aSopenharmony_ci                    self._serialize_node(item, node, item_index)
1349a5f9918aSopenharmony_ci                    item_index = item_index+1
1350a5f9918aSopenharmony_ci                yaml_sequence_end_event_initialize(&event)
1351a5f9918aSopenharmony_ci                if yaml_emitter_emit(&self.emitter, &event) == 0:
1352a5f9918aSopenharmony_ci                    error = self._emitter_error()
1353a5f9918aSopenharmony_ci                    raise error
1354a5f9918aSopenharmony_ci            elif node_class is MappingNode:
1355a5f9918aSopenharmony_ci                implicit = 0
1356a5f9918aSopenharmony_ci                tag_object = node.tag
1357a5f9918aSopenharmony_ci                if self.resolve(MappingNode, node.value, True) == tag_object:
1358a5f9918aSopenharmony_ci                    implicit = 1
1359a5f9918aSopenharmony_ci                tag = NULL
1360a5f9918aSopenharmony_ci                if tag_object is not None:
1361a5f9918aSopenharmony_ci                    if PyUnicode_CheckExact(tag_object):
1362a5f9918aSopenharmony_ci                        tag_object = PyUnicode_AsUTF8String(tag_object)
1363a5f9918aSopenharmony_ci                    if not PyBytes_CheckExact(tag_object):
1364a5f9918aSopenharmony_ci                        raise TypeError(u"tag must be a string")
1365a5f9918aSopenharmony_ci                    tag = PyBytes_AS_Yaml_STRING(tag_object)
1366a5f9918aSopenharmony_ci                mapping_style = YAML_BLOCK_MAPPING_STYLE
1367a5f9918aSopenharmony_ci                if node.flow_style:
1368a5f9918aSopenharmony_ci                    mapping_style = YAML_FLOW_MAPPING_STYLE
1369a5f9918aSopenharmony_ci                if yaml_mapping_start_event_initialize(&event, anchor, tag,
1370a5f9918aSopenharmony_ci                        implicit, mapping_style) == 0:
1371a5f9918aSopenharmony_ci                    raise MemoryError
1372a5f9918aSopenharmony_ci                if yaml_emitter_emit(&self.emitter, &event) == 0:
1373a5f9918aSopenharmony_ci                    error = self._emitter_error()
1374a5f9918aSopenharmony_ci                    raise error
1375a5f9918aSopenharmony_ci                for item_key, item_value in node.value:
1376a5f9918aSopenharmony_ci                    self._serialize_node(item_key, node, None)
1377a5f9918aSopenharmony_ci                    self._serialize_node(item_value, node, item_key)
1378a5f9918aSopenharmony_ci                yaml_mapping_end_event_initialize(&event)
1379a5f9918aSopenharmony_ci                if yaml_emitter_emit(&self.emitter, &event) == 0:
1380a5f9918aSopenharmony_ci                    error = self._emitter_error()
1381a5f9918aSopenharmony_ci                    raise error
1382a5f9918aSopenharmony_ci            self.ascend_resolver()
1383a5f9918aSopenharmony_ci        return 1
1384a5f9918aSopenharmony_ci
1385a5f9918aSopenharmony_cicdef int output_handler(void *data, unsigned char *bufferu, size_t size) except 0:
1386a5f9918aSopenharmony_ci    cdef CEmitter emitter
1387a5f9918aSopenharmony_ci    cdef char *buffer
1388a5f9918aSopenharmony_ci    buffer = <char *>bufferu
1389a5f9918aSopenharmony_ci    emitter = <CEmitter>data
1390a5f9918aSopenharmony_ci    if emitter.dump_unicode == 0:
1391a5f9918aSopenharmony_ci        value = PyBytes_FromStringAndSize(buffer, size)
1392a5f9918aSopenharmony_ci    else:
1393a5f9918aSopenharmony_ci        value = PyUnicode_DecodeUTF8(buffer, size, 'strict')
1394a5f9918aSopenharmony_ci    emitter.stream.write(value)
1395a5f9918aSopenharmony_ci    return 1
1396a5f9918aSopenharmony_ci
1397