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