0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/types.h>
0013 #include <linux/nls.h>
0014
0015 #include "hfs_fs.h"
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 int hfs_mac2asc(struct super_block *sb, char *out, const struct hfs_name *in)
0034 {
0035 struct nls_table *nls_disk = HFS_SB(sb)->nls_disk;
0036 struct nls_table *nls_io = HFS_SB(sb)->nls_io;
0037 const char *src;
0038 char *dst;
0039 int srclen, dstlen, size;
0040
0041 src = in->name;
0042 srclen = in->len;
0043 if (srclen > HFS_NAMELEN)
0044 srclen = HFS_NAMELEN;
0045 dst = out;
0046 dstlen = HFS_MAX_NAMELEN;
0047 if (nls_io) {
0048 wchar_t ch;
0049
0050 while (srclen > 0) {
0051 if (nls_disk) {
0052 size = nls_disk->char2uni(src, srclen, &ch);
0053 if (size <= 0) {
0054 ch = '?';
0055 size = 1;
0056 }
0057 src += size;
0058 srclen -= size;
0059 } else {
0060 ch = *src++;
0061 srclen--;
0062 }
0063 if (ch == '/')
0064 ch = ':';
0065 size = nls_io->uni2char(ch, dst, dstlen);
0066 if (size < 0) {
0067 if (size == -ENAMETOOLONG)
0068 goto out;
0069 *dst = '?';
0070 size = 1;
0071 }
0072 dst += size;
0073 dstlen -= size;
0074 }
0075 } else {
0076 char ch;
0077
0078 while (--srclen >= 0)
0079 *dst++ = (ch = *src++) == '/' ? ':' : ch;
0080 }
0081 out:
0082 return dst - out;
0083 }
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 void hfs_asc2mac(struct super_block *sb, struct hfs_name *out, const struct qstr *in)
0098 {
0099 struct nls_table *nls_disk = HFS_SB(sb)->nls_disk;
0100 struct nls_table *nls_io = HFS_SB(sb)->nls_io;
0101 const char *src;
0102 char *dst;
0103 int srclen, dstlen, size;
0104
0105 src = in->name;
0106 srclen = in->len;
0107 dst = out->name;
0108 dstlen = HFS_NAMELEN;
0109 if (nls_io) {
0110 wchar_t ch;
0111
0112 while (srclen > 0) {
0113 size = nls_io->char2uni(src, srclen, &ch);
0114 if (size < 0) {
0115 ch = '?';
0116 size = 1;
0117 }
0118 src += size;
0119 srclen -= size;
0120 if (ch == ':')
0121 ch = '/';
0122 if (nls_disk) {
0123 size = nls_disk->uni2char(ch, dst, dstlen);
0124 if (size < 0) {
0125 if (size == -ENAMETOOLONG)
0126 goto out;
0127 *dst = '?';
0128 size = 1;
0129 }
0130 dst += size;
0131 dstlen -= size;
0132 } else {
0133 *dst++ = ch > 0xff ? '?' : ch;
0134 dstlen--;
0135 }
0136 }
0137 } else {
0138 char ch;
0139
0140 if (dstlen > srclen)
0141 dstlen = srclen;
0142 while (--dstlen >= 0)
0143 *dst++ = (ch = *src++) == ':' ? '/' : ch;
0144 }
0145 out:
0146 out->len = dst - (char *)out->name;
0147 dstlen = HFS_NAMELEN - out->len;
0148 while (--dstlen >= 0)
0149 *dst++ = 0;
0150 }