[Python-checkins] CVS: python/dist/src/Modules pyexpat.c,2.45,2.46

Fred L. Drake fdrake@users.sourceforge.net
Wed, 25 Apr 2001 09:01:32 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv17701/Modules

Modified Files:
	pyexpat.c 
Log Message:

ParserCreate():  Allow an empty string for the namespace_separator argument;
    while not generally a good idea, this is used by RDF users, and works
    to implement RDF-style namespace+localname concatenation as defined
    in the RDF specifications.  (This also corrects a backwards-compatibility
    bug.)

Be more conservative while clearing out handlers; set the slot in the
self->handlers array to NULL before DECREFing the callback.

Still more adjustments to make the code style internally consistent.


Index: pyexpat.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/pyexpat.c,v
retrieving revision 2.45
retrieving revision 2.46
diff -C2 -r2.45 -r2.46
*** pyexpat.c	2001/03/24 19:58:26	2.45
--- pyexpat.c	2001/04/25 16:01:30	2.46
***************
*** 964,970 ****
      int i;
  
!     if (!PyArg_ParseTuple(args, "s|s:ExternalEntityParserCreate", &context,
! 			  &encoding)) {
! 	    return NULL;
      }
  
--- 964,970 ----
      int i;
  
!     if (!PyArg_ParseTuple(args, "s|s:ExternalEntityParserCreate",
!                           &context, &encoding)) {
!         return NULL;
      }
  
***************
*** 1144,1148 ****
      self->in_callback = 0;
      self->handlers = NULL;
!     if (namespace_separator) {
          self->itself = XML_ParserCreateNS(encoding, *namespace_separator);
      }
--- 1144,1148 ----
      self->in_callback = 0;
      self->handlers = NULL;
!     if (namespace_separator != NULL) {
          self->itself = XML_ParserCreateNS(encoding, *namespace_separator);
      }
***************
*** 1187,1192 ****
  
      if (self->handlers != NULL) {
          for (i = 0; handler_info[i].name != NULL; i++) {
!             Py_XDECREF(self->handlers[i]);
          }
          free(self->handlers);
--- 1187,1195 ----
  
      if (self->handlers != NULL) {
+         PyObject *temp;
          for (i = 0; handler_info[i].name != NULL; i++) {
!             temp = self->handlers[i];
!             self->handlers[i] = NULL;
!             Py_XDECREF(temp);
          }
          free(self->handlers);
***************
*** 1319,1331 ****
  xmlparse_traverse(xmlparseobject *op, visitproc visit, void *arg)
  {
! 	int i, err;
! 	for (i = 0; handler_info[i].name != NULL; i++) {
! 		if (!op->handlers[i])
! 			continue;
! 		err = visit(op->handlers[i], arg);
! 		if (err)
! 			return err;
! 	}
! 	return 0;
  }
  
--- 1322,1334 ----
  xmlparse_traverse(xmlparseobject *op, visitproc visit, void *arg)
  {
!     int i, err;
!     for (i = 0; handler_info[i].name != NULL; i++) {
!         if (!op->handlers[i])
!             continue;
!         err = visit(op->handlers[i], arg);
!         if (err)
!             return err;
!     }
!     return 0;
  }
  
***************
*** 1333,1338 ****
  xmlparse_clear(xmlparseobject *op)
  {
! 	clear_handlers(op, 1);
! 	return 0;
  }
  #endif
--- 1336,1341 ----
  xmlparse_clear(xmlparseobject *op)
  {
!     clear_handlers(op, 1);
!     return 0;
  }
  #endif
***************
*** 1383,1401 ****
  pyexpat_ParserCreate(PyObject *notused, PyObject *args, PyObject *kw)
  {
! 	char *encoding = NULL;
!         char *namespace_separator = NULL;
! 	static char *kwlist[] = {"encoding", "namespace_separator", NULL};
! 
! 	if (!PyArg_ParseTupleAndKeywords(args, kw, "|zz:ParserCreate", kwlist,
! 					 &encoding, &namespace_separator))
! 		return NULL;
! 	if (namespace_separator != NULL
! 	    && strlen(namespace_separator) != 1) {
! 		PyErr_SetString(PyExc_ValueError,
! 				"namespace_separator must be one character,"
! 				" omitted, or None");
! 		return NULL;
! 	}
! 	return newxmlparseobject(encoding, namespace_separator);
  }
  
--- 1386,1404 ----
  pyexpat_ParserCreate(PyObject *notused, PyObject *args, PyObject *kw)
  {
!     char *encoding = NULL;
!     char *namespace_separator = NULL;
!     static char *kwlist[] = {"encoding", "namespace_separator", NULL};
! 
!     if (!PyArg_ParseTupleAndKeywords(args, kw, "|zz:ParserCreate", kwlist,
!                                      &encoding, &namespace_separator))
!         return NULL;
!     if (namespace_separator != NULL
!         && strlen(namespace_separator) > 1) {
!         PyErr_SetString(PyExc_ValueError,
!                         "namespace_separator must be at most one"
!                         " character, omitted, or None");
!         return NULL;
!     }
!     return newxmlparseobject(encoding, namespace_separator);
  }
  
***************
*** 1430,1437 ****
  "Python wrapper for Expat parser.";
  
- /* Initialization function for the module */
- 
- void initpyexpat(void);  /* avoid compiler warnings */
- 
  #if PY_VERSION_HEX < 0x20000F0
  
--- 1433,1436 ----
***************
*** 1440,1453 ****
  PyModule_AddObject(PyObject *m, char *name, PyObject *o)
  {
! 	PyObject *dict;
!         if (!PyModule_Check(m) || o == NULL)
!                 return -1;
! 	dict = PyModule_GetDict(m);
! 	if (dict == NULL)
! 		return -1;
!         if (PyDict_SetItemString(dict, name, o))
!                 return -1;
!         Py_DECREF(o);
!         return 0;
  }
  
--- 1439,1452 ----
  PyModule_AddObject(PyObject *m, char *name, PyObject *o)
  {
!     PyObject *dict;
!     if (!PyModule_Check(m) || o == NULL)
!         return -1;
!     dict = PyModule_GetDict(m);
!     if (dict == NULL)
!         return -1;
!     if (PyDict_SetItemString(dict, name, o))
!         return -1;
!     Py_DECREF(o);
!     return 0;
  }
  
***************
*** 1455,1459 ****
  PyModule_AddIntConstant(PyObject *m, char *name, long value)
  {
! 	return PyModule_AddObject(m, name, PyInt_FromLong(value));
  }
  
--- 1454,1458 ----
  PyModule_AddIntConstant(PyObject *m, char *name, long value)
  {
!     return PyModule_AddObject(m, name, PyInt_FromLong(value));
  }
  
***************
*** 1461,1465 ****
  PyModule_AddStringConstant(PyObject *m, char *name, char *value)
  {
! 	return PyModule_AddObject(m, name, PyString_FromString(value));
  }
  
--- 1460,1464 ----
  PyModule_AddStringConstant(PyObject *m, char *name, char *value)
  {
!     return PyModule_AddObject(m, name, PyString_FromString(value));
  }
  
***************
*** 1487,1495 ****
  }
  
  DL_EXPORT(void)
! initpyexpat(void)
  {
      PyObject *m, *d;
!     PyObject *errmod_name = PyString_FromString("pyexpat.errors");
      PyObject *errors_module;
      PyObject *modelmod_name;
--- 1486,1506 ----
  }
  
+ /* Initialization function for the module */
+ 
+ #ifndef MODULE_NAME
+ #define MODULE_NAME "pyexpat"
+ #endif
+ 
+ #ifndef MODULE_INITFUNC
+ #define MODULE_INITFUNC initpyexpat
+ #endif
+ 
+ void MODULE_INITFUNC(void);  /* avoid compiler warnings */
+ 
  DL_EXPORT(void)
! MODULE_INITFUNC(void)
  {
      PyObject *m, *d;
!     PyObject *errmod_name = PyString_FromString(MODULE_NAME ".errors");
      PyObject *errors_module;
      PyObject *modelmod_name;
***************
*** 1499,1503 ****
      if (errmod_name == NULL)
          return;
!     modelmod_name = PyString_FromString("pyexpat.model");
      if (modelmod_name == NULL)
          return;
--- 1510,1514 ----
      if (errmod_name == NULL)
          return;
!     modelmod_name = PyString_FromString(MODULE_NAME ".model");
      if (modelmod_name == NULL)
          return;
***************
*** 1506,1510 ****
  
      /* Create the module and add the functions */
!     m = Py_InitModule3("pyexpat", pyexpat_methods,
                         pyexpat_module_documentation);
  
--- 1517,1521 ----
  
      /* Create the module and add the functions */
!     m = Py_InitModule3(MODULE_NAME, pyexpat_methods,
                         pyexpat_module_documentation);
  
***************
*** 1548,1552 ****
      errors_module = PyDict_GetItem(d, errmod_name);
      if (errors_module == NULL) {
!         errors_module = PyModule_New("pyexpat.errors");
          if (errors_module != NULL) {
              PyDict_SetItem(sys_modules, errmod_name, errors_module);
--- 1559,1563 ----
      errors_module = PyDict_GetItem(d, errmod_name);
      if (errors_module == NULL) {
!         errors_module = PyModule_New(MODULE_NAME ".errors");
          if (errors_module != NULL) {
              PyDict_SetItem(sys_modules, errmod_name, errors_module);
***************
*** 1558,1562 ****
      model_module = PyDict_GetItem(d, modelmod_name);
      if (model_module == NULL) {
!         model_module = PyModule_New("pyexpat.model");
          if (model_module != NULL) {
              PyDict_SetItem(sys_modules, modelmod_name, model_module);
--- 1569,1573 ----
      model_module = PyDict_GetItem(d, modelmod_name);
      if (model_module == NULL) {
!         model_module = PyModule_New(MODULE_NAME ".model");
          if (model_module != NULL) {
              PyDict_SetItem(sys_modules, modelmod_name, model_module);
***************
*** 1633,1645 ****
  clear_handlers(xmlparseobject *self, int decref)
  {
! 	int i = 0;
  
! 	for (; handler_info[i].name!=NULL; i++) {
! 		if (decref){
! 			Py_XDECREF(self->handlers[i]);
! 		}
! 		self->handlers[i]=NULL;
! 		handler_info[i].setter(self->itself, NULL);
! 	}
  }
  
--- 1644,1659 ----
  clear_handlers(xmlparseobject *self, int decref)
  {
!     int i = 0;
!     PyObject *temp;
  
!     for (; handler_info[i].name!=NULL; i++) {
!         if (decref) {
!             temp = self->handlers[i];
!             self->handlers[i] = NULL;
!             Py_XDECREF(temp);
!         }
!         self->handlers[i]=NULL;
!         handler_info[i].setter(self->itself, NULL);
!     }
  }
  
***************
*** 1652,1665 ****
                             pairsetter setter)
  {
!     void *start_handler=NULL;
!     void *end_handler=NULL;
  
      if (self->handlers[startHandler]
!         && self->handlers[endHandler]!=Py_None) {
!         start_handler=handler_info[startHandler].handler;
      }
      if (self->handlers[EndElement]
!         && self->handlers[EndElement] !=Py_None) {
!         end_handler=handler_info[endHandler].handler;
      }
      setter(self->itself, start_handler, end_handler);
--- 1666,1679 ----
                             pairsetter setter)
  {
!     void *start_handler = NULL;
!     void *end_handler = NULL;
  
      if (self->handlers[startHandler]
!         && self->handlers[endHandler] != Py_None) {
!         start_handler = handler_info[startHandler].handler;
      }
      if (self->handlers[EndElement]
!         && self->handlers[EndElement] != Py_None) {
!         end_handler = handler_info[endHandler].handler;
      }
      setter(self->itself, start_handler, end_handler);