home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / prgramer / rexx / 4macrs / expander.rex next >
OS/2 REXX Batch file  |  1993-05-25  |  11KB  |  343 lines

  1. /* expander for SourceLink32                                             */
  2. /* creation 15.3.93                 by Thomas Korfhage ++49 6446 2931    */
  3. /* history  start                   'his 1. steps in rexx'               */
  4. /* expander uses file FORMS.LST in sourcelink macro directory            */
  5. 'S_CLEAR_MACRO_OUTPUT'
  6. 'S_GET_CURR_EDITMODE Emode'
  7. if Emode = 'READONLY' then do
  8.    'S_MSG' 'File is readonly!,,Change to edit?,'RESULT
  9.    if RESULT = 'CANCEL' then 
  10.       exit
  11.    'S_CHG_EDITMODE'
  12. end
  13. 'S_GET_ENV_INFO SLINK2 Slink2Path'
  14. FormFile = Slink2Path || "\MACROS\FORMS.LST"
  15. 'S_DOES_FILE_EXIST' FormFile 'FileExists'
  16. if FileExists = 'FALSE' then do 
  17.    'S_MSG File for Forms not exist,FormFile,,RESULT'
  18.    exit
  19. end
  20. 'S_GET_CURR_FILENAME' ActFileName
  21. if ARG(1,'E')then do
  22.    ARG TransOrForm 
  23.    if Wordpos( TransOrForm, 'TRANS FORM WFORM') \= 0 then do
  24.       'S_DISABLE_WINDOW'
  25.       Signal Value TransOrForm
  26.    end 
  27. end   
  28. 'S_MSG' 'Invalid Argument (TRANS | FORM),' TransOrForm ',,'RESULT
  29. exit
  30.  
  31. TRANS:
  32. 'S_GET_SELECTED_SIZE' CurrentSelLen
  33. LeadText = ''
  34. TermText = ''
  35. if CurrentSelLen > 0 then do
  36.    'S_GET_SELECTED_TEXT' OldText
  37.    'S_DEL_SELECTED'
  38. end   
  39. else do
  40.    'S_GET_CURR_WORD' OldText
  41.    'S_DEL_WORD'
  42.    if Length(OldText) >= 1 then do
  43.       PrevText = OldText
  44.       OldText = Strip(OldText,,'(') 
  45.       OldText = Strip(OldText,,'[') 
  46.       OldText = Strip(OldText,,')') 
  47.       OldText = Strip(OldText,,']') 
  48.       OldText = Strip(OldText,,',') 
  49.       OldText = Strip(OldText,,';') 
  50.       PPos = Pos(OldText,PrevText)
  51.       LeadText = Substr(PrevText,1,PPos-1)
  52.       TermText = Substr(PrevText,PPos+Length(OldText))
  53.    end
  54.    else do
  55.       'S_ENABLE_WINDOW'
  56.       exit
  57.    end
  58. end   
  59. TransSearch = '~#~' || OldText || ':'
  60. call GetReplacement TransSearch
  61. 'S_INSERT_STRING' LeadText||RESULT||TermText
  62. do Length(TermText)
  63.    'S_PREV_CHAR'
  64. end
  65. 'S_ENABLE_WINDOW'
  66. exit
  67.  
  68. FORM:
  69. /* query form name */
  70. ptext = 'Name of form to insert,'
  71. 'S_PROMPT'  ptext FormId
  72. if FormId = 'CANCEL' then do
  73.    'S_ENABLE_WINDOW'
  74.    exit
  75. end   
  76. WFORM:
  77. /* get possible replacements */
  78. 'S_GET_CURR_WORD' CurrentWord
  79. if TransOrForm = 'WFORM' then do
  80.    FormId = CurrentWord
  81.    'S_DEL_WORD'
  82. end   
  83. 'S_GET_SELECTED_SIZE' CurrentSelLen
  84. if CurrentSelLen > 0 then do
  85.    'S_GET_SELECTED_TEXT' CurrentSelected
  86.    'S_COPY_SEL_TO_PASTE'
  87. end   
  88. else 
  89.    CurrentSelected = ''
  90. 'S_GET_COL_NUM' CurrentColNo
  91. 'S_GET_LINE_NUM' CurrentLinNo
  92. 'S_SELECT_LINE'
  93. 'S_GET_SELECTED_TEXT' CurrentLine
  94. CurrentLine = Left(CurrentLine,Length(CurrentLine)-2)
  95. CurrentEOL = Substr(CurrentLine, CurrentColNo)
  96. /* restore */  
  97. 'S_GOTO_LINE' CurrentLinNo
  98. /* Get legth of last Line */
  99. LastLineLen = 0
  100. do 10 
  101.    'S_GET_CURSOR_POS CursorPos'
  102.    if CursorPos < 1 then 
  103.       leave
  104.    'S_BEG_OF_LINE'
  105.    'S_PREV_LINE'
  106.    'S_GET_LINE_LEN LastLineLen'
  107.    if LastLineLen > 4 then 
  108.       leave
  109. end      
  110. if LastLineLen <= 4 then 
  111.    LastLineLen = 80 ;
  112. /* restore */  
  113. 'S_GOTO_COL' CurrentColNo
  114. 'S_GOTO_LINE' CurrentLinNo
  115. /* look for form in Formfile */
  116. 'S_GET_FILE_BUFFNUM' FormFile 'ActBuffNo'
  117. if RC = 0 then do 
  118.    'S_GOTO_BUFF' ActBuffNo
  119.    end
  120. else   
  121.    'S_OPEN_SL_FILE 0 R N' FormFile
  122. SearchString = '#~#' || FormId || '#~#'
  123. drop FormLines.
  124. 'S_SEARCH_FWD 1 1' SearchString
  125. if RC = 0 then do 
  126.    /* form found */
  127.    'S_DISABLE_WINDOW'
  128.    /* get Info from header line */
  129.    'S_SELECT_LINE'
  130.    'S_GET_SELECTED_TEXT' 'ActLine'
  131.    ActLine = Left( ActLine, Length(ActLine)-2)
  132.    parse value ActLine with SearchString . 'info:' FormName 'pos:' FormIndent FormMargin ttrest
  133.    FormName = Strip(FormName)
  134.    FormIndent = Left(FormIndent,1)
  135.    /* for center and right, check margin */
  136.    if FormIndent = '!' | FormIndent = '>' then do
  137.       /* a non numeric margin value forces query */
  138.       do 3 while Datatype(FormMargin) \= 'NUM' 
  139.          'S_PROMPT Right Margin, FormMargin'
  140.          if FromMargin = 'CANCEL' then do
  141.             'S_GET_FILE_BUFFNUM' ActFileName 'ActBuffNo'
  142.             'S_GOTO_BUFF' ActBuffNo
  143.             'S_ENABLE_WINDOW'
  144.             exit
  145.          end 
  146.       end
  147.       /* if margin = 0 take line legth over insert */
  148.       if FormMargin = 0 then
  149.          FormMargin = LastLineLen
  150.    end
  151.    /* cursor align will be shifted with blanks */
  152.    if FormIndent = '.' & CurrentColNo > 1 then
  153.       FormShift = copies(' ',CurrentColNo-1)
  154.    else 
  155.       FormShift = ''
  156.    /* get lines from form until end mark */  
  157.    do NoLines = 1 for 99
  158.       'S_SELECT_LINE'
  159.       'S_GET_SELECTED_TEXT' 'ActLine'
  160.       if Compare(ActLine,'#~#end----') >= 8 then leave
  161.       FormLines.NoLines = FormShift || BuildFormLine(ActLine)
  162.       if FormIndent = '!' then 
  163.          FormLines.NoLines = Strip( Center(FormLines.NoLines, FormMargin), 't')
  164.       else if FormIndent = '>' & Length( FormLines.NoLines) < FormMargin then 
  165.          FormLines.NoLines = Copies(' ', FormMargin - Length( FormLines.NoLines) ) || FormLines.NoLines
  166.    end NoLines
  167.   'S_ENABLE_WINDOW'
  168.    'S_GET_FILE_BUFFNUM' ActFileName 'ActBuffNo'
  169.    'S_GOTO_BUFF' ActBuffNo
  170.   'S_DISABLE_WINDOW'
  171.    if NoLines \= 0 then do
  172.       do i=1 to NoLines-1
  173.          if Length(FormLines.i) > 80 then do
  174.             'S_INSERT_LINE' Substr(FormLines.i, 80)
  175.             'S_PREV_LINE'
  176.             'S_BEG_OF_LINE'
  177.             'S_INSERT_STRING' Left(FormLines.i, 79)
  178.             'S_BEG_OF_LINE'
  179.             'S_NEXT_LINE'
  180.          end
  181.          else 
  182.             'S_INSERT_LINE' FormLines.i
  183.       end i
  184.    end
  185.    'S_SAVE_POS'
  186.    'S_GOTO_COL' CurrentColNo
  187.    'S_GOTO_LINE' CurrentLinNo
  188.    SearchString = '#^#'
  189.    'S_SEARCH_FWD 1 1' SearchString
  190.    if RC = 0 then 'S_DEL_SELECTED'
  191.    else  'S_GOTO_POS'
  192.   'S_ENABLE_WINDOW'
  193. end
  194. else do 
  195.    /* form not found */
  196.    'S_MSG' 'Form "'||FormId||'" does not exist, Create new form?,, RESULT'
  197.    if RESULT = 'CANCEL' then
  198.       exit
  199.    'S_PROMPT Form "'||FormId||'" enter "Information; [.<>!] margin", RESULT'
  200.    if RESULT = 'CANCEL' then
  201.       exit
  202.    parse value RESULT with FormName ";" FormIndent FormMargin ttrest
  203.    NewItem = Left('#~#'||FormId||'#~#',25)||'info: '||Left(FormName, 35)||'pos:'||FormIndent||' '||FormMargin
  204.    'S_GET_CURR_EDITMODE Emode'
  205.    if Emode = 'READONLY' then
  206.       'S_CHG_EDITMODE'
  207.    'S_END_OF_FILE'
  208.    'S_INSERT_LINE' NewItem
  209.    if CurrentSelLen > 0 then 
  210.       'S_INSERT_PASTE'
  211.    'S_INSERT_LINE #~#end---------------------------------------------------' 
  212.    'S_SAVE_CURR_FILE'
  213.    'S_CHG_EDITMODE'
  214.    'S_GET_FILE_BUFFNUM' ActFileName 'ActBuffNo'
  215.    'S_GOTO_BUFF' ActBuffNo
  216.    'S_ENABLE_WINDOW'
  217.    if CurrentSelLen > 0 then 
  218.       exit
  219.    'S_GET_FILE_BUFFNUM' FormFile 'ActBuffNo'
  220.    'S_GOTO_BUFF' ActBuffNo
  221.    'S_CHG_EDITMODE'
  222.    'S_PREV_LINE'
  223.    'S_INSERT_LINE {new form text goes here}'
  224.    'S_PREV_LINE'
  225.    'S_GOTO_COL' 3
  226.    'S_SELECT_BRACED_CODE'
  227. end
  228. exit
  229.  
  230. BuildFormLine: Procedure expose CurrentWord CurrentSelected CurrentColNo CurrentLine CurrentEOL ActFileName
  231.    parse arg ActLine
  232.    ActLine = Left( ActLine, Length( ActLine)-2)
  233.    CaretPos = 1
  234.    do forever  
  235.       drop OverlayText
  236.       CaretPos = Pos("^", ActLine, CaretPos) ;
  237.       if CaretPos = 0 then leave
  238.       SubLine = Substr(ActLine, CaretPos)
  239.       select
  240.          when Abbrev(SubLine, '^FILENAME^') then do
  241.                OverlayText = ActFileName
  242.                MatchLen = 10
  243.             end   
  244.          when Abbrev(SubLine, '^CL^') then do
  245.                OverlayText = CurrentLine
  246.                MatchLen = 4
  247.             end   
  248.          when Abbrev(SubLine, '^CW^') then do
  249.                OverlayText = CurrentWord
  250.                MatchLen = 4
  251.             end   
  252.          when Abbrev(SubLine, '^CE^') then do
  253.                OverlayText = CurrentEOL
  254.                MatchLen = 4
  255.             end   
  256.          when Abbrev(SubLine, '^SEL^') then do
  257.                OverlayText = CurrentSelected
  258.                MatchLen = 5
  259.             end   
  260.          when Abbrev(SubLine, '^DATE') then do
  261.                if Substr( SubLine, 6, 1) = '.' then do
  262.                   tchr = Substr( SubLine, 7, 1)
  263.                   if Pos(tchr, "BDELMNOSUW") \= 0 then
  264.                      OverlayText = Date(tchr)
  265.                   else 
  266.                      OverlayText = '?'|| tchr || '!in(BDELMNOSUW)?'
  267.                   MatchLen = 8
  268.                end
  269.                else do
  270.                   OverlayText = Date()
  271.                   MatchLen = 6
  272.                end
  273.             end   
  274.          when Abbrev(SubLine, '^TIME') then do
  275.                if Substr( SubLine, 6, 1) = '.' then do
  276.                   tchr = Substr( SubLine, 7, 1)
  277.                   if Pos(tchr, "CEHLMNRS") \= 0 then
  278.                      OverlayText = Time(tchr)
  279.                   else 
  280.                      OverlayText = '?'|| tchr || '!in(CEHLMNRS)?'
  281.                   MatchLen = 8
  282.                end
  283.                else do
  284.                   OverlayText = Time()
  285.                   MatchLen = 6
  286.                end
  287.             end   
  288.          otherwise
  289.             if Substr( SubLine, 2, 1) = '%' then do
  290.                tPos = Pos('%', SubLine, 3)
  291.                EnvVarName = Substr( Subline, 3, tPos - 3)
  292.                'S_GET_ENV_INFO' EnvVarName 'OverlayText'
  293.                if RC > 0 then
  294.                   OverlayText = '?%' || EnvVarName || '%?'
  295.                MatchLen = tPos + 1
  296.             end
  297.             else
  298.                MatchLen = 1
  299.       end
  300.       if MatchLen > 1 then 
  301.          ActLine = Overlay(OverlayText, ActLine, CaretPos, Max(Length(OverlayText),MatchLen))
  302.       CaretPos = CaretPos + MatchLen   
  303.    end   
  304.    return ActLine
  305.    
  306. GetReplacement: Procedure expose FormFile ActFileName OldText
  307.    parse arg SearchString
  308.    'S_GET_FILE_BUFFNUM' FormFile 'ActBuffNo'
  309.    if RC = 0 then do 
  310.       'S_GOTO_BUFF' ActBuffNo
  311.       end
  312.    else   
  313.       'S_OPEN_SL_FILE 0 R N' FormFile
  314.    'S_SEARCH_FWD 1 1' SearchString
  315.    if RC = 0 then do
  316.       'S_SELECT_LINE'
  317.       'S_GET_SELECTED_TEXT SelText'
  318.       parse value SelText with SearchString Replacement 
  319.       Replacement = Left(Replacement, Length(Replacement)-2)
  320.    end
  321.    else do 
  322.       Call NewTranslation OldText
  323.       Replacement = RESULT
  324.    end
  325.    'S_GET_FILE_BUFFNUM' ActFileName 'ActBuffNo'
  326.    'S_GOTO_BUFF' ActBuffNo
  327.    return Replacement
  328.  
  329. NewTranslation: Procedure
  330.    parse arg NewItem
  331.    ptext = 'Translation for "' NewItem '",'
  332.    'S_PROMPT' ptext Translate 
  333.    if Translate = 'CANCEL' | Translate = '' then
  334.       return NewItem
  335.    NewItem = '~#~' || NewItem || ': ' || Translate
  336.    'S_CHG_EDITMODE'
  337.    'S_BEG_OF_FILE'
  338.    'S_INSERT_LINE' NewItem
  339.    'S_SAVE_CURR_FILE'
  340.    'S_CHG_EDITMODE'
  341.    return Translate
  342.  
  343.