I think I misread the requirement. Try this version, which also handles
block commands.
/*
PREFIXO
K -- Kopy prefix subcommand
O -- Overlay prefix subcommand
OO -- Overlay block prefix subcommand
Designed to be used with:
COMMAND SET PREFIX SYNONYM K PREFIXO
COMMAND SET PREFIX SYNONYM O PREFIXO
COMMAND SET PREFIX SYNONYM OO PREFIXO
*/
arg p f l rest
if f = 'CLEAR' | p <> 'PREFIX' then exit /* Nothing to do, great */
parse source . . . . . pcmd .
if rest <> '' then signal Error /* Operand, we don't do those */
if index('KOO', pcmd) = 0 then signal Error /* Not ours?? error */
'COMMAND LOCATE :'l /* Go to the line we're handling */
if pcmd = 'K' then signal JustWait /* Kopying, go Wait for O */
'EXTRACT /PENDING K' /* Is there a pending K?? */
if pending.0 = 0 then signal JustWait /* No, just wait */
kline = pending.1 /* Remember where Kopied line is */
'COMMAND LOCATE :'pending.1 'COMMAND EXTRACT /CURLINE' /* Go */
kopy = curline.3 /* Get the Kopied data */
'COMMAND EXTRACT /PENDING BLOCK OO :0' l /* See if OO pending */
select
when pcmd = 'O' then do
call Overlay l l /* Simple O, do that */
'COMMAND LOCATE :'kline 'SET PENDING OFF' /* And clear K */
end
when pending.0 = 0 then /* OO and not pending?? */
'COMMAND LOCATE :'l 'COMMAND SET PENDING BLOCK OO' /* Wait */
otherwise /* OO and already a pending K and OO, process it */
call Overlay pending.1 l /* Go do the overlays */
'COMMAND LOCATE :'pending.1 'SET PENDING OFF' /* Clear OO */
'COMMAND LOCATE :'kline 'SET PENDING OFF' /* And clear K */
end
exit
/* Do overlays: Build replacement lines, overlaying only blanks */
Overlay:
arg s e /* Start and end lines */
do n = s to e /* Spin through them */
'COMMAND LOCATE :'n 'COMMAND EXTRACT /CURLINE' /* Get data */
r = '' /* No replacement yet */
do i = 1 to length(kopy) /* Only care about overlay length */
c = substr(curline.3, i, 1) /* Get character from line */
if c = '' then r = r || substr(kopy, i, 1) /* Overlay blank */
else r = r || c /* Don't overlay if not blank */
end
if r <> '' then 'COMMAND REPLACE' r /* Replace if not null */
end
return
JustWait: /* Reset pending command, either K or OO */
'COMMAND SET PENDING ON' pcmd
exit
Error: /* Invalid, show prefix error */
'COMMAND SET PENDING ERROR' pcmd rest
exit
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN