You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.6 KiB
74 lines
1.6 KiB
/* iconv.c - Convert character encoding
|
|
*
|
|
* Copyright 2014 Felix Janda <felix.janda@posteo.de>
|
|
*
|
|
* See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/iconv.html
|
|
*
|
|
* Deviations from posix: no idea how to implement -l
|
|
|
|
USE_ICONV(NEWTOY(iconv, "cst:f:", TOYFLAG_USR|TOYFLAG_BIN))
|
|
|
|
config ICONV
|
|
bool "iconv"
|
|
default y
|
|
depends on TOYBOX_ICONV
|
|
help
|
|
usage: iconv [-f FROM] [-t TO] [FILE...]
|
|
|
|
Convert character encoding of files.
|
|
|
|
-c Omit invalid chars
|
|
-f Convert from (default UTF-8)
|
|
-t Convert to (default UTF-8)
|
|
*/
|
|
|
|
#define FOR_iconv
|
|
#include "toys.h"
|
|
#include <iconv.h>
|
|
|
|
GLOBALS(
|
|
char *f, *t;
|
|
|
|
void *ic;
|
|
)
|
|
|
|
static void do_iconv(int fd, char *name)
|
|
{
|
|
char *outstart = toybuf+2048;
|
|
size_t outlen, inlen = 0;
|
|
int readlen = 1;
|
|
|
|
for (;;) {
|
|
char *in = toybuf, *out = outstart;
|
|
|
|
if (readlen && 0>(readlen = read(fd, in+inlen, 2048-inlen))) {
|
|
perror_msg("read '%s'", name);
|
|
return;
|
|
}
|
|
inlen += readlen;
|
|
if (!inlen) break;
|
|
|
|
outlen = 2048;
|
|
iconv(TT.ic, &in, &inlen, &out, &outlen);
|
|
if (in == toybuf) {
|
|
// Skip first byte of illegal sequence to avoid endless loops
|
|
if (toys.optflags & FLAG_c) in++;
|
|
else *(out++) = *(in++);
|
|
inlen--;
|
|
}
|
|
if (out != outstart) xwrite(1, outstart, out-outstart);
|
|
memmove(toybuf, in, inlen);
|
|
}
|
|
}
|
|
|
|
void iconv_main(void)
|
|
{
|
|
if (!TT.t) TT.t = "UTF-8";
|
|
if (!TT.f) TT.f = "UTF-8";
|
|
|
|
if ((iconv_t)-1 == (TT.ic = iconv_open(TT.t, TT.f)))
|
|
perror_exit("%s/%s", TT.t, TT.f);
|
|
loopfiles(toys.optargs, do_iconv);
|
|
if (CFG_TOYBOX_FREE) iconv_close(TT.ic);
|
|
}
|