root/branches/dmdfe-2.0/dchar.h

Revision 360, 6.9 kB (checked in by Gregor, 2 years ago)

Initial import.

Line 
1 // Copyright (c) 1999-2006 by Digital Mars
2 // All Rights Reserved
3 // written by Walter Bright
4 // www.digitalmars.com
5 // License for redistribution is by either the Artistic License
6 // in artistic.txt, or the GNU General Public License in gnu.txt.
7 // See the included readme.txt for details.
8
9
10 #ifndef DCHAR_H
11 #define DCHAR_H
12
13 #if __GNUC__ && !_WIN32
14 #include "gnuc.h"
15 #endif
16
17 #if _MSC_VER
18     // Disable useless warnings about unreferenced functions
19     #pragma warning (disable : 4514)
20 #endif
21
22 //#include "root.h"
23 typedef size_t hash_t;
24
25 #undef TEXT
26
27 // NOTE: All functions accepting pointer arguments must not be NULL
28
29 #if M_UNICODE
30
31 #include <string.h>
32 #include <wchar.h>
33
34 typedef wchar_t dchar;
35 #define TEXT(x)     L##x
36
37 #define Dchar_mbmax 1
38
39 struct Dchar
40 {
41     static dchar *inc(dchar *p) { return p + 1; }
42     static dchar *dec(dchar *pstart, dchar *p) { (void)pstart; return p - 1; }
43     static int len(const dchar *p) { return wcslen(p); }
44     static dchar get(dchar *p) { return *p; }
45     static dchar getprev(dchar *pstart, dchar *p) { (void)pstart; return p[-1]; }
46     static dchar *put(dchar *p, dchar c) { *p = c; return p + 1; }
47     static int cmp(dchar *s1, dchar *s2)
48     {
49 #if __DMC__
50     if (!*s1 && !*s2)   // wcscmp is broken
51         return 0;
52 #endif
53     return wcscmp(s1, s2);
54 #if 0
55     return (*s1 == *s2)
56         ? wcscmp(s1, s2)
57         : ((int)*s1 - (int)*s2);
58 #endif
59     }
60     static int memcmp(const dchar *s1, const dchar *s2, int nchars) { return ::memcmp(s1, s2, nchars * sizeof(dchar)); }
61     static int isDigit(dchar c) { return '0' <= c && c <= '9'; }
62     static int isAlpha(dchar c) { return iswalpha(c); }
63     static int isUpper(dchar c) { return iswupper(c); }
64     static int isLower(dchar c) { return iswlower(c); }
65     static int isLocaleUpper(dchar c) { return isUpper(c); }
66     static int isLocaleLower(dchar c) { return isLower(c); }
67     static int toLower(dchar c) { return isUpper(c) ? towlower(c) : c; }
68     static int toLower(dchar *p) { return toLower(*p); }
69     static int toUpper(dchar c) { return isLower(c) ? towupper(c) : c; }
70     static dchar *dup(dchar *p) { return ::_wcsdup(p); }    // BUG: out of memory?
71     static dchar *dup(char *p);
72     static dchar *chr(dchar *p, unsigned c) { return wcschr(p, (dchar)c); }
73     static dchar *rchr(dchar *p, unsigned c) { return wcsrchr(p, (dchar)c); }
74     static dchar *memchr(dchar *p, int c, int count);
75     static dchar *cpy(dchar *s1, dchar *s2) { return wcscpy(s1, s2); }
76     static dchar *str(dchar *s1, dchar *s2) { return wcsstr(s1, s2); }
77     static hash_t calcHash(const dchar *str, size_t len);
78
79     // Case insensitive versions
80     static int icmp(dchar *s1, dchar *s2) { return wcsicmp(s1, s2); }
81     static int memicmp(const dchar *s1, const dchar *s2, int nchars) { return ::wcsnicmp(s1, s2, nchars); }
82     static hash_t icalcHash(const dchar *str, size_t len);
83 };
84
85 #elif MCBS
86
87 #include <limits.h>
88 #include <mbstring.h>
89
90 typedef char dchar;
91 #define TEXT(x)     x
92
93 #define Dchar_mbmax MB_LEN_MAX
94
95 #elif UTF8
96
97 typedef char dchar;
98 #define TEXT(x)     x
99
100 #define Dchar_mbmax 6
101
102 struct Dchar
103 {
104     static char mblen[256];
105
106     static dchar *inc(dchar *p) { return p + mblen[*p & 0xFF]; }
107     static dchar *dec(dchar *pstart, dchar *p);
108     static int len(const dchar *p) { return strlen(p); }
109     static int get(dchar *p);
110     static int getprev(dchar *pstart, dchar *p)
111     { return *dec(pstart, p) & 0xFF; }
112     static dchar *put(dchar *p, unsigned c);
113     static int cmp(dchar *s1, dchar *s2) { return strcmp(s1, s2); }
114     static int memcmp(const dchar *s1, const dchar *s2, int nchars) { return ::memcmp(s1, s2, nchars); }
115     static int isDigit(dchar c) { return '0' <= c && c <= '9'; }
116     static int isAlpha(dchar c) { return c <= 0x7F ? isalpha(c) : 0; }
117     static int isUpper(dchar c) { return c <= 0x7F ? isupper(c) : 0; }
118     static int isLower(dchar c) { return c <= 0x7F ? islower(c) : 0; }
119     static int isLocaleUpper(dchar c) { return isUpper(c); }
120     static int isLocaleLower(dchar c) { return isLower(c); }
121     static int toLower(dchar c) { return isUpper(c) ? tolower(c) : c; }
122     static int toLower(dchar *p) { return toLower(*p); }
123     static int toUpper(dchar c) { return isLower(c) ? toupper(c) : c; }
124     static dchar *dup(dchar *p) { return ::strdup(p); } // BUG: out of memory?
125     static dchar *chr(dchar *p, int c) { return strchr(p, c); }
126     static dchar *rchr(dchar *p, int c) { return strrchr(p, c); }
127     static dchar *memchr(dchar *p, int c, int count)
128     { return (dchar *)::memchr(p, c, count); }
129     static dchar *cpy(dchar *s1, dchar *s2) { return strcpy(s1, s2); }
130     static dchar *str(dchar *s1, dchar *s2) { return strstr(s1, s2); }
131     static hash_t calcHash(const dchar *str, size_t len);
132
133     // Case insensitive versions
134     static int icmp(dchar *s1, dchar *s2) { return _mbsicmp(s1, s2); }
135     static int memicmp(const dchar *s1, const dchar *s2, int nchars) { return ::_mbsnicmp(s1, s2, nchars); }
136 };
137
138 #else
139
140 #include <string.h>
141
142 #ifndef GCC_SAFE_DMD
143 #include <ctype.h>
144 #endif
145
146 typedef char dchar;
147 #define TEXT(x)     x
148
149 #define Dchar_mbmax 1
150
151 struct Dchar
152 {
153     static dchar *inc(dchar *p) { return p + 1; }
154     static dchar *dec(dchar *pstart, dchar *p) { return p - 1; }
155     static int len(const dchar *p) { return strlen(p); }
156     static int get(dchar *p) { return *p & 0xFF; }
157     static int getprev(dchar *pstart, dchar *p) { return p[-1] & 0xFF; }
158     static dchar *put(dchar *p, unsigned c) { *p = c; return p + 1; }
159     static int cmp(dchar *s1, dchar *s2) { return strcmp(s1, s2); }
160     static int memcmp(const dchar *s1, const dchar *s2, int nchars) { return ::memcmp(s1, s2, nchars); }
161     static int isDigit(dchar c) { return '0' <= c && c <= '9'; }
162 #ifndef GCC_SAFE_DMD
163     static int isAlpha(dchar c) { return isalpha(c); }
164     static int isUpper(dchar c) { return isupper(c); }
165     static int isLower(dchar c) { return islower(c); }
166     static int isLocaleUpper(dchar c) { return isupper(c); }
167     static int isLocaleLower(dchar c) { return islower(c); }
168     static int toLower(dchar c) { return isupper(c) ? tolower(c) : c; }
169     static int toLower(dchar *p) { return toLower(*p); }
170     static int toUpper(dchar c) { return islower(c) ? toupper(c) : c; }
171     static dchar *dup(dchar *p) { return ::strdup(p); } // BUG: out of memory?
172 #endif
173     static dchar *chr(dchar *p, int c) { return strchr(p, c); }
174     static dchar *rchr(dchar *p, int c) { return strrchr(p, c); }
175     static dchar *memchr(dchar *p, int c, int count)
176     { return (dchar *)::memchr(p, c, count); }
177     static dchar *cpy(dchar *s1, dchar *s2) { return strcpy(s1, s2); }
178     static dchar *str(dchar *s1, dchar *s2) { return strstr(s1, s2); }
179     static hash_t calcHash(const dchar *str, size_t len);
180
181     // Case insensitive versions
182 #ifdef __GNUC__
183     static int icmp(dchar *s1, dchar *s2) { return strcasecmp(s1, s2); }
184 #else
185     static int icmp(dchar *s1, dchar *s2) { return stricmp(s1, s2); }
186 #endif
187     static int memicmp(const dchar *s1, const dchar *s2, int nchars) { return ::memicmp(s1, s2, nchars); }
188     static hash_t icalcHash(const dchar *str, size_t len);
189 };
190
191 #endif
192 #endif
Note: See TracBrowser for help on using the browser.