#line 1 "hb-number-parser.rl"
/*
* Copyright © 2019 Ebrahim Byagowi
*
* This is part of HarfBuzz , a text shaping library .
*
* Permission is hereby granted , without written agreement and without
* license or royalty fees , to use , copy , modify , and distribute this
* software and its documentation for any purpose , provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software .
*
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
* DIRECT , INDIRECT , SPECIAL , INCIDENTAL , OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION , EVEN
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE .
*
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES , INCLUDING ,
* BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE . THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN " AS IS " BASIS , AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE , SUPPORT , UPDATES , ENHANCEMENTS , OR MODIFICATIONS .
*
*/
#ifndef HB_NUMBER_PARSER_HH
#define HB_NUMBER_PARSER_HH
#include "hb.hh"
#line 35 "hb-number-parser.hh"
static const unsigned char _double_parser_trans_keys[] = {
0 u, 0 u, 43 u, 57 u, 46 u, 57 u, 48 u, 57 u, 43 u, 57 u, 48 u, 57 u, 48 u, 101 u, 48 u, 57 u,
46 u, 101 u, 0
};
static const char _double_parser_key_spans[] = {
0 , 15 , 12 , 10 , 15 , 10 , 54 , 10 ,
56
};
static const unsigned char _double_parser_index_offsets[] = {
0 , 0 , 16 , 29 , 40 , 56 , 67 , 122 ,
133
};
static const char _double_parser_indicies[] = {
0 , 1 , 2 , 3 , 1 , 4 , 4 ,
4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 ,
1 , 3 , 1 , 4 , 4 , 4 , 4 , 4 ,
4 , 4 , 4 , 4 , 4 , 1 , 5 , 5 ,
5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 ,
1 , 6 , 1 , 7 , 1 , 1 , 8 , 8 ,
8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 ,
1 , 8 , 8 , 8 , 8 , 8 , 8 , 8 ,
8 , 8 , 8 , 1 , 5 , 5 , 5 , 5 ,
5 , 5 , 5 , 5 , 5 , 5 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 9 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 9 , 1 , 8 , 8 , 8 , 8 , 8 ,
8 , 8 , 8 , 8 , 8 , 1 , 3 , 1 ,
4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 ,
4 , 4 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 9 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 9 , 1 , 0
};
static const char _double_parser_trans_targs[] = {
2 , 0 , 2 , 3 , 8 , 6 , 5 , 5 ,
7 , 4
};
static const char _double_parser_trans_actions[] = {
0 , 0 , 1 , 0 , 2 , 3 , 0 , 4 ,
5 , 0
};
static const int double_parser_start = 1 ;
static const int double_parser_first_final = 6 ;
static const int double_parser_error = 0 ;
static const int double_parser_en_main = 1 ;
#line 68 "hb-number-parser.rl"
/* Works only for n < 512 */
static inline double
_pow10 (unsigned exponent)
{
static const double _powers_of_10[] =
{
1 .0 e+256 ,
1 .0 e+128 ,
1 .0 e+64 ,
1 .0 e+32 ,
1 .0 e+16 ,
1 .0 e+8 ,
10000 .,
100 .,
10 .
};
unsigned mask = 1 << (ARRAY_LENGTH (_powers_of_10) - 1 );
double result = 1 ;
for (const double *power = _powers_of_10; mask; ++power, mask >>= 1 )
if (exponent & mask) result *= *power;
return result;
}
/* a variant of strtod that also gets end of buffer in its second argument */
static inline double
strtod_rl (const char *p, const char **end_ptr /* IN/OUT */)
{
double value = 0 ;
double frac = 0 ;
double frac_count = 0 ;
unsigned exp = 0 ;
bool neg = false , exp_neg = false , exp_overflow = false ;
const unsigned long long MAX_FRACT = 0 xFFFFFFFFFFFFFull; /* 2^52-1 */
const unsigned MAX_EXP = 0 x7FFu; /* 2^11-1 */
const char *pe = *end_ptr;
while (p < pe && ISSPACE (*p))
p++;
int cs;
#line 139 "hb-number-parser.hh"
{
cs = double_parser_start;
}
#line 144 "hb-number-parser.hh"
{
int _slen;
int _trans;
const unsigned char *_keys;
const char *_inds;
if ( p == pe )
goto _test_eof;
if ( cs == 0 )
goto _out;
_resume:
_keys = _double_parser_trans_keys + (cs<<1 );
_inds = _double_parser_indicies + _double_parser_index_offsets[cs];
_slen = _double_parser_key_spans[cs];
_trans = _inds[ _slen > 0 && _keys[0 ] <=(*p) &&
(*p) <= _keys[1 ] ?
(*p) - _keys[0 ] : _slen ];
cs = _double_parser_trans_targs[_trans];
if ( _double_parser_trans_actions[_trans] == 0 )
goto _again;
switch ( _double_parser_trans_actions[_trans] ) {
case 1 :
#line 37 "hb-number-parser.rl"
{ neg = true ; }
break ;
case 4 :
#line 38 "hb-number-parser.rl"
{ exp_neg = true ; }
break ;
case 2 :
#line 40 "hb-number-parser.rl"
{
value = value * 10 . + ((*p) - '0' );
}
break ;
case 3 :
#line 43 "hb-number-parser.rl"
{
if (likely (frac <= MAX_FRACT / 10 ))
{
frac = frac * 10 . + ((*p) - '0' );
++frac_count;
}
}
break ;
case 5 :
#line 50 "hb-number-parser.rl"
{
if (likely (exp * 10 + ((*p) - '0' ) <= MAX_EXP))
exp = exp * 10 + ((*p) - '0' );
else
exp_overflow = true ;
}
break ;
#line 202 "hb-number-parser.hh"
}
_again:
if ( cs == 0 )
goto _out;
if ( ++p != pe )
goto _resume;
_test_eof: {}
_out: {}
}
#line 113 "hb-number-parser.rl"
*end_ptr = p;
if (frac_count) value += frac / _pow10 (frac_count);
if (neg) value *= -1 .;
if (unlikely (exp_overflow))
{
if (value == 0 ) return value;
if (exp_neg) return neg ? -DBL_MIN : DBL_MIN;
else return neg ? -DBL_MAX : DBL_MAX;
}
if (exp)
{
if (exp_neg) value /= _pow10 (exp);
else value *= _pow10 (exp);
}
return value;
}
#endif /* HB_NUMBER_PARSER_HH */
Messung V0.5 in Prozent C=96 H=94 G=94
¤ Dauer der Verarbeitung: 0.8 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland