aboutsummaryrefslogtreecommitdiffstats
path: root/converters/iconv/files/patch-lib::converter.c
blob: 362246793dcab63c9471e501c10c9206003ba9d5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
--- lib/converter.c.orig    Sun Nov 26 22:10:22 2000
+++ lib/converter.c Mon Mar 18 19:49:56 2002
@@ -92,14 +92,14 @@
        if (ch == UCS_CHAR_NONE) {
            /* Incomplete character in input buffer */
            errno = EINVAL;
-           return res;
+           return (size_t)(-1);
        }
        if (ch == UCS_CHAR_INVALID) {
            /* Invalid character in source buffer */
            *inbytesleft += *inbuf - ptr;
            *inbuf = ptr;
            errno = EILSEQ;
-           return res;
+           return (size_t)(-1);
        }
        size = ICONV_CES_CONVERT_FROM_UCS(&(uc->to), ch,
                                          outbuf, outbytesleft);
@@ -116,7 +116,7 @@
            *inbytesleft += *inbuf - ptr;
            *inbuf = ptr; 
            errno = E2BIG;
-           return res;
+           return (size_t)(-1);
        }
    }
    return res;
@@ -156,14 +156,24 @@
 {
    if (inbuf && *inbuf && inbytesleft && *inbytesleft > 0 && outbuf
            && *outbuf && outbytesleft && *outbytesleft > 0) {
-       size_t len = *inbytesleft < *outbytesleft ? *inbytesleft
-                             : *outbytesleft;
+       size_t result, len;
+       if (*inbytesleft < *outbytesleft) {
+           result = 0;
+           len = *inbytesleft;
+       } else {
+           result = (size_t)(-1);
+           errno = E2BIG;
+           len = *outbytesleft;
+       }
        bcopy(*inbuf, *outbuf, len);
        *inbuf += len;
        *inbytesleft -= len;
        *outbuf += len;
        *outbytesleft -= len;
+
+       return result;
    }
+
    return 0;
 }