musl: add iconv utility from Alpine.
This commit is contained in:
parent
616a6d8055
commit
cdc033261a
2 changed files with 113 additions and 1 deletions
110
srcpkgs/musl/files/iconv.c
Normal file
110
srcpkgs/musl/files/iconv.c
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/*
|
||||||
|
* iconv.c
|
||||||
|
* Implementation of SUSv4 XCU iconv utility
|
||||||
|
* Copyright © 2011 Rich Felker
|
||||||
|
* Licensed under the terms of the GNU General Public License, v2 or later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <iconv.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <langinfo.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const char *from=0, *to=0;
|
||||||
|
int b;
|
||||||
|
iconv_t cd;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
char outbuf[BUFSIZ*4];
|
||||||
|
char *in, *out;
|
||||||
|
size_t inb;
|
||||||
|
size_t l;
|
||||||
|
size_t unitsize=0;
|
||||||
|
int err=0;
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
while ((b = getopt(argc, argv, "f:t:csl")) != EOF) switch(b) {
|
||||||
|
case 'l':
|
||||||
|
puts("UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF32-LE, UCS-2BE, UCS-2LE, WCHAR_T,\n"
|
||||||
|
"US_ASCII, ISO8859-1, ISO8859-2, ISO8859-3, ISO8859-4, ISO8859-5,\n"
|
||||||
|
"ISO8859-6, ISO8859-7, ...");
|
||||||
|
exit(0);
|
||||||
|
case 'c': case 's': break;
|
||||||
|
case 'f': from=optarg; break;
|
||||||
|
case 't': to=optarg; break;
|
||||||
|
default: exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!from || !to) {
|
||||||
|
setlocale(LC_CTYPE, "");
|
||||||
|
if (!to) to = nl_langinfo(CODESET);
|
||||||
|
if (!from) from = nl_langinfo(CODESET);
|
||||||
|
}
|
||||||
|
cd = iconv_open(to, from);
|
||||||
|
if (cd == (iconv_t)-1) {
|
||||||
|
if (iconv_open(to, "WCHAR_T") == (iconv_t)-1)
|
||||||
|
fprintf(stderr, "iconv: destination charset %s: ", to);
|
||||||
|
else
|
||||||
|
fprintf(stderr, "iconv: source charset %s: ", from);
|
||||||
|
perror("");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (optind == argc) argv[argc++] = "-";
|
||||||
|
|
||||||
|
for (; optind < argc; optind++) {
|
||||||
|
if (argv[optind][0]=='-' && !argv[optind][1]) {
|
||||||
|
f = stdin;
|
||||||
|
argv[optind] = "(stdin)";
|
||||||
|
} else if (!(f = fopen(argv[optind], "rb"))) {
|
||||||
|
fprintf(stderr, "iconv: %s: ", argv[optind]);
|
||||||
|
perror("");
|
||||||
|
err = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
inb = 0;
|
||||||
|
for (;;) {
|
||||||
|
in = buf;
|
||||||
|
out = outbuf;
|
||||||
|
l = fread(buf+inb, 1, sizeof(buf)-inb, f);
|
||||||
|
inb += l;
|
||||||
|
if (!inb) break;
|
||||||
|
if (iconv(cd, &in, &inb, &out, (size_t [1]){sizeof outbuf})==-1
|
||||||
|
&& errno == EILSEQ) {
|
||||||
|
if (!unitsize) {
|
||||||
|
wchar_t wc='0';
|
||||||
|
char dummy[4], *dummyp=dummy;
|
||||||
|
iconv_t cd2 = iconv_open(from, "WCHAR_T");
|
||||||
|
if (cd == (iconv_t)-1) {
|
||||||
|
unitsize = 1;
|
||||||
|
} else {
|
||||||
|
iconv(cd2,
|
||||||
|
(char *[1]){(char *)&wc},
|
||||||
|
(size_t[1]){1},
|
||||||
|
&dummyp, (size_t[1]){4});
|
||||||
|
unitsize = dummyp-dummy;
|
||||||
|
if (!unitsize) unitsize=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inb-=unitsize;
|
||||||
|
in+=unitsize;
|
||||||
|
}
|
||||||
|
if (inb && !l && errno==EINVAL) break;
|
||||||
|
if (out>outbuf && !fwrite(outbuf, out-outbuf, 1, stdout)) {
|
||||||
|
perror("iconv: write error");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (inb) memmove(buf, in, inb);
|
||||||
|
}
|
||||||
|
if (ferror(f)) {
|
||||||
|
fprintf(stderr, "iconv: %s: ", argv[optind]);
|
||||||
|
perror("");
|
||||||
|
err = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
# Template file for 'musl'.
|
# Template file for 'musl'.
|
||||||
pkgname=musl
|
pkgname=musl
|
||||||
version=1.1.8
|
version=1.1.8
|
||||||
revision=2
|
revision=3
|
||||||
build_style=gnu-configure
|
build_style=gnu-configure
|
||||||
configure_args="--prefix=/usr --disable-gcc-wrapper"
|
configure_args="--prefix=/usr --disable-gcc-wrapper"
|
||||||
conflicts="glibc>=0"
|
conflicts="glibc>=0"
|
||||||
|
@ -19,6 +19,7 @@ CFLAGS="-fno-stack-protector -U_FORTIFY_SOURCE"
|
||||||
post_build() {
|
post_build() {
|
||||||
$CC $CFLAGS $LDFLAGS ${FILESDIR}/getent.c -o getent
|
$CC $CFLAGS $LDFLAGS ${FILESDIR}/getent.c -o getent
|
||||||
$CC $CFLAGS $LDFLAGS ${FILESDIR}/getconf.c -o getconf
|
$CC $CFLAGS $LDFLAGS ${FILESDIR}/getconf.c -o getconf
|
||||||
|
$CC $CFLAGS $LDFLAGS ${FILESDIR}/getconf.c -o iconv
|
||||||
}
|
}
|
||||||
do_install() {
|
do_install() {
|
||||||
# Move everything to /usr.
|
# Move everything to /usr.
|
||||||
|
@ -30,6 +31,7 @@ do_install() {
|
||||||
vmkdir usr/bin
|
vmkdir usr/bin
|
||||||
ln -s /usr/lib/libc.so ${DESTDIR}/usr/bin/ldd
|
ln -s /usr/lib/libc.so ${DESTDIR}/usr/bin/ldd
|
||||||
# additional utils from Alpine/NetBSD
|
# additional utils from Alpine/NetBSD
|
||||||
|
vbin iconv
|
||||||
vbin getent
|
vbin getent
|
||||||
vman ${FILESDIR}/getent.1
|
vman ${FILESDIR}/getent.1
|
||||||
vbin getconf
|
vbin getconf
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue