Mercurial > hg > octave-lyh
diff scripts/strings/patch @ 3789:2a257be5e488
[project @ 2001-02-09 04:12:30 by jwe]
author | jwe |
---|---|
date | Fri, 09 Feb 2001 04:12:31 +0000 |
parents | |
children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scripts/strings/patch @@ -0,0 +1,81 @@ +*** strrep.m-2.1.28 Tue May 2 01:39:24 2000 +--- strrep.m Fri May 12 08:21:15 2000 +*************** +*** 45,70 **** + t = s; + return; + endif + ind = findstr (s, x, 0); +! len = length (ind); +! if (len == 0) + t = s; +! else +! save_empty_list_elements_ok = empty_list_elements_ok; +! unwind_protect +! empty_list_elements_ok = 1; +! l_x = length (x); +! tmp = s (1 : ind (1) - 1); +! t = strcat (tmp, y); +! for k = 1 : len - 1 +! tmp = s (ind (k) + l_x : ind (k+1) - 1); +! t = strcat (t, tmp, y); +! endfor +! tmp = s (ind(len) + l_x : length (s)); +! t = [t, tmp]; +! unwind_protect_cleanup +! empty_list_elements_ok = save_empty_list_elements_ok; +! end_unwind_protect + endif + + endfunction +--- 45,94 ---- + t = s; + return; + endif ++ + ind = findstr (s, x, 0); +! if (length(ind) == 0) + t = s; +! +! elseif (length(y) > 0) # replacement +! ## Copy the parts of s that aren't being replaced. This is done +! ## with an index vector, with jumps where each search string +! ## is found. For a jump of 0 (target length == replacement length) +! ## the index is just cumsum ( ones (length (s))). For non-zero +! ## jumps, add the jump size to the ones vector at each found position. +! jump = length(y) - length(x); +! if (jump > 0) # s expands +! di = ones(size(s)); +! di (ind) = 1 + jump * ones (length (ind), 1); +! t (cumsum (di)) = s; +! if (size(s,1) == 1) +! t = t'; +! endif +! elseif (jump < 0) # s contracts +! di = ones (jump * length (ind) + length (s), 1); +! di (ind + jump * [0:length(ind)-1]) = 1 - jump * ones(length(ind), 1); +! t = s (cumsum (di)); +! else # s stays the same length +! t = s; +! endif +! +! ## Now, substitute a copy of the replacement string whereever the +! ## search string was found. Note that we must first update the +! ## target positions to account for any expansion or contraction +! ## of s that may have occurred. +! ind = ind + jump * [ 0 : length (ind) - 1 ]; +! repeat = [1 : length (y)]' * ones (1, length (ind)); +! dest = ones (length (y), 1) * ind + repeat - 1; +! t (dest) = y (repeat); +! +! else # deletion +! ## Build an index vector of all locations where the target was found +! ## in the search string, and zap them. +! t = toascii(s); +! repeat = [1 : length (x)]' * ones (1, length (ind)); +! delete = ones (length (x), 1) * ind + repeat - 1; +! t (delete) = []; +! t = setstr(t); + endif + + endfunction