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
, u16
*uni
, int len
, struct nls_table
*nls
)
28 wchar_t ch
= be16_to_cpu(*ip
);
29 if ((llen
= nls
->uni2char(ch
, op
, NLS_MAX_CHARSET_SIZE
)) > 0)
41 /* Convert big endian wide character string to utf8 */
43 wcsntombs_be(__u8
*s
, const __u8
*pwcs
, int inlen
, int maxlen
)
52 while ((*ip
|| ip
[1]) && (maxlen
> 0) && (inlen
> 0)) {
53 c
= (*ip
<< 8) | ip
[1];
55 size
= utf8_wctomb(op
, c
, maxlen
);
57 /* Ignore character and move on */
73 get_joliet_filename(struct iso_directory_record
* de
, struct inode
* inode
,
74 unsigned char *outname
)
77 struct nls_table
*nls
;
78 unsigned char len
= 0;
80 utf8
= inode
->i_sb
->u
.isofs_sb
.s_utf8
;
81 nls
= inode
->i_sb
->u
.isofs_sb
.s_nls_iocharset
;
84 len
= wcsntombs_be(outname
, de
->name
,
85 de
->name_len
[0] >> 1, PAGE_SIZE
);
87 len
= uni16_to_x8(outname
, (u16
*) de
->name
,
88 de
->name_len
[0] >> 1, nls
);
90 if ((len
> 2) && (outname
[len
-2] == ';') && (outname
[len
-1] == '1')) {
95 * Windows doesn't like periods at the end of a name,
98 while (len
>= 2 && (outname
[len
-1] == '.')) {