FreeBSD Bugzilla – Attachment 243206 Details for
Bug 272334
Misleading 'iconv -l' output
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
Program that extracts the conversion table of an encoding
table-from.c (text/plain), 4.19 KB, created by
bruno
on 2023-07-04 20:38:46 UTC
(
hide
)
Description:
Program that extracts the conversion table of an encoding
Filename:
MIME Type:
Creator:
bruno
Created:
2023-07-04 20:38:46 UTC
Size:
4.19 KB
patch
obsolete
>/* Copyright (C) 2000 Free Software Foundation, Inc. > This file is part of the GNU ICONV Library. > > The GNU ICONV Library is free software; you can redistribute it and/or > modify it under the terms of the GNU Library General Public License as > published by the Free Software Foundation; either version 2 of the > License, or (at your option) any later version. > > The GNU ICONV Library is distributed in the hope that it will be useful, > but WITHOUT ANY WARRANTY; without even the implied warranty of > MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > Library General Public License for more details. > > You should have received a copy of the GNU Library General Public > License along with the GNU ICONV Library; see the file COPYING.LIB. If not, > write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, > Boston, MA 02111-1307, USA. */ > >/* Create a table from CHARSET to Unicode. */ > >#include <stddef.h> >#include <stdio.h> >#include <stdlib.h> >#include <iconv.h> >#include <errno.h> > >static const char* hexbuf (unsigned char buf[], unsigned int buflen) >{ > static char msg[50]; > switch (buflen) { > case 1: sprintf(msg,"0x%02X",buf[0]); break; > case 2: sprintf(msg,"0x%02X%02X",buf[0],buf[1]); break; > case 3: sprintf(msg,"0x%02X%02X%02X",buf[0],buf[1],buf[2]); break; > case 4: sprintf(msg,"0x%02X%02X%02X%02X",buf[0],buf[1],buf[2],buf[3]); break; > default: abort(); > } > return msg; >} > >static int try (iconv_t cd, unsigned char buf[], unsigned int buflen, unsigned char *out) >{ > const char* inbuf = (const char*) buf; > size_t inbytesleft = buflen; > char* outbuf = (char*) out; > size_t outbytesleft = 6; > size_t result = iconv(cd,&inbuf,&inbytesleft,&outbuf,&outbytesleft); > if (result == (size_t)(-1)) { > if (errno == EILSEQ) { > return -1; > } else if (errno == EINVAL) { > return 0; > } else { > int saved_errno = errno; > fprintf(stderr,"%s: iconv error: ",hexbuf(buf,buflen)); > errno = saved_errno; > perror(""); > exit(1); > } > } else { > if (inbytesleft != 0) { > fprintf(stderr,"%s: inbytes = %ld, outbytes = %ld\n",hexbuf(buf,buflen),(long)(buflen-inbytesleft),(long)(6-outbytesleft)); > exit(1); > } > return 6-outbytesleft; > } >} > >int main (int argc, char* argv[]) >{ > const char* charset; > iconv_t cd; > > if (argc != 2) { > fprintf(stderr,"Usage: table-from charset\n"); > exit(1); > } > charset = argv[1]; > > cd = iconv_open("UTF-8",charset); > if (cd == (iconv_t)(-1)) { > perror("iconv_open"); > exit(1); > } > > { > unsigned char out[6]; > unsigned char buf[4]; > unsigned int i0, i1, i2, i3; > int result; >#define OUT (result==1 ? out[0] : result==2 ? ((out[0] & 0x1f) << 6) + (out[1] & 0x3f) : result==3 ? ((out[0] & 0x0f) << 12) + ((out[1] & 0x3f) << 6) + (out[2] & 0x3f) : 0xfffd) > for (i0 = 0; i0 < 0x100; i0++) { > buf[0] = i0; > result = try(cd,buf,1,out); > if (result < 0) { > } else if (result > 0) { > printf("0x%02X\t0x%04X\n",i0,OUT); > } else { > for (i1 = 0; i1 < 0x100; i1++) { > buf[1] = i1; > result = try(cd,buf,2,out); > if (result < 0) { > } else if (result > 0) { > printf("0x%02X%02X\t0x%04X\n",i0,i1,OUT); > } else { > for (i2 = 0; i2 < 0x100; i2++) { > buf[2] = i2; > result = try(cd,buf,3,out); > if (result < 0) { > } else if (result > 0) { > printf("0x%02X%02X%02X\t0x%04X\n",i0,i1,i2,OUT); > } else { > for (i3 = 0; i3 < 0x100; i3++) { > buf[3] = i3; > result = try(cd,buf,4,out); > if (result < 0) { > } else if (result > 0) { > printf("0x%02X%02X%02X%02X\t0x%04X\n",i0,i1,i2,i3,OUT); > } else { > fprintf(stderr,"%s: incomplete byte sequence\n",hexbuf(buf,4)); > exit(1); > } > } > } > } > } > } > } > } > } > > if (iconv_close(cd) < 0) { > perror("iconv_close"); > exit(1); > } > > if (ferror(stdin) || fflush(stdout) || ferror(stdout)) { > fprintf(stderr,"I/O error\n"); > exit(1); > } > > exit(0); >}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 272334
: 243206 |
243207
|
243208
|
243209
|
243210
|
243211
|
243212
|
243213
|
243214
|
243215
|
243216
|
243217
|
243218
|
243219
|
243220
|
243221
|
243222
|
243223
|
243225
|
243226
|
243227
|
243228
|
243229
|
243230
|
243231
|
243232
|
243233
|
243234
|
243235
|
243237
|
243238
|
243242
|
243243
|
243244
|
243245
|
243246
|
243247
|
243248
|
243249
|
243250