;-------------------------------------------------------------
;+
; NAME:
; STREP
; PURPOSE:
; Edit a string by position. Precede, Follow, Replace, Delete.
; CATEGORY:
; CALLING SEQUENCE:
; newstring = strep(string,cmd,p,ss,[iflg])
; INPUTS:
; string = string to edit. in
; cmd = edit command: in
; 'P' = precede position p with substring ss.
; 'F' = follow position p with substring ss.
; 'R' = replace text starting at position p
; with text from substring ss.
; 'D' = delete N characters starting at
; position p. The calling sequence for
; this command is slightly different:
; IFLG = STREP(string,'D',p,n,[iflg])
; Where n = number of characters to delete.
; p = character position to use. in
; 0 = first char. Any number larger
; than the string length = last char.
; ss = substring to use. For 'D' command in
; n is used instead of ss.
; KEYWORD PARAMETERS:
; OUTPUTS:
; iflg = 0 for a successful edit, out
; iflg = -1 for an error and no change to string.
; newstring = edited string. out
; COMMON BLOCKS:
; NOTES:
; MODIFICATION HISTORY:
; Written by R. Sterner, 27 Dec, 1984.
; Converted to SUN 13 Aug, 1989 --- R. Sterner.
; R. Sterner, 2010 Apr 29 --- Converted arrays from () to [].
; R. Sterner, 2010 Dec 20 --- Fixed 'P', 'F', and 'R' for ss=NULL string.
; Null string was terminating the string where inserted (since 1984).
;
; Copyright (C) 1984, Johns Hopkins University/Applied Physics Laboratory
; This software may be used, copied, or redistributed as long as it is not
; sold and this copyright notice is reproduced on each copy made. This
; routine is provided as is without any express or implied warranties
; whatsoever. Other limitations apply as described in the file disclaimer.txt.
;-
;-------------------------------------------------------------
function strep,s,cmd,ip,ss,iflg, help=hlp
if (n_params(0) lt 4) or keyword_set(hlp) then begin
print,' Edit a string by position. Precede, Follow, Replace, Delete.'
print,' newstring = strep(string,cmd,p,ss,[iflg])'
print,' string = string to edit. in'
print,' cmd = edit command: in'
print," 'P' = precede position p with substring ss."
print," 'F' = follow position p with substring ss."
print," 'R' = replace text starting at position p"
print,' with text from substring ss.'
print," 'D' = delete N characters starting at"
print,' position p. The calling sequence for'
print,' this command is slightly different:'
print," IFLG = STREP(string,'D',p,n,[iflg])"
print,' Where n = number of characters to delete.'
print,' p = character position to use. in'
print,' 0 = first char. Any number larger'
print,' than the string length = last char.'
print," ss = substring to use. For 'D' command in"
print,' n is used instead of ss.'
print,' iflg = 0 for a successful edit, out'
print,' iflg = -1 for an error and no change to string.'
print,' newstring = edited string. out'
return, -1
endif
N = STRLEN(S) - 1
IF N LT 0 THEN $
IF CMD EQ 'D' THEN RETURN, '' ELSE RETURN, SS
P = IP>0<N
BS = BYTE(S)
IF (CMD NE 'D') THEN BSS = BYTE(SS)
JFLG = 0
CASE CMD OF
'P': BEGIN
if ss ne '' then begin ; Ignore NULL string.
IF P EQ 0 THEN T = [BSS,BS] ELSE T = [BS[0:P-1],BSS,BS[P:*]]
endif else t=bs
END
'F': BEGIN
if ss ne '' then begin ; Ignore NULL string.
IF P EQ N THEN BEGIN
T = [BS,BSS]
ENDIF ELSE BEGIN
IF IP GE 0 THEN BEGIN
T = [BS[0:P],BSS,BS[P+1:*]]
ENDIF ELSE BEGIN
T = [BSS, BS]
ENDELSE
ENDELSE
endif else t=bs
END
'R': BEGIN
NSS = STRLEN(SS)
IF NSS GT N - P + 1 THEN $
T = [BS[0:P-1],BSS] $
ELSE BEGIN $
T = BS
if ss ne '' then T[P]=BSS
ENDELSE
END
'D': BEGIN
ND = SS < (N + 1)
IF P EQ 0 THEN $
IF ND EQ N+1 THEN T = '' ELSE $
T = [BS[ND:*]]
IF P GT 0 THEN $
IF ND+P-1 GE N THEN $
T = [BS[0:P-1]] ELSE $
T = [BS[0:P-1],BS[ND+P:*]]
END
ELSE: JFLG = -1
ENDCASE
IF JFLG NE 0 THEN T = S
IF JFLG EQ 0 THEN T = STRING(T)
IF N_PARAMS(0) EQ 5 THEN IFLG = JFLG
RETURN,T
END