1 
2 #line 1 "hb-buffer-deserialize-text.rl"
3 /*
4  * Copyright © 2013  Google, Inc.
5  *
6  *  This is part of HarfBuzz, a text shaping library.
7  *
8  * Permission is hereby granted, without written agreement and without
9  * license or royalty fees, to use, copy, modify, and distribute this
10  * software and its documentation for any purpose, provided that the
11  * above copyright notice and the following two paragraphs appear in
12  * all copies of this software.
13  *
14  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
15  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
16  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18  * DAMAGE.
19  *
20  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
21  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
22  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
23  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25  *
26  * Google Author(s): Behdad Esfahbod
27  */
28 
29 #ifndef HB_BUFFER_DESERIALIZE_TEXT_HH
30 #define HB_BUFFER_DESERIALIZE_TEXT_HH
31 
32 #include "hb-private.hh"
33 
34 
35 #line 36 "hb-buffer-deserialize-text.hh"
36 static const unsigned char _deserialize_text_trans_keys[] = {
37 	0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u,
38 	48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u,
39 	9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u,
40 	9u, 124u, 9u, 124u, 9u, 124u, 0
41 };
42 
43 static const char _deserialize_text_key_spans[] = {
44 	0, 114, 13, 10, 13, 10, 10, 13,
45 	10, 1, 13, 10, 14, 116, 116, 0,
46 	114, 116, 116, 116, 116, 116, 116, 116,
47 	116, 116, 116
48 };
49 
50 static const short _deserialize_text_index_offsets[] = {
51 	0, 0, 115, 129, 140, 154, 165, 176,
52 	190, 201, 203, 217, 228, 243, 360, 477,
53 	478, 593, 710, 827, 944, 1061, 1178, 1295,
54 	1412, 1529, 1646
55 };
56 
57 static const char _deserialize_text_indicies[] = {
58 	0, 0, 0, 0, 0, 1, 1,
59 	1, 1, 1, 1, 1, 1, 1, 1,
60 	1, 1, 1, 1, 1, 1, 1, 1,
61 	0, 1, 1, 1, 1, 1, 1, 1,
62 	1, 1, 1, 1, 1, 1, 1, 1,
63 	2, 3, 3, 3, 3, 3, 3, 3,
64 	3, 3, 1, 1, 1, 1, 1, 1,
65 	1, 4, 4, 4, 4, 4, 4, 4,
66 	4, 4, 4, 4, 4, 4, 4, 4,
67 	4, 4, 4, 4, 4, 4, 4, 4,
68 	4, 4, 4, 1, 1, 1, 1, 1,
69 	1, 4, 4, 4, 4, 4, 4, 4,
70 	4, 4, 4, 4, 4, 4, 4, 4,
71 	4, 4, 4, 4, 4, 4, 4, 4,
72 	4, 4, 4, 1, 5, 1, 1, 6,
73 	7, 7, 7, 7, 7, 7, 7, 7,
74 	7, 1, 8, 9, 9, 9, 9, 9,
75 	9, 9, 9, 9, 1, 10, 1, 1,
76 	11, 12, 12, 12, 12, 12, 12, 12,
77 	12, 12, 1, 13, 14, 14, 14, 14,
78 	14, 14, 14, 14, 14, 1, 15, 16,
79 	16, 16, 16, 16, 16, 16, 16, 16,
80 	1, 17, 1, 1, 18, 19, 19, 19,
81 	19, 19, 19, 19, 19, 19, 1, 20,
82 	21, 21, 21, 21, 21, 21, 21, 21,
83 	21, 1, 22, 1, 23, 1, 1, 24,
84 	25, 25, 25, 25, 25, 25, 25, 25,
85 	25, 1, 26, 27, 27, 27, 27, 27,
86 	27, 27, 27, 27, 1, 22, 1, 1,
87 	1, 21, 21, 21, 21, 21, 21, 21,
88 	21, 21, 21, 1, 28, 28, 28, 28,
89 	28, 1, 1, 1, 1, 1, 1, 1,
90 	1, 1, 1, 1, 1, 1, 1, 1,
91 	1, 1, 1, 28, 1, 1, 1, 1,
92 	1, 1, 1, 1, 1, 1, 29, 1,
93 	1, 1, 1, 1, 1, 1, 1, 1,
94 	1, 1, 1, 1, 1, 1, 1, 1,
95 	30, 1, 1, 31, 1, 1, 1, 1,
96 	1, 1, 1, 1, 1, 1, 1, 1,
97 	1, 1, 1, 1, 1, 1, 1, 1,
98 	1, 1, 1, 1, 1, 1, 1, 1,
99 	32, 1, 1, 1, 1, 1, 1, 1,
100 	1, 1, 1, 1, 1, 1, 1, 1,
101 	1, 1, 1, 1, 1, 1, 1, 1,
102 	1, 1, 1, 1, 1, 1, 1, 33,
103 	1, 34, 34, 34, 34, 34, 1, 1,
104 	1, 1, 1, 1, 1, 1, 1, 1,
105 	1, 1, 1, 1, 1, 1, 1, 1,
106 	34, 1, 1, 1, 1, 1, 1, 1,
107 	1, 1, 1, 1, 1, 1, 1, 1,
108 	1, 1, 1, 1, 1, 1, 1, 1,
109 	1, 1, 1, 1, 1, 1, 1, 1,
110 	1, 1, 1, 1, 1, 1, 1, 1,
111 	1, 1, 1, 1, 1, 1, 1, 1,
112 	1, 1, 1, 1, 1, 1, 1, 1,
113 	1, 1, 1, 1, 1, 35, 1, 1,
114 	1, 1, 1, 1, 1, 1, 1, 1,
115 	1, 1, 1, 1, 1, 1, 1, 1,
116 	1, 1, 1, 1, 1, 1, 1, 1,
117 	1, 1, 1, 1, 36, 1, 1, 0,
118 	0, 0, 0, 0, 1, 1, 1, 1,
119 	1, 1, 1, 1, 1, 1, 1, 1,
120 	1, 1, 1, 1, 1, 1, 0, 1,
121 	1, 1, 1, 1, 1, 1, 1, 1,
122 	1, 1, 1, 1, 1, 1, 2, 3,
123 	3, 3, 3, 3, 3, 3, 3, 3,
124 	1, 1, 1, 1, 1, 1, 1, 4,
125 	4, 4, 4, 4, 4, 4, 4, 4,
126 	4, 4, 4, 4, 4, 4, 4, 4,
127 	4, 4, 4, 4, 4, 4, 4, 4,
128 	4, 1, 1, 1, 1, 1, 1, 4,
129 	4, 4, 4, 4, 4, 4, 4, 4,
130 	4, 4, 4, 4, 4, 4, 4, 4,
131 	4, 4, 4, 4, 4, 4, 4, 4,
132 	4, 1, 28, 28, 28, 28, 28, 1,
133 	1, 1, 1, 1, 1, 1, 1, 1,
134 	1, 1, 1, 1, 1, 1, 1, 1,
135 	1, 28, 1, 1, 1, 1, 1, 1,
136 	1, 1, 1, 1, 29, 1, 1, 1,
137 	1, 37, 37, 37, 37, 37, 37, 37,
138 	37, 37, 37, 1, 1, 1, 30, 1,
139 	1, 31, 1, 1, 1, 1, 1, 1,
140 	1, 1, 1, 1, 1, 1, 1, 1,
141 	1, 1, 1, 1, 1, 1, 1, 1,
142 	1, 1, 1, 1, 1, 1, 32, 1,
143 	1, 1, 1, 1, 1, 1, 1, 1,
144 	1, 1, 1, 1, 1, 1, 1, 1,
145 	1, 1, 1, 1, 1, 1, 1, 1,
146 	1, 1, 1, 1, 1, 33, 1, 38,
147 	38, 38, 38, 38, 1, 1, 1, 1,
148 	1, 1, 1, 1, 1, 1, 1, 1,
149 	1, 1, 1, 1, 1, 1, 38, 1,
150 	1, 1, 1, 1, 1, 1, 1, 1,
151 	1, 1, 39, 1, 1, 1, 1, 1,
152 	1, 1, 1, 1, 1, 1, 1, 1,
153 	1, 1, 1, 1, 1, 1, 1, 1,
154 	1, 1, 1, 1, 1, 1, 1, 1,
155 	1, 1, 1, 1, 1, 1, 1, 1,
156 	1, 1, 1, 1, 1, 1, 1, 1,
157 	1, 1, 1, 40, 1, 1, 1, 1,
158 	1, 1, 1, 1, 1, 1, 1, 1,
159 	1, 1, 1, 1, 1, 1, 1, 1,
160 	1, 1, 1, 1, 1, 1, 1, 1,
161 	1, 1, 41, 1, 42, 42, 42, 42,
162 	42, 1, 1, 1, 1, 1, 1, 1,
163 	1, 1, 1, 1, 1, 1, 1, 1,
164 	1, 1, 1, 42, 1, 1, 1, 1,
165 	1, 1, 1, 1, 1, 1, 1, 1,
166 	1, 1, 1, 1, 1, 1, 1, 1,
167 	1, 1, 1, 1, 1, 1, 1, 1,
168 	1, 1, 1, 1, 1, 1, 1, 1,
169 	1, 1, 1, 1, 1, 1, 1, 1,
170 	1, 1, 1, 1, 1, 1, 1, 1,
171 	1, 1, 1, 1, 1, 1, 1, 1,
172 	43, 1, 1, 1, 1, 1, 1, 1,
173 	1, 1, 1, 1, 1, 1, 1, 1,
174 	1, 1, 1, 1, 1, 1, 1, 1,
175 	1, 1, 1, 1, 1, 1, 1, 44,
176 	1, 42, 42, 42, 42, 42, 1, 1,
177 	1, 1, 1, 1, 1, 1, 1, 1,
178 	1, 1, 1, 1, 1, 1, 1, 1,
179 	42, 1, 1, 1, 1, 1, 1, 1,
180 	1, 1, 1, 1, 1, 1, 1, 1,
181 	14, 14, 14, 14, 14, 14, 14, 14,
182 	14, 14, 1, 1, 1, 1, 1, 1,
183 	1, 1, 1, 1, 1, 1, 1, 1,
184 	1, 1, 1, 1, 1, 1, 1, 1,
185 	1, 1, 1, 1, 1, 1, 1, 1,
186 	1, 1, 1, 1, 1, 43, 1, 1,
187 	1, 1, 1, 1, 1, 1, 1, 1,
188 	1, 1, 1, 1, 1, 1, 1, 1,
189 	1, 1, 1, 1, 1, 1, 1, 1,
190 	1, 1, 1, 1, 44, 1, 38, 38,
191 	38, 38, 38, 1, 1, 1, 1, 1,
192 	1, 1, 1, 1, 1, 1, 1, 1,
193 	1, 1, 1, 1, 1, 38, 1, 1,
194 	1, 1, 1, 1, 1, 1, 1, 1,
195 	1, 39, 1, 1, 1, 9, 9, 9,
196 	9, 9, 9, 9, 9, 9, 9, 1,
197 	1, 1, 1, 1, 1, 1, 1, 1,
198 	1, 1, 1, 1, 1, 1, 1, 1,
199 	1, 1, 1, 1, 1, 1, 1, 1,
200 	1, 1, 1, 1, 1, 1, 1, 1,
201 	1, 1, 40, 1, 1, 1, 1, 1,
202 	1, 1, 1, 1, 1, 1, 1, 1,
203 	1, 1, 1, 1, 1, 1, 1, 1,
204 	1, 1, 1, 1, 1, 1, 1, 1,
205 	1, 41, 1, 45, 45, 45, 45, 45,
206 	1, 1, 1, 1, 1, 1, 1, 1,
207 	1, 1, 1, 1, 1, 1, 1, 1,
208 	1, 1, 45, 1, 1, 1, 1, 1,
209 	1, 1, 1, 1, 1, 46, 1, 1,
210 	1, 1, 1, 1, 1, 1, 1, 1,
211 	1, 1, 1, 1, 1, 1, 1, 1,
212 	1, 1, 47, 1, 1, 1, 1, 1,
213 	1, 1, 1, 1, 1, 1, 1, 1,
214 	1, 1, 1, 1, 1, 1, 1, 1,
215 	1, 1, 1, 1, 1, 1, 1, 48,
216 	1, 1, 1, 1, 1, 1, 1, 1,
217 	1, 1, 1, 1, 1, 1, 1, 1,
218 	1, 1, 1, 1, 1, 1, 1, 1,
219 	1, 1, 1, 1, 1, 1, 49, 1,
220 	50, 50, 50, 50, 50, 1, 1, 1,
221 	1, 1, 1, 1, 1, 1, 1, 1,
222 	1, 1, 1, 1, 1, 1, 1, 50,
223 	1, 1, 1, 1, 1, 1, 1, 1,
224 	1, 1, 51, 1, 1, 1, 1, 1,
225 	1, 1, 1, 1, 1, 1, 1, 1,
226 	1, 1, 1, 1, 1, 1, 1, 1,
227 	1, 1, 1, 1, 1, 1, 1, 1,
228 	1, 1, 1, 1, 1, 1, 1, 1,
229 	1, 1, 1, 1, 1, 1, 1, 1,
230 	1, 1, 1, 1, 52, 1, 1, 1,
231 	1, 1, 1, 1, 1, 1, 1, 1,
232 	1, 1, 1, 1, 1, 1, 1, 1,
233 	1, 1, 1, 1, 1, 1, 1, 1,
234 	1, 1, 1, 53, 1, 50, 50, 50,
235 	50, 50, 1, 1, 1, 1, 1, 1,
236 	1, 1, 1, 1, 1, 1, 1, 1,
237 	1, 1, 1, 1, 50, 1, 1, 1,
238 	1, 1, 1, 1, 1, 1, 1, 51,
239 	1, 1, 1, 1, 27, 27, 27, 27,
240 	27, 27, 27, 27, 27, 27, 1, 1,
241 	1, 1, 1, 1, 1, 1, 1, 1,
242 	1, 1, 1, 1, 1, 1, 1, 1,
243 	1, 1, 1, 1, 1, 1, 1, 1,
244 	1, 1, 1, 1, 1, 1, 1, 1,
245 	1, 52, 1, 1, 1, 1, 1, 1,
246 	1, 1, 1, 1, 1, 1, 1, 1,
247 	1, 1, 1, 1, 1, 1, 1, 1,
248 	1, 1, 1, 1, 1, 1, 1, 1,
249 	53, 1, 45, 45, 45, 45, 45, 1,
250 	1, 1, 1, 1, 1, 1, 1, 1,
251 	1, 1, 1, 1, 1, 1, 1, 1,
252 	1, 45, 1, 1, 1, 1, 1, 1,
253 	1, 1, 1, 1, 46, 1, 1, 1,
254 	1, 54, 54, 54, 54, 54, 54, 54,
255 	54, 54, 54, 1, 1, 1, 1, 1,
256 	1, 47, 1, 1, 1, 1, 1, 1,
257 	1, 1, 1, 1, 1, 1, 1, 1,
258 	1, 1, 1, 1, 1, 1, 1, 1,
259 	1, 1, 1, 1, 1, 1, 48, 1,
260 	1, 1, 1, 1, 1, 1, 1, 1,
261 	1, 1, 1, 1, 1, 1, 1, 1,
262 	1, 1, 1, 1, 1, 1, 1, 1,
263 	1, 1, 1, 1, 1, 49, 1, 28,
264 	28, 28, 28, 28, 1, 1, 1, 1,
265 	1, 1, 1, 1, 1, 1, 1, 1,
266 	1, 1, 1, 1, 1, 1, 28, 1,
267 	1, 1, 1, 1, 1, 1, 1, 1,
268 	1, 29, 1, 55, 55, 1, 55, 55,
269 	55, 55, 55, 55, 55, 55, 55, 55,
270 	1, 1, 1, 30, 1, 1, 31, 55,
271 	55, 55, 55, 55, 55, 55, 55, 55,
272 	55, 55, 55, 55, 55, 55, 55, 55,
273 	55, 55, 55, 55, 55, 55, 55, 55,
274 	55, 1, 1, 32, 1, 55, 1, 55,
275 	55, 55, 55, 55, 55, 55, 55, 55,
276 	55, 55, 55, 55, 55, 55, 55, 55,
277 	55, 55, 55, 55, 55, 55, 55, 55,
278 	55, 1, 33, 1, 0
279 };
280 
281 static const char _deserialize_text_trans_targs[] = {
282 	1, 0, 13, 17, 26, 3, 18, 21,
283 	18, 21, 5, 19, 20, 19, 20, 22,
284 	25, 8, 9, 12, 9, 12, 10, 11,
285 	23, 24, 23, 24, 14, 2, 6, 7,
286 	15, 16, 14, 15, 16, 17, 14, 4,
287 	15, 16, 14, 15, 16, 14, 2, 7,
288 	15, 16, 14, 2, 15, 16, 25, 26
289 };
290 
291 static const char _deserialize_text_trans_actions[] = {
292 	0, 0, 1, 1, 1, 2, 2, 2,
293 	0, 0, 2, 2, 2, 0, 0, 2,
294 	2, 2, 2, 2, 0, 0, 3, 2,
295 	2, 2, 0, 0, 4, 5, 5, 5,
296 	4, 4, 0, 0, 0, 0, 6, 7,
297 	6, 6, 8, 8, 8, 9, 10, 10,
298 	9, 9, 11, 12, 11, 11, 0, 0
299 };
300 
301 static const char _deserialize_text_eof_actions[] = {
302 	0, 0, 0, 0, 0, 0, 0, 0,
303 	0, 0, 0, 0, 0, 4, 0, 0,
304 	0, 4, 6, 8, 8, 6, 9, 11,
305 	11, 9, 4
306 };
307 
308 static const int deserialize_text_start = 1;
309 static const int deserialize_text_first_final = 13;
310 static const int deserialize_text_error = 0;
311 
312 static const int deserialize_text_en_main = 1;
313 
314 
315 #line 91 "hb-buffer-deserialize-text.rl"
316 
317 
318 static hb_bool_t
_hb_buffer_deserialize_glyphs_text(hb_buffer_t * buffer,const char * buf,unsigned int buf_len,const char ** end_ptr,hb_font_t * font)319 _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
320 				    const char *buf,
321 				    unsigned int buf_len,
322 				    const char **end_ptr,
323 				    hb_font_t *font)
324 {
325   const char *p = buf, *pe = buf + buf_len;
326 
327   /* Ensure we have positions. */
328   (void) hb_buffer_get_glyph_positions (buffer, NULL);
329 
330   while (p < pe && ISSPACE (*p))
331     p++;
332   if (p < pe && *p == (buffer->len ? '|' : '['))
333   {
334     *end_ptr = ++p;
335   }
336 
337   const char *eof = pe, *tok = NULL;
338   int cs;
339   hb_glyph_info_t info = {0};
340   hb_glyph_position_t pos = {0};
341 
342 #line 343 "hb-buffer-deserialize-text.hh"
343 	{
344 	cs = deserialize_text_start;
345 	}
346 
347 #line 348 "hb-buffer-deserialize-text.hh"
348 	{
349 	int _slen;
350 	int _trans;
351 	const unsigned char *_keys;
352 	const char *_inds;
353 	if ( p == pe )
354 		goto _test_eof;
355 	if ( cs == 0 )
356 		goto _out;
357 _resume:
358 	_keys = _deserialize_text_trans_keys + (cs<<1);
359 	_inds = _deserialize_text_indicies + _deserialize_text_index_offsets[cs];
360 
361 	_slen = _deserialize_text_key_spans[cs];
362 	_trans = _inds[ _slen > 0 && _keys[0] <=(*p) &&
363 		(*p) <= _keys[1] ?
364 		(*p) - _keys[0] : _slen ];
365 
366 	cs = _deserialize_text_trans_targs[_trans];
367 
368 	if ( _deserialize_text_trans_actions[_trans] == 0 )
369 		goto _again;
370 
371 	switch ( _deserialize_text_trans_actions[_trans] ) {
372 	case 2:
373 #line 51 "hb-buffer-deserialize-text.rl"
374 	{
375 	tok = p;
376 }
377 	break;
378 	case 5:
379 #line 55 "hb-buffer-deserialize-text.rl"
380 	{
381 	if (!hb_font_glyph_from_string (font,
382 					tok, p - tok,
383 					&info.codepoint))
384 	  return false;
385 }
386 	break;
387 	case 10:
388 #line 62 "hb-buffer-deserialize-text.rl"
389 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
390 	break;
391 	case 3:
392 #line 63 "hb-buffer-deserialize-text.rl"
393 	{ if (!parse_int  (tok, p, &pos.x_offset )) return false; }
394 	break;
395 	case 12:
396 #line 64 "hb-buffer-deserialize-text.rl"
397 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
398 	break;
399 	case 7:
400 #line 65 "hb-buffer-deserialize-text.rl"
401 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
402 	break;
403 	case 1:
404 #line 38 "hb-buffer-deserialize-text.rl"
405 	{
406 	memset (&info, 0, sizeof (info));
407 	memset (&pos , 0, sizeof (pos ));
408 }
409 #line 51 "hb-buffer-deserialize-text.rl"
410 	{
411 	tok = p;
412 }
413 	break;
414 	case 4:
415 #line 55 "hb-buffer-deserialize-text.rl"
416 	{
417 	if (!hb_font_glyph_from_string (font,
418 					tok, p - tok,
419 					&info.codepoint))
420 	  return false;
421 }
422 #line 43 "hb-buffer-deserialize-text.rl"
423 	{
424 	buffer->add_info (info);
425 	if (buffer->in_error)
426 	  return false;
427 	buffer->pos[buffer->len - 1] = pos;
428 	*end_ptr = p;
429 }
430 	break;
431 	case 9:
432 #line 62 "hb-buffer-deserialize-text.rl"
433 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
434 #line 43 "hb-buffer-deserialize-text.rl"
435 	{
436 	buffer->add_info (info);
437 	if (buffer->in_error)
438 	  return false;
439 	buffer->pos[buffer->len - 1] = pos;
440 	*end_ptr = p;
441 }
442 	break;
443 	case 11:
444 #line 64 "hb-buffer-deserialize-text.rl"
445 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
446 #line 43 "hb-buffer-deserialize-text.rl"
447 	{
448 	buffer->add_info (info);
449 	if (buffer->in_error)
450 	  return false;
451 	buffer->pos[buffer->len - 1] = pos;
452 	*end_ptr = p;
453 }
454 	break;
455 	case 6:
456 #line 65 "hb-buffer-deserialize-text.rl"
457 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
458 #line 43 "hb-buffer-deserialize-text.rl"
459 	{
460 	buffer->add_info (info);
461 	if (buffer->in_error)
462 	  return false;
463 	buffer->pos[buffer->len - 1] = pos;
464 	*end_ptr = p;
465 }
466 	break;
467 	case 8:
468 #line 66 "hb-buffer-deserialize-text.rl"
469 	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
470 #line 43 "hb-buffer-deserialize-text.rl"
471 	{
472 	buffer->add_info (info);
473 	if (buffer->in_error)
474 	  return false;
475 	buffer->pos[buffer->len - 1] = pos;
476 	*end_ptr = p;
477 }
478 	break;
479 #line 480 "hb-buffer-deserialize-text.hh"
480 	}
481 
482 _again:
483 	if ( cs == 0 )
484 		goto _out;
485 	if ( ++p != pe )
486 		goto _resume;
487 	_test_eof: {}
488 	if ( p == eof )
489 	{
490 	switch ( _deserialize_text_eof_actions[cs] ) {
491 	case 4:
492 #line 55 "hb-buffer-deserialize-text.rl"
493 	{
494 	if (!hb_font_glyph_from_string (font,
495 					tok, p - tok,
496 					&info.codepoint))
497 	  return false;
498 }
499 #line 43 "hb-buffer-deserialize-text.rl"
500 	{
501 	buffer->add_info (info);
502 	if (buffer->in_error)
503 	  return false;
504 	buffer->pos[buffer->len - 1] = pos;
505 	*end_ptr = p;
506 }
507 	break;
508 	case 9:
509 #line 62 "hb-buffer-deserialize-text.rl"
510 	{ if (!parse_uint (tok, p, &info.cluster )) return false; }
511 #line 43 "hb-buffer-deserialize-text.rl"
512 	{
513 	buffer->add_info (info);
514 	if (buffer->in_error)
515 	  return false;
516 	buffer->pos[buffer->len - 1] = pos;
517 	*end_ptr = p;
518 }
519 	break;
520 	case 11:
521 #line 64 "hb-buffer-deserialize-text.rl"
522 	{ if (!parse_int  (tok, p, &pos.y_offset )) return false; }
523 #line 43 "hb-buffer-deserialize-text.rl"
524 	{
525 	buffer->add_info (info);
526 	if (buffer->in_error)
527 	  return false;
528 	buffer->pos[buffer->len - 1] = pos;
529 	*end_ptr = p;
530 }
531 	break;
532 	case 6:
533 #line 65 "hb-buffer-deserialize-text.rl"
534 	{ if (!parse_int  (tok, p, &pos.x_advance)) return false; }
535 #line 43 "hb-buffer-deserialize-text.rl"
536 	{
537 	buffer->add_info (info);
538 	if (buffer->in_error)
539 	  return false;
540 	buffer->pos[buffer->len - 1] = pos;
541 	*end_ptr = p;
542 }
543 	break;
544 	case 8:
545 #line 66 "hb-buffer-deserialize-text.rl"
546 	{ if (!parse_int  (tok, p, &pos.y_advance)) return false; }
547 #line 43 "hb-buffer-deserialize-text.rl"
548 	{
549 	buffer->add_info (info);
550 	if (buffer->in_error)
551 	  return false;
552 	buffer->pos[buffer->len - 1] = pos;
553 	*end_ptr = p;
554 }
555 	break;
556 #line 557 "hb-buffer-deserialize-text.hh"
557 	}
558 	}
559 
560 	_out: {}
561 	}
562 
563 #line 119 "hb-buffer-deserialize-text.rl"
564 
565 
566   *end_ptr = p;
567 
568   return p == pe && *(p-1) != ']';
569 }
570 
571 #endif /* HB_BUFFER_DESERIALIZE_TEXT_HH */
572