181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
-
-
-
-
-
+
+
+
+
+
-
-
+
|
*---------------------------------------------------------------------------
*
* Tcl_UniCharToUtf --
*
* Stores the given Tcl_UniChar as a sequence of UTF-8 bytes in the provided
* buffer. Equivalent to Plan 9 runetochar().
*
* When this function is called and ch is a high surrogate,
* the first byte of the 4-byte UTF-8 sequence is produced, and
* the function returns 1. Calling the function again with a
* low surrogate, the remaining 3 bytes of the 4-byte UTF-8
* sequence is produced, and the function returns 3. The buffer
* Surrogate pairs are handled as follows: When ch is a high surrogate,
* the first byte of the 4-byte UTF-8 sequence is stored in the buffer and
* the function returns 1. If the function is called again with a low
* surrogate and the same buffer, the remaining 3 bytes of the 4-byte
* UTF-8 sequence are produced.
* is used to remember the high surrogate between the two calls.
*
* If no low surrogate follows the high surrogate (which is actually illegal),
* calling Tcl_UniCharToUtf again with ch being -1 produces a 3-byte UTF-8
* sequence representing the high surrogate.
*
* Results:
* Returns the number of bytes populated in the buffer.
* Returns the number of bytes stored into the buffer.
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
|
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
|
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
-
+
|
/* Add 0x10000 to the raw number encoded in the surrogate
* pair in order to get the code point.
*/
ch += 0x40;
/* Fill buffer with specific 3-byte (invalid) byte combination,
so following low surrogate can recognize it and combine */
buf[2] = (char) ( 0x03 & ch);
buf[2] = (char) ((ch << 4) & 0x30);
buf[1] = (char) (0x80 | (0x3F & (ch >> 2)));
buf[0] = (char) (0xF0 | (0x07 & (ch >> 8)));
return 1;
}
}
goto three;
}
|
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
|
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
|
-
+
-
-
+
+
|
}
/*
*---------------------------------------------------------------------------
*
* TclUtfToUCS4 --
*
* Extract the 4-byte codepoint from the leading bytes of the
* Extracts the 4-byte codepoint from the leading bytes of the
* Modified UTF-8 string "src". This is a utility routine to
* contain the surrogate gymnastics in one place.
*
* The caller must ensure that the source buffer is long enough that this
* routine does not run off the end and dereference non-existent memory
* looking for trail bytes. If the source buffer is known to be '\0'
* terminated, this cannot happen. Otherwise, the caller should call
* Tcl_UtfCharComplete() before calling this routine to ensure that
* enough bytes remain in the string.
*
* Results:
* *usc4Ptr is filled with the UCS4 code point, and the return value is
* the number of bytes from the UTF-8 string that were consumed.
* Fills *usc4Ptr with the UCS4 code point and returns the number of bytes
* consumed from the source string.
*
* Side effects:
* None.
*
*---------------------------------------------------------------------------
*/
|