UTF-8 Fixes
authorWerner Koch <wk@gnupg.org>
Fri, 4 May 2007 09:22:18 +0000 (09:22 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 4 May 2007 09:22:18 +0000 (09:22 +0000)
common/ChangeLog
common/i18n.h
common/simple-gettext.c
jnlib/ChangeLog
jnlib/argparse.c
jnlib/utf8conv.c
jnlib/utf8conv.h

index ab4bec0..b458bdd 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-25  Werner Koch  <wk@g10code.com>
+
+       * i18n.h (ngettext): New.
+       * simple-gettext.c (ngettext): New.
+
 2007-04-20  Werner Koch  <wk@g10code.com>
 
        * miscellaneous.c (my_gcry_logger, my_gcry_outofcore_handler):
index 6881a8a..56c00ab 100644 (file)
@@ -17,6 +17,8 @@
 #ifdef USE_SIMPLE_GETTEXT
   int set_gettext_file( const char *filename );
   const char *gettext( const char *msgid );
+  const char *ngettext(const char *msgid1, const char *msgid2,
+                       unsigned long int n);
 # define _(a) gettext (a)
 # define N_(a) (a)
 #else
@@ -34,6 +36,7 @@
 # else
 #  define _(a) (a)
 #  define N_(a) (a)
+#  define ngettext(a,b,c) ((c)==1? (a):(b))
 # endif
 #endif /*!USE_SIMPLE_GETTEXT*/
 
index 56a305f..6661b2d 100644 (file)
@@ -419,6 +419,15 @@ gettext( const char *msgid )
     return msgid;
 }
 
+
+const char *
+ngettext (const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  /* We use the simple Germanic plural rule. */
+  return gettext (n==1? msgid1 : msgid2);
+}
+
+
 #if 0
        unsigned int cp1, cp2;
 
index 3168b8a..0db89e3 100644 (file)
@@ -1,3 +1,7 @@
+2007-04-25  Werner Koch  <wk@g10code.com>
+
+       * argparse.c (long_opt_strlen): Fixed for utf-8.
+
 2007-03-07  Werner Koch  <wk@g10code.com>
 
        * argparse.c (strusage): Set copyright year to 2007.
index c9cb7d3..348a803 100644 (file)
@@ -1,5 +1,6 @@
 /* [argparse.c wk 17.06.97] Argument Parser for option handling
- * Copyright (C) 1998, 1999, 2000, 2001, 2006 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2006
+ *               2007  Free Software Foundation, Inc.
  *
  * This file is part of JNLIB.
  *
@@ -29,6 +30,9 @@
 #include "mischelp.h"
 #include "stringhelp.h"
 #include "logging.h"
+#ifdef JNLIB_NEED_UTF8CONV
+#include "utf8conv.h"
+#endif
 #include "argparse.h"
 
 
@@ -438,7 +442,7 @@ find_long_option( ARGPARSE_ARGS *arg,
     for(i=0; opts[i].short_opt; i++ )
        if( opts[i].long_opt && !strcmp( opts[i].long_opt, keyword) )
            return i;
-  #if 0
+#if 0
     {
        ALIAS_DEF a;
        /* see whether it is an alias */
@@ -450,7 +454,7 @@ find_long_option( ARGPARSE_ARGS *arg,
            }
        }
     }
-  #endif
+#endif
     /* not found, see whether it is an abbreviation */
     /* aliases may not be abbreviated */
     n = strlen( keyword );
@@ -699,18 +703,28 @@ set_opt_arg(ARGPARSE_ARGS *arg, unsigned flags, char *s)
 static size_t
 long_opt_strlen( ARGPARSE_OPTS *o )
 {
-    size_t n = strlen(o->long_opt);
-
-    if( o->description && *o->description == '|' ) {
-       const char *s;
+  size_t n = strlen (o->long_opt);
 
-       s=o->description+1;
-       if( *s != '=' )
-           n++;
-       for(; *s && *s != '|'; s++ )
-           n++;
+  if ( o->description && *o->description == '|' ) 
+    {
+      const char *s;
+#ifdef JNLIB_NEED_UTF8CONV
+      int is_utf8 = is_native_utf8 ();
+#endif
+        
+      s=o->description+1;
+      if ( *s != '=' )
+        n++;
+      /* For a (mostly) correct length calculation we exclude
+         continuation bytes (10xxxxxx) if we are on a native utf8
+         terminal. */
+      for (; *s && *s != '|'; s++ )
+#ifdef JNLIB_NEED_UTF8CONV
+        if ( is_utf8 && (*s&0xc0) != 0x80 )
+#endif
+          n++;
     }
-    return n;
+  return n;
 }
 
 /****************
@@ -954,17 +968,20 @@ main(int argc, char **argv)
 {
     ARGPARSE_OPTS opts[] = {
     { 'v', "verbose",   0 , "Laut sein"},
-    { 'e', "echo"   ,   0 , "Zeile ausgeben, damit wir sehen, was wir einegegeben haben"},
-    { 'd', "debug",     0 , "Debug\nfalls mal etasws\nSchief geht"},
+    { 'e', "echo"   ,   0 , ("Zeile ausgeben, damit wir sehen, was wir ein"
+                             " gegeben haben")},
+    { 'd', "debug",     0 , "Debug\nfalls mal etwas\nschief geht"},
     { 'o', "output",    2   },
     { 'c', "cross-ref", 2|8, "cross-reference erzeugen\n" },
+    /* Note that on a non-utf8 terminal the ß might garble the output. */
+    { 's', "street",  0,     "|Straße|set the name of the street to Straße" },
     { 'm', "my-option", 1|8 },
     { 500, "a-long-option", 0 },
     {0} };
     ARGPARSE_ARGS pargs = { &argc, &argv, 2|4|32 };
     int i;
 
-    while( ArgParse( &pargs, opts) ) {
+    while( arg_parse ( &pargs, opts) ) {
        switch( pargs.r_opt ) {
          case -1 : printf( "arg=`%s'\n", pargs.r.ret_str); break;
          case 'v': opt.verbose++; break;
index 9a2a98b..d7c0d44 100644 (file)
@@ -256,6 +256,13 @@ get_native_charset ()
   return active_charset_name;
 }
 
+/* Return true if the native charset is utf-8.  */
+int 
+is_native_utf8 (void)
+{
+  return no_translation;
+}
+
 
 /* Convert string, which is in native encoding to UTF8 and return a
    new allocated UTF-8 string.  */
index f0eb4ec..9e1ce95 100644 (file)
@@ -24,6 +24,7 @@
 
 int set_native_charset (const char *newset);
 const char *get_native_charset (void);
+int is_native_utf8 (void);
 
 char *native_to_utf8 (const char *string);
 char *utf8_to_native (const char *string, size_t length, int delim);