Changeset 5 for trunk/ext/_syckmodule.c
- Timestamp:
- 07/16/05 16:22:27 (8 years ago)
- File:
-
- 1 edited
-
trunk/ext/_syckmodule.c (modified) (28 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ext/_syckmodule.c
r4 r5 5 5 /* Global objects. */ 6 6 7 static PyObject * _syck_Error;8 9 static PyObject * _syck_ScalarKind;10 static PyObject * _syck_SeqKind;11 static PyObject * _syck_MapKind;7 static PyObject *PySyck_Error; 8 9 static PyObject *PySyck_ScalarKind; 10 static PyObject *PySyck_SeqKind; 11 static PyObject *PySyck_MapKind; 12 12 13 13 /* Node type. */ … … 18 18 PyObject *type_id; 19 19 PyObject *value; 20 } _syck_Node;20 } PySyckNodeObject; 21 21 22 22 static void 23 _syck_Node_dealloc(_syck_Node*self)23 PySyckNode_dealloc(PySyckNodeObject *self) 24 24 { 25 25 Py_XDECREF(self->kind); … … 30 30 31 31 static PyObject * 32 _syck_Node_getattr(_syck_Node*self, char *name)32 PySyckNode_getattr(PySyckNodeObject *self, char *name) 33 33 { 34 34 PyObject *value; … … 49 49 } 50 50 51 static char _syck_Node_doc[] =51 static char PySyckNode_doc[] = 52 52 "Node object\n" 53 53 "\n" … … 57 57 "value -- the value of the node, a string, list or dict object.\n"; 58 58 59 static PyTypeObject _syck_NodeType = {59 static PyTypeObject PySyckNode_Type = { 60 60 PyObject_HEAD_INIT(NULL) 61 61 0, /* ob_size */ 62 62 "_syck.Node", /* tp_name */ 63 sizeof( _syck_Node),/* tp_basicsize */63 sizeof(PySyckNodeObject), /* tp_basicsize */ 64 64 0, /* tp_itemsize */ 65 (destructor) _syck_Node_dealloc, /* tp_dealloc */65 (destructor)PySyckNode_dealloc, /* tp_dealloc */ 66 66 0, /* tp_print */ 67 (getattrfunc) _syck_Node_getattr, /* tp_getattr */67 (getattrfunc)PySyckNode_getattr, /* tp_getattr */ 68 68 0, /* tp_setattr */ 69 69 0, /* tp_compare */ … … 79 79 0, /* tp_as_buffer */ 80 80 Py_TPFLAGS_DEFAULT, /* tp_flags */ 81 _syck_Node_doc, /* tp_doc */81 PySyckNode_doc, /* tp_doc */ 82 82 }; 83 83 84 84 static PyObject * 85 _syck_NewNode(PyObject *self, PyObject *args) 86 { 87 if (!PyArg_ParseTuple(args, ":_syck.Node")) 88 return NULL; 89 90 PyErr_SetString(PyExc_TypeError, "Node object cannot be created explicitly. Use _syck.Parser.parse() instead."); 91 return NULL; 92 } 93 94 static char _syck_NewNode_doc[] = 95 "Node object cannot be created explicitly. Use _syck.Parser.parse() instead."; 96 97 static PyObject * 98 _syck_NewNode_FromValue(char *type_id, PyObject *value) /* Note: steals the reference to the value. */ 99 { 100 _syck_Node *self; 85 PySyckNode_New(char *type_id, PyObject *value) /* Note: steals the reference to the value. */ 86 { 87 PySyckNodeObject *self; 101 88 PyObject *kind; 102 89 103 self = PyObject_NEW( _syck_Node, &_syck_NodeType);90 self = PyObject_NEW(PySyckNodeObject, &PySyckNode_Type); 104 91 if (!self) { 105 92 Py_XDECREF(value); … … 110 97 111 98 if (PyList_Check(value)) 112 kind = _syck_SeqKind;99 kind = PySyck_SeqKind; 113 100 else if (PyDict_Check(value)) 114 kind = _syck_MapKind;101 kind = PySyck_MapKind; 115 102 else 116 kind = _syck_ScalarKind;103 kind = PySyck_ScalarKind; 117 104 Py_INCREF(kind); 118 105 self->kind = kind; … … 133 120 } 134 121 122 static PyObject * 123 PySyck_Node(PyObject *self, PyObject *args) 124 { 125 if (!PyArg_ParseTuple(args, ":_syck.Node")) 126 return NULL; 127 128 PyErr_SetString(PyExc_TypeError, "Node object cannot be created explicitly. Use _syck.Parser.parse() instead."); 129 return NULL; 130 } 131 132 static char PySyck_Node_doc[] = 133 "Node object cannot be created explicitly. Use _syck.Parser.parse() instead."; 134 135 135 /* Parser type. */ 136 136 … … 138 138 PyObject_HEAD 139 139 PyObject *source; 140 PyObject *resolver; 140 /* PyObject *resolver;*/ 141 141 PyObject *symbols; 142 int error_state; 143 int mark; 144 SyckParser *parser; 145 } _syck_Parser; 146 147 static PyObject * 148 _syck_Parser_parse(_syck_Parser *self, PyObject *args) 142 SyckParser *syck; 143 int error; 144 } PySyckParserObject; 145 146 static PyObject * 147 PySyckParser_parse(PySyckParserObject *parser, PyObject *args) 149 148 { 150 149 SYMID index; … … 154 153 return NULL; 155 154 156 if (! self->parser) {155 if (!parser->syck) { 157 156 PyErr_SetString(PyExc_TypeError, "Parser object is closed"); 158 157 return NULL; 159 158 } 160 159 161 self->symbols = PyList_New(0);162 if (! self->symbols) {163 return NULL; 164 } 165 166 index = syck_parse( self->parser);167 if (! self->error_state && !self->parser->eof) {168 value = PyList_GetItem( self->symbols, index-1);169 } 170 171 Py_DECREF( self->symbols);172 173 if ( self->error_state) {174 self->error_state= 0;175 return NULL; 176 } 177 178 if ( self->parser->eof) {160 parser->symbols = PyList_New(0); 161 if (!parser->symbols) { 162 return NULL; 163 } 164 165 index = syck_parse(parser->syck); 166 if (!parser->error && !parser->syck->eof) { 167 value = PyList_GetItem(parser->symbols, index-1); 168 } 169 170 Py_DECREF(parser->symbols); 171 172 if (parser->error) { 173 parser->error = 0; 174 return NULL; 175 } 176 177 if (parser->syck->eof) { 179 178 Py_INCREF(Py_None); 180 179 return Py_None; … … 184 183 } 185 184 186 static char _syck_Parser_parse_doc[] =185 static char PySyckParser_parse_doc[] = 187 186 "Parses the next document in the YAML stream, return the root Node object or None on EOF."; 188 187 189 188 static PyObject * 190 _syck_Parser_parse_documents(_syck_Parser *self, PyObject *args)189 PySyckParser_parse_documents(PySyckParserObject *parser, PyObject *args) 191 190 { 192 191 SYMID index; 193 192 PyObject *value = NULL; 194 PyObject * result= NULL;193 PyObject *documents = NULL; 195 194 196 195 if (!PyArg_ParseTuple(args, ":parse_document")) 197 196 return NULL; 198 197 199 if (! self->parser) {198 if (!parser->syck) { 200 199 PyErr_SetString(PyExc_TypeError, "Parser object is closed"); 201 200 return NULL; 202 201 } 203 202 204 result= PyList_New(0);205 if (! result) return NULL;203 documents = PyList_New(0); 204 if (!documents) return NULL; 206 205 207 206 while (1) { 208 207 209 self->symbols = PyList_New(0);210 if (! self->symbols) {211 Py_DECREF( result);208 parser->symbols = PyList_New(0); 209 if (!parser->symbols) { 210 Py_DECREF(documents); 212 211 return NULL; 213 212 }; 214 213 215 index = syck_parse( self->parser);216 217 if (! self->error_state && !self->parser->eof) {218 value = PyList_GetItem( self->symbols, index-1);214 index = syck_parse(parser->syck); 215 216 if (!parser->error && !parser->syck->eof) { 217 value = PyList_GetItem(parser->symbols, index-1); 219 218 if (!value) { 220 Py_DECREF( self->symbols);221 Py_DECREF( result);219 Py_DECREF(parser->symbols); 220 Py_DECREF(documents); 222 221 return NULL; 223 222 } 224 if (PyList_Append( result, value) < 0) {225 Py_DECREF( self->symbols);223 if (PyList_Append(documents, value) < 0) { 224 Py_DECREF(parser->symbols); 226 225 Py_DECREF(value); 227 Py_DECREF( result);226 Py_DECREF(documents); 228 227 return NULL; 229 228 } … … 231 230 } 232 231 233 Py_DECREF( self->symbols);234 235 if ( self->error_state) {236 self->error_state= 0;237 Py_DECREF( result);232 Py_DECREF(parser->symbols); 233 234 if (parser->error) { 235 parser->error = 0; 236 Py_DECREF(documents); 238 237 return NULL; 239 238 } 240 239 241 if ( self->parser->eof) break;242 } 243 244 return result;245 } 246 247 static char _syck_Parser_parse_documents_doc[] =240 if (parser->syck->eof) break; 241 } 242 243 return documents; 244 } 245 246 static char PySyckParser_parse_documents_doc[] = 248 247 "Parses the entire YAML stream and returns list of documents."; 249 248 250 249 static PyObject * 251 _syck_Parser_close(_syck_Parser *self, PyObject *args)250 PySyckParser_close(PySyckParserObject *parser, PyObject *args) 252 251 { 253 252 if (!PyArg_ParseTuple(args, ":close")) 254 253 return NULL; 255 254 256 Py_XDECREF( self->source);257 self->source = NULL;258 259 if ( self->parser) {260 syck_free_parser( self->parser);261 } 262 self->parser= NULL;255 Py_XDECREF(parser->source); 256 parser->source = NULL; 257 258 if (parser->syck) { 259 syck_free_parser(parser->syck); 260 } 261 parser->syck = NULL; 263 262 264 263 Py_INCREF(Py_None); … … 266 265 } 267 266 268 static char _syck_Parser_close_doc[] =267 static char PySyckParser_close_doc[] = 269 268 "Closes the parser and frees memory"; 270 269 271 static PyMethodDef _syck_Parser_methods[] = {272 {"parse", (PyCFunction) _syck_Parser_parse, METH_VARARGS, _syck_Parser_parse_doc},273 {"parse_documents", (PyCFunction) _syck_Parser_parse_documents, METH_VARARGS, _syck_Parser_parse_documents_doc},274 {"close", (PyCFunction) _syck_Parser_close, METH_VARARGS, _syck_Parser_close_doc},270 static PyMethodDef PySyckParser_methods[] = { 271 {"parse", (PyCFunction)PySyckParser_parse, METH_VARARGS, PySyckParser_parse_doc}, 272 {"parse_documents", (PyCFunction)PySyckParser_parse_documents, METH_VARARGS, PySyckParser_parse_documents_doc}, 273 {"close", (PyCFunction)PySyckParser_close, METH_VARARGS, PySyckParser_close_doc}, 275 274 {NULL} /* Sentinel */ 276 275 }; 277 276 278 277 static void 279 _syck_Parser_dealloc(_syck_Parser *self)280 { 281 Py_XDECREF( self->source);282 if ( self->parser) {283 syck_free_parser( self->parser);284 } 285 PyObject_Del( self);286 } 287 288 static PyObject * 289 _syck_Parser_getattr(_syck_Parser *self, char *name)290 { 291 return Py_FindMethod( _syck_Parser_methods, (PyObject *)self, name);292 } 293 294 static char _syck_Parser_doc[] =278 PySyckParser_dealloc(PySyckParserObject *parser) 279 { 280 Py_XDECREF(parser->source); 281 if (parser->syck) { 282 syck_free_parser(parser->syck); 283 } 284 PyObject_Del(parser); 285 } 286 287 static PyObject * 288 PySyckParser_getattr(PySyckParserObject *parser, char *name) 289 { 290 return Py_FindMethod(PySyckParser_methods, (PyObject *)parser, name); 291 } 292 293 static char PySyckParser_doc[] = 295 294 "_syck.Parser(yaml_string_or_file, implicit_typing=True, taguri_expansion=True) -> Parser object\n" 296 295 "\n" … … 300 299 "close() -- Closes the parser and frees memory.\n"; 301 300 302 static PyTypeObject _syck_ParserType = {301 static PyTypeObject PySyckParser_Type = { 303 302 PyObject_HEAD_INIT(NULL) 304 303 0, /* ob_size */ 305 304 "_syck.Parser", /* tp_name */ 306 sizeof( _syck_Parser),/* tp_basicsize */305 sizeof(PySyckParserObject), /* tp_basicsize */ 307 306 0, /* tp_itemsize */ 308 (destructor) _syck_Parser_dealloc, /* tp_dealloc */307 (destructor)PySyckParser_dealloc, /* tp_dealloc */ 309 308 0, /* tp_print */ 310 (getattrfunc) _syck_Parser_getattr, /* tp_getattr */309 (getattrfunc)PySyckParser_getattr, /* tp_getattr */ 311 310 0, /* tp_setattr */ 312 311 0, /* tp_compare */ … … 322 321 0, /* tp_as_buffer */ 323 322 Py_TPFLAGS_DEFAULT, /* tp_flags */ 324 _syck_Parser_doc, /* tp_doc */323 PySyckParser_doc, /* tp_doc */ 325 324 }; 326 325 327 326 static long 328 _syck_Parser_io_file_read(char *buf, SyckIoFile *file, long max_size, long skip)329 { 330 _syck_Parser *runtime = (_syck_Parser*)file->ptr;327 PySyckParser_read_handler(char *buf, SyckIoFile *file, long max_size, long skip) 328 { 329 PySyckParserObject *parser = (PySyckParserObject *)file->ptr; 331 330 332 331 PyObject *value; … … 337 336 buf[skip] = '\0'; 338 337 339 if ( runtime->error_state) {338 if (parser->error) { 340 339 return skip; 341 340 } … … 343 342 max_size -= skip; 344 343 345 value = PyObject_CallMethod( runtime->source, "read", "(i)", max_size);344 value = PyObject_CallMethod(parser->source, "read", "(i)", max_size); 346 345 if (!value) { 347 runtime->error_state= 1;346 parser->error = 1; 348 347 return skip; 349 348 } … … 352 351 Py_DECREF(value); 353 352 PyErr_SetString(PyExc_TypeError, "file-like object should return a string"); 354 runtime->error_state= 1;353 parser->error = 1; 355 354 356 355 return skip; … … 367 366 Py_DECREF(value); 368 367 PyErr_SetString(PyExc_ValueError, "read returns an overly long string"); 369 runtime->error_state= 1;368 parser->error = 1; 370 369 return skip; 371 370 } … … 381 380 382 381 static SYMID 383 _syck_Parser_node_handler(SyckParser *parser, SyckNode *node)384 { 385 _syck_Parser *runtime = (_syck_Parser *)parser->bonus;382 PySyckParser_node_handler(SyckParser *syck, SyckNode *node) 383 { 384 PySyckParserObject *parser = (PySyckParserObject *)syck->bonus; 386 385 387 386 SYMID index; … … 391 390 int k; 392 391 393 if ( runtime->error_state)392 if (parser->error) 394 393 return 0; 395 394 … … 407 406 for (k = 0; k < node->data.list->idx; k++) { 408 407 index = syck_seq_read(node, k); 409 item = PyList_GetItem( runtime->symbols, index-1);408 item = PyList_GetItem(parser->symbols, index-1); 410 409 if (!item) goto error; 411 410 Py_INCREF(item); … … 420 419 { 421 420 index = syck_map_read(node, map_key, k); 422 key = PyList_GetItem( runtime->symbols, index-1);421 key = PyList_GetItem(parser->symbols, index-1); 423 422 if (!key) goto error; 424 423 index = syck_map_read(node, map_value, k); 425 value = PyList_GetItem( runtime->symbols, index-1);424 value = PyList_GetItem(parser->symbols, index-1); 426 425 if (!value) goto error; 427 426 if (PyDict_SetItem(object, key, value) < 0) … … 431 430 } 432 431 433 object = _syck_NewNode_FromValue(node->type_id, object);432 object = PySyckNode_New(node->type_id, object); 434 433 if (!object) goto error; 435 434 436 if (PyList_Append( runtime->symbols, object) < 0)435 if (PyList_Append(parser->symbols, object) < 0) 437 436 goto error; 438 437 439 index = PyList_Size( runtime->symbols);438 index = PyList_Size(parser->symbols); 440 439 return index; 441 440 442 441 error: 443 442 Py_XDECREF(object); 444 runtime->error_state= 1;443 parser->error = 1; 445 444 return 0; 446 445 } 447 446 448 447 static void 449 _syck_Parser_error_handler(SyckParser *parser, char *str)450 { 451 _syck_Parser *runtime = (_syck_Parser *)parser->bonus;448 PySyckParser_error_handler(SyckParser *syck, char *str) 449 { 450 PySyckParserObject *parser = (PySyckParserObject *)syck->bonus; 452 451 PyObject *value; 453 452 454 if ( runtime->error_state) return;455 456 runtime->error_state= 1;457 458 value = Py_BuildValue("(sii)", str, parser->linect, parser->cursor-parser->lineptr);453 if (parser->error) return; 454 455 parser->error = 1; 456 457 value = Py_BuildValue("(sii)", str, syck->linect, syck->cursor-syck->lineptr); 459 458 if (value) { 460 PyErr_SetObject( _syck_Error, value);461 } 462 } 463 464 static PyObject * 465 _syck_NewParser(PyObject *self, PyObject *args, PyObject *kwds)466 { 467 _syck_Parser*parser;459 PyErr_SetObject(PySyck_Error, value); 460 } 461 } 462 463 static PyObject * 464 PySyck_Parser(PyObject *self, PyObject *args, PyObject *kwds) 465 { 466 PySyckParserObject *parser; 468 467 PyObject *source; 469 468 int implicit_typing = 1; … … 476 475 return NULL; 477 476 478 parser = PyObject_NEW( _syck_Parser, &_syck_ParserType);477 parser = PyObject_NEW(PySyckParserObject, &PySyckParser_Type); 479 478 if (!parser) 480 479 return NULL; … … 482 481 Py_INCREF(source); 483 482 parser->source = source; 484 parser->error _state= 0;485 486 parser-> parser= syck_new_parser();487 parser-> parser->bonus = parser;483 parser->error = 0; 484 485 parser->syck = syck_new_parser(); 486 parser->syck->bonus = parser; 488 487 489 488 if (PyString_Check(source)) { 490 syck_parser_str _auto(parser->parser, PyString_AS_STRING(source), NULL);489 syck_parser_str(parser->syck, PyString_AS_STRING(source), PyString_GET_SIZE(source), NULL); 491 490 } 492 491 else { 493 syck_parser_file(parser-> parser, (FILE *)parser, _syck_Parser_io_file_read);494 } 495 syck_parser_implicit_typing(parser-> parser, implicit_typing);496 syck_parser_taguri_expansion(parser-> parser, taguri_expansion);497 498 syck_parser_handler(parser-> parser, _syck_Parser_node_handler);499 syck_parser_error_handler(parser-> parser, _syck_Parser_error_handler);492 syck_parser_file(parser->syck, (FILE *)parser, PySyckParser_read_handler); 493 } 494 syck_parser_implicit_typing(parser->syck, implicit_typing); 495 syck_parser_taguri_expansion(parser->syck, taguri_expansion); 496 497 syck_parser_handler(parser->syck, PySyckParser_node_handler); 498 syck_parser_error_handler(parser->syck, PySyckParser_error_handler); 500 499 /* 501 500 syck_parser_bad_anchor_handler(parser, _syck_Parser_bad_anchor_handler); … … 505 504 } 506 505 507 static char _syck_NewParser_doc[] =506 static char PySyck_Parser_doc[] = 508 507 "Creates a new Parser object."; 509 508 510 509 /* The module definitions. */ 511 510 512 static PyMethodDef _syck_methods[] = {513 {"Node", (PyCFunction) _syck_NewNode, METH_VARARGS, _syck_NewNode_doc},514 {"Parser", (PyCFunction) _syck_NewParser, METH_VARARGS|METH_KEYWORDS, _syck_NewParser_doc},511 static PyMethodDef PySyck_methods[] = { 512 {"Node", (PyCFunction)PySyck_Node, METH_VARARGS, PySyck_Node_doc}, 513 {"Parser", (PyCFunction)PySyck_Parser, METH_VARARGS|METH_KEYWORDS, PySyck_Parser_doc}, 515 514 {NULL} /* Sentinel */ 516 515 }; 517 516 518 static char _syck_doc[] =517 static char PySyck_doc[] = 519 518 "This module provides low-level access to the Syck parser and emitter.\n" 520 519 "Do not use this module directly, use the package 'syck' instead.\n"; … … 525 524 PyObject *m; 526 525 527 _syck_NodeType.ob_type = &PyType_Type;528 _syck_ParserType.ob_type = &PyType_Type;529 530 _syck_Error = PyErr_NewException("_syck.error", NULL, NULL);531 if (! _syck_Error)532 return; 533 534 _syck_ScalarKind = PyString_FromString("scalar");535 if (! _syck_ScalarKind)536 return; 537 _syck_SeqKind = PyString_FromString("seq");538 if (! _syck_SeqKind)539 return; 540 _syck_MapKind = PyString_FromString("map");541 if (! _syck_MapKind)542 return; 543 544 m = Py_InitModule3("_syck", _syck_methods, _syck_doc);545 546 Py_INCREF( _syck_Error);547 if (!PyModule_AddObject(m, "error", _syck_Error) < 0)548 return; 549 550 Py_INCREF(& _syck_NodeType);551 if (PyModule_AddObject(m, "NodeType", (PyObject *)& _syck_NodeType) < 0)552 return; 553 554 Py_INCREF(& _syck_ParserType);555 if (PyModule_AddObject(m, "ParserType", (PyObject *)& _syck_ParserType) < 0)556 return; 557 } 558 526 PySyckNode_Type.ob_type = &PyType_Type; 527 PySyckParser_Type.ob_type = &PyType_Type; 528 529 PySyck_Error = PyErr_NewException("_syck.error", NULL, NULL); 530 if (!PySyck_Error) 531 return; 532 533 PySyck_ScalarKind = PyString_FromString("scalar"); 534 if (!PySyck_ScalarKind) 535 return; 536 PySyck_SeqKind = PyString_FromString("seq"); 537 if (!PySyck_SeqKind) 538 return; 539 PySyck_MapKind = PyString_FromString("map"); 540 if (!PySyck_MapKind) 541 return; 542 543 m = Py_InitModule3("_syck", PySyck_methods, PySyck_doc); 544 545 Py_INCREF(PySyck_Error); 546 if (!PyModule_AddObject(m, "error", PySyck_Error) < 0) 547 return; 548 549 Py_INCREF(&PySyckNode_Type); 550 if (PyModule_AddObject(m, "NodeType", (PyObject *)&PySyckNode_Type) < 0) 551 return; 552 553 Py_INCREF(&PySyckParser_Type); 554 if (PyModule_AddObject(m, "ParserType", (PyObject *)&PySyckParser_Type) < 0) 555 return; 556 } 557
Note: See TracChangeset
for help on using the changeset viewer.
