[Top][All Lists]
[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