Added support for WC_NO_BEST_FIT_CHAR and default char parameters in
[wine] / include / wine / unicode.h
1 /*
2  * Wine internal Unicode definitions
3  *
4  * Copyright 2000 Alexandre Julliard
5  */
6
7 #ifndef __WINE_UNICODE_H
8 #define __WINE_UNICODE_H
9
10 /* code page info common to SBCS and DBCS */
11 struct cp_info
12 {
13     unsigned int          codepage;          /* codepage id */
14     unsigned int          char_size;         /* char size (1 or 2 bytes) */
15     unsigned short        def_char;          /* default char value (can be double-byte) */
16     unsigned short        def_unicode_char;  /* default Unicode char value */
17     const char           *name;              /* code page name */
18 };
19
20 struct sbcs_table
21 {
22     struct cp_info        info;
23     const unsigned short *cp2uni;            /* code page -> Unicode map */
24     const unsigned char  *uni2cp_low;        /* Unicode -> code page map */
25     const unsigned short *uni2cp_high;
26 };
27
28 struct dbcs_table
29 {
30     struct cp_info        info;
31     const unsigned short *cp2uni;            /* code page -> Unicode map */
32     const unsigned char  *cp2uni_leadbytes;
33     const unsigned short *uni2cp_low;        /* Unicode -> code page map */
34     const unsigned short *uni2cp_high;
35     unsigned char         lead_bytes[12];    /* lead bytes ranges */
36 };
37
38 union cptable
39 {
40     struct cp_info    info;
41     struct sbcs_table sbcs;
42     struct dbcs_table dbcs;
43 };
44
45 extern const union cptable *cp_get_table( unsigned int codepage );
46 extern const union cptable *cp_enum_table( unsigned int index );
47
48 extern int cp_mbstowcs( const union cptable *table, int flags,
49                         const char *src, int srclen,
50                         unsigned short *dst, int dstlen );
51 extern int cp_wcstombs( const union cptable *table, int flags,
52                         const unsigned short *src, int srclen,
53                         char *dst, int dstlen, const char *defchar, int *used );
54
55
56 static inline int is_dbcs_leadbyte( const union cptable *table, unsigned char ch )
57 {
58     return (table->info.char_size == 2) && (table->dbcs.cp2uni_leadbytes[ch]);
59 }
60
61 static inline unsigned int strlenW( const unsigned short *str )
62 {
63 #if defined(__i386__) && defined(__GNUC__)
64     int dummy, res;
65     __asm__( "cld\n\t"
66              "repne\n\t"
67              "scasw\n\t"
68              "notl %0"
69              : "=c" (res), "=&D" (dummy)
70              : "0" (0xffffffff), "1" (str), "a" (0) );
71     return res - 1;
72 #else
73     const unsigned short *s = str;
74     while (*s) s++;
75     return s - str;
76 #endif
77 }
78
79 #endif  /* __WINE_UNICODE_H */