1.1 --- a/lib/native/iconv.py Tue Jan 10 18:47:33 2017 +0100
1.2 +++ b/lib/native/iconv.py Tue Jan 10 19:08:11 2017 +0100
1.3 @@ -24,7 +24,11 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 """
1.6
1.7 +from posix.iconv import IncompleteSequenceError, InvalidSequenceError
1.8 +
1.9 def iconv(cd, state):
1.10 + IncompleteSequenceError
1.11 + InvalidSequenceError
1.12 OSError
1.13
1.14 def iconv_close(cd):
2.1 --- a/lib/posix/iconv.py Tue Jan 10 18:47:33 2017 +0100
2.2 +++ b/lib/posix/iconv.py Tue Jan 10 19:08:11 2017 +0100
2.3 @@ -22,10 +22,17 @@
2.4 from __builtins__.types import check_int, check_string
2.5 from native import iconv, iconv_close, iconv_open, iconv_reset
2.6
2.7 -# Errors produced by iconv.
2.8 +class IncompleteSequenceError(OSError):
2.9 +
2.10 + "An error indicating an incomplete multibyte sequence."
2.11 +
2.12 + pass
2.13
2.14 -EINVAL = 22
2.15 -EILSEQ = 84
2.16 +class InvalidSequenceError(OSError):
2.17 +
2.18 + "An error indicating an incomplete multibyte sequence."
2.19 +
2.20 + pass
2.21
2.22 class ConverterError(Exception):
2.23
2.24 @@ -86,14 +93,14 @@
2.25
2.26 # Incomplete input does not cause an exception.
2.27
2.28 - except OSError, exc:
2.29 - if exc.value == EINVAL:
2.30 - self.result.append(exc.arg)
2.31 - return
2.32 - elif exc.value == EILSEQ:
2.33 - raise UnicodeDecodeError(exc.arg)
2.34 - else:
2.35 - raise
2.36 + except IncompleteSequenceError, exc:
2.37 + self.result.append(exc.arg)
2.38 + return
2.39 +
2.40 + # Invalid input causes a Unicode exception.
2.41 +
2.42 + except InvalidSequenceError, exc:
2.43 + raise UnicodeDecodeError(exc.arg)
2.44
2.45 # Add any returned text to the result.
2.46
3.1 --- a/templates/native/iconv.c Tue Jan 10 18:47:33 2017 +0100
3.2 +++ b/templates/native/iconv.c Tue Jan 10 19:08:11 2017 +0100
3.3 @@ -81,7 +81,7 @@
3.4 /* Incomplete sequence: raise the string in an OSError instead. */
3.5
3.6 if (errno == EINVAL)
3.7 - __raise_os_error(__new_int(errno), __new_str(resultbuf, outbytestotal));
3.8 + __raise_incomplete_sequence_error(__new_int(errno), __new_str(resultbuf, outbytestotal));
3.9
3.10 return __new_str(resultbuf, outbytestotal);
3.11 }
3.12 @@ -92,7 +92,7 @@
3.13 {
3.14 resultbuf = __ALLOCATE(inbytesleft + 1, sizeof(char));
3.15 memcpy(resultbuf, inbuf, inbytesleft);
3.16 - __raise_os_error(__new_int(errno), __new_str(resultbuf, inbytesleft));
3.17 + __raise_invalid_sequence_error(__new_int(errno), __new_str(resultbuf, inbytesleft));
3.18 }
3.19
3.20 /* General failure. */
4.1 --- a/templates/progops.c Tue Jan 10 18:47:33 2017 +0100
4.2 +++ b/templates/progops.c Tue Jan 10 19:08:11 2017 +0100
4.3 @@ -103,6 +103,24 @@
4.4 #endif /* __HAVE___builtins___exception_io_EOFError */
4.5 }
4.6
4.7 +void __raise_incomplete_sequence_error(__attr value, __attr arg)
4.8 +{
4.9 +#ifdef __HAVE_posix_iconv_IncompleteSequenceError
4.10 + __attr args[3] = {{0, 0}, value, arg};
4.11 + __attr exc = __new_posix_iconv_IncompleteSequenceError(args);
4.12 + __Raise(exc);
4.13 +#endif /* __HAVE_posix_iconv_IncompleteSequenceError */
4.14 +}
4.15 +
4.16 +void __raise_invalid_sequence_error(__attr value, __attr arg)
4.17 +{
4.18 +#ifdef __HAVE_posix_iconv_InvalidSequenceError
4.19 + __attr args[3] = {{0, 0}, value, arg};
4.20 + __attr exc = __new_posix_iconv_InvalidSequenceError(args);
4.21 + __Raise(exc);
4.22 +#endif /* __HAVE_posix_iconv_InvalidSequenceError */
4.23 +}
4.24 +
4.25 void __raise_io_error(__attr value)
4.26 {
4.27 #ifdef __HAVE___builtins___exception_io_IOError
5.1 --- a/templates/progops.h Tue Jan 10 18:47:33 2017 +0100
5.2 +++ b/templates/progops.h Tue Jan 10 19:08:11 2017 +0100
5.3 @@ -40,6 +40,10 @@
5.4
5.5 void __raise_eof_error();
5.6
5.7 +void __raise_incomplete_sequence_error(__attr value, __attr arg);
5.8 +
5.9 +void __raise_invalid_sequence_error(__attr value, __attr arg);
5.10 +
5.11 void __raise_io_error(__attr value);
5.12
5.13 void __raise_memory_error();