Mercurial > projects > ldc
comparison tango/tango/text/stream/QuoteIterator.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:5825d48b27d1 | 132:1700239cab2e |
---|---|
1 /******************************************************************************* | |
2 | |
3 copyright: Copyright (c) 2004 Kris Bell. All rights reserved | |
4 | |
5 license: BSD style: $(LICENSE) | |
6 | |
7 version: Initial release: January 2006 | |
8 | |
9 author: Kris | |
10 | |
11 *******************************************************************************/ | |
12 | |
13 module tango.text.stream.QuoteIterator; | |
14 | |
15 private import tango.text.stream.StreamIterator; | |
16 | |
17 /******************************************************************************* | |
18 | |
19 Iterate across a set of text patterns. | |
20 | |
21 Each pattern is exposed to the client as a slice of the original | |
22 content, where the slice is transient. If you need to retain the | |
23 exposed content, then you should .dup it appropriately. | |
24 | |
25 These iterators are based upon the IBuffer construct, and can | |
26 thus be used in conjunction with other Iterators and/or Reader | |
27 instances upon a common buffer ~ each will stay in lockstep via | |
28 state maintained within the IBuffer. | |
29 | |
30 The content exposed via an iterator is supposed to be entirely | |
31 read-only. All current iterators abide by this rule, but it is | |
32 possible a user could mutate the content through a get() slice. | |
33 To enforce the desired read-only aspect, the code would have to | |
34 introduce redundant copying or the compiler would have to support | |
35 read-only arrays. | |
36 | |
37 See LineIterator, SimpleIterator, RegexIterator, QuotedIterator. | |
38 | |
39 | |
40 *******************************************************************************/ | |
41 | |
42 class QuoteIterator(T) : StreamIterator!(T) | |
43 { | |
44 private T[] delim; | |
45 | |
46 /*********************************************************************** | |
47 | |
48 Construct an uninitialized iterator. For example: | |
49 --- | |
50 auto lines = new LineIterator!(char); | |
51 | |
52 void somefunc (IBuffer buffer) | |
53 { | |
54 foreach (line; lines.set(buffer)) | |
55 Cout (line).newline; | |
56 } | |
57 --- | |
58 | |
59 Construct a streaming iterator upon a buffer: | |
60 --- | |
61 void somefunc (IBuffer buffer) | |
62 { | |
63 foreach (line; new LineIterator!(char) (buffer)) | |
64 Cout (line).newline; | |
65 } | |
66 --- | |
67 | |
68 Construct a streaming iterator upon a conduit: | |
69 --- | |
70 foreach (line; new LineIterator!(char) (new FileConduit ("myfile"))) | |
71 Cout (line).newline; | |
72 --- | |
73 | |
74 ***********************************************************************/ | |
75 | |
76 this (T[] delim, InputStream stream = null) | |
77 { | |
78 super (stream); | |
79 this.delim = delim; | |
80 } | |
81 | |
82 /*********************************************************************** | |
83 | |
84 ***********************************************************************/ | |
85 | |
86 private uint pair (T[] content, T quote) | |
87 { | |
88 foreach (int i, T c; content) | |
89 if (c is quote) | |
90 return found (set (content.ptr, 0, i) + 1); | |
91 | |
92 return notFound; | |
93 } | |
94 | |
95 /*********************************************************************** | |
96 | |
97 ***********************************************************************/ | |
98 | |
99 protected uint scan (void[] data) | |
100 { | |
101 auto content = (cast(T*) data.ptr) [0 .. data.length / T.sizeof]; | |
102 | |
103 foreach (int i, T c; content) | |
104 if (has (delim, c)) | |
105 return found (set (content.ptr, 0, i)); | |
106 else | |
107 if (c is '"' || c is '\'') | |
108 if (i) | |
109 return found (set (content.ptr, 0, i)); | |
110 else | |
111 return pair (content[1 .. content.length], c); | |
112 | |
113 return notFound; | |
114 } | |
115 } |