home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
prgramer
/
rexx
/
4macrs
/
expander.rex
next >
Wrap
OS/2 REXX Batch file
|
1993-05-25
|
11KB
|
343 lines
/* expander for SourceLink32 */
/* creation 15.3.93 by Thomas Korfhage ++49 6446 2931 */
/* history start 'his 1. steps in rexx' */
/* expander uses file FORMS.LST in sourcelink macro directory */
'S_CLEAR_MACRO_OUTPUT'
'S_GET_CURR_EDITMODE Emode'
if Emode = 'READONLY' then do
'S_MSG' 'File is readonly!,,Change to edit?,'RESULT
if RESULT = 'CANCEL' then
exit
'S_CHG_EDITMODE'
end
'S_GET_ENV_INFO SLINK2 Slink2Path'
FormFile = Slink2Path || "\MACROS\FORMS.LST"
'S_DOES_FILE_EXIST' FormFile 'FileExists'
if FileExists = 'FALSE' then do
'S_MSG File for Forms not exist,FormFile,,RESULT'
exit
end
'S_GET_CURR_FILENAME' ActFileName
if ARG(1,'E')then do
ARG TransOrForm
if Wordpos( TransOrForm, 'TRANS FORM WFORM') \= 0 then do
'S_DISABLE_WINDOW'
Signal Value TransOrForm
end
end
'S_MSG' 'Invalid Argument (TRANS | FORM),' TransOrForm ',,'RESULT
exit
TRANS:
'S_GET_SELECTED_SIZE' CurrentSelLen
LeadText = ''
TermText = ''
if CurrentSelLen > 0 then do
'S_GET_SELECTED_TEXT' OldText
'S_DEL_SELECTED'
end
else do
'S_GET_CURR_WORD' OldText
'S_DEL_WORD'
if Length(OldText) >= 1 then do
PrevText = OldText
OldText = Strip(OldText,,'(')
OldText = Strip(OldText,,'[')
OldText = Strip(OldText,,')')
OldText = Strip(OldText,,']')
OldText = Strip(OldText,,',')
OldText = Strip(OldText,,';')
PPos = Pos(OldText,PrevText)
LeadText = Substr(PrevText,1,PPos-1)
TermText = Substr(PrevText,PPos+Length(OldText))
end
else do
'S_ENABLE_WINDOW'
exit
end
end
TransSearch = '~#~' || OldText || ':'
call GetReplacement TransSearch
'S_INSERT_STRING' LeadText||RESULT||TermText
do Length(TermText)
'S_PREV_CHAR'
end
'S_ENABLE_WINDOW'
exit
FORM:
/* query form name */
ptext = 'Name of form to insert,'
'S_PROMPT' ptext FormId
if FormId = 'CANCEL' then do
'S_ENABLE_WINDOW'
exit
end
WFORM:
/* get possible replacements */
'S_GET_CURR_WORD' CurrentWord
if TransOrForm = 'WFORM' then do
FormId = CurrentWord
'S_DEL_WORD'
end
'S_GET_SELECTED_SIZE' CurrentSelLen
if CurrentSelLen > 0 then do
'S_GET_SELECTED_TEXT' CurrentSelected
'S_COPY_SEL_TO_PASTE'
end
else
CurrentSelected = ''
'S_GET_COL_NUM' CurrentColNo
'S_GET_LINE_NUM' CurrentLinNo
'S_SELECT_LINE'
'S_GET_SELECTED_TEXT' CurrentLine
CurrentLine = Left(CurrentLine,Length(CurrentLine)-2)
CurrentEOL = Substr(CurrentLine, CurrentColNo)
/* restore */
'S_GOTO_LINE' CurrentLinNo
/* Get legth of last Line */
LastLineLen = 0
do 10
'S_GET_CURSOR_POS CursorPos'
if CursorPos < 1 then
leave
'S_BEG_OF_LINE'
'S_PREV_LINE'
'S_GET_LINE_LEN LastLineLen'
if LastLineLen > 4 then
leave
end
if LastLineLen <= 4 then
LastLineLen = 80 ;
/* restore */
'S_GOTO_COL' CurrentColNo
'S_GOTO_LINE' CurrentLinNo
/* look for form in Formfile */
'S_GET_FILE_BUFFNUM' FormFile 'ActBuffNo'
if RC = 0 then do
'S_GOTO_BUFF' ActBuffNo
end
else
'S_OPEN_SL_FILE 0 R N' FormFile
SearchString = '#~#' || FormId || '#~#'
drop FormLines.
'S_SEARCH_FWD 1 1' SearchString
if RC = 0 then do
/* form found */
'S_DISABLE_WINDOW'
/* get Info from header line */
'S_SELECT_LINE'
'S_GET_SELECTED_TEXT' 'ActLine'
ActLine = Left( ActLine, Length(ActLine)-2)
parse value ActLine with SearchString . 'info:' FormName 'pos:' FormIndent FormMargin ttrest
FormName = Strip(FormName)
FormIndent = Left(FormIndent,1)
/* for center and right, check margin */
if FormIndent = '!' | FormIndent = '>' then do
/* a non numeric margin value forces query */
do 3 while Datatype(FormMargin) \= 'NUM'
'S_PROMPT Right Margin, FormMargin'
if FromMargin = 'CANCEL' then do
'S_GET_FILE_BUFFNUM' ActFileName 'ActBuffNo'
'S_GOTO_BUFF' ActBuffNo
'S_ENABLE_WINDOW'
exit
end
end
/* if margin = 0 take line legth over insert */
if FormMargin = 0 then
FormMargin = LastLineLen
end
/* cursor align will be shifted with blanks */
if FormIndent = '.' & CurrentColNo > 1 then
FormShift = copies(' ',CurrentColNo-1)
else
FormShift = ''
/* get lines from form until end mark */
do NoLines = 1 for 99
'S_SELECT_LINE'
'S_GET_SELECTED_TEXT' 'ActLine'
if Compare(ActLine,'#~#end----') >= 8 then leave
FormLines.NoLines = FormShift || BuildFormLine(ActLine)
if FormIndent = '!' then
FormLines.NoLines = Strip( Center(FormLines.NoLines, FormMargin), 't')
else if FormIndent = '>' & Length( FormLines.NoLines) < FormMargin then
FormLines.NoLines = Copies(' ', FormMargin - Length( FormLines.NoLines) ) || FormLines.NoLines
end NoLines
'S_ENABLE_WINDOW'
'S_GET_FILE_BUFFNUM' ActFileName 'ActBuffNo'
'S_GOTO_BUFF' ActBuffNo
'S_DISABLE_WINDOW'
if NoLines \= 0 then do
do i=1 to NoLines-1
if Length(FormLines.i) > 80 then do
'S_INSERT_LINE' Substr(FormLines.i, 80)
'S_PREV_LINE'
'S_BEG_OF_LINE'
'S_INSERT_STRING' Left(FormLines.i, 79)
'S_BEG_OF_LINE'
'S_NEXT_LINE'
end
else
'S_INSERT_LINE' FormLines.i
end i
end
'S_SAVE_POS'
'S_GOTO_COL' CurrentColNo
'S_GOTO_LINE' CurrentLinNo
SearchString = '#^#'
'S_SEARCH_FWD 1 1' SearchString
if RC = 0 then 'S_DEL_SELECTED'
else 'S_GOTO_POS'
'S_ENABLE_WINDOW'
end
else do
/* form not found */
'S_MSG' 'Form "'||FormId||'" does not exist, Create new form?,, RESULT'
if RESULT = 'CANCEL' then
exit
'S_PROMPT Form "'||FormId||'" enter "Information; [.<>!] margin", RESULT'
if RESULT = 'CANCEL' then
exit
parse value RESULT with FormName ";" FormIndent FormMargin ttrest
NewItem = Left('#~#'||FormId||'#~#',25)||'info: '||Left(FormName, 35)||'pos:'||FormIndent||' '||FormMargin
'S_GET_CURR_EDITMODE Emode'
if Emode = 'READONLY' then
'S_CHG_EDITMODE'
'S_END_OF_FILE'
'S_INSERT_LINE' NewItem
if CurrentSelLen > 0 then
'S_INSERT_PASTE'
'S_INSERT_LINE #~#end---------------------------------------------------'
'S_SAVE_CURR_FILE'
'S_CHG_EDITMODE'
'S_GET_FILE_BUFFNUM' ActFileName 'ActBuffNo'
'S_GOTO_BUFF' ActBuffNo
'S_ENABLE_WINDOW'
if CurrentSelLen > 0 then
exit
'S_GET_FILE_BUFFNUM' FormFile 'ActBuffNo'
'S_GOTO_BUFF' ActBuffNo
'S_CHG_EDITMODE'
'S_PREV_LINE'
'S_INSERT_LINE {new form text goes here}'
'S_PREV_LINE'
'S_GOTO_COL' 3
'S_SELECT_BRACED_CODE'
end
exit
BuildFormLine: Procedure expose CurrentWord CurrentSelected CurrentColNo CurrentLine CurrentEOL ActFileName
parse arg ActLine
ActLine = Left( ActLine, Length( ActLine)-2)
CaretPos = 1
do forever
drop OverlayText
CaretPos = Pos("^", ActLine, CaretPos) ;
if CaretPos = 0 then leave
SubLine = Substr(ActLine, CaretPos)
select
when Abbrev(SubLine, '^FILENAME^') then do
OverlayText = ActFileName
MatchLen = 10
end
when Abbrev(SubLine, '^CL^') then do
OverlayText = CurrentLine
MatchLen = 4
end
when Abbrev(SubLine, '^CW^') then do
OverlayText = CurrentWord
MatchLen = 4
end
when Abbrev(SubLine, '^CE^') then do
OverlayText = CurrentEOL
MatchLen = 4
end
when Abbrev(SubLine, '^SEL^') then do
OverlayText = CurrentSelected
MatchLen = 5
end
when Abbrev(SubLine, '^DATE') then do
if Substr( SubLine, 6, 1) = '.' then do
tchr = Substr( SubLine, 7, 1)
if Pos(tchr, "BDELMNOSUW") \= 0 then
OverlayText = Date(tchr)
else
OverlayText = '?'|| tchr || '!in(BDELMNOSUW)?'
MatchLen = 8
end
else do
OverlayText = Date()
MatchLen = 6
end
end
when Abbrev(SubLine, '^TIME') then do
if Substr( SubLine, 6, 1) = '.' then do
tchr = Substr( SubLine, 7, 1)
if Pos(tchr, "CEHLMNRS") \= 0 then
OverlayText = Time(tchr)
else
OverlayText = '?'|| tchr || '!in(CEHLMNRS)?'
MatchLen = 8
end
else do
OverlayText = Time()
MatchLen = 6
end
end
otherwise
if Substr( SubLine, 2, 1) = '%' then do
tPos = Pos('%', SubLine, 3)
EnvVarName = Substr( Subline, 3, tPos - 3)
'S_GET_ENV_INFO' EnvVarName 'OverlayText'
if RC > 0 then
OverlayText = '?%' || EnvVarName || '%?'
MatchLen = tPos + 1
end
else
MatchLen = 1
end
if MatchLen > 1 then
ActLine = Overlay(OverlayText, ActLine, CaretPos, Max(Length(OverlayText),MatchLen))
CaretPos = CaretPos + MatchLen
end
return ActLine
GetReplacement: Procedure expose FormFile ActFileName OldText
parse arg SearchString
'S_GET_FILE_BUFFNUM' FormFile 'ActBuffNo'
if RC = 0 then do
'S_GOTO_BUFF' ActBuffNo
end
else
'S_OPEN_SL_FILE 0 R N' FormFile
'S_SEARCH_FWD 1 1' SearchString
if RC = 0 then do
'S_SELECT_LINE'
'S_GET_SELECTED_TEXT SelText'
parse value SelText with SearchString Replacement
Replacement = Left(Replacement, Length(Replacement)-2)
end
else do
Call NewTranslation OldText
Replacement = RESULT
end
'S_GET_FILE_BUFFNUM' ActFileName 'ActBuffNo'
'S_GOTO_BUFF' ActBuffNo
return Replacement
NewTranslation: Procedure
parse arg NewItem
ptext = 'Translation for "' NewItem '",'
'S_PROMPT' ptext Translate
if Translate = 'CANCEL' | Translate = '' then
return NewItem
NewItem = '~#~' || NewItem || ': ' || Translate
'S_CHG_EDITMODE'
'S_BEG_OF_FILE'
'S_INSERT_LINE' NewItem
'S_SAVE_CURR_FILE'
'S_CHG_EDITMODE'
return Translate