[Python-checkins] CVS: python/dist/src/Modules _localemodule.c,2.25,2.25.6.1

Michael Hudson mwh@users.sourceforge.net
Sat, 16 Mar 2002 09:54:22 -0800


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

Modified Files:
      Tag: release22-maint
	_localemodule.c 
Log Message:
backport loewis' checkin of
    revision 2.26 of _localemodule.c

Verify arguments for nl_langinfo. Fixes #528879.


Index: _localemodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_localemodule.c,v
retrieving revision 2.25
retrieving revision 2.25.6.1
diff -C2 -d -r2.25 -r2.25.6.1
*** _localemodule.c	28 Nov 2001 20:27:42 -0000	2.25
--- _localemodule.c	16 Mar 2002 17:54:20 -0000	2.25.6.1
***************
*** 1,4 ****
  /***********************************************************
! Copyright (C) 1997 Martin von Loewis
  
  Permission to use, copy, modify, and distribute this software and its
--- 1,4 ----
  /***********************************************************
! Copyright (C) 1997, 2002 Martin von Loewis
  
  Permission to use, copy, modify, and distribute this software and its
***************
*** 416,419 ****
--- 416,507 ----
  
  #ifdef HAVE_LANGINFO_H
+ #define LANGINFO(X) {#X, X}
+ struct langinfo_constant{
+ 	char* name;
+ 	int value;
+ } langinfo_constants[] = 
+ {
+     /* These constants should exist on any langinfo implementation */
+     LANGINFO(DAY_1),
+     LANGINFO(DAY_2),
+     LANGINFO(DAY_3),
+     LANGINFO(DAY_4),
+     LANGINFO(DAY_5),
+     LANGINFO(DAY_6),
+     LANGINFO(DAY_7),
+ 
+     LANGINFO(ABDAY_1),
+     LANGINFO(ABDAY_2),
+     LANGINFO(ABDAY_3),
+     LANGINFO(ABDAY_4),
+     LANGINFO(ABDAY_5),
+     LANGINFO(ABDAY_6),
+     LANGINFO(ABDAY_7),
+ 
+     LANGINFO(MON_1),
+     LANGINFO(MON_2),
+     LANGINFO(MON_3),
+     LANGINFO(MON_4),
+     LANGINFO(MON_5),
+     LANGINFO(MON_6),
+     LANGINFO(MON_7),
+     LANGINFO(MON_8),
+     LANGINFO(MON_9),
+     LANGINFO(MON_10),
+     LANGINFO(MON_11),
+     LANGINFO(MON_12),
+ 
+     LANGINFO(ABMON_1),
+     LANGINFO(ABMON_2),
+     LANGINFO(ABMON_3),
+     LANGINFO(ABMON_4),
+     LANGINFO(ABMON_5),
+     LANGINFO(ABMON_6),
+     LANGINFO(ABMON_7),
+     LANGINFO(ABMON_8),
+     LANGINFO(ABMON_9),
+     LANGINFO(ABMON_10),
+     LANGINFO(ABMON_11),
+     LANGINFO(ABMON_12),
+ 
+ #ifdef RADIXCHAR
+     /* The following are not available with glibc 2.0 */
+     LANGINFO(RADIXCHAR),
+     LANGINFO(THOUSEP),
+     /* YESSTR and NOSTR are deprecated in glibc, since they are
+        a special case of message translation, which should be rather
+        done using gettext. So we don't expose it to Python in the
+        first place.
+     LANGINFO(YESSTR),
+     LANGINFO(NOSTR),
+     */
+     LANGINFO(CRNCYSTR),
+ #endif
+ 
+     LANGINFO(D_T_FMT),
+     LANGINFO(D_FMT),
+     LANGINFO(T_FMT),
+     LANGINFO(AM_STR),
+     LANGINFO(PM_STR),
+ 
+ #ifdef CODESET
+     /* The following constants are available only with XPG4. */
+     LANGINFO(CODESET),
+     LANGINFO(T_FMT_AMPM),
+     LANGINFO(ERA),
+     LANGINFO(ERA_D_FMT),
+     LANGINFO(ERA_D_T_FMT),
+     LANGINFO(ERA_T_FMT),
+     LANGINFO(ALT_DIGITS),
+     LANGINFO(YESEXPR),
+     LANGINFO(NOEXPR),
+ #endif
+ #ifdef _DATE_FMT
+     /* This is not available in all glibc versions that have CODESET. */
+     LANGINFO(_DATE_FMT),
+ #endif
+     {0, 0}
+ };
+ 
  static char nl_langinfo__doc__[] =
  "nl_langinfo(key) -> string\n"
***************
*** 424,433 ****
  PyLocale_nl_langinfo(PyObject* self, PyObject* args)
  {
!     int item;
      if (!PyArg_ParseTuple(args, "i:nl_langinfo", &item))
          return NULL;
!     return PyString_FromString(nl_langinfo(item));
  }
! #endif
      
  
--- 512,528 ----
  PyLocale_nl_langinfo(PyObject* self, PyObject* args)
  {
!     int item, i;
      if (!PyArg_ParseTuple(args, "i:nl_langinfo", &item))
          return NULL;
!     /* Check whether this is a supported constant. GNU libc sometimes
!        returns numeric values in the char* return value, which would
!        crash PyString_FromString.  */
!     for (i = 0; langinfo_constants[i].name; i++)
! 	    if (langinfo_constants[i].value == item)
! 		    return PyString_FromString(nl_langinfo(item));
!     PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant");
!     return NULL;
  }
! #endif /* HAVE_LANGINFO_H */
      
  
***************
*** 456,459 ****
--- 551,557 ----
  {
      PyObject *m, *d, *x;
+ #ifdef HAVE_LANGINFO_H
+     int i;
+ #endif
  
      m = Py_InitModule("_locale", PyLocale_Methods);
***************
*** 502,586 ****
      Py_XDECREF(x);
  
- #define ADDINT(X) PyModule_AddIntConstant(m, #X, X)
  #ifdef HAVE_LANGINFO_H
!     /* These constants should exist on any langinfo implementation */
!     ADDINT(DAY_1);
!     ADDINT(DAY_2);
!     ADDINT(DAY_3);
!     ADDINT(DAY_4);
!     ADDINT(DAY_5);
!     ADDINT(DAY_6);
!     ADDINT(DAY_7);
! 
!     ADDINT(ABDAY_1);
!     ADDINT(ABDAY_2);
!     ADDINT(ABDAY_3);
!     ADDINT(ABDAY_4);
!     ADDINT(ABDAY_5);
!     ADDINT(ABDAY_6);
!     ADDINT(ABDAY_7);
! 
!     ADDINT(MON_1);
!     ADDINT(MON_2);
!     ADDINT(MON_3);
!     ADDINT(MON_4);
!     ADDINT(MON_5);
!     ADDINT(MON_6);
!     ADDINT(MON_7);
!     ADDINT(MON_8);
!     ADDINT(MON_9);
!     ADDINT(MON_10);
!     ADDINT(MON_11);
!     ADDINT(MON_12);
! 
!     ADDINT(ABMON_1);
!     ADDINT(ABMON_2);
!     ADDINT(ABMON_3);
!     ADDINT(ABMON_4);
!     ADDINT(ABMON_5);
!     ADDINT(ABMON_6);
!     ADDINT(ABMON_7);
!     ADDINT(ABMON_8);
!     ADDINT(ABMON_9);
!     ADDINT(ABMON_10);
!     ADDINT(ABMON_11);
!     ADDINT(ABMON_12);
! 
! #ifdef RADIXCHAR
!     /* The following are not available with glibc 2.0 */
!     ADDINT(RADIXCHAR);
!     ADDINT(THOUSEP);
!     /* YESSTR and NOSTR are deprecated in glibc, since they are
!        a special case of message translation, which should be rather
!        done using gettext. So we don't expose it to Python in the
!        first place.
!     ADDINT(YESSTR);
!     ADDINT(NOSTR);
!     */
!     ADDINT(CRNCYSTR);
! #endif
! 
!     ADDINT(D_T_FMT);
!     ADDINT(D_FMT);
!     ADDINT(T_FMT);
!     ADDINT(AM_STR);
!     ADDINT(PM_STR);
! 
! #ifdef CODESET
!     /* The following constants are available only with XPG4. */
!     ADDINT(CODESET);
!     ADDINT(T_FMT_AMPM);
!     ADDINT(ERA);
!     ADDINT(ERA_D_FMT);
!     ADDINT(ERA_D_T_FMT);
!     ADDINT(ERA_T_FMT);
!     ADDINT(ALT_DIGITS);
!     ADDINT(YESEXPR);
!     ADDINT(NOEXPR);
! #endif
! #ifdef _DATE_FMT
!     /* This is not available in all glibc versions that have CODESET. */
!     ADDINT(_DATE_FMT);
  #endif
- #endif /* HAVE_LANGINFO_H */
  }
--- 600,608 ----
      Py_XDECREF(x);
  
  #ifdef HAVE_LANGINFO_H
!     for (i = 0; langinfo_constants[i].name; i++) {
! 	    PyModule_AddIntConstant(m, langinfo_constants[i].name,
! 				    langinfo_constants[i].value);
!     }
  #endif
  }