1212
1313use core:: prelude:: * ;
1414use core:: { char, int, vec} ;
15+ use core:: iterator:: IteratorUtil ;
1516
1617#[ deriving( Eq ) ]
1718enum 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