2 * linux/fs/isofs/joliet.c
4 * (C) 1996 Gordon Chaffee
6 * Joliet: Microsoft's Unicode extensions to iso9660
9 #include <linux/string.h>
10 #include <linux/nls.h>
11 #include <linux/malloc.h>
12 #include <linux/iso_fs.h>
15 * Convert Unicode 16 to UTF8 or ASCII.
18 uni16_to_x8(unsigned char *ascii
, unsigned char *uni
, int len
,
19 struct nls_table
*nls
)
21 unsigned char *ip
, *op
;
23 unsigned char *uni_page
;
28 while ((*ip
|| ip
[1]) && len
) {
32 uni_page
= nls
->page_uni2charset
[ch
];
33 if (uni_page
&& uni_page
[cl
]) {
44 /* Convert big endian wide character string to utf8 */
46 wcsntombs_be(__u8
*s
, const __u8
*pwcs
, int inlen
, int maxlen
)
55 while ((*ip
|| ip
[1]) && (maxlen
> 0) && (inlen
> 0)) {
56 c
= (*ip
<< 8) | ip
[1];
58 size
= utf8_wctomb(op
, c
, maxlen
);
60 /* Ignore character and move on */
76 get_joliet_filename(struct iso_directory_record
* de
, struct inode
* inode
,
77 unsigned char *outname
)
80 struct nls_table
*nls
;
81 unsigned char len
= 0;
83 utf8
= inode
->i_sb
->u
.isofs_sb
.s_utf8
;
84 nls
= inode
->i_sb
->u
.isofs_sb
.s_nls_iocharset
;
87 len
= wcsntombs_be(outname
, de
->name
,
88 de
->name_len
[0] >> 1, PAGE_SIZE
);
90 len
= uni16_to_x8(outname
, de
->name
,
91 de
->name_len
[0] >> 1, nls
);
93 if ((len
> 2) && (outname
[len
-2] == ';') && (outname
[len
-1] == '1')) {
98 * Windows doesn't like periods at the end of a name,
101 while (len
>= 2 && (outname
[len
-1] == '.')) {