Linux-2.6.12-rc2
[linux-flexiantxendom0-natty.git] / fs / cifs / cifs_unicode.c
1 /*
2  *   fs/cifs/cifs_unicode.c
3  *
4  *   Copyright (c) International Business Machines  Corp., 2000,2002
5  *   Modified by Steve French (sfrench@us.ibm.com)
6  *
7  *   This program is free software;  you can redistribute it and/or modify
8  *   it under the terms of the GNU General Public License as published by
9  *   the Free Software Foundation; either version 2 of the License, or 
10  *   (at your option) any later version.
11  * 
12  *   This program is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
15  *   the GNU General Public License for more details.
16  *
17  *   You should have received a copy of the GNU General Public License
18  *   along with this program;  if not, write to the Free Software 
19  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21 #include <linux/fs.h>
22 #include "cifs_unicode.h"
23 #include "cifs_uniupr.h"
24 #include "cifspdu.h"
25 #include "cifs_debug.h"
26
27 /*
28  * NAME:        cifs_strfromUCS()
29  *
30  * FUNCTION:    Convert little-endian unicode string to character string
31  *
32  */
33 int
34 cifs_strfromUCS_le(char *to, const wchar_t * from,      /* LITTLE ENDIAN */
35                    int len, const struct nls_table *codepage)
36 {
37         int i;
38         int outlen = 0;
39
40         for (i = 0; (i < len) && from[i]; i++) {
41                 int charlen;
42                 /* 2.4.0 kernel or greater */
43                 charlen =
44                     codepage->uni2char(le16_to_cpu(from[i]), &to[outlen],
45                                        NLS_MAX_CHARSET_SIZE);
46                 if (charlen > 0) {
47                         outlen += charlen;
48                 } else {
49                         to[outlen++] = '?';
50                 }
51         }
52         to[outlen] = 0;
53         return outlen;
54 }
55
56 /*
57  * NAME:        cifs_strtoUCS()
58  *
59  * FUNCTION:    Convert character string to unicode string
60  *
61  */
62 int
63 cifs_strtoUCS(wchar_t * to, const char *from, int len,
64               const struct nls_table *codepage)
65 {
66         int charlen;
67         int i;
68
69         for (i = 0; len && *from; i++, from += charlen, len -= charlen) {
70
71                 /* works for 2.4.0 kernel or later */
72                 charlen = codepage->char2uni(from, len, &to[i]);
73                 if (charlen < 1) {
74                         cERROR(1,
75                                ("cifs_strtoUCS: char2uni returned %d",
76                                 charlen));
77                         to[i] = cpu_to_le16(0x003f);    /* a question mark */
78                         charlen = 1;
79                 }
80                 to[i] = cpu_to_le16(to[i]);
81
82         }
83
84         to[i] = 0;
85         return i;
86 }
87