22{
33 using System ;
44 using System . Collections . Generic ;
5+ using System . Diagnostics ;
56 using System . Globalization ;
67 using System . Text ;
78 using Core ;
@@ -41,35 +42,43 @@ private Type1Token ReadNextToken()
4142 do
4243 {
4344 skip = false ;
44- while ( bytes . MoveNext ( ) )
45+ while ( bytes . Peek ( ) is { } b )
4546 {
46- var b = bytes . CurrentByte ;
4747 var c = ( char ) b ;
4848
4949 switch ( c )
5050 {
5151 case '%' :
52+ bytes . MoveNext ( ) ;
5253 comments . Add ( ReadComment ( ) ) ;
5354 break ;
5455 case '(' :
56+ bytes . MoveNext ( ) ;
5557 return ReadString ( ) ;
5658 case ')' :
5759 throw new InvalidOperationException ( "Encountered an end of string ')' outside of string." ) ;
5860 case '[' :
61+ bytes . MoveNext ( ) ;
5962 return new Type1Token ( c , Type1Token . TokenType . StartArray ) ;
6063 case ']' :
64+ bytes . MoveNext ( ) ;
6165 return new Type1Token ( c , Type1Token . TokenType . EndArray ) ;
6266 case '{' :
67+ bytes . MoveNext ( ) ;
6368 return new Type1Token ( c , Type1Token . TokenType . StartProc ) ;
6469 case '}' :
70+ bytes . MoveNext ( ) ;
6571 return new Type1Token ( c , Type1Token . TokenType . EndProc ) ;
6672 case '/' :
6773 {
68- var name = ReadLiteral ( ) ;
74+ bytes . MoveNext ( ) ;
75+ TryReadLiteral ( out var name ) ;
76+ Debug . Assert ( name != null ) ;
6977 return new Type1Token ( name , Type1Token . TokenType . Literal ) ;
7078 }
7179 case '<' :
7280 {
81+ bytes . MoveNext ( ) ;
7382 var following = bytes . Peek ( ) ;
7483 if ( following == '<' )
7584 {
@@ -81,6 +90,7 @@ private Type1Token ReadNextToken()
8190 }
8291 case '>' :
8392 {
93+ bytes . MoveNext ( ) ;
8494 var following = bytes . Peek ( ) ;
8595 if ( following == '>' )
8696 {
@@ -94,23 +104,24 @@ private Type1Token ReadNextToken()
94104 {
95105 if ( ReadHelper . IsWhitespace ( b ) )
96106 {
107+ bytes . MoveNext ( ) ;
97108 skip = true ;
98109 break ;
99110 }
100111
101112 if ( b == 0 )
102113 {
114+ bytes . MoveNext ( ) ;
103115 skip = true ;
104116 break ;
105117 }
106118
107- if ( TryReadNumber ( c , out var number ) )
119+ if ( TryReadNumber ( out var number ) )
108120 {
109121 return number ;
110122 }
111123
112- var name = ReadLiteral ( c ) ;
113- if ( name == null )
124+ if ( ! TryReadLiteral ( out var name ) )
114125 {
115126 throw new InvalidOperationException ( $ "The binary portion of the type 1 font was invalid at position { bytes . CurrentOffset } .") ;
116127 }
@@ -197,12 +208,21 @@ char GetNext()
197208 return null ;
198209 }
199210
200- private bool TryReadNumber ( char c , out Type1Token numberToken )
211+ private bool TryReadNumber ( out Type1Token numberToken )
201212 {
202213 char GetNext ( )
203214 {
204215 bytes . MoveNext ( ) ;
205- return ( char ) bytes . CurrentByte ;
216+ return ( char ) ( bytes . Peek ( ) ?? 0 ) ;
217+ }
218+
219+ char c = ( char ) ( bytes . Peek ( ) ?? 0 ) ;
220+
221+ if ( ! ( ( c >= '0' && c <= '9' ) || c is '+' or '-' ) )
222+ {
223+ // Easy out. Not a valid number
224+ numberToken = null ;
225+ return false ;
206226 }
207227
208228 numberToken = null ;
@@ -251,8 +271,6 @@ char GetNext()
251271 else
252272 {
253273 // integer
254- bytes . Seek ( bytes . CurrentOffset - 1 ) ;
255-
256274 numberToken = new Type1Token ( sb . ToString ( ) , Type1Token . TokenType . Integer ) ;
257275 return true ;
258276 }
@@ -309,7 +327,6 @@ char GetNext()
309327 }
310328 }
311329
312- bytes . Seek ( bytes . CurrentOffset - 1 ) ;
313330 if ( radix != null )
314331 {
315332 var number = Convert . ToInt32 ( sb . ToString ( ) , int . Parse ( radix . ToString ( ) , CultureInfo . InvariantCulture ) ) ;
@@ -323,14 +340,9 @@ char GetNext()
323340 return true ;
324341 }
325342
326- private string ReadLiteral ( char ? previousCharacter = null )
343+ private bool TryReadLiteral ( out string ? value )
327344 {
328345 literalBuffer . Clear ( ) ;
329- if ( previousCharacter . HasValue )
330- {
331- literalBuffer . Append ( previousCharacter ) ;
332- }
333-
334346 do
335347 {
336348 var b = bytes . Peek ( ) ;
@@ -350,8 +362,16 @@ private string ReadLiteral(char? previousCharacter = null)
350362 literalBuffer . Append ( c ) ;
351363 } while ( bytes . MoveNext ( ) ) ;
352364
353- var literal = literalBuffer . ToString ( ) ;
354- return literal . Length == 0 ? null : literal ;
365+ if ( literalBuffer . Length > 0 )
366+ {
367+ value = literalBuffer . ToString ( ) ;
368+ return true ;
369+ }
370+ else
371+ {
372+ value = null ;
373+ return false ;
374+ }
355375 }
356376
357377 private string ReadComment ( )
@@ -377,7 +397,7 @@ private Type1DataToken ReadCharString(int length)
377397 // Skip preceding space.
378398 bytes . MoveNext ( ) ;
379399 // TODO: may be wrong
380- // bytes.MoveNext();
400+ // bytes.MoveNext();
381401
382402 byte [ ] data = new byte [ length ] ;
383403 for ( int i = 0 ; i < length ; i ++ )
0 commit comments