Skip to content

Commit 0123da7

Browse files
BurdetteLamarkou
andauthored
Doc for StringScanner (#96)
#peek_byte and #scan_byte not updated (not available in my repo -- sorry). --------- Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
1 parent ca66d48 commit 0123da7

File tree

5 files changed

+1908
-415
lines changed

5 files changed

+1908
-415
lines changed

.document

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
COPYING
2+
LICENSE.txt
3+
NEWS.md
4+
README.md
5+
ext/strscan/strscan.c
6+
ext/strscan/helper_methods.md
7+

ext/strscan/helper_methods.md

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
## Helper Methods
2+
3+
These helper methods display values returned by scanner's methods.
4+
5+
### `put_situation(scanner)`
6+
7+
Display scanner's situation:
8+
9+
- Byte position (`#pos`).
10+
- Character position (`#charpos`)
11+
- Target string (`#rest`) and size (`#rest_size`).
12+
13+
```
14+
scanner = StringScanner.new('foobarbaz')
15+
scanner.scan(/foo/)
16+
put_situation(scanner)
17+
# Situation:
18+
# pos: 3
19+
# charpos: 3
20+
# rest: "barbaz"
21+
# rest_size: 6
22+
```
23+
24+
### `put_match_values(scanner)`
25+
26+
Display the scanner's match values:
27+
28+
```
29+
scanner = StringScanner.new('Fri Dec 12 1975 14:39')
30+
pattern = /(?<wday>\w+) (?<month>\w+) (?<day>\d+) /
31+
scanner.match?(pattern)
32+
put_match_values(scanner)
33+
# Basic match values:
34+
# matched?: true
35+
# matched_size: 11
36+
# pre_match: ""
37+
# matched : "Fri Dec 12 "
38+
# post_match: "1975 14:39"
39+
# Captured match values:
40+
# size: 4
41+
# captures: ["Fri", "Dec", "12"]
42+
# named_captures: {"wday"=>"Fri", "month"=>"Dec", "day"=>"12"}
43+
# values_at: ["Fri Dec 12 ", "Fri", "Dec", "12", nil]
44+
# []:
45+
# [0]: "Fri Dec 12 "
46+
# [1]: "Fri"
47+
# [2]: "Dec"
48+
# [3]: "12"
49+
# [4]: nil
50+
```
51+
52+
### `match_values_cleared?(scanner)`
53+
54+
Returns whether the scanner's match values are all properly cleared:
55+
56+
```
57+
scanner = StringScanner.new('foobarbaz')
58+
match_values_cleared?(scanner) # => true
59+
put_match_values(scanner)
60+
# Basic match values:
61+
# matched?: false
62+
# matched_size: nil
63+
# pre_match: nil
64+
# matched : nil
65+
# post_match: nil
66+
# Captured match values:
67+
# size: nil
68+
# captures: nil
69+
# named_captures: {}
70+
# values_at: nil
71+
# [0]: nil
72+
scanner.scan(/foo/)
73+
match_values_cleared?(scanner) # => false
74+
```
75+
76+
## The Code
77+
78+
```
79+
def put_situation(scanner)
80+
puts '# Situation:'
81+
puts "# pos: #{scanner.pos}"
82+
puts "# charpos: #{scanner.charpos}"
83+
puts "# rest: #{scanner.rest.inspect}"
84+
puts "# rest_size: #{scanner.rest_size}"
85+
end
86+
```
87+
88+
```
89+
def put_match_values(scanner)
90+
puts '# Basic match values:'
91+
puts "# matched?: #{scanner.matched?}"
92+
value = scanner.matched_size || 'nil'
93+
puts "# matched_size: #{value}"
94+
puts "# pre_match: #{scanner.pre_match.inspect}"
95+
puts "# matched : #{scanner.matched.inspect}"
96+
puts "# post_match: #{scanner.post_match.inspect}"
97+
puts '# Captured match values:'
98+
puts "# size: #{scanner.size}"
99+
puts "# captures: #{scanner.captures}"
100+
puts "# named_captures: #{scanner.named_captures}"
101+
if scanner.size.nil?
102+
puts "# values_at: #{scanner.values_at(0)}"
103+
puts "# [0]: #{scanner[0]}"
104+
else
105+
puts "# values_at: #{scanner.values_at(*(0..scanner.size))}"
106+
puts "# []:"
107+
scanner.size.times do |i|
108+
puts "# [#{i}]: #{scanner[i].inspect}"
109+
end
110+
end
111+
end
112+
```
113+
114+
```
115+
def match_values_cleared?(scanner)
116+
scanner.matched? == false &&
117+
scanner.matched_size.nil? &&
118+
scanner.matched.nil? &&
119+
scanner.pre_match.nil? &&
120+
scanner.post_match.nil? &&
121+
scanner.size.nil? &&
122+
scanner[0].nil? &&
123+
scanner.captures.nil? &&
124+
scanner.values_at(0..1).nil? &&
125+
scanner.named_captures == {}
126+
end
127+
```
128+

ext/strscan/link_refs.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[1]: rdoc-ref:StringScanner@Stored+String
2+
[2]: rdoc-ref:StringScanner@Byte+Position+-28Position-29
3+
[3]: rdoc-ref:StringScanner@Target+Substring
4+
[4]: rdoc-ref:StringScanner@Setting+the+Target+Substring
5+
[5]: rdoc-ref:StringScanner@Traversing+the+Target+Substring
6+
[6]: https://docs.ruby-lang.org/en/master/Regexp.html
7+
[7]: rdoc-ref:StringScanner@Character+Position
8+
[8]: https://docs.ruby-lang.org/en/master/String.html#method-i-5B-5D
9+
[9]: rdoc-ref:StringScanner@Match+Values
10+
[10]: rdoc-ref:StringScanner@Fixed-Anchor+Property
11+
[11]: rdoc-ref:StringScanner@Positions
12+
[13]: rdoc-ref:StringScanner@Captured+Match+Values
13+
[14]: rdoc-ref:StringScanner@Querying+the+Target+Substring
14+
[15]: rdoc-ref:StringScanner@Searching+the+Target+Substring
15+
[16]: https://docs.ruby-lang.org/en/master/Regexp.html#class-Regexp-label-Groups+and+Captures
16+
[17]: rdoc-ref:StringScanner@Matching
17+
[18]: rdoc-ref:StringScanner@Basic+Match+Values

0 commit comments

Comments
 (0)