diff -r eac4e23ce2fd Modules/_localemodule.c --- a/Modules/_localemodule.c Sat Apr 13 15:29:22 2013 -0400 +++ b/Modules/_localemodule.c Sat Apr 13 15:33:36 2013 -0400 @@ -312,11 +312,28 @@ } #endif +#ifdef HAVE_NL_TIME_FIRST_WEEKDAY +static const char * +handle_nl_time_week_1stday(const char *result) +{ + const unsigned long week_1stday = (const unsigned long)result; + switch (week_1stday) { + case 19971130: /* Sunday */ + return "6"; + case 19971201: /* Monday */ + return "1"; + default: /* St Swithin's Day */ + return ""; + } +} +#endif + #ifdef HAVE_LANGINFO_H -#define LANGINFO(X) {#X, X} +#define LANGINFO(X) {#X, X, NULL} static struct langinfo_constant{ char* name; int value; + const char* (*interp)(const char *result); } langinfo_constants[] = { /* These constants should exist on any langinfo implementation */ @@ -414,6 +431,12 @@ #ifdef NOEXPR LANGINFO(NOEXPR), #endif +#ifdef HAVE_NL_TIME_FIRST_WEEKDAY + /* Only glibc appears to provide this functionality */ + /* can't use LANGINFO since they start with _ */ + { "TIME_FIRST_WEEKDAY", _NL_TIME_FIRST_WEEKDAY, NULL }, + { "TIME_WEEK_1STDAY", _NL_TIME_WEEK_1STDAY, handle_nl_time_week_1stday }, +#endif #ifdef _DATE_FMT /* This is not available in all glibc versions that have CODESET. */ LANGINFO(_DATE_FMT), @@ -440,6 +463,8 @@ instead of an empty string for nl_langinfo(ERA). */ const char *result = nl_langinfo(item); result = result != NULL ? result : ""; + if (langinfo_constants[i].interp) + result = langinfo_constants[i].interp(result); return PyUnicode_DecodeLocale(result, NULL); } PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant"); @@ -447,6 +472,42 @@ } #endif /* HAVE_LANGINFO_H */ +/* hide complexity of langinfo.h and TIME_FIRST_WEEKDAY/TIME_WEEK_1STDAY */ +/* returns locale dependent values for Calendar module */ +static PyObject* +PyLocale_firstdayofweek(PyObject* self) +{ + int start; +#ifdef HAVE_NL_TIME_FIRST_WEEKDAY + int first_weekday = nl_langinfo(_NL_TIME_FIRST_WEEKDAY)[0]; + long week_1stday = (long)nl_langinfo(_NL_TIME_WEEK_1STDAY); + switch (week_1stday) { + default: + case 19971130: + week_1stday = 0; + break; + case 19971201: + week_1stday = 1; + break; + } + /* should be 0 for Sunday or 1 for Monday, clamp to + * Calendar.firstdayofweek values + */ + start = (week_1stday + first_weekday - 1) % 7; + if (start == 0) + start = 6; + else + start = 0; +#else + start = 0; +#endif + return Py_BuildValue("i", start); +} + +PyDoc_STRVAR(firstdayofweek__doc__, +"firstdayofweek() -> integer\n" +"Return a best guess at the first day of the week, 0 == Monday, 6 == Sunday"); + #ifdef HAVE_LIBINTL_H PyDoc_STRVAR(gettext__doc__, @@ -581,6 +642,8 @@ {"nl_langinfo", (PyCFunction) PyLocale_nl_langinfo, METH_VARARGS, nl_langinfo__doc__}, #endif + {"firstdayofweek", (PyCFunction) PyLocale_firstdayofweek, + METH_NOARGS, firstdayofweek__doc__}, #ifdef HAVE_LIBINTL_H {"gettext",(PyCFunction)PyIntl_gettext,METH_VARARGS, gettext__doc__}, diff -r eac4e23ce2fd configure.ac --- a/configure.ac Sat Apr 13 15:29:22 2013 -0400 +++ b/configure.ac Sat Apr 13 15:33:36 2013 -0400 @@ -4250,6 +4250,20 @@ [Define if you have struct stat.st_mtimensec]) fi +# checking for glibc extensions to langinfo.h +# _NL_TIME_FIRST_WEEKDAY isn't #define'd, so test it directly +AC_MSG_CHECKING(for _NL_TIME_FIRST_WEEKDAY) +AC_CACHE_VAL(ac_cv_have_nl_time_first_weekday, +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ +int main(int argc, char *argv[]) { return !!nl_langinfo(_NL_TIME_FIRST_WEEKDAY); }]])], + [ac_cv_have_nl_time_first_weekday=yes],[ac_cv_have_nl_time_first_weekday=no])) +AC_MSG_RESULT($ac_cv_have_nl_time_first_weekday) +if test "$ac_cv_have_nl_time_first_weekday" = yes +then + AC_DEFINE(HAVE_NL_TIME_FIRST_WEEKDAY, 1, + [Define if you have _NL_TIME_FIRST_WEEKDAY in langinfo.h]) +fi + ac_save_cppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw" # On HP/UX 11.0, mvwdelch is a block with a return statement