changeset 10302:3884ac6e6550

getdate.y: avoid locale-dependent date parsing failure In Turkish locales, getdate would fail to recognize keywords containing a lowercase "i". The solution is not to rely on locale-sensitive case-conversion. * lib/getdate.y: Include <c-ctype.h> rather than <ctype.h>. (lookup_word): Use c_toupper in place of toupper. (yylex, get_date): Use c_ prefixed variants of isspace and isalpha, too. Reported by Vefa Bicakci <bicave@superonline.com> in <http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/14184>. * modules/getdate (Depends-on): Add c-ctype.
author Jim Meyering <meyering@redhat.com>
date Sat, 02 Aug 2008 15:40:39 +0200
parents 02851f6746a3
children 17acf200b59d
files ChangeLog lib/getdate.y modules/getdate
diffstat 3 files changed, 21 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2008-08-02  Jim Meyering  <meyering@redhat.com>
+
+	getdate.y: avoid locale-dependent date parsing failure
+	In Turkish locales, getdate would fail to recognize keywords
+	containing a lowercase "i".  The solution is not to rely on
+	locale-sensitive case-conversion.
+	* lib/getdate.y: Include <c-ctype.h> rather than <ctype.h>.
+	(lookup_word): Use c_toupper in place of toupper.
+	(yylex, get_date): Use c_ prefixed variants of isspace and isalpha, too.
+	Reported by Vefa Bicakci <bicave@superonline.com> in
+	<http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/14184>.
+	* modules/getdate (Depends-on): Add c-ctype.
+
 2008-08-02  Bruno Haible  <bruno@clisp.org>
 
 	* gnulib-tool (func_import): When updating or creating a .gitignore
--- a/lib/getdate.y
+++ b/lib/getdate.y
@@ -60,7 +60,7 @@
 # undef static
 #endif
 
-#include <ctype.h>
+#include <c-ctype.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -900,7 +900,7 @@
   for (p = word; *p; p++)
     {
       unsigned char ch = *p;
-      *p = toupper (ch);
+      *p = c_toupper (ch);
     }
 
   for (tp = meridian_table; tp->name; tp++)
@@ -965,7 +965,7 @@
 
   for (;;)
     {
-      while (c = *pc->input, isspace (c))
+      while (c = *pc->input, c_isspace (c))
 	pc->input++;
 
       if (ISDIGIT (c) || c == '-' || c == '+')
@@ -976,7 +976,7 @@
 	  if (c == '-' || c == '+')
 	    {
 	      sign = c == '-' ? -1 : 1;
-	      while (c = *++pc->input, isspace (c))
+	      while (c = *++pc->input, c_isspace (c))
 		continue;
 	      if (! ISDIGIT (c))
 		/* skip the '-' sign */
@@ -1080,7 +1080,7 @@
 	    }
 	}
 
-      if (isalpha (c))
+      if (c_isalpha (c))
 	{
 	  char buff[20];
 	  char *p = buff;
@@ -1092,7 +1092,7 @@
 		*p++ = c;
 	      c = *++pc->input;
 	    }
-	  while (isalpha (c) || c == '.');
+	  while (c_isalpha (c) || c == '.');
 
 	  *p = '\0';
 	  tp = lookup_word (pc, buff);
@@ -1205,7 +1205,7 @@
   if (! tmp)
     return false;
 
-  while (c = *p, isspace (c))
+  while (c = *p, c_isspace (c))
     p++;
 
   if (strncmp (p, "TZ=\"", 4) == 0)
--- a/modules/getdate
+++ b/modules/getdate
@@ -10,6 +10,7 @@
 m4/getdate.m4
 
 Depends-on:
+c-ctype
 stdbool
 gettime
 intprops