Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 119509 Details for
Bug 178856
patch app-cdr/cdrtools-2.01.01_alpha25 to work with utf-8
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
patch to add utf-8 feature to mkisofs
mkisofs-iconv-10.patch (text/plain), 16.78 KB, created by
dimonb
on 2007-05-17 10:42:27 UTC
(
hide
)
Description:
patch to add utf-8 feature to mkisofs
Filename:
MIME Type:
Creator:
dimonb
Created:
2007-05-17 10:42:27 UTC
Size:
16.78 KB
patch
obsolete
>diff -urN cdrtools-2.01.01/include/schily/unls.h cdrtools-2.01.01_1/include/schily/unls.h >--- cdrtools-2.01.01/include/schily/unls.h 2006-10-10 12:24:15.000000000 +0400 >+++ cdrtools-2.01.01_1/include/schily/unls.h 2007-05-17 14:03:01.000000000 +0400 >@@ -23,6 +23,10 @@ > #include <schily/mconfig.h> > #endif > >+#ifdef USE_ICONV >+#include <iconv.h> >+#endif >+ > #ifdef __cplusplus > extern "C" { > #endif >@@ -37,6 +41,10 @@ > unsigned char **unls_uni2cs; /* Unicode -> Charset */ > struct unls_unicode *unls_cs2uni; /* Charset -> Unicode */ > struct unls_table *unls_next; /* Next table */ >+ >+#ifdef USE_ICONV >+ iconv_t iconv_d; >+#endif > }; > > extern int init_unls __PR((void)); >@@ -49,6 +57,10 @@ > extern struct unls_table *load_unls_default __PR((void)); > extern int init_unls_file __PR((char * name)); > >+#ifdef USE_ICONV >+extern int init_nls_iconv __PR((char * name)); >+#endif >+ > #ifdef __cplusplus > } > #endif >diff -urN cdrtools-2.01.01/libunls/libunls.mk cdrtools-2.01.01_1/libunls/libunls.mk >--- cdrtools-2.01.01/libunls/libunls.mk 2007-02-04 03:56:54.000000000 +0300 >+++ cdrtools-2.01.01_1/libunls/libunls.mk 2007-05-17 12:56:34.000000000 +0400 >@@ -8,7 +8,7 @@ > INSDIR= lib > TARGETLIB= unls > #CPPOPTS += -Istdio >-CPPOPTS += -DSCHILY_PRINT >+CPPOPTS += -DSCHILY_PRINT -DUSE_ICONV > > include Targets > LIBS= >diff -urN cdrtools-2.01.01/libunls/nls.h cdrtools-2.01.01_1/libunls/nls.h >--- cdrtools-2.01.01/libunls/nls.h 2006-09-13 19:09:14.000000000 +0400 >+++ cdrtools-2.01.01_1/libunls/nls.h 2007-05-17 12:55:43.000000000 +0400 >@@ -111,4 +111,8 @@ > extern int init_unls_cp10081 __PR((void)); > extern int init_unls_file __PR((char * name)); > >+#ifdef USE_ICONV >+extern int init_nls_iconv __PR((char * name)); >+#endif >+ > #endif /* _NLS_H */ >diff -urN cdrtools-2.01.01/libunls/nls_iconv.c cdrtools-2.01.01_1/libunls/nls_iconv.c >--- cdrtools-2.01.01/libunls/nls_iconv.c 1970-01-01 03:00:00.000000000 +0300 >+++ cdrtools-2.01.01_1/libunls/nls_iconv.c 2007-05-17 14:07:04.000000000 +0400 >@@ -0,0 +1,97 @@ >+/* @(#)nls_iconv.c 1.0 02/04/20 2002 J. Schilling */ >+#ifndef lint >+static char sccsid[] = >+ "@(#)nls_iconv.c 1.0 02/01/20 2002 J. Schilling"; >+#endif >+/* >+ * This program is free software; you can redistribute it and/or modify >+ * it under the terms of the GNU General Public License as published by >+ * the Free Software Foundation; either version 2, or (at your option) >+ * any later version. >+ * >+ * This program 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 General Public License for more details. >+ * >+ * You should have received a copy of the GNU General Public License >+ * along with this program; see the file COPYING. If not, write to >+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. >+ */ >+/* >+ * Modifications to make the code portable Copyright (c) 2000 J. Schilling >+ * >+ * nls_iconv: create a pseudo-charset table to use iconv() provided by C >+ * library or libiconv by Bruno Haible >+ * The Unicode to charset table has only exact mappings. >+ * >+ * >+ * Jungshik Shin (jshin@mailaps.org) 04-Feb-2002 >+ */ >+ >+#ifdef USE_ICONV >+//#include <mconfig.h> >+#include <stdio.h> >+//#include <stdxlib.h> >+//#include <strdefs.h> >+#include "nls.h" >+#include <iconv.h> >+ >+static void inc_use_count __PR((void)); >+static void dec_use_count __PR((void)); >+ >+ >+static void >+inc_use_count() >+{ >+ MOD_INC_USE_COUNT; >+} >+ >+static void >+dec_use_count() >+{ >+ MOD_DEC_USE_COUNT; >+} >+ >+int >+init_nls_iconv(charset) >+ char *charset; >+{ >+ iconv_t iconv_d; /* iconv conversion descriptor */ >+ struct unls_table *table; >+ >+ /* give up if no charset is given */ >+ if (charset == NULL) >+ return -1; >+ >+ /* see if we already have a table with this name - built in tables >+ have precedence over iconv() - i.e. can't have the name of an >+ existing table. Also, we may have already registered this file >+ table */ >+ if (find_unls(charset) != NULL) >+ return -1; >+ >+ if ((iconv_d = iconv_open("UCS-2BE", charset)) == (iconv_t) -1) >+ return -1; >+ >+ >+ /* set up the table */ >+ if ((table = (struct unls_table *)malloc(sizeof (struct unls_table))) >+ == NULL) { >+ return -1; >+ } >+ >+ /* give the table the file name, so we can find it again if needed */ >+ table->unls_name = strdup(charset); >+ table->iconv_d = iconv_d; >+ table->unls_cs2uni = NULL; >+ table->unls_uni2cs = NULL; >+// table->inc_use_count = inc_use_count; >+// table->dec_use_count = dec_use_count; >+ table->unls_next = NULL; >+ >+ /* register the table */ >+ return register_unls(table); >+} >+#endif >+ >diff -urN cdrtools-2.01.01/libunls/Targets cdrtools-2.01.01_1/libunls/Targets >--- cdrtools-2.01.01/libunls/Targets 2002-12-03 03:34:27.000000000 +0300 >+++ cdrtools-2.01.01_1/libunls/Targets 2007-05-17 12:51:22.000000000 +0400 >@@ -39,4 +39,5 @@ > nls_cp10029.c \ > nls_cp10079.c \ > nls_cp10081.c \ >- nls_file.c >+ nls_file.c \ >+ nls_iconv.c >diff -urN cdrtools-2.01.01/mkisofs/joliet.c cdrtools-2.01.01_1/mkisofs/joliet.c >--- cdrtools-2.01.01/mkisofs/joliet.c 2006-10-08 17:48:36.000000000 +0400 >+++ cdrtools-2.01.01_1/mkisofs/joliet.c 2007-05-17 13:53:36.000000000 +0400 >@@ -90,6 +90,11 @@ > #include <schily/unls.h> /* For UNICODE translation */ > #include <schily/schily.h> > >+#ifdef USE_ICONV >+#include <iconv.h> >+#include <errno.h> >+#endif >+ > static Uint jpath_table_index; > static struct directory **jpathlist; > static int next_jpath_index = 1; >@@ -103,13 +108,23 @@ > }; > > #ifdef UDF >- void convert_to_unicode __PR((unsigned char *buffer, >+# ifdef USE_ICONV >+ size_t >+# else >+ void >+# endif >+ convert_to_unicode __PR((unsigned char *buffer, > int size, char *source, struct unls_table *inls)); >- int joliet_strlen __PR((const char *string)); >+ int joliet_strlen __PR((const char *string, struct unls_table *inls)); > #else >-static void convert_to_unicode __PR((unsigned char *buffer, >+# ifdef USE_ICONV >+ static size_t >+# else >+ static void >+#endif >+ convert_to_unicode __PR((unsigned char *buffer, > int size, char *source, struct unls_table *inls)); >-static int joliet_strlen __PR((const char *string)); >+ static int joliet_strlen __PR((const char *string, struct unls_table *inls)); > #endif > static void get_joliet_vol_desc __PR((struct iso_primary_descriptor *jvol_desc)); > static void assign_joliet_directory_addresses __PR((struct directory *node)); >@@ -161,6 +176,20 @@ > if (inls == onls) > return (c); > >+#ifdef USE_ICONV >+ if(inls->unls_cs2uni == NULL || onls->unls_uni2cs == NULL) { >+ /* >+ * This shouldn't be reached >+ */ >+ static BOOL iconv_warned = FALSE; >+ if(!iconv_warned) { >+ error("Warning: Iconv conversion not supported in conv_charset.\n"); >+ iconv_warned = TRUE; >+ } >+ return (c); >+ } >+#endif >+ > /* get high and low UNICODE bytes */ > uh = inls->unls_cs2uni[c].unls_high; > ul = inls->unls_cs2uni[c].unls_low; >@@ -186,10 +215,18 @@ > * > * Notes: > */ >-#ifdef UDF >-void >+#ifdef USE_ICONV >+# if UDF >+size_t >+# else >+static size_t >+# endif > #else >+# if UDF >+void >+# else > static void >+# endif > #endif > convert_to_unicode(buffer, size, source, inls) > unsigned char *buffer; >@@ -216,6 +253,51 @@ > tmpbuf = (Uchar *) source; > } > >+#ifdef USE_ICONV >+ if (inls->iconv_d && inls->unls_cs2uni==NULL && >+ inls->unls_uni2cs==NULL) { >+ char *inptr = tmpbuf; >+ char *outptr = buffer; >+ size_t inleft = strlen(tmpbuf); >+ size_t inlen = inleft; >+ size_t outleft = size; >+ >+ iconv(inls->iconv_d, NULL, NULL, NULL, NULL); >+ if(iconv(inls->iconv_d, &inptr, &inleft, &outptr, &outleft) == >+ (size_t)-1 && errno == EILSEQ) { >+ fprintf(stderr, "Incorrectly encoded string (%s) " >+ "encountered.\nPossibly creating an invalid " >+ "Joliet extension. Aborting.\n", source); >+ exit(1); >+ } >+ >+ for (i = 0; (i + 1) < size - outleft; i += 2) { /* Size may be odd!!!*/ >+ if (buffer[i]=='\0') { >+ switch (buffer[i+1]) { /* Invalid characters for Joliet */ >+ case '*': >+ case '/': >+ case ':': >+ case ';': >+ case '?': >+ case '\\': >+ buffer[i+1]='_'; >+ default: >+ if (buffer[i+1] == 0x7f || >+ buffer[i+1] < 0x20) >+ buffer[i+1]='_'; >+ } >+ } >+ } >+ if (size & 1) { /* beautification */ >+ buffer[size - 1] = 0; >+ } >+ if (source == NULL) { >+ free(tmpbuf); >+ } >+ return (inlen - inleft); >+ } >+#endif >+ > /* > * Now start copying characters. If the size was specified to be 0, > * then assume the input was 0 terminated. >@@ -271,6 +353,9 @@ > if (source == NULL) { > free(tmpbuf); > } >+#ifdef USE_ICONV >+ return j; >+#endif > } > > /* >@@ -287,12 +372,50 @@ > #else > static int > #endif >-joliet_strlen(string) >+joliet_strlen(string, inls) > const char *string; >+ struct unls_table *inls; > { > int rtn; > >+#ifdef USE_ICONV >+ if (inls->iconv_d && inls->unls_cs2uni==NULL && >+ inls->unls_uni2cs==NULL) { >+ /* >+ * we const-cast since we're sure iconv won't change >+ * the string itself >+ */ >+ char *string_ptr = (char *)string; >+ size_t string_len = strlen(string); >+ >+ /* >+ * iconv has no way of finding out the required size >+ * in the target >+ */ >+ >+ char *tmp, *tmp_ptr; >+ /* we assume that the maximum length is 2 * jlen */ >+ size_t tmp_len = (size_t)jlen * 2 + 1; >+ tmp = e_malloc(tmp_len); >+ tmp_ptr = tmp; >+ >+ iconv(inls->iconv_d, NULL, NULL, NULL, NULL); >+ iconv(inls->iconv_d, &string_ptr, &string_len, &tmp_ptr, >+ &tmp_len); >+ >+ /* >+ * iconv advanced the tmp pointer with as many chars >+ * as it has written to it, so we add up the delta >+ */ >+ rtn = (tmp_ptr - tmp); >+ >+ free(tmp); >+ } else { >+ rtn = strlen(string) << 1; >+ } >+#else > rtn = strlen(string) << 1; >+#endif > > /* > * We do clamp the maximum length of a Joliet string to be the >@@ -481,16 +604,33 @@ > /* compare the Unicode names */ > > while (*rpnt && *lpnt) { >+#ifdef USE_ICONV >+ size_t ri, li; >+ >+ ri = convert_to_unicode(rtmp, 2, rpnt, rinls); >+ li = convert_to_unicode(ltmp, 2, lpnt, linls); >+ rpnt += ri; >+ lpnt += li; >+ if(!ri && !li) >+ return (0); >+ else if(ri && !li) >+ return (1); >+ else if(!ri && li) >+ return (-1); >+#else > convert_to_unicode(rtmp, 2, rpnt, rinls); > convert_to_unicode(ltmp, 2, lpnt, linls); >+#endif > > if (a_to_u_2_byte(rtmp) < a_to_u_2_byte(ltmp)) > return (-1); > if (a_to_u_2_byte(rtmp) > a_to_u_2_byte(ltmp)) > return (1); > >+#ifndef USE_ICONV > rpnt++; > lpnt++; >+#endif > } > > if (*rpnt) >@@ -564,10 +704,10 @@ > } > #ifdef APPLE_HYB > if (USE_MAC_NAME(de)) >- namelen = joliet_strlen(de->hfs_ent->name); >+ namelen = joliet_strlen(de->hfs_ent->name, hfs_inls); > else > #endif /* APPLE_HYB */ >- namelen = joliet_strlen(de->name); >+ namelen = joliet_strlen(de->name, in_nls); > > if (dpnt == root) { > jpath_table_l[jpath_table_index] = 1; >@@ -712,10 +852,10 @@ > #ifdef APPLE_HYB > /* Use the HFS name if it exists */ > if (USE_MAC_NAME(s_entry1)) >- cvt_len = joliet_strlen(s_entry1->hfs_ent->name); >+ cvt_len = joliet_strlen(s_entry1->hfs_ent->name, hfs_inls); > else > #endif /* APPLE_HYB */ >- cvt_len = joliet_strlen(s_entry1->name); >+ cvt_len = joliet_strlen(s_entry1->name, in_nls); > > /* > * Fix the record length >@@ -849,12 +989,12 @@ > if (USE_MAC_NAME(s_entry)) > /* Use the HFS name if it exists */ > jpath_table_size += >- joliet_strlen(s_entry->hfs_ent->name) + >+ joliet_strlen(s_entry->hfs_ent->name, hfs_inls) + > offsetof(struct iso_path_table, name[0]); > else > #endif /* APPLE_HYB */ > jpath_table_size += >- joliet_strlen(s_entry->name) + >+ joliet_strlen(s_entry->name, in_nls) + > offsetof(struct iso_path_table, name[0]); > if (jpath_table_size & 1) { > jpath_table_size++; >@@ -876,13 +1016,13 @@ > /* Use the HFS name if it exists */ > s_entry->jreclen = > offsetof(struct iso_directory_record, name[0]) >- + joliet_strlen(s_entry->hfs_ent->name) >+ + joliet_strlen(s_entry->hfs_ent->name, hfs_inls) > + 1; > else > #endif /* APPLE_HYB */ > s_entry->jreclen = > offsetof(struct iso_directory_record, name[0]) >- + joliet_strlen(s_entry->name) >+ + joliet_strlen(s_entry->name, in_nls) > + 1; > } else { > /* >@@ -1024,6 +1164,9 @@ > #endif > > while (*rpnt && *lpnt) { >+#ifdef USE_ICONV >+ size_t ri, li; >+#endif > if (*rpnt == ';' && *lpnt != ';') > return (-1); > if (*rpnt != ';' && *lpnt == ';') >@@ -1044,16 +1187,32 @@ > return (1); > #endif > >+#ifdef USE_ICONV >+ >+ ri = convert_to_unicode(rtmp, 2, rpnt, rinls); >+ li = convert_to_unicode(ltmp, 2, lpnt, linls); >+ rpnt += ri; >+ lpnt += li; >+ if(!ri && !li) >+ return (0); >+ else if(ri && !li) >+ return (1); >+ else if(!ri && li) >+ return (-1); >+#else > convert_to_unicode(rtmp, 2, rpnt, rinls); > convert_to_unicode(ltmp, 2, lpnt, linls); >+#endif > > if (a_to_u_2_byte(rtmp) < a_to_u_2_byte(ltmp)) > return (-1); > if (a_to_u_2_byte(rtmp) > a_to_u_2_byte(ltmp)) > return (1); > >+#ifndef USE_ICONV > rpnt++; > lpnt++; >+#endif > } > if (*rpnt) > return (1); >diff -urN cdrtools-2.01.01/mkisofs/Makefile cdrtools-2.01.01_1/mkisofs/Makefile >--- cdrtools-2.01.01/mkisofs/Makefile 2007-02-05 02:19:08.000000000 +0300 >+++ cdrtools-2.01.01_1/mkisofs/Makefile 2007-05-17 12:51:54.000000000 +0400 >@@ -33,6 +33,7 @@ > CPPOPTS += -DUDF > CPPOPTS += -DDVD_VIDEO > CPPOPTS += -DSORTING >+CPPOPTS += -DUSE_ICONV > CPPOPTS += -I../libhfs_iso/ > CPPOPTS += -DUSE_SCG \ > '-DAPPID_DEFAULT="MKISOFS ISO 9660/HFS FILESYSTEM BUILDER & CDRECORD CD-R/DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON/J.SCHILLING"' \ >diff -urN cdrtools-2.01.01/mkisofs/mkisofs.c cdrtools-2.01.01_1/mkisofs/mkisofs.c >--- cdrtools-2.01.01/mkisofs/mkisofs.c 2007-04-04 14:19:49.000000000 +0400 >+++ cdrtools-2.01.01_1/mkisofs/mkisofs.c 2007-05-17 13:00:27.000000000 +0400 >@@ -63,6 +63,11 @@ > #endif > #endif /* no_more_needed */ > >+#ifdef USE_ICONV >+#include <locale.h> >+#include <langinfo.h> >+#endif >+ > struct directory *root = NULL; > int path_ind; > >@@ -290,6 +295,10 @@ > int do_sort = 0; /* sort file data */ > #endif /* SORTING */ > >+#ifdef USE_ICONV >+int iconv_possible; >+#endif >+ > /* > * inode numbers for zero sized files start from this number and count > * backwards. This is done to allow unique inode numbers even on multi-session >@@ -2060,6 +2069,37 @@ > init_unls_file(hfs_ocharset); > #endif /* APPLE_HYB */ > >+#ifdef USE_ICONV >+ iconv_possible = !(iso9660_level >= 4 || ((ocharset && >+ strcmp(ocharset, icharset ? icharset : "")) && >+ use_RockRidge) || apple_ext || apple_hyb); >+ >+ setlocale(LC_CTYPE, ""); >+ >+ if (icharset == NULL && iconv_possible) { >+ char *charset = nl_langinfo(CODESET); >+ /* set to detected value but only if it is not pure US-ASCII */ >+ if(strcmp(charset, "ANSI_X3.4-1968") != 0) >+ icharset = charset; >+ >+ if(icharset && verbose > 0) >+ fprintf(stderr, "INFO:\t" >+ "%s character encoding detected by locale settings." >+ "\n\tAssuming %s encoded filenames on source " >+ "filesystem,\n" >+ "\tuse -input-charset to override.\n", >+ icharset, icharset); >+ } >+ >+ if(iconv_possible) { >+ /* >+ * don't care if initialization fails >+ */ >+ init_nls_iconv(icharset); >+ init_nls_iconv(ocharset); >+ } >+#endif >+ > if (icharset == NULL) { > #if (defined(__CYGWIN32__) || defined(__CYGWIN__) || defined(__DJGPP__)) && !defined(IS_CYGWIN_1) > in_nls = load_unls("cp437"); >@@ -2087,7 +2127,13 @@ > if (in_nls == NULL || out_nls == NULL) { /* Unknown charset specified */ > fprintf(stderr, "Unknown charset\nKnown charsets are:\n"); > list_unls(); /* List all known charset names */ >+#ifdef USE_ICONV >+ if(!iconv_possible) >+ fprintf(stderr, "Iconv charsets cannot be used with " >+ "Apple extension, HFS, ISO9660 version 2 or\n" >+ "Rock Ridge.\n"); > exit(1); >+#endif > } > > >diff -urN cdrtools-2.01.01/mkisofs/mkisofs.h cdrtools-2.01.01_1/mkisofs/mkisofs.h >--- cdrtools-2.01.01/mkisofs/mkisofs.h 2006-11-25 18:44:46.000000000 +0300 >+++ cdrtools-2.01.01_1/mkisofs/mkisofs.h 2007-05-17 13:49:04.000000000 +0400 >@@ -514,9 +514,14 @@ > > /* joliet.c */ > #ifdef UDF >+# ifdef USE_ICONV >+extern size_t convert_to_unicode __PR((unsigned char *buffer, >+ int size, char *source, struct unls_table *inls)); >+# else > extern void convert_to_unicode __PR((unsigned char *buffer, > int size, char *source, struct unls_table *inls)); >-extern int joliet_strlen __PR((const char *string)); >+#endif >+extern int joliet_strlen __PR((const char *string, struct unls_table *inls)); > #endif > extern unsigned char conv_charset __PR((unsigned char, struct unls_table *, > struct unls_table *)); >diff -urN cdrtools-2.01.01/mkisofs/udf.c cdrtools-2.01.01_1/mkisofs/udf.c >--- cdrtools-2.01.01/mkisofs/udf.c 2006-10-26 20:04:26.000000000 +0400 >+++ cdrtools-2.01.01_1/mkisofs/udf.c 2007-05-17 12:52:33.000000000 +0400 >@@ -436,7 +436,7 @@ > int i; > int expanded_length; > >- expanded_length = joliet_strlen(src); >+ expanded_length = joliet_strlen(src, in_nls); > if (expanded_length > 1024) > expanded_length = 1024; > if (expanded_length > (dst_size-1)*2)
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 Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 178856
: 119509