*** empty log message ***
[gnulib.git] / lib / quotearg.c
index fe747fb..1d1b543 100644 (file)
@@ -1,6 +1,6 @@
 /* quotearg.c - quote arguments for output
 
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Free Software
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005 Free Software
    Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 /* Written by Paul Eggert <eggert@twinsun.com> */
 
-#if HAVE_CONFIG_H
+#ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
@@ -30,6 +30,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include <limits.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -83,7 +84,7 @@ struct quoting_options
 
   /* Quote the characters indicated by this bit vector even if the
      quoting style would not normally require them to be quoted.  */
-  int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
+  unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
 };
 
 /* Names of quoting styles.  */
@@ -151,7 +152,8 @@ int
 set_char_quoting (struct quoting_options *o, char c, int i)
 {
   unsigned char uc = c;
-  int *p = (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
+  unsigned int *p =
+    (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
   int shift = uc % INT_BITS;
   int r = (*p >> shift) & 1;
   *p ^= ((i & 1) ^ r) << shift;
@@ -192,8 +194,8 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
   size_t len = 0;
   char const *quote_string = 0;
   size_t quote_string_len = 0;
-  int backslash_escapes = 0;
-  int unibyte_locale = MB_CUR_MAX == 1;
+  bool backslash_escapes = false;
+  bool unibyte_locale = MB_CUR_MAX == 1;
 
 #define STORE(c) \
     do \
@@ -208,19 +210,20 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
     {
     case c_quoting_style:
       STORE ('"');
-      backslash_escapes = 1;
+      backslash_escapes = true;
       quote_string = "\"";
       quote_string_len = 1;
       break;
 
     case escape_quoting_style:
-      backslash_escapes = 1;
+      backslash_escapes = true;
       break;
 
     case locale_quoting_style:
     case clocale_quoting_style:
       {
-       /* Get translations for open and closing quotation marks.
+       /* TRANSLATORS:
+          Get translations for open and closing quotation marks.
 
           The message catalog should translate "`" to a left
           quotation mark suitable for the locale, and similarly for
@@ -233,13 +236,17 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
           should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
           MARK).  A British English Unicode locale should instead
           translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
-          U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.  */
+          U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+
+          If you don't know what to put here, please see
+          <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+          and use glyphs suitable for your language.  */
 
        char const *left = gettext_quote (N_("`"), quoting_style);
        char const *right = gettext_quote (N_("'"), quoting_style);
        for (quote_string = left; *quote_string; quote_string++)
          STORE (*quote_string);
-       backslash_escapes = 1;
+       backslash_escapes = true;
        quote_string = right;
        quote_string_len = strlen (quote_string);
       }
@@ -396,12 +403,12 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
            /* Length of multibyte sequence found so far.  */
            size_t m;
 
-           int printable;
+           bool printable;
 
            if (unibyte_locale)
              {
                m = 1;
-               printable = isprint (c);
+               printable = isprint (c) != 0;
              }
            else
              {
@@ -409,7 +416,7 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
                memset (&mbstate, 0, sizeof mbstate);
 
                m = 0;
-               printable = 1;
+               printable = true;
                if (argsize == SIZE_MAX)
                  argsize = strlen (arg);
 
@@ -422,12 +429,12 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
                      break;
                    else if (bytes == (size_t) -1)
                      {
-                       printable = 0;
+                       printable = false;
                        break;
                      }
                    else if (bytes == (size_t) -2)
                      {
-                       printable = 0;
+                       printable = false;
                        while (i + m < argsize && arg[i + m])
                          m++;
                        break;
@@ -449,9 +456,9 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
                                  goto use_shell_always_quoting_style;
                                }
                          }
-                           
+
                        if (! iswprint (w))
-                         printable = 0;
+                         printable = false;
                        m += bytes;
                      }
                  }
@@ -579,7 +586,12 @@ quotearg_n_options (int n, char const *arg, size_t argsize,
 
   if (nslots <= n0)
     {
-      unsigned int n1 = n0 + 1;
+      /* FIXME: technically, the type of n1 should be `unsigned int',
+        but that evokes an unsuppressible warning from gcc-4.0.1 and
+        older.  If gcc ever provides an option to suppress that warning,
+        revert to the original type, so that the test in xalloc_oversized
+        is once again performed only at compile time.  */
+      size_t n1 = n0 + 1;
 
       if (xalloc_oversized (n1, sizeof *slotvec))
        xalloc_die ();