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