Changeset 205 for pyyaml/trunk/ext
- Timestamp:
- 07/07/06 15:39:29 (6 years ago)
- Location:
- pyyaml/trunk/ext
- Files:
-
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
pyyaml/trunk/ext/_yaml.h
r195 r205 1 1 2 #include <yaml /yaml.h>2 #include <yaml.h> 3 3 -
pyyaml/trunk/ext/_yaml.pxd
r195 r205 58 58 YAML_TAG_TOKEN 59 59 YAML_SCALAR_TOKEN 60 cdef enum yaml_event_type_t: 61 YAML_STREAM_START_EVENT 62 YAML_STREAM_END_EVENT 63 YAML_DOCUMENT_START_EVENT 64 YAML_DOCUMENT_END_EVENT 65 YAML_ALIAS_EVENT 66 YAML_SCALAR_EVENT 67 YAML_SEQUENCE_START_EVENT 68 YAML_SEQUENCE_END_EVENT 69 YAML_MAPPING_START_EVENT 70 YAML_MAPPING_END_EVENT 60 71 61 72 ctypedef int yaml_read_handler_t(void *data, char *buffer, … … 66 77 int line 67 78 int column 79 ctypedef struct yaml_version_directive_t: 80 int major 81 int minor 82 ctypedef struct yaml_tag_directive_t: 83 char *handle 84 char *prefix 85 86 ctypedef struct _yaml_token_stream_start_data_t: 87 yaml_encoding_t encoding 88 ctypedef struct _yaml_token_alias_data_t: 89 char *value 90 ctypedef struct _yaml_token_anchor_data_t: 91 char *value 68 92 ctypedef struct _yaml_token_tag_data_t: 69 93 char *handle … … 80 104 char *prefix 81 105 ctypedef union _yaml_token_data_t: 82 yaml_encoding_t encoding 83 char *anchor 106 _yaml_token_stream_start_data_t stream_start 107 _yaml_token_alias_data_t alias 108 _yaml_token_anchor_data_t anchor 84 109 _yaml_token_tag_data_t tag 85 110 _yaml_token_scalar_data_t scalar … … 91 116 yaml_mark_t start_mark 92 117 yaml_mark_t end_mark 118 119 ctypedef struct _yaml_event_stream_start_data_t: 120 yaml_encoding_t encoding 121 ctypedef struct _yaml_event_document_start_data_t: 122 yaml_version_directive_t *version_directive 123 yaml_tag_directive_t **tag_directives 124 int implicit 125 ctypedef struct _yaml_event_document_end_data_t: 126 int implicit 127 ctypedef struct _yaml_event_alias_data_t: 128 char *anchor 129 ctypedef struct _yaml_event_scalar_data_t: 130 char *anchor 131 char *tag 132 char *value 133 int length 134 int plain_implicit 135 int quoted_implicit 136 yaml_scalar_style_t style 137 ctypedef struct _yaml_event_sequence_start_data_t: 138 char *anchor 139 char *tag 140 int implicit 141 yaml_sequence_style_t style 142 ctypedef struct _yaml_event_mapping_start_data_t: 143 char *anchor 144 char *tag 145 int implicit 146 yaml_mapping_style_t style 147 ctypedef union _yaml_event_data_t: 148 _yaml_event_stream_start_data_t stream_start 149 _yaml_event_document_start_data_t document_start 150 _yaml_event_document_end_data_t document_end 151 _yaml_event_alias_data_t alias 152 _yaml_event_scalar_data_t scalar 153 _yaml_event_sequence_start_data_t sequence_start 154 _yaml_event_mapping_start_data_t mapping_start 155 ctypedef struct yaml_event_t: 156 yaml_event_type_t type 157 _yaml_event_data_t data 158 yaml_mark_t start_mark 159 yaml_mark_t end_mark 160 93 161 ctypedef struct yaml_parser_t: 94 162 yaml_error_type_t error … … 103 171 void yaml_get_version(int *major, int *minor, int *patch) 104 172 void yaml_token_delete(yaml_token_t *token) 173 void yaml_event_delete(yaml_event_t *event) 105 174 yaml_parser_t *yaml_parser_new() 106 175 void yaml_parser_delete(yaml_parser_t *parser) … … 113 182 yaml_token_t *yaml_parser_get_token(yaml_parser_t *parser) 114 183 yaml_token_t *yaml_parser_peek_token(yaml_parser_t *parser) 184 yaml_event_t *yaml_parser_get_event(yaml_parser_t *parser) 185 yaml_event_t *yaml_parser_peek_event(yaml_parser_t *parser) 115 186 -
pyyaml/trunk/ext/_yaml.pyx
r196 r205 30 30 yaml_parser_delete(parser) 31 31 32 cdef class Scanner: 32 def test_parser(data): 33 cdef yaml_parser_t *parser 34 cdef yaml_event_t *event 35 cdef int done 36 if PyString_CheckExact(data) == 0: 37 raise TypeError("string input required") 38 parser = yaml_parser_new() 39 if parser == NULL: 40 raise MemoryError 41 yaml_parser_set_input_string(parser, PyString_AS_STRING(data), PyString_GET_SIZE(data)) 42 done = 0 43 while done == 0: 44 event = yaml_parser_get_event(parser) 45 if event == NULL: 46 raise MemoryError 47 if event.type == YAML_STREAM_END_EVENT: 48 done = 1 49 yaml_event_delete(event) 50 yaml_parser_delete(parser) 51 52 cdef class ScannerAndParser: 33 53 34 54 cdef yaml_parser_t *parser … … 36 56 cdef object stream 37 57 cdef yaml_token_t *cached_token 58 cdef yaml_event_t *cached_event 38 59 cdef object cached_obj 39 60 … … 59 80 self.parser = NULL 60 81 61 cdef object _convert (self, yaml_token_t *token):82 cdef object _convert_token(self, yaml_token_t *token): 62 83 if token == NULL: 63 84 if self.parser.error == YAML_MEMORY_ERROR: … … 144 165 return yaml.ValueToken(start_mark, end_mark) 145 166 elif token.type == YAML_ALIAS_TOKEN: 146 return yaml.AliasToken(token.data.a nchor,167 return yaml.AliasToken(token.data.alias.value, 147 168 start_mark, end_mark) 148 169 elif token.type == YAML_ANCHOR_TOKEN: 149 return yaml.AnchorToken(token.data.anchor ,170 return yaml.AnchorToken(token.data.anchor.value, 150 171 start_mark, end_mark) 151 172 elif token.type == YAML_TAG_TOKEN: … … 162 183 else: 163 184 raise RuntimeError("unknown token type") 185 186 cdef object _convert_event(self, yaml_event_t *event): 187 if event == NULL: 188 if self.parser.error == YAML_MEMORY_ERROR: 189 raise MemoryError 190 elif self.parser.error == YAML_READER_ERROR: 191 raise yaml.reader.ReaderError("<input>", 192 self.parser.problem_offset, 193 self.parser.problem_value, 194 '?', self.parser.problem) 195 elif self.parser.error == YAML_SCANNER_ERROR: 196 if self.parser.context != NULL: 197 raise yaml.scanner.ScannerError( 198 self.parser.context, 199 yaml.Mark("<input>", 200 self.parser.context_mark.index, 201 self.parser.context_mark.line, 202 self.parser.context_mark.column, 203 None, None), 204 self.parser.problem, 205 yaml.Mark("<input>", 206 self.parser.problem_mark.index, 207 self.parser.problem_mark.line, 208 self.parser.problem_mark.column, 209 None, None)) 210 else: 211 raise yaml.scanner.ScannerError(None, None, 212 self.parser.problem, 213 yaml.Mark("<input>", 214 self.parser.problem_mark.index, 215 self.parser.problem_mark.line, 216 self.parser.problem_mark.column, 217 None, None)) 218 elif self.parser.error == YAML_PARSER_ERROR: 219 if self.parser.context != NULL: 220 raise yaml.parser.ParserError( 221 self.parser.context, 222 yaml.Mark("<input>", 223 self.parser.context_mark.index, 224 self.parser.context_mark.line, 225 self.parser.context_mark.column, 226 None, None), 227 self.parser.problem, 228 yaml.Mark("<input>", 229 self.parser.problem_mark.index, 230 self.parser.problem_mark.line, 231 self.parser.problem_mark.column, 232 None, None)) 233 else: 234 raise yaml.parser.ParserError(None, None, 235 self.parser.problem, 236 yaml.Mark("<input>", 237 self.parser.problem_mark.index, 238 self.parser.problem_mark.line, 239 self.parser.problem_mark.column, 240 None, None)) 241 else: 242 raise RuntimeError("neither error nor event produced") 243 start_mark = yaml.Mark("<input>", 244 event.start_mark.index, 245 event.start_mark.line, 246 event.start_mark.column, 247 None, None) 248 end_mark = yaml.Mark("<input>", 249 event.end_mark.index, 250 event.end_mark.line, 251 event.end_mark.column, 252 None, None) 253 if event.type == YAML_STREAM_START_EVENT: 254 return yaml.StreamStartEvent(start_mark, end_mark) 255 elif event.type == YAML_STREAM_END_EVENT: 256 return yaml.StreamEndEvent(start_mark, end_mark) 257 elif event.type == YAML_DOCUMENT_START_EVENT: 258 return yaml.DocumentStartEvent(start_mark, end_mark, 259 (event.data.document_start.implicit == 0)) 260 elif event.type == YAML_DOCUMENT_END_EVENT: 261 return yaml.DocumentEndEvent(start_mark, end_mark, 262 (event.data.document_end.implicit == 0)) 263 elif event.type == YAML_SCALAR_EVENT: 264 if event.data.scalar.anchor == NULL: 265 anchor = None 266 else: 267 anchor = event.data.scalar.anchor 268 if event.data.scalar.tag == NULL: 269 tag = None 270 else: 271 tag = event.data.scalar.tag 272 implicit = (event.data.scalar.plain_implicit == 1, event.data.scalar.quoted_implicit == 1) 273 flow_style = (event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE) 274 value = PyString_FromStringAndSize(event.data.scalar.value, event.data.scalar.length) 275 return yaml.ScalarEvent(anchor, tag, implicit, unicode(value, 'utf-8'), 276 start_mark, end_mark) 277 elif event.type == YAML_ALIAS_EVENT: 278 if event.data.alias.anchor == NULL: 279 anchor = None 280 else: 281 anchor = event.data.alias.anchor 282 return yaml.AliasEvent(anchor, start_mark, end_mark) 283 elif event.type == YAML_SEQUENCE_START_EVENT: 284 if event.data.sequence_start.anchor == NULL: 285 anchor = None 286 else: 287 anchor = event.data.sequence_start.anchor 288 if event.data.sequence_start.tag == NULL: 289 tag = None 290 else: 291 tag = event.data.sequence_start.tag 292 implicit = (event.data.sequence_start.implicit == 1) 293 flow_style = (event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE) 294 return yaml.SequenceStartEvent(anchor, tag, implicit, 295 start_mark, end_mark, flow_style) 296 elif event.type == YAML_MAPPING_START_EVENT: 297 if event.data.mapping_start.anchor == NULL: 298 anchor = None 299 else: 300 anchor = event.data.mapping_start.anchor 301 if event.data.mapping_start.tag == NULL: 302 tag = None 303 else: 304 tag = event.data.mapping_start.tag 305 implicit = (event.data.mapping_start.implicit == 1) 306 flow_style = (event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE) 307 return yaml.MappingStartEvent(anchor, tag, implicit, 308 start_mark, end_mark, flow_style) 309 elif event.type == YAML_SEQUENCE_END_EVENT: 310 return yaml.SequenceEndEvent(start_mark, end_mark) 311 elif event.type == YAML_MAPPING_END_EVENT: 312 return yaml.MappingEndEvent(start_mark, end_mark) 313 else: 314 raise RuntimeError("unknown event type") 164 315 165 316 def get_token(self): … … 174 325 return None 175 326 token = yaml_parser_get_token(self.parser) 176 obj = self._convert (token)327 obj = self._convert_token(token) 177 328 if token.type == YAML_STREAM_END_TOKEN: 178 329 self.eof = 1 … … 187 338 return None 188 339 token = yaml_parser_peek_token(self.parser) 189 obj = self._convert (token)340 obj = self._convert_token(token) 190 341 if token.type == YAML_STREAM_END_TOKEN: 191 342 self.eof = 1 … … 202 353 else: 203 354 token = yaml_parser_peek_token(self.parser) 204 obj = self._convert (token)355 obj = self._convert_token(token) 205 356 if token.type == YAML_STREAM_END_TOKEN: 206 357 self.eof = 1 … … 214 365 return False 215 366 216 class Loader(Scanner, 217 yaml.parser.Parser, 367 def get_event(self): 368 cdef yaml_event_t *event 369 if self.cached_event != NULL: 370 yaml_event_delete(yaml_parser_get_event(self.parser)) 371 obj = self.cached_obj 372 self.cached_event = NULL 373 self.cached_obj = None 374 return obj 375 if self.eof != 0: 376 return None 377 event = yaml_parser_get_event(self.parser) 378 obj = self._convert_event(event) 379 if event.type == YAML_STREAM_END_EVENT: 380 self.eof = 1 381 yaml_event_delete(event) 382 return obj 383 384 def peek_event(self): 385 cdef yaml_event_t *event 386 if self.cached_event != NULL: 387 return self.cached_obj 388 if self.eof != 0: 389 return None 390 event = yaml_parser_peek_event(self.parser) 391 obj = self._convert_event(event) 392 if event.type == YAML_STREAM_END_EVENT: 393 self.eof = 1 394 self.cached_event = event 395 self.cached_obj = obj 396 return obj 397 398 def check_event(self, *choices): 399 cdef yaml_event_t *event 400 if self.cached_event != NULL: 401 obj = self.cached_obj 402 elif self.eof != 0: 403 return False 404 else: 405 event = yaml_parser_peek_event(self.parser) 406 obj = self._convert_event(event) 407 if event.type == YAML_STREAM_END_EVENT: 408 self.eof = 1 409 self.cached_event = event 410 self.cached_obj = obj 411 if not choices: 412 return True 413 for choice in choices: 414 if isinstance(obj, choice): 415 return True 416 return False 417 418 class Loader(ScannerAndParser, 218 419 yaml.composer.Composer, 219 420 yaml.constructor.Constructor, … … 221 422 222 423 def __init__(self, stream): 223 Scanner.__init__(self, stream) 224 yaml.parser.Parser.__init__(self) 424 ScannerAndParser.__init__(self, stream) 225 425 yaml.composer.Composer.__init__(self) 226 426 yaml.constructor.Constructor.__init__(self)
