1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
4+
5+ using schema . util . strings ;
6+
7+
8+ namespace schema . text . reader ;
9+
10+ public sealed partial class SchemaTextReader {
11+ public byte ? [ ] ReadBytesIncludingEmpty ( string separators ,
12+ string terminators )
13+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
14+ terminators ,
15+ this . ConvertByte_ ) ;
16+
17+ public byte ? [ ] ReadHexBytesIncludingEmpty ( string separators ,
18+ string terminators )
19+ => this . ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ ( separators ,
20+ terminators ,
21+ this . ConvertHexByte_ ) ;
22+
23+
24+ public sbyte ? [ ] ReadSBytesIncludingEmpty ( string separators ,
25+ string terminators )
26+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
27+ terminators ,
28+ this . ConvertSByte_ ) ;
29+
30+ public sbyte ? [ ] ReadHexSBytesIncludingEmpty ( string separators ,
31+ string terminators )
32+ => this . ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ ( separators ,
33+ terminators ,
34+ this . ConvertHexSByte_ ) ;
35+
36+
37+ public short ? [ ] ReadInt16sIncludingEmpty ( string separators ,
38+ string terminators )
39+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
40+ terminators ,
41+ this . ConvertInt16_ ) ;
42+
43+ public short ? [ ] ReadHexInt16sIncludingEmpty ( string separators ,
44+ string terminators )
45+ => this . ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ ( separators ,
46+ terminators ,
47+ this . ConvertHexInt16_ ) ;
48+
49+
50+ public ushort ? [ ] ReadUInt16sIncludingEmpty ( string separators ,
51+ string terminators )
52+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
53+ terminators ,
54+ this . ConvertUInt16_ ) ;
55+
56+ public ushort ? [ ] ReadHexUInt16sIncludingEmpty (
57+ string separators ,
58+ string terminators )
59+ => this . ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ ( separators ,
60+ terminators ,
61+ this . ConvertHexUInt16_ ) ;
62+
63+
64+ public int ? [ ] ReadInt32sIncludingEmpty ( string separators ,
65+ string terminators )
66+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
67+ terminators ,
68+ this . ConvertInt32_ ) ;
69+
70+
71+ public int ? [ ] ReadHexInt32sIncludingEmpty ( string separators ,
72+ string terminators )
73+ => this . ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ ( separators ,
74+ terminators ,
75+ this . ConvertHexInt32_ ) ;
76+
77+ public uint ? [ ] ReadUInt32sIncludingEmpty ( string separators ,
78+ string terminators )
79+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
80+ terminators ,
81+ this . ConvertUInt32_ ) ;
82+
83+ public uint ? [ ] ReadHexUInt32sIncludingEmpty ( string separators ,
84+ string terminators )
85+ => this . ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ ( separators ,
86+ terminators ,
87+ this . ConvertHexUInt32_ ) ;
88+
89+ public long ? [ ] ReadInt64sIncludingEmpty ( string separators ,
90+ string terminators )
91+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
92+ terminators ,
93+ this . ConvertInt64_ ) ;
94+
95+ public long ? [ ] ReadHexInt64sIncludingEmpty ( string separators ,
96+ string terminators )
97+ => this . ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ ( separators ,
98+ terminators ,
99+ this . ConvertHexInt64_ ) ;
100+
101+
102+ public ulong ? [ ] ReadUInt64sIncludingEmpty ( string separators ,
103+ string terminators )
104+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
105+ terminators ,
106+ this . ConvertUInt64_ ) ;
107+
108+
109+ public ulong ? [ ] ReadHexUInt64sIncludingEmpty (
110+ string separators ,
111+ string terminators )
112+ => this . ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ ( separators ,
113+ terminators ,
114+ this . ConvertHexUInt64_ ) ;
115+
116+
117+ public float ? [ ] ReadSinglesIncludingEmpty ( string separators ,
118+ string terminators )
119+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
120+ terminators ,
121+ this . ConvertSingle_ ) ;
122+
123+ public double ? [ ] ReadDoublesIncludingEmpty ( string separators ,
124+ string terminators )
125+ => this . ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ ( separators ,
126+ terminators ,
127+ this . ConvertDouble_ ) ;
128+
129+
130+ private IEnumerable < string > ReadSplitUpToAndPastTerminatorsIncludingEmpty_ (
131+ string separators ,
132+ string terminators ) {
133+ var match = this . ReadUpToAndPastTerminator ( terminators ) ;
134+ if ( match . Length == 0 ) {
135+ return [ ] ;
136+ }
137+
138+ return match . SplitViaChar ( separators , true ) ;
139+ }
140+
141+ private T ? [ ] ConvertSplitUpToAndPastTerminatorsIncludingEmpty_ < T > (
142+ string separators ,
143+ string terminators ,
144+ Func < string , T > converter ) where T : struct
145+ => this . ReadSplitUpToAndPastTerminatorsIncludingEmpty_ (
146+ separators ,
147+ terminators )
148+ . Select ( t => {
149+ var start = 0 ;
150+
151+ int i ;
152+ for ( i = 0 ; i < t . Length ; ++ i ) {
153+ var c = t [ i ] ;
154+ if ( c is '\t ' or ' ' or '\r ' or '\n ' ) {
155+ start ++ ;
156+ }
157+ }
158+
159+ if ( t . Length - start == 0 ) {
160+ return null ;
161+ }
162+
163+ return start == 0 ? t : t . Substring ( start ) ;
164+ } )
165+ . Select ( text => text != null ? converter ( text ) : ( T ? ) null )
166+ . ToArray ( ) ;
167+
168+ private T ? [ ] ConvertSplitUpToAndPastHexTerminatorsIncludingEmpty_ < T > (
169+ string separators ,
170+ string terminators ,
171+ Func < string , T > converter ) where T : struct
172+ => this . ReadSplitUpToAndPastTerminatorsIncludingEmpty_ (
173+ separators ,
174+ terminators )
175+ . Select ( t => {
176+ var start = 0 ;
177+
178+ int i ;
179+ for ( i = 0 ; i < t . Length ; ++ i ) {
180+ var c = t [ i ] ;
181+ if ( c is '\t ' or ' ' or '\r ' or '\n ' ) {
182+ start ++ ;
183+ } else {
184+ break ;
185+ }
186+ }
187+
188+ if ( t . Length - start == 0 ) {
189+ return ( T ? ) null ;
190+ }
191+
192+ if ( t [ i ] == '0' && i < t . Length - 1 && t [ i + 1 ] == 'x' ) {
193+ start += 2 ;
194+ }
195+
196+ return converter ( start == 0 ? t : t . Substring ( start ) ) ;
197+ } )
198+ . ToArray ( ) ;
199+ }
0 commit comments