1 #ifndef _ATALK_UNICODE_H
2 #define _ATALK_UNICODE_H 1
8 #define ucs2_t uint16_t
11 #define MIN(a,b) ((a)<(b)?(a):(b))
15 #define MAX(a,b) ((a)>(b)?(a):(b))
18 #define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)
21 #define EILSEQ 84 /* Illegal byte sequence. */
24 /* generic iconv conversion structure */
26 size_t (*direct)(void *cd, char **inbuf, size_t *inbytesleft,
27 char **outbuf, size_t *outbytesleft);
28 size_t (*pull)(void *cd, char **inbuf, size_t *inbytesleft,
29 char **outbuf, size_t *outbytesleft);
30 size_t (*push)(void *cd, char **inbuf, size_t *inbytesleft,
31 char **outbuf, size_t *outbytesleft);
32 void *cd_direct, *cd_pull, *cd_push;
33 char *from_name, *to_name;
36 #define CHARSET_CLIENT 1
37 #define CHARSET_VOLUME 2
38 #define CHARSET_PRECOMPOSED 4
39 #define CHARSET_DECOMPOSED 8
40 #define CHARSET_MULTIBYTE 16
41 #define CHARSET_WIDECHAR 32
42 #define CHARSET_ICONV 64
44 #define IGNORE_CHAR '_'
46 /* conversion flags */
47 #define CONV_IGNORE (1<<0) /* return the first convertable characters. */
48 #define CONV_ESCAPEHEX (1<<1) /* escape unconvertable chars with :[UCS2HEX], */
49 /* also escape '/'. Escape ':' if also CONV_ALLOW_COLON, */
50 /* else ':' raises EILSEQ */
51 #define CONV_ESCAPEDOTS (1<<2) /* escape leading dots with :2600 */
52 #define CONV_UNESCAPEHEX (1<<3)
53 #define CONV_TOUPPER (1<<4) /* convert to UPPERcase */
54 #define CONV_TOLOWER (1<<5) /* convert to lowercase */
55 #define CONV_PRECOMPOSE (1<<6) /* precompose */
56 #define CONV_DECOMPOSE (1<<7) /* precompose */
57 #define CONV_FORCE (1<<8) /* force convertion */
58 #define CONV__EILSEQ (1<<9) /* ignore EILSEQ, replace with IGNORE_CHAR (try USC2) */
59 #define CONV_ALLOW_COLON (1<<10) /* Allow ':' in name. Needed for Extended Attributes */
60 #define CONV_ALLOW_SLASH (1<<11) /* Allow '/' in name. Needed for volume name */
62 /* conversion return flags */
63 #define CONV_REQMANGLE (1<<14) /* mangling of returned name is required */
64 #define CONV_REQESCAPE (1<<15) /* espace unconvertable chars with :[UCS2HEX] */
66 /* this defines the charset types used in samba */
67 typedef enum {CH_UCS2=0, CH_UTF8=1, CH_MAC=2, CH_UNIX=3, CH_UTF8_MAC=4} charset_t;
69 #define NUM_CHARSETS 5
72 * for each charset we have a function that pulls from that charset to
73 * a ucs2 buffer, and a function that pushes to a ucs2 buffer
76 struct charset_functions {
78 const long kTextEncoding;
79 size_t (*pull)(void *, char **inbuf, size_t *inbytesleft,
80 char **outbuf, size_t *outbytesleft);
81 size_t (*push)(void *, char **inbuf, size_t *inbytesleft,
82 char **outbuf, size_t *outbytesleft);
85 struct charset_functions *prev, *next;
89 extern atalk_iconv_t atalk_iconv_open (const char *, const char *);
90 extern size_t atalk_iconv (atalk_iconv_t, const char **, size_t *, char **, size_t *);
91 extern int atalk_iconv_close (atalk_iconv_t);
92 extern struct charset_functions *find_charset_functions (const char *);
93 extern int atalk_register_charset (struct charset_functions *);
95 /* from utf16_case.c */
96 extern ucs2_t toupper_w (ucs2_t);
97 extern uint32_t toupper_sp (uint32_t);
98 extern ucs2_t tolower_w (ucs2_t);
99 extern uint32_t tolower_sp (uint32_t);
101 /* from util_unistr.c */
102 extern int strupper_w (ucs2_t *);
103 extern int strlower_w (ucs2_t *);
104 extern int islower_w (ucs2_t);
105 extern int isupper_w (ucs2_t);
106 extern size_t strlen_w (const ucs2_t *);
107 extern size_t strnlen_w (const ucs2_t *, size_t);
108 extern ucs2_t* strchr_w (const ucs2_t *, ucs2_t);
109 extern ucs2_t *strcasechr_w (const ucs2_t *s, ucs2_t c);
110 extern int strcmp_w (const ucs2_t *, const ucs2_t *);
111 extern int strncmp_w (const ucs2_t *, const ucs2_t *, size_t);
112 extern int strcasecmp_w (const ucs2_t *, const ucs2_t *);
113 extern int strncasecmp_w (const ucs2_t *, const ucs2_t *, size_t);
114 extern ucs2_t *strstr_w (const ucs2_t *s, const ucs2_t *ins);
115 extern ucs2_t *strcasestr_w (const ucs2_t *, const ucs2_t *);
116 extern ucs2_t *strndup_w (const ucs2_t *, size_t);
117 extern ucs2_t *strdup_w (const ucs2_t *);
118 extern ucs2_t *strncpy_w (ucs2_t *, const ucs2_t *, const size_t);
119 extern ucs2_t *strncat_w (ucs2_t *, const ucs2_t *, const size_t);
120 extern ucs2_t *strcat_w (ucs2_t *, const ucs2_t *);
121 extern size_t precompose_w (ucs2_t *, size_t, ucs2_t *,size_t *);
122 extern size_t decompose_w (ucs2_t *, size_t, ucs2_t *,size_t *);
123 extern size_t utf8_charlen ( char* );
124 extern size_t utf8_strlen_validate ( char *);
127 extern int set_charset_name(charset_t, const char *);
128 extern void free_charset_names(void);
129 extern void init_iconv (void);
130 extern size_t convert_string (charset_t, charset_t, void const *, size_t, void *, size_t);
131 extern size_t convert_string_allocate (charset_t, charset_t, void const *, size_t, char **);
132 extern size_t utf8_strupper (const char *, size_t, char *, size_t);
133 extern size_t utf8_strlower (const char *, size_t, char *, size_t);
134 extern size_t unix_strupper (const char *, size_t, char *, size_t);
135 extern size_t unix_strlower (const char *, size_t, char *, size_t);
136 extern size_t charset_strupper (charset_t, const char *, size_t, char *, size_t);
137 extern size_t charset_strlower (charset_t, const char *, size_t, char *, size_t);
139 extern size_t charset_to_ucs2_allocate (charset_t, ucs2_t **dest, const char *src);
140 extern size_t charset_to_utf8_allocate (charset_t, char **dest, const char *src);
141 extern size_t ucs2_to_charset_allocate (charset_t, char **dest, const ucs2_t *src);
142 extern size_t utf8_to_charset_allocate (charset_t, char **dest, const char *src);
143 extern size_t ucs2_to_charset (charset_t, const ucs2_t *src, char *dest, size_t);
145 extern size_t convert_charset (charset_t, charset_t, charset_t, const char *, size_t, char *, size_t, uint16_t *);
147 extern size_t charset_precompose ( charset_t, char *, size_t, char *, size_t);
148 extern size_t charset_decompose ( charset_t, char *, size_t, char *, size_t);
149 extern size_t utf8_precompose ( char *, size_t, char *, size_t);
150 extern size_t utf8_decompose ( char *, size_t, char *, size_t);
152 extern charset_t add_charset (const char* name);
154 #endif /* _ATALK_UNICODE_H */