1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) Index Data
3 * See the file LICENSE for details.
14 #include <yaz/yaz-util.h>
15 #include <yaz/backtrace.h>
20 void write_out(const char *b0, const char *b1)
25 if (fwrite(b0, 1, sz, stdout) != sz)
27 fprintf(stderr, "yaz-iconv: write failed\n");
33 void convert(FILE *inf, yaz_iconv_t cd, int verbose)
35 char inbuf0[CHUNK_IN], *inbuf = inbuf0;
36 char outbuf0[CHUNK_OUT], *outbuf = outbuf0;
37 size_t inbytesleft = CHUNK_IN;
38 size_t outbytesleft = CHUNK_OUT;
46 r = fread(inbuf, 1, inbytesleft, inf);
51 fprintf(stderr, "yaz-iconv: error reading file\n");
56 write_out(outbuf0, outbuf);
58 outbytesleft = CHUNK_OUT;
59 r = yaz_iconv(cd, 0, 0, &outbuf, &outbytesleft);
60 write_out(outbuf0, outbuf);
68 fprintf(stderr, "yaz_iconv: inbytesleft=%ld outbytesleft=%ld\n",
69 (long) inbytesleft, (long) outbytesleft);
72 r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
73 if (r == (size_t)(-1))
75 int e = yaz_iconv_error(cd);
76 if (e == YAZ_ICONV_EILSEQ)
78 fprintf(stderr, "invalid sequence\n");
81 else if (e == YAZ_ICONV_EINVAL) /* incomplete input */
84 for (i = 0; i<inbytesleft; i++)
87 r = fread(inbuf0 + i, 1, CHUNK_IN - i, inf);
88 if (r != CHUNK_IN - i)
92 fprintf(stderr, "yaz-iconv: error reading file\n");
98 fprintf(stderr, "invalid sequence due to missing input\n");
105 else if (e == YAZ_ICONV_E2BIG) /* no more output space */
107 write_out(outbuf0, outbuf);
109 outbytesleft = CHUNK_OUT;
114 fprintf(stderr, "yaz-iconv: unknown error\n");
121 inbytesleft = CHUNK_IN;
123 write_out(outbuf0, outbuf);
125 outbytesleft = CHUNK_OUT;
132 int main(int argc, char **argv)
142 yaz_enable_panic_backtrace(*argv);
143 while ((ret = options("vf:t:", argv, argc, &arg)) != -2)
148 inf = fopen(arg, "rb");
151 fprintf(stderr, "yaz-iconv: cannot open %s", arg);
165 fprintf(stderr, "yaz-iconv: Usage\n"
166 "yaziconv -f encoding -t encoding [-v] [file]\n");
172 fprintf(stderr, "yaz-iconv: -t encoding missing\n");
177 fprintf(stderr, "yaz-iconv: -f encoding missing\n");
180 cd = yaz_iconv_open(to, from);
183 fprintf(stderr, "yaz-iconv: unsupported encoding\n");
190 fprintf(stderr, "yaz-iconv: using %s\n",
191 yaz_iconv_isbuiltin(cd) ? "YAZ" : "iconv");
194 convert(inf, cd, verbose);
201 * c-file-style: "Stroustrup"
202 * indent-tabs-mode: nil
204 * vim: shiftwidth=4 tabstop=8 expandtab