bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: unicodeio.c ignores fwrite return value


From: Bruno Haible
Subject: Re: unicodeio.c ignores fwrite return value
Date: Wed, 12 Nov 2008 12:38:46 +0100
User-agent: KMail/1.5.4

Hi Jim,

It's a long time I last looked at the unicodeio module. I'm applying the
changes below, for better integration with gnulib.

>   unicodeio.c: In function 'fwrite_success_callback':
>   unicodeio.c:203: warning: ignoring return value of 'fwrite', declared with 
> attribute warn_unused_result
> 
> Would you be open to a change that would suppress the above warning?

Sure, yes. print_unicode_char could return EOF upon error on the stream, like
other stdio functions do.

> One way would be to use the value and make the function return an
> indication of failure.
> Alternatively, use ignore_value (from ignore-value.h) to make
> explicit the desire to ignore the return value.

But what is the reason of the warning, and what is the best approach?
  - Does the attribute warn_unused_result come from the glibc headers
    or from a third-party header file?
  - In coreutils, there are plenty of fwrite() calls which drop the
    return value.
  - We have a wrapper xprintf() for printf(), because printf has some
    errors (like ENOMEM or EILSEQ) which are not stream related and
    therefore may not set the stream error indicator. But for fwrite(),
    you are sure that if there's an error, ferror (stream) will be true.
    Then what's the point of the checking fwrite`s return value, and
    what's the point of attribute warn_unused_result in its declaration?

I'm confused.

Bruno


2008-11-12  Bruno Haible  <address@hidden>

        * lib/unicodeio.c: Include unistr.h.
        (utf8_wctomb): Remove function.
        (unicode_to_mb): Use utf8_uctomb instead of utf8_wctomb.

--- lib/unicodeio.c.orig        2008-11-12 12:27:18.000000000 +0100
+++ lib/unicodeio.c     2008-11-12 12:27:08.000000000 +0100
@@ -1,6 +1,6 @@
 /* Unicode character output to streams with locale dependent encoding.
 
-   Copyright (C) 2000-2003, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2000-2003, 2006, 2008 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -17,9 +17,6 @@
 
 /* Written by Bruno Haible <address@hidden>.  */
 
-/* Note: This file requires the locale_charset() function.  See in
-   libiconv-1.8/libcharset/INTEGRATE for how to obtain it.  */
-
 #include <config.h>
 
 /* Specification.  */
@@ -40,6 +37,7 @@
 #define N_(msgid) msgid
 
 #include "localcharset.h"
+#include "unistr.h"
 
 /* When we pass a Unicode character to iconv(), we must pass it in a
    suitable encoding. The standardized Unicode encodings are
@@ -53,42 +51,6 @@
    So we use UTF-8. It supports characters up to \U7FFFFFFF and is
    unambiguously defined.  */
 
-/* Stores the UTF-8 representation of the Unicode character wc in r[0..5].
-   Returns the number of bytes stored, or -1 if wc is out of range.  */
-static int
-utf8_wctomb (unsigned char *r, unsigned int wc)
-{
-  int count;
-
-  if (wc < 0x80)
-    count = 1;
-  else if (wc < 0x800)
-    count = 2;
-  else if (wc < 0x10000)
-    count = 3;
-  else if (wc < 0x200000)
-    count = 4;
-  else if (wc < 0x4000000)
-    count = 5;
-  else if (wc <= 0x7fffffff)
-    count = 6;
-  else
-    return -1;
-
-  switch (count)
-    {
-      /* Note: code falls through cases! */
-      case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000;
-      case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000;
-      case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000;
-      case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800;
-      case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0;
-      case 1: r[0] = wc;
-    }
-
-  return count;
-}
-
 /* Luckily, the encoding's name is platform independent.  */
 #define UTF8_NAME "UTF-8"
 
@@ -144,7 +106,7 @@
     }
 
   /* Convert the character to UTF-8.  */
-  count = utf8_wctomb ((unsigned char *) inbuf, code);
+  count = utf8_uctomb ((unsigned char *) inbuf, code, sizeof (inbuf));
   if (count < 0)
     return failure (code, N_("character out of range"), callback_arg);
 
--- lib/unicodeio.h.orig        2008-11-12 12:27:18.000000000 +0100
+++ lib/unicodeio.h     2008-11-12 12:27:08.000000000 +0100
@@ -1,6 +1,6 @@
 /* Unicode character output to streams with locale dependent encoding.
 
-   Copyright (C) 2000-2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2000-2003, 2005, 2008 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -38,11 +38,11 @@
    Upon failure, exit if exit_on_error is true, otherwise output a fallback
    notation.  */
 extern void print_unicode_char (FILE *stream, unsigned int code,
-                                int exit_on_error);
+                               int exit_on_error);
 
 /* Simple success callback that outputs the converted string.
    The STREAM is passed as callback_arg.  */
 extern long fwrite_success_callback (const char *buf, size_t buflen,
-                                     void *callback_arg);
+                                    void *callback_arg);
 
 #endif
--- modules/unicodeio.orig      2008-11-12 12:27:18.000000000 +0100
+++ modules/unicodeio   2008-11-12 12:27:08.000000000 +0100
@@ -7,6 +7,7 @@
 m4/unicodeio.m4
 
 Depends-on:
+unistr/u8-uctomb
 iconv
 iconv_open
 gettext-h





reply via email to

[Prev in Thread] Current Thread [Next in Thread]