12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- %
- % MOVE-STRINGS.RED - "Fast" string copying utilities.
- %
- % Author: William F. Galway
- % Symbolic Computation Group
- % Computer Science Dept.
- % University of Utah
- % Date: 8 June 1982
- % Copyright (c) 1982 University of Utah
- %
- % Utilities for moving subranges of strings around (and other related
- % operations). Written in SysLisp for speed. (Modeled after
- % PI:STRING-OPS.RED and PI:COPIERS.RED.)
- % Equivalent routines for vectors should be added (one of these days).
- on SysLisp;
- syslsp procedure MoveSubstringToFrom(DestString, SourceString,
- DestIndex, SourceIndex,
- SubrangeLength);
- % Quite a few arguments there, but should be clear enough? Returns the
- % modified destination string.
- % WARNING--this version screws up when destination and source overlap
- % (movement of one subrange of a string to another subrange of the same
- % string.)
- begin scalar rawsrc, rawdst, isrc, idst, maxindx, len, i;
- isrc := IntInf SourceIndex;
- idst := IntInf DestIndex;
- rawsrc := StrInf SourceString;
- rawdst := StrInf DestString;
- len := IntInf SubrangeLength;
- % Get upper bound on how far to copy--don't go past end of destination
- % or source, or subrange.
- % We want (i + idst) <= StrLen rawdst AND (i + isrc) <= StrLen rawsrc
- % AND i < SubrangeLength. (Strictly less than SubrangeLength, since i
- % starts at 0.) maxindx is the appropriate bound on i.
- maxindx := (StrLen rawdst) - idst;
- if maxindx >= len then
- maxindx := len-1;
- if maxindx > (StrLen rawsrc) - isrc then
- maxindx := (StrLen rawsrc) - isrc;
- i := 0;
- loop:
- % if we've run out of stuff, quit.
- if i > maxindx then
- goto loopex;
- % Otherwise, copy the string.
- StrByt(rawdst, i + idst) := StrByt(rawsrc, i + isrc);
- i := i+1;
- goto loop;
- loopex:
- return DestString;
- end;
- syslsp procedure FillSubstring(DestString, DestIndex, SubrangeLength, chr);
- % Fill a subrange of a string with a character code.
- begin scalar rawdst, rawchr, idst,len, maxindx, i;
- idst := IntInf DestIndex;
- rawdst := StrInf DestString;
- rawchr := IntInf chr;
- len := IntInf SubrangeLength;
- maxindx := StrLen rawdst;
- if maxindx >= len then
- maxindx := len-1;
- i := 0;
- loop:
- % if we've run out of stuff, quit.
- if i > maxindx then
- goto loopex;
- % Copy the character into the destination.
- StrByt(rawdst, i + idst) := rawchr;
- i := i+1;
- goto loop;
- loopex:
- return DestString;
- end;
- off SysLisp;
|