📄 yaziconv.c
字号:
/* * Copyright (c) 1997-2003, Index Data * See the file LICENSE for details. * * $Id: yaziconv.c,v 1.1 2003/04/23 20:34:08 adam Exp $ */#if HAVE_CONFIG_H#include <config.h>#endif#include <errno.h>#include <string.h>#include <ctype.h>#include <yaz/yaz-util.h>#define CHUNK_IN 64#define CHUNK_OUT 64void convert (FILE *inf, yaz_iconv_t cd, int verbose){ char inbuf0[CHUNK_IN], *inbuf = inbuf0; char outbuf0[CHUNK_OUT], *outbuf = outbuf0; size_t inbytesleft = CHUNK_IN; size_t outbytesleft = CHUNK_OUT; int mustread = 1; while (1) { size_t r; if (mustread) { r = fread (inbuf, 1, inbytesleft, inf); if (inbytesleft != r) { if (ferror(inf)) { fprintf (stderr, "yaziconv: error reading file\n"); exit (6); } if (r == 0) { if (outbuf != outbuf0) fwrite (outbuf0, 1, outbuf - outbuf0, stdout); break; } inbytesleft = r; } } if (verbose > 1) { fprintf (stderr, "yaz_iconv: inbytesleft=%d outbytesleft=%d\n", inbytesleft, outbytesleft); } r = yaz_iconv (cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (r == (size_t)(-1)) { int e = yaz_iconv_error(cd); if (e == YAZ_ICONV_EILSEQ) { fprintf (stderr, "invalid sequence\n"); return ; } else if (e == YAZ_ICONV_EINVAL) /* incomplete input */ { size_t i; for (i = 0; i<inbytesleft; i++) inbuf0[i] = inbuf[i]; r = fread(inbuf0 + i, 1, CHUNK_IN - i, inf); if (r != CHUNK_IN - i) { if (ferror(inf)) { fprintf (stderr, "yaziconv: error reading file\n"); exit(6); } } if (r == 0) { fprintf (stderr, "invalid sequence\n"); return ; } inbytesleft += r; inbuf = inbuf0; mustread = 0; } else if (e == YAZ_ICONV_E2BIG) /* no more output space */ { fwrite (outbuf0, 1, outbuf - outbuf0, stdout); outbuf = outbuf0; outbytesleft = CHUNK_OUT; mustread = 0; } else { fprintf (stderr, "yaziconv: unknown error\n"); exit (7); } } else { inbuf = inbuf0; inbytesleft = CHUNK_IN; fwrite (outbuf0, 1, outbuf - outbuf0, stdout); outbuf = outbuf0; outbytesleft = CHUNK_OUT; mustread = 1; } }}int main (int argc, char **argv){ int ret; int verbose = 0; char *from = 0; char *to = 0; char *arg; yaz_iconv_t cd; FILE *inf = stdin; while ((ret = options ("vf:t:", argv, argc, &arg)) != -2) { switch (ret) { case 0: inf = fopen (arg, "rb"); if (!inf) { fprintf (stderr, "yaziconv: cannot open %s", arg); exit (2); } break; case 'f': from = arg; break; case 't': to = arg; break; case 'v': verbose++; break; default: fprintf (stderr, "yaziconv: Usage\n" "siconv -f encoding -t encoding [-v] [file]\n"); exit(1); } } if (!to) { fprintf (stderr, "yaziconv: -t encoding missing\n"); exit (3); } if (!from) { fprintf (stderr, "yaziconv: -f encoding missing\n"); exit (4); } cd = yaz_iconv_open (to, from); if (!cd) { fprintf (stderr, "yaziconv: unsupported encoding\n"); exit (5); } else { if (verbose) { fprintf (stderr, "yaziconv: using %s\n", yaz_iconv_isbuiltin(cd) ? "YAZ" : "iconv"); } } convert (inf, cd, verbose); yaz_iconv_close (cd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -