33#define FT_COMPONENT psconv
42 static const FT_Char ft_char_table[128] =
45 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
46 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
48 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
49 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
50 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
51 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
52 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
63 static const FT_Char ft_char_table[128] =
66 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
67 -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
68 -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
69 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
70 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
71 -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
72 -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
73 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
82 FT_LOCAL_DEF( FT_Long )
83 PS_Conv_Strtol( FT_Byte** cursor,
91 FT_Bool have_overflow = 0;
100 if ( base < 2 || base > 36 )
102 FT_TRACE4((
"!!!INVALID BASE:!!!" ));
106 if ( *p ==
'-' || *p ==
'+' )
108 sign = FT_BOOL( *p ==
'-' );
115 if ( *p ==
'-' || *p ==
'+' )
119 num_limit = 0x7FFFFFFFL / base;
120 c_limit = (FT_Char)( 0x7FFFFFFFL % base );
122 for ( ; p < limit; p++ )
127 if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
130 c = ft_char_table[*p & 0x7F];
132 if ( c < 0 || c >= base )
135 if ( num > num_limit || ( num == num_limit && c > c_limit ) )
138 num = num * base + c;
146 FT_TRACE4((
"!!!OVERFLOW:!!!" ));
155 FT_TRACE4((
"!!!END OF DATA:!!!" ));
160 FT_LOCAL_DEF( FT_Long )
161 PS_Conv_ToInt( FT_Byte** cursor,
165 FT_Byte* p = *cursor;
172 num = PS_Conv_Strtol( &p, limit, 10 );
177 if ( p < limit && *p ==
'#' )
182 num = PS_Conv_Strtol( &p, limit, num );
194 FT_LOCAL_DEF( FT_Fixed )
195 PS_Conv_ToFixed( FT_Byte** cursor,
199 FT_Byte* p = *cursor;
202 FT_Fixed integral = 0;
207 FT_Bool have_overflow = 0;
208 FT_Bool have_underflow = 0;
214 if ( *p ==
'-' || *p ==
'+' )
216 sign = FT_BOOL( *p ==
'-' );
223 if ( *p ==
'-' || *p ==
'+' )
231 integral = PS_Conv_ToInt( &p, limit );
236 if ( integral > 0x7FFF )
239 integral = (FT_Fixed)( (FT_UInt32)integral << 16 );
243 if ( p < limit && *p ==
'.' )
247 for ( ; p < limit; p++ )
252 if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
255 c = ft_char_table[*p & 0x7F];
257 if ( c < 0 || c >= 10 )
261 if ( divider < 0xCCCCCCCL && decimal < 0xCCCCCCCL )
263 decimal = decimal * 10 + c;
265 if ( !integral && power_ten > 0 )
274 if ( p + 1 < limit && ( *p ==
'e' || *p ==
'E' ) )
282 exponent = PS_Conv_ToInt( &p, limit );
288 if ( exponent > 1000 )
290 else if ( exponent < -1000 )
293 power_ten += exponent;
298 if ( !integral && !decimal )
303 if ( have_underflow )
306 while ( power_ten > 0 )
308 if ( integral >= 0xCCCCCCCL )
312 if ( decimal >= 0xCCCCCCCL )
324 while ( power_ten < 0 )
327 if ( divider < 0xCCCCCCCL )
332 if ( !integral && !decimal )
340 decimal = FT_DivFix( decimal, divider );
348 integral = -integral;
353 FT_TRACE4((
"!!!END OF DATA:!!!" ));
357 integral = 0x7FFFFFFFL;
358 FT_TRACE4((
"!!!OVERFLOW:!!!" ));
362 FT_TRACE4((
"!!!UNDERFLOW:!!!" ));
368 FT_LOCAL_DEF( FT_UInt )
369 PS_Conv_StringDecode( FT_Byte** cursor,
378 for ( p = *cursor; r < n && p < limit; p++ )
422 if ( IS_PS_DIGIT( *p ) )
428 if ( IS_PS_DIGIT( *p ) )
430 b = b * 8 + *p -
'0';
434 if ( IS_PS_DIGIT( *p ) )
435 b = b * 8 + *p -
'0';
463 FT_LOCAL_DEF( FT_UInt )
464 PS_Conv_ASCIIHexDecode( FT_Byte** cursor,
484 if ( n > (FT_UInt)( limit - p ) )
485 n = (FT_UInt)( limit - p );
493 if ( IS_PS_SPACE( c ) )
499 c = (FT_UInt)ft_char_table[c & 0x7F];
503 pad = ( pad << 4 ) | c;
506 buffer[w++] = (FT_Byte)pad;
512 buffer[w++] = (FT_Byte)( pad << 4 );
520 for ( r = 0; r < n; r++ )
525 if ( IS_PS_SPACE( *p ) )
531 c = ft_char_table[*p & 0x7F];
533 if ( (
unsigned)c >= 16 )
538 *buffer = (FT_Byte)( *buffer + c );
542 *buffer = (FT_Byte)( c << 4 );
549 return ( r + 1 ) / 2;
556 FT_LOCAL_DEF( FT_UInt )
557 PS_Conv_EexecDecode( FT_Byte** cursor,
575 if ( n > (FT_UInt)( limit - p ) )
576 n = (FT_UInt)( limit - p );
578 for ( r = 0; r < n; r++ )
581 FT_UInt b = ( val ^ ( s >> 8 ) );
584 s = ( (val + s)*52845U + 22719 ) & 0xFFFFU;
585 buffer[r] = (FT_Byte) b;
589 *seed = (FT_UShort)s;
593 for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ )
595 FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) );
598 s = (FT_UShort)( ( *p + s ) * 52845U + 22719 );