Skip to content

Commit e990239

Browse files
committed
Don't require &mut [Param] with terminfo::parm::expand()
1 parent c9e234a commit e990239

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

src/libextra/terminfo/parm.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
1313
use core::prelude::*;
1414
use core::{char, int, vec};
15+
use core::iterator::IteratorUtil;
1516

1617
#[deriving(Eq)]
1718
enum States {
@@ -60,15 +61,12 @@ impl Variables {
6061
To be compatible with ncurses, `vars` should be the same between calls to `expand` for
6162
multiple capabilities for the same terminal.
6263
*/
63-
pub fn expand(cap: &[u8], params: &mut [Param], vars: &mut Variables)
64+
pub fn expand(cap: &[u8], params: &[Param], vars: &mut Variables)
6465
-> Result<~[u8], ~str> {
65-
assert!(cap.len() != 0, "expanding an empty capability makes no sense");
66-
assert!(params.len() <= 9, "only 9 parameters are supported by capability strings");
67-
6866
let mut state = Nothing;
6967
let mut i = 0;
7068

71-
// expanded cap will only rarely be smaller than the cap itself
69+
// expanded cap will only rarely be larger than the cap itself
7270
let mut output = vec::with_capacity(cap.len());
7371

7472
let mut cur;
@@ -77,6 +75,12 @@ pub fn expand(cap: &[u8], params: &mut [Param], vars: &mut Variables)
7775

7876
let mut intstate = ~[];
7977

78+
// Copy parameters into a local vector for mutability
79+
let mut mparams = [Number(0), ..9];
80+
for mparams.mut_iter().zip(params.iter()).advance |(dst, &src)| {
81+
*dst = src;
82+
}
83+
8084
while i < cap.len() {
8185
cur = cap[i] as char;
8286
let mut old_state = state;
@@ -163,7 +167,7 @@ pub fn expand(cap: &[u8], params: &mut [Param], vars: &mut Variables)
163167
Number(x) => stack.push(Number(!x)),
164168
_ => return Err(~"non-number on stack with %~")
165169
},
166-
'i' => match (copy params[0], copy params[1]) {
170+
'i' => match (copy mparams[0], copy mparams[1]) {
167171
(Number(ref mut x), Number(ref mut y)) => {
168172
*x += 1;
169173
*y += 1;
@@ -176,7 +180,7 @@ pub fn expand(cap: &[u8], params: &mut [Param], vars: &mut Variables)
176180
},
177181
PushParam => {
178182
// params are 1-indexed
179-
stack.push(copy params[char::to_digit(cur, 10).expect("bad param number") - 1]);
183+
stack.push(copy mparams[char::to_digit(cur, 10).expect("bad param number") - 1]);
180184
},
181185
SetVar => {
182186
if cur >= 'A' && cur <= 'Z' {

0 commit comments

Comments
 (0)