diff options
-rw-r--r-- | miscutils/iconv.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/miscutils/iconv.c b/miscutils/iconv.c index d6ed439b4..ec3c0c92d 100644 --- a/miscutils/iconv.c +++ b/miscutils/iconv.c | |||
@@ -1677,22 +1677,23 @@ static void process_file(iconv_t cd, FILE *in, FILE *out) | |||
1677 | char outbuf[BUFSIZ]; | 1677 | char outbuf[BUFSIZ]; |
1678 | const char *pin; | 1678 | const char *pin; |
1679 | char *pout; | 1679 | char *pout; |
1680 | size_t inbytesleft; | 1680 | size_t inbytesleft = 0; |
1681 | size_t outbytesleft; | 1681 | size_t outbytesleft; |
1682 | size_t rest = 0; | 1682 | size_t rest = 0; |
1683 | size_t r; | 1683 | size_t r; |
1684 | 1684 | ||
1685 | while ((inbytesleft=fread(inbuf+rest, 1, sizeof(inbuf)-rest, in)) != 0 | 1685 | while ((!feof(in) && |
1686 | (inbytesleft=fread(inbuf+rest, 1, sizeof(inbuf)-rest, in)) != 0) | ||
1686 | || rest != 0) { | 1687 | || rest != 0) { |
1687 | inbytesleft += rest; | 1688 | inbytesleft += rest; |
1688 | pin = inbuf; | 1689 | pin = inbuf; |
1689 | pout = outbuf; | 1690 | pout = outbuf; |
1690 | outbytesleft = sizeof(outbuf); | 1691 | outbytesleft = sizeof(outbuf); |
1691 | r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft); | 1692 | r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft); |
1692 | fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, out); | ||
1693 | if (r == (size_t)(-1) && errno != E2BIG && | 1693 | if (r == (size_t)(-1) && errno != E2BIG && |
1694 | (errno != EINVAL || feof(in))) | 1694 | (errno != EINVAL || feof(in))) |
1695 | bb_perror_msg_and_die("conversion error"); | 1695 | bb_perror_msg_and_die("conversion error"); |
1696 | fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, out); | ||
1696 | memmove(inbuf, pin, inbytesleft); | 1697 | memmove(inbuf, pin, inbytesleft); |
1697 | rest = inbytesleft; | 1698 | rest = inbytesleft; |
1698 | } | 1699 | } |
@@ -1718,7 +1719,7 @@ int iconv_main(int argc, char **argv) | |||
1718 | const char *fromcode = "", *tocode = "", *outfile; | 1719 | const char *fromcode = "", *tocode = "", *outfile; |
1719 | int i, opt; | 1720 | int i, opt; |
1720 | iconv_t cd; | 1721 | iconv_t cd; |
1721 | FILE *in = stdin; | 1722 | FILE *in; |
1722 | FILE *out = stdout; | 1723 | FILE *out = stdout; |
1723 | 1724 | ||
1724 | opt = getopt32(argv, "f:t:lco:", &fromcode, &tocode, &outfile); | 1725 | opt = getopt32(argv, "f:t:lco:", &fromcode, &tocode, &outfile); |
@@ -1742,16 +1743,16 @@ int iconv_main(int argc, char **argv) | |||
1742 | if (cd == (iconv_t)(-1)) | 1743 | if (cd == (iconv_t)(-1)) |
1743 | bb_perror_msg_and_die("iconv_open error"); | 1744 | bb_perror_msg_and_die("iconv_open error"); |
1744 | 1745 | ||
1745 | if (optind == argc || | 1746 | if (optind == argc) |
1746 | (optind == argc-1 && strcmp(argv[optind], "-") == 0)) { | 1747 | argv[argc++] = (char *)"-"; |
1748 | |||
1749 | for (i=optind; i<argc; ++i) { | ||
1750 | if (argv[i][0] == '-' && argv[i][1] == '\0') | ||
1751 | in = stdin; | ||
1752 | else | ||
1753 | in = xfopen(argv[optind], "rb"); | ||
1747 | process_file(cd, in, out); | 1754 | process_file(cd, in, out); |
1748 | } | 1755 | fclose(in); |
1749 | else { | ||
1750 | for (i=optind; i<argc; ++i) { | ||
1751 | in = xfopen(argv[i], "rb"); | ||
1752 | process_file(cd, in, out); | ||
1753 | fclose(in); | ||
1754 | } | ||
1755 | } | 1756 | } |
1756 | 1757 | ||
1757 | if (ENABLE_FEATURE_CLEAN_UP) | 1758 | if (ENABLE_FEATURE_CLEAN_UP) |