]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * linux/fs/hfs/trans.c | |
3 | * | |
4 | * Copyright (C) 1995-1997 Paul H. Hargrove | |
5 | * This file may be distributed under the terms of the GNU General Public License. | |
6 | * | |
7 | * This file contains routines for converting between the Macintosh | |
8 | * character set and various other encodings. This includes dealing | |
9 | * with ':' vs. '/' as the path-element separator. | |
10 | */ | |
11 | ||
12 | #include "hfs_fs.h" | |
13 | ||
14 | /*================ Global functions ================*/ | |
15 | ||
16 | /* | |
17 | * hfs_mac2triv() | |
18 | * | |
19 | * Given a 'Pascal String' (a string preceded by a length byte) in | |
20 | * the Macintosh character set produce the corresponding filename using | |
21 | * the 'trivial' name-mangling scheme, returning the length of the | |
22 | * mangled filename. Note that the output string is not NULL | |
23 | * terminated. | |
24 | * | |
25 | * The name-mangling works as follows: | |
26 | * The character '/', which is illegal in Linux filenames is replaced | |
27 | * by ':' which never appears in HFS filenames. All other characters | |
28 | * are passed unchanged from input to output. | |
29 | */ | |
30 | int hfs_mac2triv(char *out, const struct hfs_name *in) | |
31 | { | |
32 | const char *p; | |
33 | char c; | |
34 | int i, len; | |
35 | ||
36 | len = in->len; | |
37 | p = in->name; | |
38 | for (i = 0; i < len; i++) { | |
39 | c = *p++; | |
40 | *out++ = c == '/' ? ':' : c; | |
41 | } | |
42 | return i; | |
43 | } | |
44 | ||
45 | /* | |
46 | * hfs_triv2mac() | |
47 | * | |
48 | * Given an ASCII string (not null-terminated) and its length, | |
49 | * generate the corresponding filename in the Macintosh character set | |
50 | * using the 'trivial' name-mangling scheme, returning the length of | |
51 | * the mangled filename. Note that the output string is not NULL | |
52 | * terminated. | |
53 | * | |
54 | * This routine is a inverse to hfs_mac2triv(). | |
55 | * A ':' is replaced by a '/'. | |
56 | */ | |
57 | void hfs_triv2mac(struct hfs_name *out, struct qstr *in) | |
58 | { | |
59 | const char *src; | |
60 | char *dst, c; | |
61 | int i, len; | |
62 | ||
63 | out->len = len = min((unsigned int)HFS_NAMELEN, in->len); | |
64 | src = in->name; | |
65 | dst = out->name; | |
66 | for (i = 0; i < len; i++) { | |
67 | c = *src++; | |
68 | *dst++ = c == ':' ? '/' : c; | |
69 | } | |
70 | for (; i < HFS_NAMELEN; i++) | |
71 | *dst++ = 0; | |
72 | } |