annotate tools/mkunicode/src/utf.h @ 401:ca5e4360f79a

Js: - Add support of constants map (js::Map<T>) - Add supports for vectors (std::vector<T>) - Add index based getProperty/putProperty
author David Demelier <markand@malikania.fr>
date Sat, 03 Oct 2015 11:27:49 +0200
parents 7fe8d4094983
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
352
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * The authors of this software are Rob Pike and Ken Thompson.
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 * Copyright (c) 1998-2002 by Lucent Technologies.
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Portions Copyright (c) 2009 The Go Authors. All rights reserved.
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 * Permission to use, copy, modify, and distribute this software for any
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * purpose without fee is hereby granted, provided that this entire notice
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * is included in all copies of any software which is or includes a copy
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * or modification of this software and in all copies of the supporting
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 * documentation for such software.
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 */
David Demelier <markand@malikania.fr>
parents:
diff changeset
15
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 #ifndef _UTFH_
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 #define _UTFH_ 1
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 typedef unsigned int Rune; /* Code-point values in Unicode 4.0 are 21 bits wide.*/
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 enum
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 {
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 UTFmax = 4, /* maximum bytes per rune */
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 Runeself = 0x80, /* rune and UTF sequences are the same (<) */
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 Runeerror = 0xFFFD, /* decoding error in UTF */
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 Runemax = 0x10FFFF, /* maximum rune value */
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 };
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 extern "C" {
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #endif
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 /*
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 * rune routines
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 */
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 /*
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 * These routines were written by Rob Pike and Ken Thompson
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 * and first appeared in Plan 9.
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 * SEE ALSO
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 * utf (7)
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 * tcs (1)
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 */
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 // runetochar copies (encodes) one rune, pointed to by r, to at most
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 // UTFmax bytes starting at s and returns the number of bytes generated.
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 int runetochar(char* s, const Rune* r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 // chartorune copies (decodes) at most UTFmax bytes starting at s to
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 // one rune, pointed to by r, and returns the number of bytes consumed.
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 // If the input is not exactly in UTF format, chartorune will set *r
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 // to Runeerror and return 1.
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 //
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 // Note: There is no special case for a "null-terminated" string. A
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 // string whose first byte has the value 0 is the UTF8 encoding of the
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 // Unicode value 0 (i.e., ASCII NULL). A byte value of 0 is illegal
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 // anywhere else in a UTF sequence.
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 int chartorune(Rune* r, const char* s);
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 // charntorune is like chartorune, except that it will access at most
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 // n bytes of s. If the UTF sequence is incomplete within n bytes,
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 // charntorune will set *r to Runeerror and return 0. If it is complete
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 // but not in UTF format, it will set *r to Runeerror and return 1.
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 //
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 // Added 2004-09-24 by Wei-Hwa Huang
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 int charntorune(Rune* r, const char* s, int n);
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 // isvalidcharntorune(str, n, r, consumed)
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 // is a convenience function that calls "*consumed = charntorune(r, str, n)"
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 // and returns an int (logically boolean) indicating whether the first
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 // n bytes of str was a valid and complete UTF sequence.
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 int isvalidcharntorune(const char* str, int n, Rune* r, int* consumed);
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 // runelen returns the number of bytes required to convert r into UTF.
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 int runelen(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 // runenlen returns the number of bytes required to convert the n
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 // runes pointed to by r into UTF.
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 int runenlen(const Rune* r, int n);
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 // fullrune returns 1 if the string s of length n is long enough to be
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 // decoded by chartorune, and 0 otherwise. This does not guarantee
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 // that the string contains a legal UTF encoding. This routine is used
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 // by programs that obtain input one byte at a time and need to know
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 // when a full rune has arrived.
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 int fullrune(const char* s, int n);
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 // The following routines are analogous to the corresponding string
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 // routines with "utf" substituted for "str", and "rune" substituted
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 // for "chr".
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 // utflen returns the number of runes that are represented by the UTF
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 // string s. (cf. strlen)
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 int utflen(const char* s);
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 // utfnlen returns the number of complete runes that are represented
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 // by the first n bytes of the UTF string s. If the last few bytes of
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 // the string contain an incompletely coded rune, utfnlen will not
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 // count them; in this way, it differs from utflen, which includes
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 // every byte of the string. (cf. strnlen)
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 int utfnlen(const char* s, long n);
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 // utfrune returns a pointer to the first occurrence of rune r in the
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 // UTF string s, or 0 if r does not occur in the string. The NULL
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 // byte terminating a string is considered to be part of the string s.
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 // (cf. strchr)
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 /*const*/ char* utfrune(const char* s, Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
125
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 // utfrrune returns a pointer to the last occurrence of rune r in the
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 // UTF string s, or 0 if r does not occur in the string. The NULL
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 // byte terminating a string is considered to be part of the string s.
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 // (cf. strrchr)
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 /*const*/ char* utfrrune(const char* s, Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
David Demelier <markand@malikania.fr>
parents:
diff changeset
134
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 // utfutf returns a pointer to the first occurrence of the UTF string
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 // s2 as a UTF substring of s1, or 0 if there is none. If s2 is the
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 // null string, utfutf returns s1. (cf. strstr)
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 const char* utfutf(const char* s1, const char* s2);
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 // utfecpy copies UTF sequences until a null sequence has been copied,
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 // but writes no sequences beyond es1. If any sequences are copied,
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 // s1 is terminated by a null sequence, and a pointer to that sequence
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 // is returned. Otherwise, the original s1 is returned. (cf. strecpy)
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 char* utfecpy(char *s1, char *es1, const char *s2);
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 // These functions are rune-string analogues of the corresponding
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 // functions in strcat (3).
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 //
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 // These routines first appeared in Plan 9.
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 // SEE ALSO
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 // memmove (3)
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 // rune (3)
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 // strcat (2)
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 //
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 // BUGS: The outcome of overlapping moves varies among implementations.
David Demelier <markand@malikania.fr>
parents:
diff changeset
161
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 Rune* runestrcat(Rune* s1, const Rune* s2);
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 Rune* runestrncat(Rune* s1, const Rune* s2, long n);
David Demelier <markand@malikania.fr>
parents:
diff changeset
164
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 const Rune* runestrchr(const Rune* s, Rune c);
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 int runestrcmp(const Rune* s1, const Rune* s2);
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 int runestrncmp(const Rune* s1, const Rune* s2, long n);
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 Rune* runestrcpy(Rune* s1, const Rune* s2);
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 Rune* runestrncpy(Rune* s1, const Rune* s2, long n);
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 Rune* runestrecpy(Rune* s1, Rune* es1, const Rune* s2);
David Demelier <markand@malikania.fr>
parents:
diff changeset
173
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 Rune* runestrdup(const Rune* s);
David Demelier <markand@malikania.fr>
parents:
diff changeset
175
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 const Rune* runestrrchr(const Rune* s, Rune c);
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 long runestrlen(const Rune* s);
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 const Rune* runestrstr(const Rune* s1, const Rune* s2);
David Demelier <markand@malikania.fr>
parents:
diff changeset
179
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
David Demelier <markand@malikania.fr>
parents:
diff changeset
181
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 // The following routines test types and modify cases for Unicode
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 // characters. Unicode defines some characters as letters and
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 // specifies three cases: upper, lower, and title. Mappings among the
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 // cases are also defined, although they are not exhaustive: some
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 // upper case letters have no lower case mapping, and so on. Unicode
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 // also defines several character properties, a subset of which are
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 // checked by these routines. These routines are based on Unicode
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 // version 3.0.0.
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 //
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 // NOTE: The routines are implemented in C, so the boolean functions
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 // (e.g., isupperrune) return 0 for false and 1 for true.
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 //
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 //
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 // toupperrune, tolowerrune, and totitlerune are the Unicode case
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 // mappings. These routines return the character unchanged if it has
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 // no defined mapping.
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 Rune toupperrune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 Rune tolowerrune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 Rune totitlerune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 // isupperrune tests for upper case characters, including Unicode
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 // upper case letters and targets of the toupper mapping. islowerrune
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 // and istitlerune are defined analogously.
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 int isupperrune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 int islowerrune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 int istitlerune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
211
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 // isalpharune tests for Unicode letters; this includes ideographs in
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 // addition to alphabetic characters.
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 int isalpharune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 // isdigitrune tests for digits. Non-digit numbers, such as Roman
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 // numerals, are not included.
David Demelier <markand@malikania.fr>
parents:
diff changeset
221
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 int isdigitrune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 // isspacerune tests for whitespace characters, including "C" locale
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 // whitespace, Unicode defined whitespace, and the "zero-width
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 // non-break space" character.
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 int isspacerune(Rune r);
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
David Demelier <markand@malikania.fr>
parents:
diff changeset
231
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 // (The comments in this file were copied from the manpage files rune.3,
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 // isalpharune.3, and runestrcat.3. Some formatting changes were also made
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 // to conform to Google style. /JRM 11/11/05)
David Demelier <markand@malikania.fr>
parents:
diff changeset
235
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 }
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 #endif
David Demelier <markand@malikania.fr>
parents:
diff changeset
239
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 #endif