jnlib/
authorWerner Koch <wk@gnupg.org>
Thu, 25 Jan 2007 10:26:55 +0000 (10:26 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 25 Jan 2007 10:26:55 +0000 (10:26 +0000)
* stringhelp.c (utf8_charcount): New.
agent/
* genkey.c (check_passphrase_constraints): Use UTF-8 aware strlen.

TODO
agent/ChangeLog
agent/genkey.c
jnlib/ChangeLog
jnlib/stringhelp.c
jnlib/stringhelp.h

diff --git a/TODO b/TODO
index 1d3c0ea..6733d1c 100644 (file)
--- a/TODO
+++ b/TODO
   There is at least one couple of duplicate files: inttype[_-]h.m4.
 
 * UTF-8
-** we need a function to count characters.
-  Something like utf8_strlen.  This is needed to correclty count the
-  lengtgh of a passphrase.
+  UTF-8 specific TODO.
index 319cb5d..39f02b1 100644 (file)
@@ -1,9 +1,10 @@
 2007-01-25  Werner Koch  <wk@g10code.com>
 
-       * genkey.c (check_passphrase_constraints): Get ngettext call right.
+       * genkey.c (check_passphrase_constraints): Get ngettext call right
+       and use UTF-8 aware strlen.
 
        * protect-tool.c (get_passphrase): New arg OPT_CHECK.
-       (get_new_passphrase): Enable OTP_CHECK on the first call.
+       (get_new_passphrase): Enable OPT_CHECK on the first call.
        * command.c (cmd_get_passphrase): Implement option --check.
 
 2007-01-24  Werner Koch  <wk@g10code.com>
index 5a25d47..9396e54 100644 (file)
@@ -84,7 +84,7 @@ check_passphrase_constraints (ctrl_t ctrl, const char *pw)
   if (!pw)
     pw = "";
 
-  if (strlen (pw) < minlen ) /* FIXME:  should be an utf-8 length. */
+  if (utf8_charcount (pw) < minlen ) 
     {
       char *desc = xtryasprintf 
         ( ngettext ("Warning:  You have entered a passphrase that%%0A"
index e120319..3f9ef15 100644 (file)
@@ -1,3 +1,7 @@
+2007-01-25  Werner Koch  <wk@g10code.com>
+
+       * stringhelp.c (utf8_charcount): New.
+
 2006-11-29  Werner Koch  <wk@g10code.com>
 
        * utf8conv.c (set_native_charset) [HAVE_W32_SYSTEM]: Fixed typo in
index 1731dd9..b74f84a 100644 (file)
@@ -547,6 +547,23 @@ sanitize_buffer (const void *p_arg, size_t n, int delim)
 }
 
 
+/* Given a string containing an UTF-8 encoded text, return the number
+   of characters in this string.  It differs from strlen in that it
+   only counts complete UTF-8 characters.  Note, that this function
+   does not take combined characters into account.  */
+size_t
+utf8_charcount (const char *s)
+{
+  size_t n;
+
+  for (n=0; *s; s++)
+    if ( (*s&0xc0) != 0x80 ) /* Exclude continuation bytes: 10xxxxxx */
+      n++;
+
+  return n;
+}
+
+
 /****************************************************
  **********  W32 specific functions  ****************
  ****************************************************/
index adbd9bf..869b0f0 100644 (file)
@@ -57,6 +57,9 @@ size_t print_sanitized_utf8_string (FILE *fp, const char *string, int delim);
 char *sanitize_buffer (const void *p, size_t n, int delim);
 
 
+size_t utf8_charcount (const char *s);
+
+
 #ifdef HAVE_W32_SYSTEM
 const char *w32_strerror (int ec);
 #endif