Mercurial > pub > ImplabNet
comparison Implab/Formats/TextScanner.cs @ 173:ecfece82ca11 ref20160224
Working on text scanner
author | cin |
---|---|
date | Tue, 15 Mar 2016 02:11:06 +0300 |
parents | |
children | 983df35b3ca1 |
comparison
equal
deleted
inserted
replaced
172:92d5278d1b10 | 173:ecfece82ca11 |
---|---|
1 using System; | |
2 using Implab.Components; | |
3 | |
4 namespace Implab.Formats { | |
5 public abstract class TextScanner<TTag> : Disposable { | |
6 | |
7 char[] m_buffer; | |
8 int m_offset; | |
9 int m_length; | |
10 int m_tokenOffset; | |
11 int m_tokenLength; | |
12 TTag[] m_tags; | |
13 | |
14 BufferScanner<TTag> m_scanner; | |
15 | |
16 protected bool ReadTokenInternal() { | |
17 if (EOF) | |
18 return false; | |
19 | |
20 // create a new scanner from template (scanners are structs) | |
21 var inst = m_scanner; | |
22 | |
23 // initialize the scanner | |
24 inst.Init(m_buffer, m_offset, m_length); | |
25 | |
26 // do work | |
27 while (inst.Scan()) | |
28 Feed(ref inst); | |
29 | |
30 // save result; | |
31 m_buffer = inst.Buffer; | |
32 m_length = inst.Length; | |
33 m_offset = inst.Position; | |
34 m_tokenOffset = inst.TokenOffset; | |
35 m_tokenLength = inst.TokenLength; | |
36 | |
37 m_tags = inst.GetTokenTags(); | |
38 } | |
39 | |
40 protected string GetToken() { | |
41 return new String(m_buffer, m_tokenOffset, m_tokenLength); | |
42 } | |
43 | |
44 protected TTag[] Tags { | |
45 get { | |
46 return m_tags; | |
47 } | |
48 } | |
49 | |
50 /// <summary> | |
51 /// Feed the specified scanner. | |
52 /// </summary> | |
53 /// <param name="scanner">Scanner.</param> | |
54 /// <example> | |
55 /// protected override void Feed(ref BufferScanner<TTag> scanner) { | |
56 /// var size = scanner.Extend(); | |
57 /// var actual = m_reader.Read(scanner.Buffer, scanner.HiMark, size); | |
58 /// if (actual == 0) { | |
59 /// m_eof = true; | |
60 /// scanner.Eof(); | |
61 /// } else { | |
62 /// scanner.RaiseHiMark(actual); | |
63 /// } | |
64 /// } | |
65 /// </example> | |
66 protected abstract void Feed(ref BufferScanner<TTag> scanner); | |
67 | |
68 public abstract bool EOF { get; } | |
69 | |
70 } | |
71 } | |
72 |