src/main.rs

Thu, 19 Oct 2023 15:10:12 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Thu, 19 Oct 2023 15:10:12 -0500
changeset 2
254e1e4bd795
parent 0
548bf3cc032e
child 3
cec573b16b46
permissions
-rw-r--r--

Add whitespace and comment stripping

2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
1 // The main documentation is in the README.
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
2 #![doc = include_str!("../README.md")]
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
3
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 use std::io;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 use std::io::BufWriter;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 use std::io::Write;
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
7 use clap::Parser;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
8
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
9 /// Command line parameters
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
10 #[derive(Parser, Debug)]
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
11 #[clap(
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
12 about = env!("CARGO_PKG_DESCRIPTION"),
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
13 author = env!("CARGO_PKG_AUTHORS"),
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
14 version = env!("CARGO_PKG_VERSION"),
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
15 )]
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
16 struct CommandLineArgs {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
17 #[arg(long, short = 'c')]
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
18 /// Strip comments
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
19 strip_comments : bool,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
20
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
21 #[arg(long, short = 'w')]
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
22 /// Strip unnecessary whitespace
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
23 strip_whitespace : bool,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
24 }
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 enum Element {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 Added,
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 Deleted,
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 Replaced,
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 Other,
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 Comment,
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 enum Status {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 Output(Element),
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 Ignore(Element),
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 Scan(Element, bool),
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
42 use Status::*;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
43 use Element::*;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
44
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
45 struct Out<W : Write> {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
46 only_whitespace : bool,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
47 stored_whitespace : String,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
48 output : W,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
49 stack : Vec<Status>,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
50 whitespace_satisfied : bool,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
51 par_satisfied : bool,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
52 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
53
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
54 impl<W : Write> Out<W> {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
55 fn current(&self) -> Status {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
56 self.stack.last().map_or(Output(Other), |s| *s)
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
57 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
58
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
59 fn raw_out(&mut self, c : char) {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
60 write!(self.output, "{}", c).unwrap();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
61 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
62
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
63 pub fn out(&mut self, c : char) {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
64 self.only_whitespace = false;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
65 write!(self.output, "{}{}", self.stored_whitespace, c).unwrap();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
66 self.stored_whitespace.clear();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
67 self.whitespace_satisfied = false;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
68 self.par_satisfied = false;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
69 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
70
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
71 pub fn whitespace(&mut self, c : char) {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
72 self.stored_whitespace.push(c);
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
73 }
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
75 pub fn line_end(&mut self, strip_ws : bool, input_only_ws : bool) {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
76 let cur = self.current();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
77 let skip_linefeed = if input_only_ws {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
78 // Need a paragraph break
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
79 strip_ws && self.par_satisfied
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
80 } else if strip_ws {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
81 self.only_whitespace && self.whitespace_satisfied
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
82 } else if let Ignore(Comment) = cur {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
83 // Skip comment-only lines if the comment is ignored
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
84 self.only_whitespace
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
85 } else if let Ignore(_) = cur {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
86 // Skip line feeds in ignored bits
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
87 true
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
88 } else {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
89 false
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
90 };
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
91
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
92 if !skip_linefeed {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
93 if !strip_ws {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
94 write!(self.output, "{}", self.stored_whitespace).unwrap();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
95 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
96 self.raw_out('\n');
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
97 self.whitespace_satisfied = true;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
98 self.par_satisfied = self.only_whitespace;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
99 }
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
101 if let Ignore(Comment) | Output(Comment) = cur {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
102 self.stack.pop();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
103 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
104
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
105 self.stored_whitespace.clear();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
106 self.only_whitespace = true;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
107 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
108
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
109 pub fn flush(&mut self) {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
110 self.output.flush().unwrap();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
111 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
112 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
113
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
114 fn main() {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
115 let cli = CommandLineArgs::parse();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
116 let input = io::stdin();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
117
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
118 let mut o = Out {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
119 only_whitespace : true,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
120 stored_whitespace : String::new(),
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
121 output : BufWriter::new(io::stdout()),
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
122 stack : Vec::new(),
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
123 whitespace_satisfied : true,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
124 par_satisfied : true,
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
125 };
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
126
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 let mut lineno = 0;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 for l in input.lines().map(|l| l.unwrap()) {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 lineno += 1;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 let mut chars = l.chars();
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 let mut maybe_next_char = None;
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
133 let mut input_only_ws = true;
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
134
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 'process_line: loop {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 let next_char = match maybe_next_char {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 None => chars.next(),
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 Some(c) => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 maybe_next_char = None;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 Some(c)
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 };
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
143 input_only_ws = input_only_ws && next_char.map_or(true, |c| c.is_whitespace());
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
144 match(o.current(), next_char) {
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 (_, None) => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 break 'process_line;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 (st @ (Output(e) | Ignore(e)), Some('\\')) if e != Comment => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 let mut command = String::new();
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 let mut first = true;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 maybe_next_char = 'scan_command: loop {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 match chars.next() {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 Some(c) if first && (c=='{' || c=='}' || c=='\\') => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 command.push(c);
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 break 'scan_command None;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 Some(c) if c.is_alphanumeric() => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 command.push(c);
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 maybe_c => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 break 'scan_command maybe_c;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 first = false;
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 };
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 let output_guard = if let Ignore(_) = st { false } else { true };
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 match command.as_str() {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 "added" => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
169 o.stack.push(Scan(Added, true && output_guard));
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 "replaced" => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
172 o.stack.push(Scan(Replaced, true && output_guard));
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 "deleted" => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
175 o.stack.push(Scan(Deleted, false));
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 _ => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 if output_guard {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
179 o.out('\\');
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
180 command.chars().for_each(|c| o.out(c.clone()));
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 };
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184 },
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
185 (Scan(next, out), Some(c)) => {
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 match c {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
187 '{' => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
188 o.stack.pop();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
189 o.stack.push(if out { Output(next) } else { Ignore(next) });
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
191 ' ' => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 _ => panic!("Non-whitespace character ({c}) separating arguments on\
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 line {lineno}"),
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197 (Output(e), Some('{')) if e != Comment => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
198 o.out('{');
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
199 o.stack.push(Output(Other));
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
201 (Ignore(e), Some('{')) if e != Comment => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
202 o.stack.push(Ignore(Other));
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
204 (Output(Added) | Ignore(Added) | Output(Deleted) | Ignore(Deleted), Some('}')) => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
205 o.stack.pop();
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
207 (Output(Replaced) | Ignore(Replaced), Some('}')) => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
208 o.stack.pop();
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
209 o.stack.push(Scan(Deleted, false));
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
210 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
211 (Output(Other), Some('}')) => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
212 o.out('}');
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
213 o.stack.pop();
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
214 },
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
215 (Ignore(e), Some('}')) if e != Comment => {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
216 o.stack.pop();
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
217 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
218 (Output(e), Some('%')) if e != Comment=> {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
219 if cli.strip_comments {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
220 if o.stored_whitespace.is_empty() && !o.only_whitespace {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
221 // Output comment marker if it is required to maintain
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
222 // lack of whitespace.
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
223 o.out('%');
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
224 }
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
225 o.stack.push(Ignore(Comment));
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
226 } else {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
227 o.out('%');
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
228 o.stack.push(Output(Comment));
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
229 }
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
230 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
231 (Ignore(e), Some('%')) if e != Comment => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
232 o.stack.push(Ignore(Comment));
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
233 },
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
234 (Output(_), Some(c)) if c.is_whitespace() => {
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
235 o.whitespace(c);
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
236 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
237 (Output(_), Some(c)) => {
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
238 o.out(c);
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
239 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
240 (Ignore(_), Some(_)) => {
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
241 },
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
242 };
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
243 }
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
244
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
245 o.line_end(cli.strip_whitespace, input_only_ws);
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
246 }
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
247
2
254e1e4bd795 Add whitespace and comment stripping
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
248 o.flush();
0
548bf3cc032e Initial rough version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
249 }

mercurial