16 #include <xercesc/util/XMLUri.hpp>
26 #define X(str) XString(str).unicode_str()
27 #define S(str) str.c_str()
29 using namespace xercesc;
37 <<
" hddm-py [-v | -o <filename>] {HDDM file}\n\n"
39 <<
" -v validate only\n"
40 <<
" -o <filename> write to <filename>.cpy"
78 void checkConsistency(DOMElement* el, DOMElement* elref);
79 void writeClassdef(DOMElement* el);
80 void writeClassimp(DOMElement* el);
81 void constructDocument(DOMElement* el);
82 void constructGroup(DOMElement* el);
83 void constructIOstreams(DOMElement* el);
84 void constructMethods(DOMElement* el);
85 void constructStreamers(DOMElement* el);
86 void writeStreamers(DOMElement* el);
97 std::vector<DOMElement*> tagList;
107 int main(
int argC,
char* argV[])
111 XMLPlatformUtils::Initialize();
113 catch (
const XMLException* toCatch)
115 XtString msg(toCatch->getMessage());
117 <<
"hddm-py: Error during initialization! :\n"
127 else if ((argC == 2) && (strcmp(argV[1],
"-?") == 0))
135 bool verifyOnly =
false;
137 for (argInd = 1; argInd < argC; argInd++)
139 if (argV[argInd][0] !=
'-')
143 if (strcmp(argV[argInd],
"-v") == 0)
147 else if (strcmp(argV[argInd],
"-o") == 0)
149 pyFilename =
XtString(argV[++argInd]);
154 <<
"Unknown option \'" << argV[argInd]
155 <<
"\', ignoring it\n" << std::endl;
159 if (argInd != argC - 1)
166 #if defined OLD_STYLE_XERCES_PARSER
174 <<
"hddm-py : Error parsing HDDM document, "
175 <<
"cannot continue" << std::endl;
179 DOMElement* rootEl = document->getDocumentElement();
180 XtString rootS(rootEl->getTagName());
184 <<
"hddm-py error: root element of input document is "
185 <<
"\"" << rootS <<
"\", expected \"HDDM\""
190 XtString classS(rootEl->getAttribute(
X(
"class")));
196 pyname =
"/dev/null";
198 else if (pyFilename.size())
200 pyname = pyFilename +
".cpy";
204 pyname =
"pyhddm_" + classPrefix +
".cpy";
208 builder.
pyFile.open(pyname.c_str());
209 if (! builder.
pyFile.is_open())
212 <<
"hddm-py error: unable to open output file "
213 << pyname << std::endl;
219 " * pyhddm_" << classPrefix <<
".cpy - DO NOT EDIT THIS FILE\n"
221 " * This file was generated automatically by hddm-py from the file\n"
222 <<
" * " << xmlFile << std::endl <<
224 " * This source file contains the Python/C++ API wrappers that\n"
225 " * provide a python interface to the hddm classes and methods\n"
226 " * generated by hddm-cpp from " << xmlFile <<
".\n"
228 " * The hddm data model tool set was written by\n"
229 " * Richard Jones, University of Connecticut.\n"
231 " * For more information see the following web site\n"
233 " * http://zeus.phys.uconn.edu/halld/datamodel/doc\n"
237 "#include <Python.h>\n"
238 "#include <structmember.h>\n"
240 "#include <hddm_" << classPrefix <<
".hpp>\n"
241 "#include <fstream>\n"
242 "#include <iostream>\n"
243 "#include <exception>\n"
244 "#include <particleType.h>\n"
246 "using namespace hddm_" << classPrefix <<
";\n"
248 "#if PY_MAJOR_VERSION >= 3\n"
249 " #define PyInt_FromLong PyLong_FromLong\n"
250 " #define PyInt_AsLong PyLong_AsLong\n"
254 "inline void LOG_NEW(PyTypeObject *t, PyTypeObject *subt=0, int own=0) {\n"
257 " std::cout << \"creating a new element of \" << t->tp_name\n"
258 " << \" \" << ((own == 0)? \"(borrowed)\" : \"(owned)\")\n"
261 " std::cout << \"creating a new list of \" << subt->tp_name\n"
262 " << \" \" << ((own == 0)? \"(borrowed)\" : \"(owned)\")\n"
267 "inline void LOG_DEALLOC(PyTypeObject *t, PyTypeObject *subt=0, int own=0) {\n"
270 " std::cout << \"destroying an element of \" << t->tp_name\n"
271 " << \" \" << ((own == 0)? \"(borrowed)\" : \"(owned)\")\n"
274 " std::cout << \"destroying a list of \" << subt->tp_name\n"
275 " << \" \" << ((own == 0)? \"(borrowed)\" : \"(owned)\")\n"
280 "inline void My_INCREF(PyObject *o) {\n"
281 " //std::cout << \"incrementing reference at \" << o << std::endl;\n"
285 "inline void My_DECREF(PyObject *o) {\n"
286 " //std::cout << \"decrementing reference at \" << o << std::endl;\n"
290 "// wrap base class hddm_" << classPrefix <<
"::HDDM_Element"
291 " as hddm_" << classPrefix <<
".HDDM_Element\n"
295 " HDDM_Element *elem;\n"
300 "_HDDM_Element_dealloc(_HDDM_Element* self)\n"
302 " if (self->elem != 0) {\n"
303 " LOG_DEALLOC(Py_TYPE(self), 0, self->host == (PyObject*)self);\n"
304 " if (self->host == (PyObject*)self)\n"
305 " delete self->elem;\n"
307 " My_DECREF(self->host);\n"
309 " Py_TYPE(self)->tp_free((PyObject*)self);\n"
313 "_HDDM_Element_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n"
315 " _HDDM_Element *self;\n"
316 " self = (_HDDM_Element*)type->tp_alloc(type, 0);\n"
317 " if (self != NULL) {\n"
321 " return (PyObject*)self;\n"
325 "_HDDM_Element_init(_HDDM_Element *self, PyObject *args, PyObject *kwds)\n"
327 " PyErr_SetString(PyExc_RuntimeError, \"illegal constructor\");\n"
332 "_HDDM_Element_getAttribute(PyObject *self, PyObject *args)\n"
335 " if (! PyArg_ParseTuple(args, \"s\", &attr)) {\n"
338 " _HDDM_Element *me = (_HDDM_Element*)self;\n"
339 " if (me->elem == 0) {\n"
340 " PyErr_SetString(PyExc_RuntimeError, \"lookup attempted on invalid"
344 " hddm_type atype;\n"
345 " void *val((int*)me->elem->getAttribute(std::string(attr),&atype));\n"
347 " Py_INCREF(Py_None);\n"
350 " else if (atype == k_hddm_int) {\n"
351 " return PyLong_FromLong(*(int*)val);\n"
353 " else if (atype == k_hddm_long) {\n"
354 " return PyLong_FromLong(*(long*)val);\n"
356 " else if (atype == k_hddm_float) {\n"
357 " return PyFloat_FromDouble(double(*(float*)val));\n"
359 " else if (atype == k_hddm_double) {\n"
360 " return PyFloat_FromDouble(*(double*)val);\n"
362 " else if (atype == k_hddm_boolean) {\n"
363 " if (*(bool*)val == 0) {\n"
364 " Py_INCREF(Py_False);\n"
365 " return Py_False;\n"
368 " Py_INCREF(Py_True);\n"
372 " else if (atype == k_hddm_string) {\n"
373 " return PyUnicode_FromString(((std::string*)val)->c_str());\n"
375 " else if (atype == k_hddm_anyURI) {\n"
376 " return PyUnicode_FromString(((std::string*)val)->c_str());\n"
378 " else if (atype == k_hddm_Particle_t) {\n"
379 " return PyUnicode_FromString(ParticleType(*(Particle_t*)val));\n"
381 " return PyUnicode_FromString(((std::string*)val)->c_str());\n"
383 "static PyMemberDef _HDDM_Element_members[] = {\n"
384 " {NULL} /* Sentinel */\n"
387 "static PyMethodDef _HDDM_Element_methods[] = {\n"
388 " {\"getAttribute\", _HDDM_Element_getAttribute, METH_VARARGS,\n"
389 " \"look up named attribute in this element\"},\n"
390 " {NULL} /* Sentinel */\n"
393 "static PyTypeObject _HDDM_Element_type = {\n"
394 " PyVarObject_HEAD_INIT(NULL,0)\n"
395 " \"hddm_" << classPrefix <<
".HDDM_Element\", /*tp_name*/\n"
396 " sizeof(_HDDM_Element), /*tp_basicsize*/\n"
397 " 0, /*tp_itemsize*/\n"
398 " (destructor)_HDDM_Element_dealloc, /*tp_dealloc*/\n"
400 " 0, /*tp_getattr*/\n"
401 " 0, /*tp_setattr*/\n"
402 " 0, /*tp_compare*/\n"
404 " 0, /*tp_as_number*/\n"
405 " 0, /*tp_as_sequence*/\n"
406 " 0, /*tp_as_mapping*/\n"
410 " 0, /*tp_getattro*/\n"
411 " 0, /*tp_setattro*/\n"
412 " 0, /*tp_as_buffer*/\n"
413 " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/\n"
414 " \"hddm_" << classPrefix <<
" basic element\", /* tp_doc */\n"
415 " 0, /* tp_traverse */\n"
416 " 0, /* tp_clear */\n"
417 " 0, /* tp_richcompare */\n"
418 " 0, /* tp_weaklistoffset */\n"
419 " 0, /* tp_iter */\n"
420 " 0, /* tp_iternext */\n"
421 " _HDDM_Element_methods, /* tp_methods */\n"
422 " _HDDM_Element_members, /* tp_members */\n"
423 " 0, /* tp_getset */\n"
424 " 0, /* tp_base */\n"
425 " 0, /* tp_dict */\n"
426 " 0, /* tp_descr_get */\n"
427 " 0, /* tp_descr_set */\n"
428 " 0, /* tp_dictoffset */\n"
429 " (initproc)_HDDM_Element_init, /* tp_init */\n"
430 " 0, /* tp_alloc */\n"
431 " _HDDM_Element_new, /* tp_new */\n"
435 "// wrap base class hddm_" << classPrefix <<
"::HDDM_ElementList"
436 " as hddm_" << classPrefix <<
".HDDM_ElementList\n"
440 " PyTypeObject *subtype; // type of wrapper derived from _HDDM_Element\n"
441 " HDDM_ElementList<HDDM_Element> *list;\n"
444 "} _HDDM_ElementList;\n"
447 "_HDDM_ElementList_dealloc(_HDDM_ElementList* self)\n"
449 " if (self->list != 0) {\n"
450 " LOG_DEALLOC(Py_TYPE(self), self->subtype, self->borrowed == 0);\n"
451 " if (self->borrowed == 0)\n"
452 " delete self->list;\n"
453 " My_DECREF(self->host);\n"
455 " Py_TYPE(self)->tp_free((PyObject*)self);\n"
459 "_HDDM_ElementList_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n"
461 " _HDDM_ElementList *self;\n"
462 " self = (_HDDM_ElementList*)type->tp_alloc(type, 0);\n"
463 " if (self != NULL) {\n"
464 " self->subtype = 0;\n"
465 " self->borrowed = 0;\n"
468 " return (PyObject*)self;\n"
472 "_HDDM_ElementList_init(_HDDM_ElementList *self, PyObject *args, PyObject *kwds)\n"
474 " PyErr_SetString(PyExc_RuntimeError, \"illegal constructor\");\n"
478 "static Py_ssize_t\n"
479 "_HDDM_ElementList_size(_HDDM_ElementList *self, void *closure)\n"
481 " if (self->list == 0) {\n"
482 " PyErr_SetString(PyExc_RuntimeError, \"size attempted on invalid list\");\n"
485 " return self->list->size();\n"
489 "_HDDM_ElementList_item(_HDDM_ElementList *self, Py_ssize_t i)\n"
491 " if (self->list == 0)\n"
493 " int len = self->list->size();\n"
494 " if (i < 0 || i >= len) {\n"
495 " PyErr_Format(PyExc_IndexError, \"index \\%ld out of bounds.\", i);\n"
498 " PyObject *elem_obj = _HDDM_Element_new(self->subtype, 0, 0);\n"
499 " ((_HDDM_Element*)elem_obj)->elem = &(HDDM_Element&)(*self->list)(i);\n"
500 " ((_HDDM_Element*)elem_obj)->host = self->host;\n"
501 " My_INCREF(self->host);\n"
502 " LOG_NEW(self->subtype);\n"
503 " return elem_obj;\n"
506 "extern PyTypeObject _HDDM_ElementList_type;\n"
508 "static PyObject *\n"
509 "_HDDM_ElementList_add(PyObject *self, PyObject *args)\n"
513 " if (! PyArg_ParseTuple(args, \"i|i\", &count, &start)) {\n"
516 " _HDDM_ElementList *me = (_HDDM_ElementList*)self;\n"
517 " if (me->list == 0) {\n"
518 " PyErr_SetString(PyExc_RuntimeError, \"add attempted on invalid list\");\n"
521 " PyObject *list = _HDDM_ElementList_new(&_HDDM_ElementList_type, 0, 0);\n"
522 " ((_HDDM_ElementList*)list)->subtype = me->subtype;\n"
523 " ((_HDDM_ElementList*)list)->list = (HDDM_ElementList<HDDM_Element>*)\n"
524 " new HDDM_ElementList<HDDM_Element>(me->list->add(count, start));\n"
525 " ((_HDDM_ElementList*)list)->borrowed = 0;\n"
526 " ((_HDDM_ElementList*)list)->host = me->host;\n"
527 " My_INCREF(me->host);\n"
528 " LOG_NEW(Py_TYPE(self), me->subtype, 1);\n"
532 "static PyObject *\n"
533 "_HDDM_ElementList_del(PyObject *self, PyObject *args)\n"
537 " if (! PyArg_ParseTuple(args, \"|ii\", &count, &start)) {\n"
540 " _HDDM_ElementList *list_obj;\n"
541 " list_obj = (_HDDM_ElementList*)self;\n"
542 " if (list_obj->list == 0) {\n"
543 " PyErr_SetString(PyExc_RuntimeError, \"del attempted on invalid list\");\n"
546 " list_obj->list->del(count, start);\n"
547 " Py_INCREF(self);\n"
551 "static PyObject *\n"
552 "_HDDM_ElementList_clear(PyObject *self, PyObject *args)\n"
554 " _HDDM_ElementList *list_obj;\n"
555 " list_obj = (_HDDM_ElementList*)self;\n"
556 " if (list_obj->list == 0) {\n"
557 " PyErr_SetString(PyExc_RuntimeError, \"clear attempted on invalid list\");\n"
560 " list_obj->list->clear();\n"
561 " Py_INCREF(self);\n"
565 "static PyMemberDef _HDDM_ElementList_members[] = {\n"
566 " {NULL} /* Sentinel */\n"
569 "static PyMethodDef _HDDM_ElementList_methods[] = {\n"
570 " {\"add\", _HDDM_ElementList_add, METH_VARARGS,\n"
571 " \"add (or insert) a new element to the list.\"},\n"
572 " {\"del\", _HDDM_ElementList_del, METH_VARARGS,\n"
573 " \"delete an existing element from the list.\"},\n"
574 " {\"clear\", _HDDM_ElementList_clear, METH_NOARGS,\n"
575 " \"reset the list to zero elements.\"},\n"
576 " {NULL} /* Sentinel */\n"
579 "static PySequenceMethods _HDDM_ElementList_as_sequence = {\n"
580 " (lenfunc)_HDDM_ElementList_size, /* sq_length */\n"
581 " 0, /* sq_concat */\n"
582 " 0, /* sq_repeat */\n"
583 " (ssizeargfunc)_HDDM_ElementList_item, /* sq_item */\n"
584 " 0, /* sq_slice */\n"
585 " 0, /* sq_ass_item */\n"
586 " 0, /* sq_ass_slice */\n"
587 " 0, /* sq_contains */\n"
588 " 0, /* sq_inplace_concat */\n"
589 " 0, /* sq_inplace_repeat */\n"
592 "PyTypeObject _HDDM_ElementList_type = {\n"
593 " PyVarObject_HEAD_INIT(NULL,0)\n"
594 " \"hddm_" << classPrefix <<
".HDDM_ElementList\", /*tp_name*/\n"
595 " sizeof(_HDDM_ElementList), /*tp_basicsize*/\n"
596 " 0, /*tp_itemsize*/\n"
597 " (destructor)_HDDM_ElementList_dealloc, /*tp_dealloc*/\n"
599 " 0, /*tp_getattr*/\n"
600 " 0, /*tp_setattr*/\n"
601 " 0, /*tp_compare*/\n"
603 " 0, /*tp_as_number*/\n"
604 " &_HDDM_ElementList_as_sequence, /*tp_as_sequence*/\n"
605 " 0, /*tp_as_mapping*/\n"
609 " 0, /*tp_getattro*/\n"
610 " 0, /*tp_setattro*/\n"
611 " 0, /*tp_as_buffer*/\n"
612 " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/\n"
613 " \"hddm_" << classPrefix <<
" output stream\", /* tp_doc */\n"
614 " 0, /* tp_traverse */\n"
615 " 0, /* tp_clear */\n"
616 " 0, /* tp_richcompare */\n"
617 " 0, /* tp_weaklistoffset */\n"
618 " 0, /* tp_iter */\n"
619 " 0, /* tp_iternext */\n"
620 " _HDDM_ElementList_methods, /* tp_methods */\n"
621 " _HDDM_ElementList_members, /* tp_members */\n"
622 " 0, /* tp_getset */\n"
623 " 0, /* tp_base */\n"
624 " 0, /* tp_dict */\n"
625 " 0, /* tp_descr_get */\n"
626 " 0, /* tp_descr_set */\n"
627 " 0, /* tp_dictoffset */\n"
628 " (initproc)_HDDM_ElementList_init, /* tp_init */\n"
629 " 0, /* tp_alloc */\n"
630 " _HDDM_ElementList_new, /* tp_new */\n"
639 builder.
typesList[
"HDDM_Element"] =
"_HDDM_Element_type";
640 builder.
typesList[
"HDDM_ElementList"] =
"_HDDM_ElementList_type";
641 builder.
typesList[
"streamposition"] =
"_streamposition_type";
642 builder.
typesList[
"ostream"] =
"_ostream_type";
643 builder.
typesList[
"istream"] =
"_istream_type";
648 "// wrap class hddm_" << classPrefix <<
"::streamposition"
649 " as hddm_" << classPrefix <<
".streamposition\n"
653 " streamposition *streampos;\n"
654 "} _streamposition;\n"
657 "_streamposition_dealloc(_streamposition* self)\n"
659 " if (self->streampos != 0)\n"
660 " delete self->streampos;\n"
661 " Py_TYPE(self)->tp_free((PyObject*)self);\n"
665 "_streamposition_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n"
667 " _streamposition *self;\n"
668 " self = (_streamposition*)type->tp_alloc(type, 0);\n"
669 " if (self != NULL)\n"
670 " self->streampos = 0;\n"
671 " return (PyObject*)self;\n"
675 "_streamposition_init(_streamposition *self, PyObject *args, PyObject *kwds)\n"
677 " const char *kwlist[] = {\"start\", \"offset\", \"status\", NULL};\n"
678 " uint64_t start = 0;\n"
679 " uint32_t offset = 0;\n"
680 " uint32_t status = 0;\n"
681 " if (PyArg_ParseTuple(args, \"\") ||\n"
682 " PyArg_ParseTupleAndKeywords(args, kwds, \"kII\", (char**)kwlist, \n"
683 " &start, &offset, &status))\n"
686 " if (self->streampos != 0)\n"
687 " delete self->streampos;\n"
688 " self->streampos = new streamposition(start, offset, status);\n"
695 "_streamposition_richcompare(PyObject *a, PyObject *b, int op)\n"
698 " streamposition *apos = ((_streamposition*)a)->streampos;\n"
699 " streamposition *bpos = ((_streamposition*)b)->streampos;\n"
700 " if (op == Py_LT)\n"
701 " res = (*apos < *bpos);\n"
702 " else if (op == Py_LE)\n"
703 " res = (*apos <= *bpos);\n"
704 " else if (op == Py_EQ)\n"
705 " res = (*apos == *bpos);\n"
706 " else if (op == Py_NE)\n"
707 " res = (*apos != *bpos);\n"
708 " else if (op == Py_GT)\n"
709 " res = (*apos > *bpos);\n"
710 " else if (op == Py_GE)\n"
711 " res = (*apos >= *bpos);\n"
713 " Py_INCREF(Py_True);\n"
717 " Py_INCREF(Py_False);\n"
718 " return Py_False;\n"
722 "_streamposition_toString(PyObject *self, PyObject *args=0)\n"
724 " std::stringstream ostr;\n"
725 " ostr << \"hddm_" << classPrefix <<
".streamposition(\"\n"
726 " << ((_streamposition*)self)->streampos->block_start << \",\"\n"
727 " << ((_streamposition*)self)->streampos->block_offset << \",\"\n"
728 " << ((_streamposition*)self)->streampos->block_status\n"
730 " return PyUnicode_FromString(ostr.str().c_str());\n"
734 "_streamposition_toRepr(PyObject *self, PyObject *args=0)\n"
736 " std::stringstream ostr;\n"
737 " ostr << \"\\\'\";\n"
738 " ostr << \"hddm_" << classPrefix <<
".streamposition(\"\n"
739 " << ((_streamposition*)self)->streampos->block_start << \",\"\n"
740 " << ((_streamposition*)self)->streampos->block_offset << \",\"\n"
741 " << ((_streamposition*)self)->streampos->block_status\n"
743 " ostr << \"\\\'\";\n"
744 " return PyUnicode_FromString(ostr.str().c_str());\n"
748 "_streamposition_getstart(_streamposition *self, void *closure)\n"
750 " return Py_BuildValue(\"k\", self->streampos->block_start);\n"
754 "_streamposition_setstart(_streamposition *self, PyObject *value, void *closure)\n"
756 " if (value == NULL) {\n"
757 " PyErr_SetString(PyExc_TypeError, \"unexpected null argument\");\n"
760 " long start = PyInt_AsLong(value);\n"
761 " if (start < 0 && PyErr_Occurred()) {\n"
764 " self->streampos->block_start = start;\n"
769 "_streamposition_getoffset(_streamposition *self, void *closure)\n"
771 " return Py_BuildValue(\"I\", self->streampos->block_offset);\n"
775 "_streamposition_setoffset(_streamposition *self, PyObject *value, void *closure)\n"
777 " if (value == NULL) {\n"
778 " PyErr_SetString(PyExc_TypeError, \"unexpected null argument\");\n"
781 " long offset = PyInt_AsLong(value);\n"
782 " if (offset < 0 && PyErr_Occurred()) {\n"
785 " self->streampos->block_offset = offset;\n"
790 "_streamposition_getstatus(_streamposition *self, void *closure)\n"
792 " return Py_BuildValue(\"I\", self->streampos->block_status);\n"
796 "_streamposition_setstatus(_streamposition *self, PyObject *value, void *closure)\n"
798 " if (value == NULL) {\n"
799 " PyErr_SetString(PyExc_TypeError, \"unexpected null argument\");\n"
802 " long status = PyInt_AsLong(value);\n"
803 " if (status == -1 && PyErr_Occurred()) {\n"
806 " self->streampos->block_status = status;\n"
810 "static PyGetSetDef _streamposition_getsetters[] = {\n"
811 " {(char*)\"start\", \n"
812 " (getter)_streamposition_getstart, (setter)_streamposition_setstart,\n"
813 " (char*)\"block start position\",\n"
815 " {(char*)\"offset\", \n"
816 " (getter)_streamposition_getoffset, (setter)_streamposition_setoffset,\n"
817 " (char*)\"block offset position\",\n"
819 " {(char*)\"status\", \n"
820 " (getter)_streamposition_getstatus, (setter)_streamposition_setstatus,\n"
821 " (char*)\"block status flags\",\n"
823 " {NULL} /* Sentinel */\n"
826 "static PyMemberDef _streamposition_members[] = {\n"
827 " {NULL} /* Sentinel */\n"
830 "static PyMethodDef _streamposition_methods[] = {\n"
831 " {NULL} /* Sentinel */\n"
834 "static PyTypeObject _streamposition_type = {\n"
835 " PyVarObject_HEAD_INIT(NULL,0)\n"
836 " \"hddm_" << classPrefix <<
".streamposition\", /*tp_name*/\n"
837 " sizeof(_streamposition), /*tp_basicsize*/\n"
838 " 0, /*tp_itemsize*/\n"
839 " (destructor)_streamposition_dealloc, /*tp_dealloc*/\n"
841 " 0, /*tp_getattr*/\n"
842 " 0, /*tp_setattr*/\n"
843 " 0, /*tp_compare*/\n"
844 " (reprfunc)_streamposition_toRepr, /*tp_repr*/\n"
845 " 0, /*tp_as_number*/\n"
846 " 0, /*tp_as_sequence*/\n"
847 " 0, /*tp_as_mapping*/\n"
850 " (reprfunc)_streamposition_toString, /*tp_str*/\n"
851 " 0, /*tp_getattro*/\n"
852 " 0, /*tp_setattro*/\n"
853 " 0, /*tp_as_buffer*/\n"
854 " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/\n"
855 " \"hddm_" << classPrefix <<
" streamposition objects\", /* tp_doc */\n"
856 " 0, /* tp_traverse */\n"
857 " 0, /* tp_clear */\n"
858 " _streamposition_richcompare, /* tp_richcompare */\n"
859 " 0, /* tp_weaklistoffset */\n"
860 " 0, /* tp_iter */\n"
861 " 0, /* tp_iternext */\n"
862 " _streamposition_methods, /* tp_methods */\n"
863 " _streamposition_members, /* tp_members */\n"
864 " _streamposition_getsetters, /* tp_getset */\n"
865 " 0, /* tp_base */\n"
866 " 0, /* tp_dict */\n"
867 " 0, /* tp_descr_get */\n"
868 " 0, /* tp_descr_set */\n"
869 " 0, /* tp_dictoffset */\n"
870 " (initproc)_streamposition_init, /* tp_init */\n"
871 " 0, /* tp_alloc */\n"
872 " _streamposition_new, /* tp_new */\n"
876 "// wrap class hddm_" << classPrefix <<
"::ostream"
877 " as hddm_" << classPrefix <<
".ostream\n"
881 " std::string *fname;\n"
882 " std::ofstream *fstr;\n"
887 "_ostream_dealloc(_ostream* self)\n"
889 " if (self->fname != 0)\n"
890 " delete self->fname;\n"
891 " if (self->ostr != 0)\n"
892 " delete self->ostr;\n"
893 " if (self->fstr != 0)\n"
894 " delete self->fstr;\n"
895 " Py_TYPE(self)->tp_free((PyObject*)self);\n"
899 "_ostream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n"
902 " self = (_ostream*)type->tp_alloc(type, 0);\n"
903 " if (self != NULL) {\n"
904 " self->fname = 0;\n"
908 " return (PyObject*)self;\n"
912 "_ostream_init(_ostream *self, PyObject *args, PyObject *kwds)\n"
914 " const char *kwlist[] = {\"file\", NULL};\n"
916 " if (PyArg_ParseTupleAndKeywords(args, kwds, \"s\", (char**)kwlist, &filename))\n"
918 " if (self->fname != 0)\n"
919 " delete self->fname;\n"
920 " if (self->ostr != 0)\n"
921 " delete self->ostr;\n"
922 " if (self->fstr != 0)\n"
923 " delete self->fstr;\n"
924 " self->fname = new std::string(filename);\n"
925 " self->fstr = new std::ofstream(filename);\n"
926 " if (! self->fstr->good()) {\n"
927 " PyErr_Format(PyExc_IOError, \"Cannot open output file \\%s\", filename);\n"
931 " self->ostr = new ostream(*self->fstr);\n"
933 " catch (std::exception& e) {\n"
934 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
943 "_ostream_getCompression(_ostream *self, void *closure)\n"
945 " return Py_BuildValue(\"i\", self->ostr->getCompression());\n"
949 "_ostream_setCompression(_ostream *self, PyObject *value, void *closure)\n"
951 " if (value == NULL) {\n"
952 " PyErr_SetString(PyExc_TypeError, \"unexpected null argument\");\n"
955 " long flags = PyInt_AsLong(value);\n"
956 " if (flags == -1 && PyErr_Occurred()) {\n"
960 " self->ostr->setCompression(flags);\n"
962 " catch (std::exception& e) {\n"
963 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
970 "_ostream_getIntegrityChecks(_ostream *self, void *closure)\n"
972 " PyObject *flags = Py_BuildValue(\"i\", self->ostr->getIntegrityChecks());\n"
977 "_ostream_setIntegrityChecks(_ostream *self, PyObject *value, void *closure)\n"
979 " if (value == NULL) {\n"
980 " PyErr_SetString(PyExc_TypeError, \"unexpected null argument\");\n"
983 " long flags = PyInt_AsLong(value);\n"
984 " if (flags == -1 && PyErr_Occurred()) {\n"
988 " self->ostr->setIntegrityChecks(flags);\n"
990 " catch (std::exception& e) {\n"
991 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
998 "_ostream_getPosition(_ostream *self, void *closure)\n"
1000 " streamposition *pos = new streamposition();\n"
1001 " if (self->ostr != 0)\n"
1002 " *pos = self->ostr->getPosition();\n"
1003 " PyObject *pos_obj = _streamposition_new(&_streamposition_type, 0, 0);\n"
1004 " ((_streamposition*)pos_obj)->streampos = pos;\n"
1005 " return pos_obj;\n"
1008 "static PyObject*\n"
1009 "_ostream_getRecordsWritten(_ostream *self, void *closure)\n"
1011 " int records = 0;\n"
1012 " if (self->ostr != 0)\n"
1014 " records = self->ostr->getRecordsWritten();\n"
1016 " catch (std::exception& e) {\n"
1017 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1020 " return PyLong_FromLong(records);\n"
1023 "static PyObject*\n"
1024 "_ostream_getBytesWritten(_ostream *self, void *closure)\n"
1027 " if (self->ostr != 0)\n"
1029 " bytes = self->ostr->getBytesWritten();\n"
1031 " catch (std::exception& e) {\n"
1032 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1035 " return PyLong_FromLong(bytes);\n"
1038 "static PyObject*\n"
1039 "_ostream_write(PyObject *self, PyObject *args)\n"
1041 " _HDDM *record_obj;\n"
1042 " if (! PyArg_ParseTuple(args, \"O!\", &_HDDM_type, (PyObject*)&record_obj))\n"
1044 " ostream *ostr = ((_ostream*)self)->ostr;\n"
1046 " Py_BEGIN_ALLOW_THREADS\n"
1047 " *ostr << *record_obj->elem;\n"
1048 " Py_END_ALLOW_THREADS\n"
1050 " catch (std::exception& e) {\n"
1051 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1054 " Py_INCREF(Py_None);\n"
1055 " return Py_None;\n"
1058 "static PyObject*\n"
1059 "_ostream_toString(PyObject *self, PyObject *args=0)\n"
1061 " std::stringstream ostr;\n"
1062 " if (((_ostream*)self)->fname != 0)\n"
1063 " ostr << \"hddm_" << classPrefix <<
".ostream(\\\"\"\n"
1064 " << *((_ostream*)self)->fname << \"\\\")\";\n"
1066 " ostr << \"hddm_" << classPrefix <<
".ostream(NULL)\";\n"
1067 " return PyUnicode_FromString(ostr.str().c_str());\n"
1070 "static PyObject*\n"
1071 "_ostream_toRepr(PyObject *self, PyObject *args=0)\n"
1073 " std::stringstream ostr;\n"
1074 " ostr << \"\\\'\";\n"
1075 " if (((_ostream*)self)->fname != 0)\n"
1076 " ostr << \"hddm_" << classPrefix <<
".ostream(\\\"\"\n"
1077 " << *((_ostream*)self)->fname << \"\\\")\";\n"
1079 " ostr << \"hddm_" << classPrefix <<
".ostream()\";\n"
1080 " ostr << \"\\\'\";\n"
1081 " return PyUnicode_FromString(ostr.str().c_str());\n"
1084 "static PyGetSetDef _ostream_getsetters[] = {\n"
1085 " {(char*)\"compression\", \n"
1086 " (getter)_ostream_getCompression, (setter)_ostream_setCompression,\n"
1087 " (char*)\"ostream compression mode (k_no_compression, k_z_compression, ...)\",\n"
1089 " {(char*)\"integrityChecks\", \n"
1090 " (getter)_ostream_getIntegrityChecks, (setter)_ostream_setIntegrityChecks,\n"
1091 " (char*)\"ostream data integrity checking mode (k_no_integrity, ...)\",\n"
1093 " {(char*)\"position\", \n"
1094 " (getter)_ostream_getPosition, 0,\n"
1095 " (char*)\"output stream position\",\n"
1097 " {(char*)\"recordsWritten\", \n"
1098 " (getter)_ostream_getRecordsWritten, 0,\n"
1099 " (char*)\"total records written to ostream\",\n"
1101 " {(char*)\"bytesWritten\", \n"
1102 " (getter)_ostream_getBytesWritten, 0,\n"
1103 " (char*)\"total bytes written to ostream\",\n"
1105 " {NULL} /* Sentinel */\n"
1108 "static PyMemberDef _ostream_members[] = {\n"
1109 " {NULL} /* Sentinel */\n"
1112 "static PyMethodDef _ostream_methods[] = {\n"
1113 " {\"write\", _ostream_write, METH_VARARGS,\n"
1114 " \"write a HDDM record to the output stream.\"},\n"
1115 " {NULL} /* Sentinel */\n"
1118 "static PyTypeObject _ostream_type = {\n"
1119 " PyVarObject_HEAD_INIT(NULL,0)\n"
1120 " \"hddm_" << classPrefix <<
".ostream\", /*tp_name*/\n"
1121 " sizeof(_ostream), /*tp_basicsize*/\n"
1122 " 0, /*tp_itemsize*/\n"
1123 " (destructor)_ostream_dealloc, /*tp_dealloc*/\n"
1124 " 0, /*tp_print*/\n"
1125 " 0, /*tp_getattr*/\n"
1126 " 0, /*tp_setattr*/\n"
1127 " 0, /*tp_compare*/\n"
1128 " (reprfunc)_ostream_toRepr, /*tp_repr*/\n"
1129 " 0, /*tp_as_number*/\n"
1130 " 0, /*tp_as_sequence*/\n"
1131 " 0, /*tp_as_mapping*/\n"
1132 " 0, /*tp_hash */\n"
1134 " (reprfunc)_ostream_toString, /*tp_str*/\n"
1135 " 0, /*tp_getattro*/\n"
1136 " 0, /*tp_setattro*/\n"
1137 " 0, /*tp_as_buffer*/\n"
1138 " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/\n"
1139 " \"hddm_" << classPrefix <<
" output stream\", /* tp_doc */\n"
1140 " 0, /* tp_traverse */\n"
1141 " 0, /* tp_clear */\n"
1142 " 0, /* tp_richcompare */\n"
1143 " 0, /* tp_weaklistoffset */\n"
1144 " 0, /* tp_iter */\n"
1145 " 0, /* tp_iternext */\n"
1146 " _ostream_methods, /* tp_methods */\n"
1147 " _ostream_members, /* tp_members */\n"
1148 " _ostream_getsetters, /* tp_getset */\n"
1149 " 0, /* tp_base */\n"
1150 " 0, /* tp_dict */\n"
1151 " 0, /* tp_descr_get */\n"
1152 " 0, /* tp_descr_set */\n"
1153 " 0, /* tp_dictoffset */\n"
1154 " (initproc)_ostream_init, /* tp_init */\n"
1155 " 0, /* tp_alloc */\n"
1156 " _ostream_new, /* tp_new */\n"
1160 "// wrap class hddm_" << classPrefix <<
"::istream"
1161 " as hddm_" << classPrefix <<
".istream\n"
1163 "typedef struct {\n"
1165 " std::string *fname;\n"
1166 " std::ifstream *fstr;\n"
1171 "_istream_dealloc(_istream* self)\n"
1173 " if (self->fname != 0)\n"
1174 " delete self->fname;\n"
1175 " if (self->istr != 0)\n"
1176 " delete self->istr;\n"
1177 " if (self->fstr != 0)\n"
1178 " delete self->fstr;\n"
1179 " Py_TYPE(self)->tp_free((PyObject*)self);\n"
1182 "static PyObject*\n"
1183 "_istream_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n"
1185 " _istream *self;\n"
1186 " self = (_istream*)type->tp_alloc(type, 0);\n"
1187 " if (self != NULL) {\n"
1188 " self->fname = 0;\n"
1189 " self->fstr = 0;\n"
1190 " self->istr = 0;\n"
1192 " return (PyObject*)self;\n"
1196 "_istream_init(_istream *self, PyObject *args, PyObject *kwds)\n"
1198 " const char *kwlist[] = {\"file\", NULL};\n"
1199 " char *filename;\n"
1200 " if (PyArg_ParseTupleAndKeywords(args, kwds, \"s\", (char**)kwlist, &filename))\n"
1202 " if (self->fname != 0)\n"
1203 " delete self->fname;\n"
1204 " if (self->istr != 0)\n"
1205 " delete self->istr;\n"
1206 " if (self->fstr != 0)\n"
1207 " delete self->fstr;\n"
1208 " self->fname = new std::string(filename);\n"
1209 " self->fstr = new std::ifstream(filename);\n"
1210 " if (! self->fstr->good()) {\n"
1211 " PyErr_Format(PyExc_IOError, \"Cannot open input file \\%s\", filename);\n"
1215 " self->istr = new istream(*self->fstr);\n"
1217 " catch (std::exception& e) {\n"
1218 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1226 "static PyObject*\n"
1227 "_istream_getCompression(_istream *self, void *closure)\n"
1229 " return Py_BuildValue(\"i\", self->istr->getCompression());\n"
1232 "static PyObject*\n"
1233 "_istream_getIntegrityChecks(_istream *self, void *closure)\n"
1235 " return Py_BuildValue(\"i\", self->istr->getIntegrityChecks());\n"
1238 "static PyObject*\n"
1239 "_istream_getPosition(_istream *self, void *closure)\n"
1241 " streamposition *pos = new streamposition();\n"
1242 " if (self->istr != 0)\n"
1244 " *pos = self->istr->getPosition();\n"
1246 " catch (std::exception& e) {\n"
1247 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1250 " PyObject *pos_obj = _streamposition_new(&_streamposition_type, 0, 0);\n"
1251 " ((_streamposition*)pos_obj)->streampos = pos;\n"
1252 " return pos_obj;\n"
1256 "_istream_setPosition(_istream *self, PyObject *value, void *closure)\n"
1258 " if (Py_TYPE(value) != &_streamposition_type)\n"
1260 " PyErr_SetString(PyExc_TypeError, \"unexpected argument type\");\n"
1263 " streamposition *pos = ((_streamposition*)value)->streampos;\n"
1264 " if (pos == 0) {\n"
1265 " PyErr_SetString(PyExc_TypeError, \"unexpected null argument\");\n"
1269 " self->istr->setPosition(*pos);\n"
1271 " catch (std::exception& e) {\n"
1272 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1278 "static PyObject*\n"
1279 "_istream_getRecordsRead(_istream *self, void *closure)\n"
1281 " int records = 0;\n"
1282 " if (self->istr != 0)\n"
1284 " records = self->istr->getRecordsRead();\n"
1286 " catch (std::exception& e) {\n"
1287 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1290 " return PyLong_FromLong(records);\n"
1293 "static PyObject*\n"
1294 "_istream_getBytesRead(_istream *self, void *closure)\n"
1297 " if (self->istr != 0)\n"
1299 " bytes = self->istr->getBytesRead();\n"
1301 " catch (std::exception& e) {\n"
1302 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1305 " return PyLong_FromLong(bytes);\n"
1308 "static PyObject*\n"
1309 "_istream_skip(PyObject *self, PyObject *args)\n"
1312 " if (! PyArg_ParseTuple(args, \"I\", &count)) {\n"
1313 " PyErr_SetString(PyExc_TypeError, \"missing argument in skip\");\n"
1316 " else if (count < 0) {\n"
1317 " PyErr_SetString(PyExc_TypeError, \"skip count cannot be negative\");\n"
1320 " istream *istr = ((_istream*)self)->istr;\n"
1321 " if (istr == 0) {\n"
1322 " PyErr_SetString(PyExc_TypeError, \"unexpected null istream ptr\");\n"
1325 " istr->skip(count);\n"
1326 " return PyLong_FromLong(0);\n"
1329 "static PyObject*\n"
1330 "_istream_read(PyObject *self, PyObject *args)\n"
1332 " istream *istr = ((_istream*)self)->istr;\n"
1333 " if (istr == 0) {\n"
1334 " PyErr_SetString(PyExc_TypeError, \"unexpected null input stream\");\n"
1337 " _HDDM *record_obj = (_HDDM*)_HDDM_new(&_HDDM_type, 0, 0);\n"
1338 " record_obj->elem = new HDDM();\n"
1339 " record_obj->host = (PyObject*)record_obj;\n"
1341 " Py_BEGIN_ALLOW_THREADS\n"
1342 " *istr >> *record_obj->elem;\n"
1343 " Py_END_ALLOW_THREADS\n"
1345 " catch (std::exception& e) {\n"
1346 " PyErr_SetString(PyExc_RuntimeError, e.what());\n"
1350 " LOG_NEW(Py_TYPE(record_obj), 0, 1);\n"
1351 " return (PyObject*)record_obj;\n"
1356 "static PyObject*\n"
1357 "_istream_toString(PyObject *self, PyObject *args=0)\n"
1359 " std::stringstream ostr;\n"
1360 " if (((_ostream*)self)->fname != 0)\n"
1361 " ostr << \"hddm_" << classPrefix <<
".istream(\\\"\"\n"
1362 " << *((_istream*)self)->fname << \"\\\")\";\n"
1364 " ostr << \"hddm_" << classPrefix <<
".istream(NULL)\";\n"
1365 " return PyUnicode_FromString(ostr.str().c_str());\n"
1368 "static PyObject*\n"
1369 "_istream_toRepr(PyObject *self, PyObject *args=0)\n"
1371 " std::stringstream ostr;\n"
1372 " ostr << \"\\\'\";\n"
1373 " if (((_ostream*)self)->fname != 0)\n"
1374 " ostr << \"hddm_" << classPrefix <<
".istream(\\\"\"\n"
1375 " << *((_istream*)self)->fname << \"\\\")\";\n"
1377 " ostr << \"hddm_" << classPrefix <<
".istream()\";\n"
1378 " ostr << \"\\\'\";\n"
1379 " return PyUnicode_FromString(ostr.str().c_str());\n"
1382 "static PyObject*\n"
1383 "_istream_iter(PyObject *self)\n"
1385 " Py_INCREF(self);\n"
1388 "static PyObject*\n"
1389 "_istream_next(PyObject *self)\n"
1391 " PyObject *rec = _istream_read(self, 0);\n"
1392 " if (rec == NULL)\n"
1393 " PyErr_SetString(PyExc_StopIteration, \"no more data on input stream\");\n"
1397 "static PyGetSetDef _istream_getsetters[] = {\n"
1398 " {(char*)\"compression\", \n"
1399 " (getter)_istream_getCompression, 0,\n"
1400 " (char*)\"istream compression mode (k_no_compression, k_z_compression, ...)\",\n"
1402 " {(char*)\"integrityChecks\", \n"
1403 " (getter)_istream_getIntegrityChecks, 0,\n"
1404 " (char*)\"istream data integrity checking mode (k_no_integrity, ...)\",\n"
1406 " {(char*)\"position\", \n"
1407 " (getter)_istream_getPosition, (setter)_istream_setPosition,\n"
1408 " (char*)\"input stream position\",\n"
1410 " {(char*)\"recordsRead\", \n"
1411 " (getter)_istream_getRecordsRead, 0,\n"
1412 " (char*)\"total records read from istream\",\n"
1414 " {(char*)\"bytesRead\", \n"
1415 " (getter)_istream_getBytesRead, 0,\n"
1416 " (char*)\"total bytes read from istream\",\n"
1418 " {NULL} /* Sentinel */\n"
1421 "static PyMemberDef _istream_members[] = {\n"
1422 " {NULL} /* Sentinel */\n"
1425 "static PyMethodDef _istream_methods[] = {\n"
1426 " {\"read\", _istream_read, METH_NOARGS,\n"
1427 " \"read a HDDM record from the input stream.\"},\n"
1428 " {\"skip\", _istream_skip, METH_VARARGS,\n"
1429 " \"skip ahead given number of HDDM records in the input stream.\"},\n"
1430 " {NULL} /* Sentinel */\n"
1433 "static PyTypeObject _istream_type = {\n"
1434 " PyVarObject_HEAD_INIT(NULL,0)\n"
1435 " \"hddm_" << classPrefix <<
".istream\", /*tp_name*/\n"
1436 " sizeof(_istream), /*tp_basicsize*/\n"
1437 " 0, /*tp_itemsize*/\n"
1438 " (destructor)_istream_dealloc, /*tp_dealloc*/\n"
1439 " 0, /*tp_print*/\n"
1440 " 0, /*tp_getattr*/\n"
1441 " 0, /*tp_setattr*/\n"
1442 " 0, /*tp_compare*/\n"
1443 " (reprfunc)_istream_toRepr, /*tp_repr*/\n"
1444 " 0, /*tp_as_number*/\n"
1445 " 0, /*tp_as_sequence*/\n"
1446 " 0, /*tp_as_mapping*/\n"
1447 " 0, /*tp_hash */\n"
1449 " (reprfunc)_istream_toString, /*tp_str*/\n"
1450 " 0, /*tp_getattro*/\n"
1451 " 0, /*tp_setattro*/\n"
1452 " 0, /*tp_as_buffer*/\n"
1453 " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/\n"
1454 " \"hddm_" << classPrefix <<
" output stream\", /* tp_doc */\n"
1455 " 0, /* tp_traverse */\n"
1456 " 0, /* tp_clear */\n"
1457 " 0, /* tp_richcompare */\n"
1458 " 0, /* tp_weaklistoffset */\n"
1459 " _istream_iter, /* tp_iter */\n"
1460 " _istream_next, /* tp_iternext */\n"
1461 " _istream_methods, /* tp_methods */\n"
1462 " _istream_members, /* tp_members */\n"
1463 " _istream_getsetters, /* tp_getset */\n"
1464 " 0, /* tp_base */\n"
1465 " 0, /* tp_dict */\n"
1466 " 0, /* tp_descr_get */\n"
1467 " 0, /* tp_descr_set */\n"
1468 " 0, /* tp_dictoffset */\n"
1469 " (initproc)_istream_init, /* tp_init */\n"
1470 " 0, /* tp_alloc */\n"
1471 " _istream_new, /* tp_new */\n"
1478 "// module declarations\n"
1480 "static PyMethodDef hddm_" << classPrefix <<
"_methods[] = {\n"
1481 " {NULL} /* Sentinel */\n"
1484 "char hddm_" << classPrefix <<
"_doc[] = \"Python module for "
1485 "hddm_" << classPrefix <<
" i/o package\";\n"
1487 "#if PY_MAJOR_VERSION >= 3\n"
1488 " static struct PyModuleDef moduledef = {\n"
1489 " PyModuleDef_HEAD_INIT,\n"
1490 " \"hddm_" << classPrefix <<
"\", /* m_name */\n"
1491 " hddm_" << classPrefix <<
"_doc, /* m_doc */\n"
1492 " -1, /* m_size */\n"
1493 " hddm_" << classPrefix <<
"_methods, /* m_methods */\n"
1494 " NULL, /* m_reload */\n"
1495 " NULL, /* m_traverse */\n"
1496 " NULL, /* m_clear */\n"
1497 " NULL, /* m_free */\n"
1501 "static PyObject *\n"
1502 "hddm_" << classPrefix <<
"_init(void) \n"
1506 "#if PY_MAJOR_VERSION >= 3\n"
1507 " m = PyModule_Create(&moduledef);\n"
1509 " m = Py_InitModule3(\"hddm_" << classPrefix <<
"\","
1510 " hddm_" << classPrefix <<
"_methods,"
1511 " hddm_" << classPrefix <<
"_doc);\n"
1519 std::map<XtString,XtString>::iterator titer;
1521 titer != builder.
typesList.end(); ++titer)
1524 " if (PyType_Ready(&" << titer->second <<
") < 0)\n"
1526 " Py_INCREF(&" << titer->second <<
");\n"
1527 " PyModule_AddObject(m, \"" << titer->first <<
"\","
1528 " (PyObject*)&" << titer->second <<
");\n"
1534 " PyModule_AddIntConstant(m, \"k_default_status\", k_default_status);\n"
1535 " PyModule_AddIntConstant(m, \"k_bits_compression\", k_bits_compression);\n"
1536 " PyModule_AddIntConstant(m, \"k_no_compression\", k_no_compression);\n"
1537 " PyModule_AddIntConstant(m, \"k_z_compression\", k_z_compression);\n"
1538 " PyModule_AddIntConstant(m, \"k_bz2_compression\", k_bz2_compression);\n"
1539 " PyModule_AddIntConstant(m, \"k_bits_integrity\", k_bits_integrity);\n"
1540 " PyModule_AddIntConstant(m, \"k_no_integrity\", k_no_integrity);\n"
1541 " PyModule_AddIntConstant(m, \"k_crc32_integrity\", k_crc32_integrity);\n"
1542 " PyModule_AddIntConstant(m, \"k_bits_randomaccess\", k_bits_randomaccess);\n"
1543 " PyModule_AddIntConstant(m, \"k_can_reposition\", k_can_reposition);\n"
1544 " PyModule_AddIntConstant(m, \"k_hddm_unknown\", k_hddm_unknown);\n"
1545 " PyModule_AddIntConstant(m, \"k_hddm_int\", k_hddm_int);\n"
1546 " PyModule_AddIntConstant(m, \"k_hddm_long\", k_hddm_long);\n"
1547 " PyModule_AddIntConstant(m, \"k_hddm_float\", k_hddm_float);\n"
1548 " PyModule_AddIntConstant(m, \"k_hddm_double\", k_hddm_double);\n"
1549 " PyModule_AddIntConstant(m, \"k_hddm_boolean\", k_hddm_boolean);\n"
1550 " PyModule_AddIntConstant(m, \"k_hddm_string\", k_hddm_string);\n"
1551 " PyModule_AddIntConstant(m, \"k_hddm_anyURI\", k_hddm_anyURI);\n"
1552 " PyModule_AddIntConstant(m, \"k_hddm_Particle_t\", k_hddm_Particle_t);\n"
1553 " std::string docstring = HDDM::DocumentString();\n"
1554 " PyModule_AddStringConstant(m, \"DocumentString\", docstring.c_str());\n"
1559 "#if PY_MAJOR_VERSION < 3\n"
1561 " inithddm_" << classPrefix <<
"(void)\n"
1563 " hddm_" << classPrefix <<
"_init();\n"
1567 " PyInit_hddm_" << classPrefix <<
"(void)\n"
1569 " return hddm_" << classPrefix <<
"_init();\n"
1577 size_t p1 = pyname.rfind(
"pyhddm_");
1578 pyname.erase(p1, 2);
1579 pyname.insert(p1,
"setup_");
1580 size_t p2 = pyname.rfind(
"cpy");
1581 pyname.erase(p2, 1);
1583 std::ofstream pysetup(pyname.c_str());
1586 "from distutils.core import setup, Extension\n"
1587 "from shutil import copyfile, rmtree\n"
1590 "source_dir = os.path.realpath(__file__)\n"
1591 "m = re.sub(r'/[^/]*$', '', source_dir)\n"
1595 " source_dir = '.'\n"
1596 "source_file = 'pyhddm_" + classPrefix +
".cxx'\n"
1597 "source_files = [source_file, source_dir + '/hddm_" + classPrefix +
"++.cpp']\n"
1598 "copyfile(source_dir + '/pyhddm_" + classPrefix +
".cpy', source_file)\n"
1600 "module1 = Extension('hddm_" + classPrefix +
"',\n"
1601 " include_dirs = [os.environ['HALLD_RECON_HOME'] + '/' +\n"
1602 " os.environ['BMS_OSNAME'] + '/include',\n"
1603 " os.environ['HALLD_RECON_HOME'] + \n"
1604 " '/src/libraries/include',\n"
1606 " libraries = ['HDDM', 'xstream', 'bz2', 'z'],\n"
1607 " library_dirs = [os.environ['HALLD_RECON_HOME'] + '/' +\n"
1608 " os.environ['BMS_OSNAME'] + '/lib'],\n"
1609 " extra_compile_args = ['-std=c++11'],\n"
1610 " sources = source_files)\n"
1612 "setup (name = 'hddm_" << classPrefix <<
"',\n"
1613 " version = '1.0',\n"
1614 " description = 'HDDM data model i/o package',\n"
1615 " ext_modules = [module1])\n"
1617 "os.remove(source_file)\n"
1618 "for dname in os.listdir('build_hddm_" << classPrefix <<
"'):\n"
1619 " for soname in os.listdir('build_hddm_" << classPrefix <<
"/' + dname):\n"
1620 " if re.match(r'.*\\.so', soname):\n"
1621 " src = 'build_hddm_" << classPrefix <<
"/' + dname + '/' + soname\n"
1622 " dest = source_dir + '/' + soname\n"
1623 " copyfile(src, dest)\n"
1624 "rmtree('build_hddm_" + classPrefix <<
"')\n"
1627 XMLPlatformUtils::Terminate();
1634 XtString::size_type len = p.size();
1635 if (len > 3 && p.substr(len-3,3) ==
"tum")
1637 p.replace(len-3,3,
"ta");
1639 else if (len > 1 && p.substr(len-3,3) ==
"ies")
1641 p.replace(len-3,3,
"iesList");
1643 else if (len > 2 && p.substr(len-2,2) ==
"ex")
1645 p.replace(len-2,2,
"ices");
1647 else if (len > 2 && p.substr(len-2,2) ==
"sh")
1649 p.replace(len-2,2,
"shes");
1651 else if (len > 1 && p.substr(len-1,1) ==
"s")
1653 p.replace(len-1,1,
"ses");
1668 p[0] = toupper(p[0]);
1678 r[0] = toupper(r[0]);
1689 r[0] = toupper(r[0]);
1701 parentList_t::iterator iter;
1702 for (iter = list.begin(); iter != list.end(); ++iter, ++n)
1704 DOMElement *el = (DOMElement*)(*iter);
1706 if (cnameS == name) {
1719 if (el->getParentNode() == elref->getParentNode())
1722 <<
"hddm-py error: tag " <<
"\"" << tagS
1723 <<
"\" is duplicated within one context in xml document."
1728 DOMNamedNodeMap* oldAttr = elref->getAttributes();
1729 DOMNamedNodeMap* newAttr = el->getAttributes();
1730 unsigned int listLength = oldAttr->getLength();
1731 for (
unsigned int n = 0; n < listLength; n++)
1733 XtString nameS(oldAttr->item(n)->getNodeName());
1734 XtString oldS(elref->getAttribute(
X(nameS)));
1735 XtString newS(el->getAttribute(
X(nameS)));
1736 if (nameS ==
"minOccurs")
1740 else if (nameS ==
"maxOccurs")
1742 int maxold = (oldS ==
"unbounded")? INT_MAX : atoi(
S(oldS));
1743 int maxnew = (newS ==
"unbounded")? INT_MAX : atoi(
S(newS));
1744 if ((maxold < 2 && maxnew > 1) || (maxold > 1 && maxnew < 2))
1747 <<
"hddm-py error: inconsistent maxOccurs usage by tag "
1748 <<
"\"" << tagS <<
"\" in xml document." << std::endl;
1752 else if (newS != oldS)
1755 <<
"hddm-py error: inconsistent usage of attribute "
1756 <<
"\"" << nameS <<
"\" in tag "
1757 <<
"\"" << tagS <<
"\" in xml document." << std::endl;
1761 listLength = newAttr->getLength();
1762 for (
unsigned int n = 0; n < listLength; n++)
1764 XtString nameS(newAttr->item(n)->getNodeName());
1765 XtString oldS(elref->getAttribute(
X(nameS)));
1766 XtString newS(el->getAttribute(
X(nameS)));
1767 if (nameS ==
"minOccurs")
1771 else if (nameS ==
"maxOccurs")
1773 int maxold = (oldS ==
"unbounded")? INT_MAX : atoi(
S(oldS));
1774 int maxnew = (newS ==
"unbounded")? INT_MAX : atoi(
S(newS));
1775 if ((maxold < 2 && maxnew > 1) || (maxold > 1 && maxnew < 2))
1778 <<
"hddm-py error: inconsistent maxOccurs usage by tag "
1779 <<
"\"" << tagS <<
"\" in xml document." << std::endl;
1783 else if (newS != oldS)
1786 <<
"hddm-py error: inconsistent usage of attribute "
1787 <<
"\"" << nameS <<
"\" in tag "
1788 <<
"\"" << tagS <<
"\" in xml document." << std::endl;
1792 DOMNodeList* oldList = elref->getChildNodes();
1793 DOMNodeList* newList = el->getChildNodes();
1794 listLength = oldList->getLength();
1795 if (newList->getLength() != listLength)
1798 <<
"hddm-py error: inconsistent usage of tag "
1799 <<
"\"" << tagS <<
"\" in xml document." << std::endl;
1802 for (
unsigned int n = 0; n < listLength; n++)
1804 DOMNode* cont = oldList->item(n);
1805 XtString nameS(cont->getNodeName());
1806 short type = cont->getNodeType();
1807 if (type == DOMNode::ELEMENT_NODE)
1809 DOMNodeList* contList = el->getElementsByTagName(
X(nameS));
1810 if (contList->getLength() != 1)
1813 <<
"hddm-py error: inconsistent usage of tag "
1814 <<
"\"" << tagS <<
"\" in xml document." << std::endl;
1828 "// wrap element class hddm_" <<
classPrefix <<
"::" << tagS.simpleType() <<
1829 " as hddm_" <<
classPrefix <<
"." << tagS.simpleType() <<
"\n"
1831 "typedef struct {\n"
1833 " " << tagS.simpleType() <<
" *elem;\n"
1834 " PyObject *host;\n"
1835 "} _" << tagS.simpleType() <<
";\n"
1838 "_" << tagS.simpleType() <<
"_dealloc(_" << tagS.simpleType() <<
"* self)\n"
1840 " if (self->elem != 0) {\n"
1841 " LOG_DEALLOC(Py_TYPE(self), 0, self->host == (PyObject*)self);\n"
1842 " if (self->host == (PyObject*)self)\n"
1843 " delete self->elem;\n"
1845 " My_DECREF(self->host);\n"
1847 " Py_TYPE(self)->tp_free((PyObject*)self);\n"
1850 "static PyObject*\n"
1851 "_" << tagS.simpleType() <<
1852 "_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n"
1854 " _" << tagS.simpleType() <<
" *self;\n"
1855 " self = (_" << tagS.simpleType() <<
"*)type->tp_alloc(type, 0);\n"
1856 " if (self != NULL) {\n"
1857 " self->elem = 0;\n"
1858 " self->host = 0;\n"
1860 " return (PyObject*)self;\n"
1869 "_HDDM_init(_HDDM *self, PyObject *args, PyObject *kwds)\n"
1871 " LOG_NEW(Py_TYPE(self), 0, 1);\n"
1872 " self->elem = new HDDM();\n"
1873 " if (self->elem == 0) {\n"
1874 " PyErr_SetString(PyExc_RuntimeError, \"HDDM new constructor failed\");\n"
1877 " self->host = (PyObject*)self;\n"
1887 "_" << tagS.simpleType() <<
"_init(_" << tagS.simpleType() <<
1888 " *self, PyObject *args, PyObject *kwds)\n"
1890 " PyErr_SetString(PyExc_RuntimeError, \"illegal constructor\");\n"
1897 std::map<XtString,XtString> attrList;
1898 DOMNamedNodeMap *myAttr = el->getAttributes();
1899 for (
unsigned int n = 0; n < myAttr->getLength(); n++)
1901 XtString attrS(myAttr->item(n)->getNodeName());
1902 XtString typeS(el->getAttribute(
X(attrS)));
1903 attrList[attrS] = typeS;
1905 parentList_t::iterator iter;
1906 for (iter = parents[tagS].begin(); iter != parents[tagS].end(); ++iter)
1908 DOMElement *hostEl = (DOMElement*)(*iter);
1909 XtString hostS(hostEl->getTagName());
1910 DOMNamedNodeMap *hostAttr = hostEl->getAttributes();
1911 for (
unsigned int n = 0; n < hostAttr->getLength(); n++)
1913 XtString attrS(hostAttr->item(n)->getNodeName());
1914 if (attrList.find(attrS) != attrList.end())
1918 XtString typeS(hostEl->getAttribute(
X(attrS)));
1919 attrList[attrS] = typeS;
1920 XtString getS(
"get" + attrS.simpleType());
1921 pyFile <<
"static PyObject*\n" <<
1923 "(_" << tagS.
simpleType() <<
" *self, void *closure)\n"
1927 pyFile <<
" return PyLong_FromLong(self->elem->"
1928 << getS <<
"());\n";
1930 else if (typeS ==
"long")
1932 pyFile <<
" return PyLong_FromLong(self->elem->"
1933 << getS <<
"());\n";
1935 else if (typeS ==
"float")
1937 pyFile <<
" return PyFloat_FromDouble(self->elem->"
1938 << getS <<
"());\n";
1940 else if (typeS ==
"double")
1942 pyFile <<
" return PyFloat_FromDouble(self->elem->"
1943 << getS <<
"());\n";
1945 else if (typeS ==
"boolean")
1947 pyFile <<
" return PyBool_FromLong(self->elem->"
1948 << getS <<
"());\n";
1950 else if (typeS ==
"string")
1952 pyFile <<
" std::string val(self->elem->"
1954 <<
" return PyUnicode_FromString(val.c_str());\n";
1955 attrList[attrS] =
"string";
1957 else if (typeS ==
"anyURI")
1959 pyFile <<
" std::string val(self->elem->"
1961 <<
" return PyUnicode_FromString(val.c_str());\n";
1962 attrList[attrS] =
"string";
1964 else if (typeS ==
"Particle_t")
1966 pyFile <<
" Particle_t p(self->elem->"
1968 <<
" std::string val(ParticleType(p));\n"
1969 <<
" return PyUnicode_FromString(val.c_str());\n";
1973 pyFile <<
" return PyLong_FromLong(self->elem->"
1974 << getS <<
"());\n";
1978 pyFile <<
" return PyLong_FromLong(self->elem->"
1979 << getS <<
"());\n";
1983 pyFile <<
" return PyFloat_FromDouble(self->elem->"
1984 << getS <<
"());\n";
1988 pyFile <<
" return PyFloat_FromDouble(self->elem->"
1989 << getS <<
"());\n";
1993 pyFile <<
" return PyBool_FromLong(self->elem->"
1994 << getS <<
"());\n";
1996 else if (
guessType(typeS) ==
"Particle_t")
1998 pyFile <<
" Particle_t p(self->elem->"
2000 <<
" std::string val(ParticleType(p));\n"
2001 <<
" return PyUnicode_FromString(val.c_str());\n";
2005 pyFile <<
" std::string val(self->elem->"
2007 <<
" return PyUnicode_FromString(val.c_str());\n";
2008 attrList[attrS] =
"string";
2014 std::map<XtString,int> setters;
2015 myAttr = el->getAttributes();
2016 for (
unsigned int n = 0; n < myAttr->getLength(); n++)
2018 XtString attrS(myAttr->item(n)->getNodeName());
2019 XtString typeS(el->getAttribute(
X(attrS)));
2020 XtString getS(
"get" + attrS.simpleType());
2021 pyFile <<
"static PyObject*\n" <<
2023 "(_" << tagS.
simpleType() <<
" *self, void *closure)\n"
2027 pyFile <<
" return PyLong_FromLong(self->elem->"
2028 << getS <<
"());\n";
2030 else if (typeS ==
"long")
2032 pyFile <<
" return PyLong_FromLong(self->elem->"
2033 << getS <<
"());\n";
2035 else if (typeS ==
"float")
2037 pyFile <<
" return PyFloat_FromDouble(self->elem->"
2038 << getS <<
"());\n";
2040 else if (typeS ==
"double")
2042 pyFile <<
" return PyFloat_FromDouble(self->elem->"
2043 << getS <<
"());\n";
2045 else if (typeS ==
"boolean")
2047 pyFile <<
" return PyBool_FromLong(self->elem->"
2048 << getS <<
"());\n";
2050 else if (typeS ==
"string")
2052 pyFile <<
" std::string val(self->elem->"
2054 <<
" return PyUnicode_FromString(val.c_str());\n";
2056 else if (typeS ==
"anyURI")
2058 pyFile <<
" std::string val(self->elem->"
2060 <<
" return PyUnicode_FromString(val.c_str());\n";
2062 else if (typeS ==
"Particle_t")
2064 pyFile <<
" Particle_t p(self->elem->"
2066 <<
" std::string val(ParticleType(p));\n"
2067 <<
" return PyUnicode_FromString(val.c_str());\n";
2071 pyFile <<
" return PyLong_FromLong(self->elem->"
2072 << getS <<
"());\n";
2076 pyFile <<
" return PyLong_FromLong(self->elem->"
2077 << getS <<
"());\n";
2081 pyFile <<
" return PyFloat_FromDouble(self->elem->"
2082 << getS <<
"());\n";
2086 pyFile <<
" return PyFloat_FromDouble(self->elem->"
2087 << getS <<
"());\n";
2091 pyFile <<
" return PyBool_FromLong(self->elem->"
2092 << getS <<
"());\n";
2094 else if (
guessType(typeS) ==
"Particle_t")
2096 pyFile <<
" Particle_t p(self->elem->"
2098 <<
" std::string val(ParticleType(p));\n"
2099 <<
" return PyUnicode_FromString(val.c_str());\n";
2103 pyFile <<
" std::string val(self->elem->"
2105 <<
" return PyUnicode_FromString(val.c_str());\n";
2109 XtString setS(
"set" + attrS.simpleType());
2112 pyFile <<
"static int\n" <<
2115 " *self, PyObject *value, void *closure)\n"
2117 " long var = PyInt_AsLong(value);\n"
2118 " if (var == -1 && PyErr_Occurred()) {\n"
2121 " self->elem->" << setS <<
"(var);\n"
2126 else if (typeS ==
"long")
2128 pyFile <<
"static int\n" <<
2129 "_" << tagS.simpleType() <<
"_" << setS <<
2130 "(_" << tagS.simpleType() <<
2131 " *self, PyObject *value, void *closure)\n"
2133 " long var = PyInt_AsLong(value);\n"
2134 " if (var == -1 && PyErr_Occurred()) {\n"
2137 " self->elem->" << setS <<
"(var);\n"
2142 else if (typeS ==
"float")
2144 pyFile <<
"static int\n" <<
2145 "_" << tagS.simpleType() <<
"_" << setS <<
2146 "(_" << tagS.simpleType() <<
2147 " *self, PyObject *value, void *closure)\n"
2149 " double var = PyFloat_AsDouble(value);\n"
2150 " if (var == -1 && PyErr_Occurred()) {\n"
2153 " self->elem->" << setS <<
"(var);\n"
2158 else if (typeS ==
"double")
2160 pyFile <<
"static int\n" <<
2161 "_" << tagS.simpleType() <<
"_" << setS <<
2162 "(_" << tagS.simpleType() <<
2163 " *self, PyObject *value, void *closure)\n"
2165 " double var = PyFloat_AsDouble(value);\n"
2166 " if (var == -1 && PyErr_Occurred()) {\n"
2169 " self->elem->" << setS <<
"(var);\n"
2174 else if (typeS ==
"boolean")
2176 pyFile <<
"static int\n" <<
2177 "_" << tagS.simpleType() <<
"_" << setS <<
2178 "(_" << tagS.simpleType() <<
2179 " *self, PyObject *value, void *closure)\n"
2181 " long var = PyInt_AsLong(value);\n"
2182 " if (var == -1 && PyErr_Occurred()) {\n"
2185 " self->elem->" << setS <<
"((var==0)? false : true);\n"
2190 else if (typeS ==
"string")
2192 pyFile <<
"static int\n" <<
2193 "_" << tagS.simpleType() <<
"_" << setS <<
2194 "(_" << tagS.simpleType() <<
2195 " *self, PyObject *value, void *closure)\n"
2197 " PyObject *str=0;\n"
2198 " if (PyUnicode_Check(value))\n"
2199 " str = PyUnicode_AsEncodedString(value, \"ASCII\", \"strict\");\n"
2202 "#if PY_MAJOR_VERSION < 3\n"
2203 " char *var = PyString_AsString(str);\n"
2205 " char *var = PyBytes_AsString(str);\n"
2207 " if (var == 0) {\n"
2210 " self->elem->" << setS <<
"(std::string(var));\n"
2211 " if (str != value) {\n"
2212 " Py_DECREF(str);\n"
2218 else if (typeS ==
"anyURI")
2220 pyFile <<
"static int\n" <<
2221 "_" << tagS.simpleType() <<
"_" << setS <<
2222 "(_" << tagS.simpleType() <<
2223 " *self, PyObject *value, void *closure)\n"
2225 " PyObject *str=0;\n"
2226 " if (PyUnicode_Check(value))\n"
2227 " str = PyUnicode_AsEncodedString(value, \"ASCII\", \"strict\");\n"
2230 "#if PY_MAJOR_VERSION < 3\n"
2231 " char *var = PyString_AsString(str);\n"
2233 " char *var = PyBytes_AsString(str);\n"
2235 " if (var == 0) {\n"
2238 " self->elem->" << setS <<
"(std::string(var));\n"
2239 " if (str != value) {\n"
2240 " Py_DECREF(str);\n"
2246 else if (typeS ==
"Particle_t")
2248 pyFile <<
"static int\n" <<
2249 "_" << tagS.simpleType() <<
"_" << setS <<
2250 "(_" << tagS.simpleType() <<
2251 " *self, PyObject *value, void *closure)\n"
2253 " long var = PyInt_AsLong(value);\n"
2254 " if (var == -1 && PyErr_Occurred()) {\n"
2257 " self->elem->" << setS <<
"((Particle_t)var);\n"
2264 std::map<XtString,method_descr> methods;
2266 if (tagS ==
"HDDM") {
2267 parentTable_t::iterator piter;
2268 for (piter = parents.begin(); piter != parents.end(); ++piter)
2271 if (cnameS !=
"HDDM" && element_in_list(cnameS,children[tagS]) == -1)
2273 XtString getS(
"_" + tagS.simpleType() +
"_get"
2274 + cnameS.plural().simpleType());
2275 pyFile <<
"static PyObject*\n" << getS <<
2276 "(PyObject *self, PyObject *args)\n"
2279 " *me = (_" << tagS.
simpleType() <<
"*)self;\n"
2280 " if (me->elem == 0) {\n"
2281 " PyErr_SetString(PyExc_RuntimeError, "
2282 "\"lookup attempted on invalid " << tagS <<
2286 " PyObject *list = _HDDM_ElementList"
2287 "_new(&_HDDM_ElementList_type, 0, 0);\n"
2288 " ((_HDDM_ElementList*)list)->subtype = "
2290 " ((_HDDM_ElementList*)list)->list = "
2291 "(HDDM_ElementList<HDDM_Element>*)\n" <<
" "
2294 " ((_HDDM_ElementList*)list)->borrowed = 0;\n"
2295 " ((_HDDM_ElementList*)list)->host = me->host;\n"
2296 " My_INCREF(me->host);\n"
2297 " LOG_NEW(Py_TYPE(list), "
2298 "((_HDDM_ElementList*)list)->subtype, 1);\n"
2304 "get complete list of " + cnameS +
2305 " objects for this record"};
2306 methods[getS] = meth_getS;
2311 parentList_t::iterator citer;
2312 for (citer = children[tagS].begin(); citer != children[tagS].end(); ++citer)
2314 DOMElement *childEl = (DOMElement*)(*citer);
2315 XtString cnameS(childEl->getTagName());
2316 XtString repS(childEl->getAttribute(
X(
"maxOccurs")));
2317 int rep = (repS ==
"unbounded")? INT_MAX : atoi(
S(repS));
2318 XtString getS(
"_" + tagS.simpleType() +
"_get" + cnameS.simpleType());
2319 pyFile <<
"static PyObject*\n" << getS <<
2320 "(PyObject *self, PyObject *args)\n"
2323 " if (! PyArg_ParseTuple(args, \"|i\", &index)) {\n"
2327 " *me = (_" << tagS.
simpleType() <<
"*)self;\n"
2328 " if (me->elem == 0) {\n"
2329 " PyErr_SetString(PyExc_RuntimeError, "
2330 "\"lookup attempted on invalid " << tagS <<
2334 " PyObject *obj = _" << cnameS.
simpleType() <<
2335 "_new(&_" << cnameS.
simpleType() <<
"_type, 0, 0);\n"
2337 "*)obj)->elem = &me->elem->get" << cnameS.
simpleType()
2338 << ((rep > 1)?
"(index)" :
"()") <<
";\n"
2339 " ((_" << cnameS.
simpleType() <<
"*)obj)->host = me->host;\n"
2340 " My_INCREF(me->host);\n"
2341 " LOG_NEW(Py_TYPE(obj));\n"
2345 method_descr meth_getS = {
"get" + cnameS.
simpleType(),
2347 "get an individual " + cnameS +
2348 " object from this " + tagS};
2349 methods[getS] = meth_getS;
2351 XtString gelS(
"_" + tagS.simpleType()
2352 +
"_get" + cnameS.plural().simpleType());
2353 pyFile <<
"static PyObject*\n" << gelS <<
2354 "(PyObject *self, PyObject *args)\n"
2357 " *me = (_" << tagS.
simpleType() <<
"*)self;\n"
2358 " if (me->elem == 0) {\n"
2359 " PyErr_SetString(PyExc_RuntimeError, "
2360 "\"lookup attempted on invalid " << tagS <<
2364 " PyObject *list = _HDDM_ElementList_new"
2365 "(&_HDDM_ElementList_type, 0, 0);\n"
2366 " ((_HDDM_ElementList*)list)->subtype ="
2368 " ((_HDDM_ElementList*)list)->list = "
2369 "(HDDM_ElementList<HDDM_Element>*)\n" <<
" "
2371 " ((_HDDM_ElementList*)list)->borrowed = 1;\n"
2372 " ((_HDDM_ElementList*)list)->host = me->host;\n"
2373 " My_INCREF(me->host);\n"
2374 " LOG_NEW(Py_TYPE(list), "
2375 "((_HDDM_ElementList*)list)->subtype, 0);\n"
2381 "get list of " + cnameS +
2382 " objects for this " + tagS};
2383 methods[gelS] = meth_gelS;
2385 XtString addS(
"_" + tagS.simpleType()
2386 +
"_add" + cnameS.plural().simpleType());
2387 pyFile <<
"static PyObject*\n" << addS <<
2388 "(PyObject *self, PyObject *args)\n"
2392 " if (! PyArg_ParseTuple(args, \"|ii\", &count, &start)) {\n"
2396 " *me = (_" << tagS.
simpleType() <<
"*)self;\n"
2397 " if (me->elem == 0) {\n"
2398 " PyErr_SetString(PyExc_RuntimeError, "
2399 "\"add attempted on invalid " << tagS <<
2403 " PyObject *list = _HDDM_ElementList_new"
2404 "(&_HDDM_ElementList_type, 0, 0);\n"
2405 " ((_HDDM_ElementList*)list)->subtype ="
2407 " ((_HDDM_ElementList*)list)->list = "
2408 "(HDDM_ElementList<HDDM_Element>*)\n" <<
" "
2411 "(count, start));\n"
2412 " ((_HDDM_ElementList*)list)->borrowed = 0;\n"
2413 " ((_HDDM_ElementList*)list)->host = me->host;\n"
2414 " My_INCREF(me->host);\n"
2415 " LOG_NEW(Py_TYPE(list), "
2416 "((_HDDM_ElementList*)list)->subtype, 1);\n"
2422 "extend (or insert into) the list of " + cnameS +
2423 " objects for this " + tagS};
2424 methods[addS] = meth_addS;
2426 XtString delS(
"_" + tagS.simpleType()
2427 +
"_delete" + cnameS.plural().simpleType());
2428 pyFile <<
"static PyObject*\n" << delS <<
2429 "(PyObject *self, PyObject *args)\n"
2433 " if (! PyArg_ParseTuple(args, \"|ii\", &count, &start)) {\n"
2437 " *me = (_" << tagS.
simpleType() <<
"*)self;\n"
2438 " if (me->elem == 0) {\n"
2439 " PyErr_SetString(PyExc_RuntimeError, "
2440 "\"delete attempted on invalid " << tagS <<
2446 " Py_INCREF(Py_None);\n"
2447 " return Py_None;\n"
2452 "delete " + cnameS +
" objects for this " + tagS};
2453 methods[delS] = meth_delS;
2458 XtString clrS(
"_" + tagS.simpleType() +
"_clear");
2459 pyFile <<
"static PyObject*\n" << clrS <<
2460 "(PyObject *self, PyObject *args)\n"
2463 " *me = (_" << tagS.
simpleType() <<
"*)self;\n"
2464 " if (me->elem == 0) {\n"
2465 " PyErr_SetString(PyExc_RuntimeError, "
2466 "\"lookup attempted on invalid " << tagS <<
2470 " me->elem->clear();\n"
2471 " Py_INCREF(Py_None);\n"
2472 " return Py_None;\n"
2475 method_descr meth_clrS = {
"clear",
"METH_NOARGS",
2476 "clear all contents from this " + tagS};
2477 methods[clrS] = meth_clrS;
2480 XtString strS(
"_" + tagS.simpleType() +
"_toString");
2481 pyFile <<
"static PyObject*\n" << strS <<
2482 "(PyObject *self, PyObject *args=0)\n"
2485 " *me = (_" << tagS.
simpleType() <<
"*)self;\n"
2486 " if (me->elem == 0) {\n"
2487 " PyErr_SetString(PyExc_RuntimeError, "
2488 "\"lookup attempted on invalid " << tagS <<
2492 " std::string str(me->elem->toString());\n"
2493 " return PyUnicode_FromString(str.c_str());\n"
2496 method_descr str_method = {
"toString",
"METH_NOARGS",
2497 "show element as a human-readable string"};
2498 methods[strS] = str_method;
2500 XtString xmlS(
"_" + tagS.simpleType() +
"_toXML");
2501 pyFile <<
"static PyObject*\n" << xmlS <<
2502 "(PyObject *self, PyObject *args=0)\n"
2505 " *me = (_" << tagS.
simpleType() <<
"*)self;\n"
2506 " if (me->elem == 0) {\n"
2507 " PyErr_SetString(PyExc_RuntimeError, "
2508 "\"lookup attempted on invalid " << tagS <<
2512 " std::string str(me->elem->toXML());\n"
2513 " return PyUnicode_FromString(str.c_str());\n"
2516 method_descr xml_method = {
"toXML",
"METH_NOARGS",
2517 "show element as a XML fragment"};
2518 methods[xmlS] = xml_method;
2520 pyFile <<
"static PyGetSetDef _" << tagS.simpleType()
2521 <<
"_getsetters[] = {\n";
2522 std::map<XtString,XtString>::iterator aiter;
2523 for (aiter = attrList.begin(); aiter != attrList.end(); ++aiter) {
2527 pyFile <<
" {(char*)\"" << attrS <<
"\",\n"
2528 <<
" (getter)" << getterS <<
", ";
2529 if (setters.find(attrS) != setters.end()) {
2530 pyFile <<
"(setter)" << setterS <<
",\n";
2535 if (aiter->second ==
"string") {
2536 pyFile <<
" (char*)\"" << attrS <<
" string\",\n";
2539 pyFile <<
" (char*)\"" << attrS <<
" value\",\n";
2541 pyFile <<
" NULL},\n";
2543 pyFile <<
" {NULL} /* Sentinel */\n"
2546 pyFile <<
"static PyMemberDef _" << tagS.
simpleType()
2547 <<
"_members[] = {\n"
2548 <<
" {NULL} /* Sentinel */\n"
2551 pyFile <<
"static PyMethodDef _" << tagS.
simpleType()
2552 <<
"_methods[] = {\n";
2553 std::map<XtString,method_descr>::iterator miter;
2554 for (miter = methods.begin(); miter != methods.end(); ++miter) {
2555 pyFile <<
" {\"" << miter->second.name <<
"\", "
2556 << miter->first <<
", " << miter->second.args <<
",\n"
2557 <<
" \"" << miter->second.docs <<
"\"},\n";
2559 pyFile <<
" {NULL} /* Sentinel */\n"
2562 typesList[tagS] =
"_" + tagS.simpleType() +
"_type";
2565 "static PyTypeObject _" << tagS.simpleType() <<
"_type = {\n"
2566 " PyVarObject_HEAD_INIT(NULL,0)\n"
2567 " \"hddm_" <<
classPrefix <<
"." << tagS.simpleType() <<
"\","
2569 " sizeof(_" << tagS.simpleType() <<
2570 "), /*tp_basicsize*/\n"
2571 " 0, /*tp_itemsize*/\n"
2572 " (destructor)_" << tagS.simpleType() <<
2573 "_dealloc, /*tp_dealloc*/\n"
2574 " 0, /*tp_print*/\n"
2575 " 0, /*tp_getattr*/\n"
2576 " 0, /*tp_setattr*/\n"
2577 " 0, /*tp_compare*/\n"
2579 " 0, /*tp_as_number*/\n"
2580 " 0, /*tp_as_sequence*/\n"
2581 " 0, /*tp_as_mapping*/\n"
2582 " 0, /*tp_hash */\n"
2584 " (reprfunc)_" << tagS.simpleType() <<
"_toString, /*tp_str*/\n"
2585 " 0, /*tp_getattro*/\n"
2586 " 0, /*tp_setattro*/\n"
2587 " 0, /*tp_as_buffer*/\n"
2588 " Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/\n"
2590 " element\", /* tp_doc */\n"
2591 " 0, /* tp_traverse */\n"
2592 " 0, /* tp_clear */\n"
2593 " 0, /* tp_richcompare */\n"
2594 " 0, /* tp_weaklistoffset */\n"
2595 " 0, /* tp_iter */\n"
2596 " 0, /* tp_iternext */\n"
2597 " _" << tagS.simpleType() <<
"_methods, /* tp_methods */\n"
2598 " _" << tagS.simpleType() <<
"_members, /* tp_members */\n"
2599 " _" << tagS.simpleType() <<
"_getsetters, /* tp_getset */\n"
2600 " &_HDDM_Element_type, /* tp_base */\n"
2601 " 0, /* tp_dict */\n"
2602 " 0, /* tp_descr_get */\n"
2603 " 0, /* tp_descr_set */\n"
2604 " 0, /* tp_dictoffset */\n"
2605 " (initproc)_" << tagS.simpleType() <<
"_init, /* tp_init */\n"
2606 " 0, /* tp_alloc */\n"
2607 " _" << tagS.simpleType() <<
"_new, /* tp_new */\n"
2619 parentList_t::iterator piter;
2620 parents[tagS].insert(parents[tagS].begin(),
2621 parentList.begin(),parentList.end());
2622 std::vector<DOMElement*>::iterator iter;
2623 for (iter = tagList.begin(); iter != tagList.end(); iter++)
2625 DOMElement* targEl = *iter;
2626 XtString targS(targEl->getTagName());
2629 checkConsistency(el,targEl);
2634 parentList.push_back(el);
2635 DOMNodeList* contList = el->getChildNodes();
2636 int contLength = contList->getLength();
2637 for (
int c = 0;
c < contLength;
c++)
2639 DOMNode* cont = contList->item(
c);
2640 short type = cont->getNodeType();
2641 if (type == DOMNode::ELEMENT_NODE)
2643 DOMElement* contEl = (DOMElement*) cont;
2644 XtString contS(contEl->getTagName());
2645 children[tagS].push_back(contEl);
2646 constructGroup(contEl);
2649 parentList.pop_back();
2651 tagList.push_back(el);
2655 std::vector<DOMElement*>::iterator iter;
2656 for (iter = tagList.begin(); iter != tagList.end(); iter++)
2658 writeClassdef(*iter);
2673 std::vector<DOMElement*>::iterator iter;
2674 for (iter = tagList.begin(); iter != tagList.end(); iter++)
2676 writeClassimp(*iter);
2688 std::vector<DOMElement*>::iterator iter;
2689 for (iter = tagList.begin(); iter != tagList.end(); ++iter)
2691 writeStreamers(*iter);
2705 static int indent = 0;
2707 for (
int n = 0; n < indent; n++)
2713 pyFile <<
"<" << tagS;
2714 DOMNamedNodeMap* attrList = el->getAttributes();
2715 int attrListLength = attrList->getLength();
2716 for (
int a = 0; a < attrListLength; a++)
2718 DOMNode* node = attrList->item(a);
2719 XtString nameS(node->getNodeName());
2720 XtString valueS(node->getNodeValue());
2721 pyFile <<
" " << nameS <<
"=\\\"" << valueS <<
"\\\"";
2724 DOMNodeList* contList = el->getChildNodes();
2725 int contListLength = contList->getLength();
2726 if (contListLength > 0)
2728 pyFile <<
">\\n\"" << std::endl;
2730 for (
int c = 0;
c < contListLength;
c++)
2732 DOMNode* node = contList->item(
c);
2733 if (node->getNodeType() == DOMNode::ELEMENT_NODE)
2735 DOMElement* contEl = (DOMElement*) node;
2736 constructDocument(contEl);
2741 for (
int n = 0; n < indent; n++)
2745 pyFile <<
"</" << tagS <<
">\\n\"" << std::endl;
2749 pyFile <<
" />\\n\"" << std::endl;
2755 const char *
str = literal.c_str();
2758 long long int llvalue = strtoll(str,&endptr,0);
2759 if (errno == 0 && *endptr == 0) {
2761 int lvalue = strtol(str,&endptr,0);
2762 if (errno == 0 && *endptr == 0 && lvalue == llvalue) {
2770 strtof(str,&endptr);
2771 if (errno == 0 && *endptr == 0) {
2775 strtod(str,&endptr);
2776 if (errno == 0 && *endptr == 0) {
2779 if (literal ==
"true" || literal ==
"false") {
2783 return "Particle_t";
2785 if (XMLUri::isValidURI(
false,
X(literal))) {
2793 for (
int p=0; p<100; ++p) {
int element_in_list(XtString &name, parentList_t list)
void constructGroup(DOMElement *el)
std::string guessType(const std::string &literal)
xercesc::DOMDocument * buildDOMDocument(const XString &xmlFile, bool keep)
void constructIOstreams(DOMElement *el)
void checkConsistency(DOMElement *el, DOMElement *elref)
XtString(const XString &x)
void writeStreamers(DOMElement *el)
static char * ParticleType(Particle_t p)
xercesc::DOMDocument * parseInputDocument(const XString &xmlFile, bool keep)
std::map< XtString, XtString > typesList
std::vector< DOMNode * > parentList_t
XtString(const XtString &t)
void constructDocument(DOMElement *el)
Particle_t lookupParticle(const std::string &name)
void writeClassimp(DOMElement *el)
void constructMethods(DOMElement *el)
XtString(const std::string &s)
void writeClassdef(DOMElement *el)
std::map< const XtString, parentList_t > parentTable_t
int main(int argc, char *argv[])
void constructStreamers(DOMElement *el)