1 #line 1 "hb-buffer-deserialize-text.rl"
2 /*
3 * Copyright © 2013  Google, Inc.
4 *
5 *  This is part of HarfBuzz, a text shaping library.
6 *
7 * Permission is hereby granted, without written agreement and without
8 * license or royalty fees, to use, copy, modify, and distribute this
9 * software and its documentation for any purpose, provided that the
10 * above copyright notice and the following two paragraphs appear in
11 * all copies of this software.
12 *
13 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17 * DAMAGE.
18 *
19 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
22 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24 *
25 * Google Author(s): Behdad Esfahbod
26 */
27 
28 #ifndef HB_BUFFER_DESERIALIZE_TEXT_HH
29 #define HB_BUFFER_DESERIALIZE_TEXT_HH
30 
31 #include "hb.hh"
32 
33 
34 #line 35 "hb-buffer-deserialize-text.hh"
35 static const unsigned char _deserialize_text_trans_keys[] = {
36 	1u, 0u, 0u, 13u, 12u, 12u, 2u, 2u,
37 	5u, 11u, 0u, 12u, 5u, 6u, 4u, 6u,
38 	5u, 6u, 5u, 6u, 4u, 6u, 5u, 6u,
39 	3u, 3u, 4u, 6u, 5u, 6u, 3u, 6u,
40 	2u, 16u, 4u, 6u, 5u, 6u, 0u, 16u,
41 	0u, 16u, 1u, 0u, 0u, 12u, 0u, 16u,
42 	0u, 16u, 0u, 16u, 0u, 16u, 0u, 16u,
43 	0u, 16u, 0u, 16u, 0u, 16u, 0u, 16u,
44 	0u, 16u, 0u, 16u, 0u, 16u, 0u, 16u,
45 	0u, 16u, 0u
46 };
47 
48 static const signed char _deserialize_text_char_class[] = {
49 	0, 0, 0, 0, 0, 1, 1, 1,
50 	1, 1, 1, 1, 1, 1, 1, 1,
51 	1, 1, 1, 1, 1, 1, 1, 0,
52 	1, 1, 1, 1, 1, 1, 1, 1,
53 	1, 1, 2, 3, 4, 1, 1, 5,
54 	6, 6, 6, 6, 6, 6, 6, 6,
55 	6, 1, 1, 7, 8, 9, 1, 10,
56 	11, 11, 11, 11, 11, 11, 1, 1,
57 	1, 1, 1, 1, 1, 1, 1, 1,
58 	1, 1, 1, 1, 12, 1, 1, 1,
59 	1, 1, 13, 14, 15, 1, 1, 1,
60 	11, 11, 11, 11, 11, 11, 1, 1,
61 	1, 1, 1, 1, 1, 1, 1, 1,
62 	1, 1, 1, 1, 1, 1, 1, 1,
63 	1, 1, 1, 16, 0
64 };
65 
66 static const short _deserialize_text_index_offsets[] = {
67 	0, 0, 14, 15, 16, 23, 36, 38,
68 	41, 43, 45, 48, 50, 51, 54, 56,
69 	60, 75, 78, 80, 97, 114, 114, 127,
70 	144, 161, 178, 195, 212, 229, 246, 263,
71 	280, 297, 314, 331, 348, 0
72 };
73 
74 static const signed char _deserialize_text_indicies[] = {
75 	1, 0, 0, 0, 0, 0, 0, 2,
76 	0, 0, 0, 0, 0, 3, 4, 6,
77 	7, 7, 0, 0, 0, 0, 7, 8,
78 	0, 0, 0, 0, 0, 0, 0, 0,
79 	0, 0, 0, 4, 10, 11, 13, 14,
80 	15, 17, 18, 20, 21, 23, 24, 25,
81 	27, 28, 29, 31, 32, 33, 35, 36,
82 	29, 0, 28, 28, 38, 38, 0, 0,
83 	0, 0, 38, 0, 38, 0, 0, 0,
84 	38, 38, 38, 40, 41, 42, 44, 45,
85 	47, 0, 0, 0, 0, 48, 48, 0,
86 	49, 50, 0, 48, 0, 0, 0, 0,
87 	51, 52, 0, 0, 0, 0, 0, 0,
88 	0, 0, 53, 0, 0, 0, 0, 0,
89 	0, 54, 8, 0, 0, 0, 0, 0,
90 	0, 0, 0, 0, 0, 0, 4, 56,
91 	0, 0, 0, 0, 0, 0, 0, 0,
92 	57, 0, 0, 0, 0, 0, 0, 58,
93 	56, 0, 0, 0, 0, 60, 60, 0,
94 	0, 57, 0, 0, 0, 0, 0, 0,
95 	58, 63, 62, 64, 0, 62, 62, 62,
96 	62, 65, 62, 66, 62, 62, 62, 67,
97 	68, 69, 71, 38, 72, 0, 38, 38,
98 	38, 38, 73, 38, 74, 38, 38, 38,
99 	37, 75, 76, 78, 0, 0, 79, 0,
100 	0, 0, 0, 0, 0, 0, 0, 0,
101 	0, 0, 80, 81, 82, 0, 0, 0,
102 	0, 0, 0, 0, 0, 0, 0, 0,
103 	0, 0, 0, 53, 83, 84, 62, 64,
104 	0, 62, 62, 62, 62, 65, 62, 66,
105 	62, 62, 62, 67, 68, 69, 86, 0,
106 	87, 0, 0, 0, 0, 0, 0, 0,
107 	88, 0, 0, 0, 0, 57, 89, 91,
108 	0, 92, 0, 0, 0, 0, 0, 0,
109 	0, 0, 0, 0, 0, 0, 93, 94,
110 	91, 0, 92, 0, 0, 36, 36, 0,
111 	0, 0, 0, 0, 0, 0, 0, 93,
112 	94, 86, 0, 87, 0, 0, 97, 97,
113 	0, 0, 0, 88, 0, 0, 0, 0,
114 	57, 89, 99, 0, 0, 0, 0, 0,
115 	0, 0, 0, 0, 0, 0, 0, 0,
116 	0, 100, 101, 99, 0, 0, 0, 0,
117 	45, 45, 0, 0, 0, 0, 0, 0,
118 	0, 0, 100, 101, 78, 0, 0, 79,
119 	0, 18, 18, 0, 0, 0, 0, 0,
120 	0, 0, 0, 80, 81, 0
121 };
122 
123 static const signed char _deserialize_text_index_defaults[] = {
124 	0, 0, 0, 0, 0, 0, 0, 0,
125 	0, 0, 0, 0, 0, 0, 0, 0,
126 	0, 0, 0, 0, 0, 0, 0, 0,
127 	0, 62, 38, 0, 0, 62, 0, 0,
128 	0, 0, 0, 0, 0, 0
129 };
130 
131 static const signed char _deserialize_text_cond_targs[] = {
132 	0, 1, 2, 25, 3, 3, 4, 19,
133 	5, 6, 23, 24, 7, 8, 27, 36,
134 	8, 27, 36, 9, 30, 33, 10, 11,
135 	12, 15, 11, 12, 15, 13, 13, 14,
136 	31, 32, 14, 31, 32, 16, 26, 17,
137 	18, 34, 35, 18, 34, 35, 19, 20,
138 	19, 6, 21, 22, 20, 21, 22, 23,
139 	20, 21, 22, 24, 24, 25, 26, 26,
140 	7, 9, 10, 16, 21, 29, 26, 26,
141 	7, 9, 10, 21, 29, 27, 28, 17,
142 	21, 29, 28, 29, 29, 30, 28, 7,
143 	10, 29, 31, 28, 7, 21, 29, 32,
144 	33, 33, 34, 28, 21, 29, 35, 36,
145 	0
146 };
147 
148 static const signed char _deserialize_text_cond_actions[] = {
149 	0, 0, 0, 0, 1, 0, 0, 2,
150 	0, 0, 2, 2, 0, 3, 4, 4,
151 	0, 5, 5, 0, 4, 4, 0, 3,
152 	3, 3, 0, 0, 0, 6, 0, 3,
153 	4, 4, 0, 5, 5, 0, 5, 0,
154 	3, 4, 4, 0, 5, 5, 7, 7,
155 	8, 9, 7, 7, 0, 0, 0, 10,
156 	10, 10, 10, 10, 8, 11, 12, 13,
157 	14, 14, 14, 15, 11, 11, 16, 17,
158 	18, 18, 18, 16, 16, 19, 19, 20,
159 	19, 19, 0, 0, 13, 10, 10, 21,
160 	21, 10, 22, 22, 23, 22, 22, 22,
161 	10, 5, 24, 24, 24, 24, 24, 19,
162 	0
163 };
164 
165 static const signed char _deserialize_text_eof_trans[] = {
166 	1, 2, 3, 6, 7, 9, 10, 13,
167 	17, 20, 23, 27, 28, 31, 35, 29,
168 	38, 40, 44, 47, 53, 54, 55, 56,
169 	60, 62, 71, 78, 83, 70, 86, 91,
170 	96, 97, 99, 103, 104, 0
171 };
172 
173 static const int deserialize_text_start = 1;
174 static const int deserialize_text_first_final = 19;
175 static const int deserialize_text_error = 0;
176 
177 static const int deserialize_text_en_main = 1;
178 
179 
180 #line 114 "hb-buffer-deserialize-text.rl"
181 
182 
183 static hb_bool_t
_hb_buffer_deserialize_text(hb_buffer_t * buffer,const char * buf,unsigned int buf_len,const char ** end_ptr,hb_font_t * font)184 _hb_buffer_deserialize_text (hb_buffer_t *buffer,
185 const char *buf,
186 unsigned int buf_len,
187 const char **end_ptr,
188 hb_font_t *font)
189 {
190 	const char *p = buf, *pe = buf + buf_len;
191 
192 	/* Ensure we have positions. */
193 	(void) hb_buffer_get_glyph_positions (buffer, nullptr);
194 
195 	while (p < pe && ISSPACE (*p))
196 	p++;
197 
198 	const char *eof = pe, *tok = nullptr;
199 	int cs;
200 	hb_glyph_info_t info = {0};
201 	hb_glyph_position_t pos = {0};
202 
203 #line 204 "hb-buffer-deserialize-text.hh"
204 	{
205 		cs = (int)deserialize_text_start;
206 	}
207 
208 #line 209 "hb-buffer-deserialize-text.hh"
209 	{
210 		unsigned int _trans = 0;
211 		const unsigned char * _keys;
212 		const signed char * _inds;
213 		int _ic;
214 		_resume: {}
215 		if ( p == pe && p != eof )
216 			goto _out;
217 		if ( p == eof ) {
218 			if ( _deserialize_text_eof_trans[cs] > 0 ) {
219 				_trans = (unsigned int)_deserialize_text_eof_trans[cs] - 1;
220 			}
221 		}
222 		else {
223 			_keys = ( _deserialize_text_trans_keys + ((cs<<1)));
224 			_inds = ( _deserialize_text_indicies + (_deserialize_text_index_offsets[cs]));
225 
226 			if ( ( (*( p))) <= 124 && ( (*( p))) >= 9 ) {
227 				_ic = (int)_deserialize_text_char_class[(int)( (*( p))) - 9];
228 				if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) )
229 					_trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) ));
230 				else
231 					_trans = (unsigned int)_deserialize_text_index_defaults[cs];
232 			}
233 			else {
234 				_trans = (unsigned int)_deserialize_text_index_defaults[cs];
235 			}
236 
237 		}
238 		cs = (int)_deserialize_text_cond_targs[_trans];
239 
240 		if ( _deserialize_text_cond_actions[_trans] != 0 ) {
241 
242 			switch ( _deserialize_text_cond_actions[_trans] ) {
243 				case 1:  {
244 					{
245 #line 38 "hb-buffer-deserialize-text.rl"
246 
247 						memset (&info, 0, sizeof (info));
248 						memset (&pos , 0, sizeof (pos ));
249 					}
250 
251 #line 252 "hb-buffer-deserialize-text.hh"
252 
253 
254 					break;
255 				}
256 				case 3:  {
257 					{
258 #line 51 "hb-buffer-deserialize-text.rl"
259 
260 						tok = p;
261 					}
262 
263 #line 264 "hb-buffer-deserialize-text.hh"
264 
265 
266 					break;
267 				}
268 				case 5:  {
269 					{
270 #line 55 "hb-buffer-deserialize-text.rl"
271 						if (unlikely (!buffer->ensure_glyphs ())) return false; }
272 
273 #line 274 "hb-buffer-deserialize-text.hh"
274 
275 
276 					break;
277 				}
278 				case 8:  {
279 					{
280 #line 56 "hb-buffer-deserialize-text.rl"
281 						if (unlikely (!buffer->ensure_unicode ())) return false; }
282 
283 #line 284 "hb-buffer-deserialize-text.hh"
284 
285 
286 					break;
287 				}
288 				case 18:  {
289 					{
290 #line 58 "hb-buffer-deserialize-text.rl"
291 
292 						/* TODO Unescape delimeters. */
293 						if (!hb_font_glyph_from_string (font,
294 						tok, p - tok,
295 						&info.codepoint))
296 						return false;
297 					}
298 
299 #line 300 "hb-buffer-deserialize-text.hh"
300 
301 
302 					break;
303 				}
304 				case 9:  {
305 					{
306 #line 66 "hb-buffer-deserialize-text.rl"
307 						if (!parse_hex (tok, p, &info.codepoint )) return false; }
308 
309 #line 310 "hb-buffer-deserialize-text.hh"
310 
311 
312 					break;
313 				}
314 				case 21:  {
315 					{
316 #line 68 "hb-buffer-deserialize-text.rl"
317 						if (!parse_uint (tok, p, &info.cluster )) return false; }
318 
319 #line 320 "hb-buffer-deserialize-text.hh"
320 
321 
322 					break;
323 				}
324 				case 6:  {
325 					{
326 #line 69 "hb-buffer-deserialize-text.rl"
327 						if (!parse_int  (tok, p, &pos.x_offset )) return false; }
328 
329 #line 330 "hb-buffer-deserialize-text.hh"
330 
331 
332 					break;
333 				}
334 				case 23:  {
335 					{
336 #line 70 "hb-buffer-deserialize-text.rl"
337 						if (!parse_int  (tok, p, &pos.y_offset )) return false; }
338 
339 #line 340 "hb-buffer-deserialize-text.hh"
340 
341 
342 					break;
343 				}
344 				case 20:  {
345 					{
346 #line 71 "hb-buffer-deserialize-text.rl"
347 						if (!parse_int  (tok, p, &pos.x_advance)) return false; }
348 
349 #line 350 "hb-buffer-deserialize-text.hh"
350 
351 
352 					break;
353 				}
354 				case 15:  {
355 					{
356 #line 38 "hb-buffer-deserialize-text.rl"
357 
358 						memset (&info, 0, sizeof (info));
359 						memset (&pos , 0, sizeof (pos ));
360 					}
361 
362 #line 363 "hb-buffer-deserialize-text.hh"
363 
364 					{
365 #line 51 "hb-buffer-deserialize-text.rl"
366 
367 						tok = p;
368 					}
369 
370 #line 371 "hb-buffer-deserialize-text.hh"
371 
372 
373 					break;
374 				}
375 				case 4:  {
376 					{
377 #line 51 "hb-buffer-deserialize-text.rl"
378 
379 						tok = p;
380 					}
381 
382 #line 383 "hb-buffer-deserialize-text.hh"
383 
384 					{
385 #line 55 "hb-buffer-deserialize-text.rl"
386 						if (unlikely (!buffer->ensure_glyphs ())) return false; }
387 
388 #line 389 "hb-buffer-deserialize-text.hh"
389 
390 
391 					break;
392 				}
393 				case 2:  {
394 					{
395 #line 51 "hb-buffer-deserialize-text.rl"
396 
397 						tok = p;
398 					}
399 
400 #line 401 "hb-buffer-deserialize-text.hh"
401 
402 					{
403 #line 56 "hb-buffer-deserialize-text.rl"
404 						if (unlikely (!buffer->ensure_unicode ())) return false; }
405 
406 #line 407 "hb-buffer-deserialize-text.hh"
407 
408 
409 					break;
410 				}
411 				case 16:  {
412 					{
413 #line 58 "hb-buffer-deserialize-text.rl"
414 
415 						/* TODO Unescape delimeters. */
416 						if (!hb_font_glyph_from_string (font,
417 						tok, p - tok,
418 						&info.codepoint))
419 						return false;
420 					}
421 
422 #line 423 "hb-buffer-deserialize-text.hh"
423 
424 					{
425 #line 43 "hb-buffer-deserialize-text.rl"
426 
427 						buffer->add_info (info);
428 						if (unlikely (!buffer->successful))
429 						return false;
430 						buffer->pos[buffer->len - 1] = pos;
431 						*end_ptr = p;
432 					}
433 
434 #line 435 "hb-buffer-deserialize-text.hh"
435 
436 
437 					break;
438 				}
439 				case 7:  {
440 					{
441 #line 66 "hb-buffer-deserialize-text.rl"
442 						if (!parse_hex (tok, p, &info.codepoint )) return false; }
443 
444 #line 445 "hb-buffer-deserialize-text.hh"
445 
446 					{
447 #line 43 "hb-buffer-deserialize-text.rl"
448 
449 						buffer->add_info (info);
450 						if (unlikely (!buffer->successful))
451 						return false;
452 						buffer->pos[buffer->len - 1] = pos;
453 						*end_ptr = p;
454 					}
455 
456 #line 457 "hb-buffer-deserialize-text.hh"
457 
458 
459 					break;
460 				}
461 				case 10:  {
462 					{
463 #line 68 "hb-buffer-deserialize-text.rl"
464 						if (!parse_uint (tok, p, &info.cluster )) return false; }
465 
466 #line 467 "hb-buffer-deserialize-text.hh"
467 
468 					{
469 #line 43 "hb-buffer-deserialize-text.rl"
470 
471 						buffer->add_info (info);
472 						if (unlikely (!buffer->successful))
473 						return false;
474 						buffer->pos[buffer->len - 1] = pos;
475 						*end_ptr = p;
476 					}
477 
478 #line 479 "hb-buffer-deserialize-text.hh"
479 
480 
481 					break;
482 				}
483 				case 22:  {
484 					{
485 #line 70 "hb-buffer-deserialize-text.rl"
486 						if (!parse_int  (tok, p, &pos.y_offset )) return false; }
487 
488 #line 489 "hb-buffer-deserialize-text.hh"
489 
490 					{
491 #line 43 "hb-buffer-deserialize-text.rl"
492 
493 						buffer->add_info (info);
494 						if (unlikely (!buffer->successful))
495 						return false;
496 						buffer->pos[buffer->len - 1] = pos;
497 						*end_ptr = p;
498 					}
499 
500 #line 501 "hb-buffer-deserialize-text.hh"
501 
502 
503 					break;
504 				}
505 				case 19:  {
506 					{
507 #line 71 "hb-buffer-deserialize-text.rl"
508 						if (!parse_int  (tok, p, &pos.x_advance)) return false; }
509 
510 #line 511 "hb-buffer-deserialize-text.hh"
511 
512 					{
513 #line 43 "hb-buffer-deserialize-text.rl"
514 
515 						buffer->add_info (info);
516 						if (unlikely (!buffer->successful))
517 						return false;
518 						buffer->pos[buffer->len - 1] = pos;
519 						*end_ptr = p;
520 					}
521 
522 #line 523 "hb-buffer-deserialize-text.hh"
523 
524 
525 					break;
526 				}
527 				case 24:  {
528 					{
529 #line 72 "hb-buffer-deserialize-text.rl"
530 						if (!parse_int  (tok, p, &pos.y_advance)) return false; }
531 
532 #line 533 "hb-buffer-deserialize-text.hh"
533 
534 					{
535 #line 43 "hb-buffer-deserialize-text.rl"
536 
537 						buffer->add_info (info);
538 						if (unlikely (!buffer->successful))
539 						return false;
540 						buffer->pos[buffer->len - 1] = pos;
541 						*end_ptr = p;
542 					}
543 
544 #line 545 "hb-buffer-deserialize-text.hh"
545 
546 
547 					break;
548 				}
549 				case 12:  {
550 					{
551 #line 38 "hb-buffer-deserialize-text.rl"
552 
553 						memset (&info, 0, sizeof (info));
554 						memset (&pos , 0, sizeof (pos ));
555 					}
556 
557 #line 558 "hb-buffer-deserialize-text.hh"
558 
559 					{
560 #line 51 "hb-buffer-deserialize-text.rl"
561 
562 						tok = p;
563 					}
564 
565 #line 566 "hb-buffer-deserialize-text.hh"
566 
567 					{
568 #line 55 "hb-buffer-deserialize-text.rl"
569 						if (unlikely (!buffer->ensure_glyphs ())) return false; }
570 
571 #line 572 "hb-buffer-deserialize-text.hh"
572 
573 
574 					break;
575 				}
576 				case 14:  {
577 					{
578 #line 38 "hb-buffer-deserialize-text.rl"
579 
580 						memset (&info, 0, sizeof (info));
581 						memset (&pos , 0, sizeof (pos ));
582 					}
583 
584 #line 585 "hb-buffer-deserialize-text.hh"
585 
586 					{
587 #line 51 "hb-buffer-deserialize-text.rl"
588 
589 						tok = p;
590 					}
591 
592 #line 593 "hb-buffer-deserialize-text.hh"
593 
594 					{
595 #line 58 "hb-buffer-deserialize-text.rl"
596 
597 						/* TODO Unescape delimeters. */
598 						if (!hb_font_glyph_from_string (font,
599 						tok, p - tok,
600 						&info.codepoint))
601 						return false;
602 					}
603 
604 #line 605 "hb-buffer-deserialize-text.hh"
605 
606 
607 					break;
608 				}
609 				case 17:  {
610 					{
611 #line 58 "hb-buffer-deserialize-text.rl"
612 
613 						/* TODO Unescape delimeters. */
614 						if (!hb_font_glyph_from_string (font,
615 						tok, p - tok,
616 						&info.codepoint))
617 						return false;
618 					}
619 
620 #line 621 "hb-buffer-deserialize-text.hh"
621 
622 					{
623 #line 55 "hb-buffer-deserialize-text.rl"
624 						if (unlikely (!buffer->ensure_glyphs ())) return false; }
625 
626 #line 627 "hb-buffer-deserialize-text.hh"
627 
628 					{
629 #line 43 "hb-buffer-deserialize-text.rl"
630 
631 						buffer->add_info (info);
632 						if (unlikely (!buffer->successful))
633 						return false;
634 						buffer->pos[buffer->len - 1] = pos;
635 						*end_ptr = p;
636 					}
637 
638 #line 639 "hb-buffer-deserialize-text.hh"
639 
640 
641 					break;
642 				}
643 				case 11:  {
644 					{
645 #line 38 "hb-buffer-deserialize-text.rl"
646 
647 						memset (&info, 0, sizeof (info));
648 						memset (&pos , 0, sizeof (pos ));
649 					}
650 
651 #line 652 "hb-buffer-deserialize-text.hh"
652 
653 					{
654 #line 51 "hb-buffer-deserialize-text.rl"
655 
656 						tok = p;
657 					}
658 
659 #line 660 "hb-buffer-deserialize-text.hh"
660 
661 					{
662 #line 58 "hb-buffer-deserialize-text.rl"
663 
664 						/* TODO Unescape delimeters. */
665 						if (!hb_font_glyph_from_string (font,
666 						tok, p - tok,
667 						&info.codepoint))
668 						return false;
669 					}
670 
671 #line 672 "hb-buffer-deserialize-text.hh"
672 
673 					{
674 #line 43 "hb-buffer-deserialize-text.rl"
675 
676 						buffer->add_info (info);
677 						if (unlikely (!buffer->successful))
678 						return false;
679 						buffer->pos[buffer->len - 1] = pos;
680 						*end_ptr = p;
681 					}
682 
683 #line 684 "hb-buffer-deserialize-text.hh"
684 
685 
686 					break;
687 				}
688 				case 13:  {
689 					{
690 #line 38 "hb-buffer-deserialize-text.rl"
691 
692 						memset (&info, 0, sizeof (info));
693 						memset (&pos , 0, sizeof (pos ));
694 					}
695 
696 #line 697 "hb-buffer-deserialize-text.hh"
697 
698 					{
699 #line 51 "hb-buffer-deserialize-text.rl"
700 
701 						tok = p;
702 					}
703 
704 #line 705 "hb-buffer-deserialize-text.hh"
705 
706 					{
707 #line 58 "hb-buffer-deserialize-text.rl"
708 
709 						/* TODO Unescape delimeters. */
710 						if (!hb_font_glyph_from_string (font,
711 						tok, p - tok,
712 						&info.codepoint))
713 						return false;
714 					}
715 
716 #line 717 "hb-buffer-deserialize-text.hh"
717 
718 					{
719 #line 55 "hb-buffer-deserialize-text.rl"
720 						if (unlikely (!buffer->ensure_glyphs ())) return false; }
721 
722 #line 723 "hb-buffer-deserialize-text.hh"
723 
724 					{
725 #line 43 "hb-buffer-deserialize-text.rl"
726 
727 						buffer->add_info (info);
728 						if (unlikely (!buffer->successful))
729 						return false;
730 						buffer->pos[buffer->len - 1] = pos;
731 						*end_ptr = p;
732 					}
733 
734 #line 735 "hb-buffer-deserialize-text.hh"
735 
736 
737 					break;
738 				}
739 			}
740 
741 		}
742 
743 		if ( p == eof ) {
744 			if ( cs >= 19 )
745 				goto _out;
746 		}
747 		else {
748 			if ( cs != 0 ) {
749 				p += 1;
750 				goto _resume;
751 			}
752 		}
753 		_out: {}
754 	}
755 
756 #line 138 "hb-buffer-deserialize-text.rl"
757 
758 
759 	*end_ptr = p;
760 
761 	return p == pe && *(p-1) != ']';
762 }
763 
764 #endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */
765