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
 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 */