xref: /openbmc/linux/fs/smb/client/cifs_unicode.h (revision de548452)
138c8a9a5SSteve French /* SPDX-License-Identifier: GPL-2.0-or-later */
238c8a9a5SSteve French /*
338c8a9a5SSteve French  * cifs_unicode:  Unicode kernel case support
438c8a9a5SSteve French  *
538c8a9a5SSteve French  * Function:
638c8a9a5SSteve French  *     Convert a unicode character to upper or lower case using
738c8a9a5SSteve French  *     compressed tables.
838c8a9a5SSteve French  *
938c8a9a5SSteve French  *   Copyright (c) International Business Machines  Corp., 2000,2009
1038c8a9a5SSteve French  *
1138c8a9a5SSteve French  * Notes:
1238c8a9a5SSteve French  *     These APIs are based on the C library functions.  The semantics
1338c8a9a5SSteve French  *     should match the C functions but with expanded size operands.
1438c8a9a5SSteve French  *
1538c8a9a5SSteve French  *     The upper/lower functions are based on a table created by mkupr.
1638c8a9a5SSteve French  *     This is a compressed table of upper and lower case conversion.
1738c8a9a5SSteve French  */
1838c8a9a5SSteve French #ifndef _CIFS_UNICODE_H
1938c8a9a5SSteve French #define _CIFS_UNICODE_H
2038c8a9a5SSteve French 
2138c8a9a5SSteve French #include <asm/byteorder.h>
2238c8a9a5SSteve French #include <linux/types.h>
2338c8a9a5SSteve French #include <linux/nls.h>
24*de548452SDr. David Alan Gilbert #include "../../nls/nls_ucs2_utils.h"
2538c8a9a5SSteve French 
2638c8a9a5SSteve French /*
2738c8a9a5SSteve French  * Macs use an older "SFM" mapping of the symbols above. Fortunately it does
2838c8a9a5SSteve French  * not conflict (although almost does) with the mapping above.
2938c8a9a5SSteve French  */
3038c8a9a5SSteve French 
3138c8a9a5SSteve French #define SFM_DOUBLEQUOTE ((__u16) 0xF020)
3238c8a9a5SSteve French #define SFM_ASTERISK    ((__u16) 0xF021)
3338c8a9a5SSteve French #define SFM_QUESTION    ((__u16) 0xF025)
3438c8a9a5SSteve French #define SFM_COLON       ((__u16) 0xF022)
3538c8a9a5SSteve French #define SFM_GRTRTHAN    ((__u16) 0xF024)
3638c8a9a5SSteve French #define SFM_LESSTHAN    ((__u16) 0xF023)
3738c8a9a5SSteve French #define SFM_PIPE        ((__u16) 0xF027)
3838c8a9a5SSteve French #define SFM_SLASH       ((__u16) 0xF026)
3938c8a9a5SSteve French #define SFM_SPACE	((__u16) 0xF028)
4038c8a9a5SSteve French #define SFM_PERIOD	((__u16) 0xF029)
4138c8a9a5SSteve French 
4238c8a9a5SSteve French /*
4338c8a9a5SSteve French  * Mapping mechanism to use when one of the seven reserved characters is
4438c8a9a5SSteve French  * encountered.  We can only map using one of the mechanisms at a time
4538c8a9a5SSteve French  * since otherwise readdir could return directory entries which we would
4638c8a9a5SSteve French  * not be able to open
4738c8a9a5SSteve French  *
4838c8a9a5SSteve French  * NO_MAP_UNI_RSVD  = do not perform any remapping of the character
4938c8a9a5SSteve French  * SFM_MAP_UNI_RSVD = map reserved characters using SFM scheme (MAC compatible)
5038c8a9a5SSteve French  * SFU_MAP_UNI_RSVD = map reserved characters ala SFU ("mapchars" option)
5138c8a9a5SSteve French  *
5238c8a9a5SSteve French  */
5338c8a9a5SSteve French #define NO_MAP_UNI_RSVD		0
5438c8a9a5SSteve French #define SFM_MAP_UNI_RSVD	1
5538c8a9a5SSteve French #define SFU_MAP_UNI_RSVD	2
5638c8a9a5SSteve French 
5738c8a9a5SSteve French #ifdef __KERNEL__
5838c8a9a5SSteve French int cifs_from_utf16(char *to, const __le16 *from, int tolen, int fromlen,
5938c8a9a5SSteve French 		    const struct nls_table *cp, int map_type);
6038c8a9a5SSteve French int cifs_utf16_bytes(const __le16 *from, int maxbytes,
6138c8a9a5SSteve French 		     const struct nls_table *codepage);
6238c8a9a5SSteve French int cifs_strtoUTF16(__le16 *, const char *, int, const struct nls_table *);
6338c8a9a5SSteve French char *cifs_strndup_from_utf16(const char *src, const int maxlen,
6438c8a9a5SSteve French 			      const bool is_unicode,
6538c8a9a5SSteve French 			      const struct nls_table *codepage);
6638c8a9a5SSteve French extern int cifsConvertToUTF16(__le16 *target, const char *source, int maxlen,
6738c8a9a5SSteve French 			      const struct nls_table *cp, int mapChars);
6838c8a9a5SSteve French extern int cifs_remap(struct cifs_sb_info *cifs_sb);
6938c8a9a5SSteve French extern __le16 *cifs_strndup_to_utf16(const char *src, const int maxlen,
7038c8a9a5SSteve French 				     int *utf16_len, const struct nls_table *cp,
7138c8a9a5SSteve French 				     int remap);
7238c8a9a5SSteve French #endif
7338c8a9a5SSteve French 
7438c8a9a5SSteve French wchar_t cifs_toupper(wchar_t in);
7538c8a9a5SSteve French 
7638c8a9a5SSteve French #endif /* _CIFS_UNICODE_H */
77