diff -Naur cdrtools-2.01a19-orig/mkisofs/joliet.c cdrtools-2.01a19-jh/mkisofs/joliet.c --- cdrtools-2.01a19-orig/mkisofs/joliet.c 2003-04-28 00:36:08.000000000 +0200 +++ cdrtools-2.01a19-jh/mkisofs/joliet.c 2003-10-09 15:34:05.000000000 +0200 @@ -263,11 +263,60 @@ buffer[i] = inls->charset2uni[uc].uni2; /* final UNICODE */ /* conversion */ buffer[i + 1] = inls->charset2uni[uc].uni1; - } - if (size & 1) { /* beautification */ - buffer[size - 1] = 0; + // convert UTF-8 to UTF-16 + int octet = tmpbuf[j]; + if (octet == 0) + break; + else + if ((octet & 0x80) == 0) { + buffer[i] = 0; + buffer[i + 1] = octet; + } + else + if ((octet & 0xE0) == 0xC0) { + int octet2 = tmpbuf[j + 1]; + if (octet2 == 0) + break; + int code = ((octet & 0x1F) << 6) + | (octet2 & 0x3F); + buffer[i] = (code & 0xFF00) >> 8; + buffer[i + 1] = code & 0xFF; + j++; + } + else + if ((octet & 0xF0) == 0xE0) { + int octet2 = tmpbuf[j + 1]; + int octet3 = tmpbuf[j + 2]; + if (octet2 == 0 || octet3 == 0) + break; + int code = ((octet & 0x0F) << 12) + | ((octet2 & 0x3F) << 6) + | (octet3 & 0x3F); + buffer[i] = (code & 0xFF00) >> 8; + buffer[i + 1] = code & 0xFF; + j += 2; + } + + if (buffer[i] == 0) { + // replace illegal characters by '_' + switch (uc) { + case '*': + case '/': + case ':': + case ';': + case '?': + case '\\': + case '\0': + buffer[i + 1] = '_'; + } + } } + + // fill end of buffer with zeros + for (; i < size; i++) + buffer[i] = 0; + if (source == NULL) { free(tmpbuf); } @@ -294,6 +343,34 @@ rtn = strlen(string) << 1; + rtn = 0; + int i = 0; + while (1) { + int octet = string[i]; + if (octet == 0) + break; + else + if ((octet & 0x80) == 0) { + rtn += 2; + i++; + } + else + if ((octet & 0xE0) == 0xC0) { + if (string[i + 1] == 0) + break; + rtn += 2; + i += 2; + } + else + if ((octet & 0xF0) == 0xE0) { + if (string[i + 1] == 0 + || string[i + 2] == 0) + break; + rtn += 2; + i += 3; + } + } + /* * We do clamp the maximum length of a Joliet string to be the * maximum path size. This helps to ensure that we don't completely @@ -1033,7 +1110,8 @@ "Error: %s and %s have the same Joliet name\n", (*r)->whole_name, (*l)->whole_name); #endif - jsort_goof++; + if (strncmp((*r)->whole_name, "/rr_moved/", 10) != 0) + jsort_goof++; } /* * Put the '.' and '..' entries on the head of the sorted list. diff -Naur cdrtools-2.01a19-orig/mkisofs/mkisofs.c cdrtools-2.01a19-jh/mkisofs/mkisofs.c --- cdrtools-2.01a19-orig/mkisofs/mkisofs.c 2003-07-13 14:42:16.000000000 +0200 +++ cdrtools-2.01a19-jh/mkisofs/mkisofs.c 2003-10-09 15:38:12.000000000 +0200 @@ -58,7 +58,7 @@ struct directory *root = NULL; int path_ind; -char version_string[] = "mkisofs 2.01a17"; +char version_string[] = "mkisofs 2.01a19+UTF-8"; char *outfile; FILE *discimage; diff -Naur cdrtools-2.01a19-orig/mkisofs/write.c cdrtools-2.01a19-jh/mkisofs/write.c --- cdrtools-2.01a19-orig/mkisofs/write.c 2003-07-13 14:42:16.000000000 +0200 +++ cdrtools-2.01a19-jh/mkisofs/write.c 2003-10-10 20:39:15.000000000 +0200 @@ -672,7 +672,8 @@ (*r)->whole_name, (*l)->whole_name, (*r)->name); #endif - sort_goof++; + if (strstr((*r)->whole_name, "/rr_moved/") == NULL) + sort_goof++; } } /*