/* REXX ***************************************************************/
/***                                                                  */
/*** ISPF/PDF edit macro to write lines from a file to the user       */
/*** PROFILE pool for later inclusion by the PASTE macro.             */
/***                                                                  */
/*** To run:                                                          */
/***  Enter CUT on the COMMAND line and use the C or M line commands  */
/***  (in any form) to select the lines to be cut.                    */
/***                                                                  */
/***  If the M line command is used, the lines will be deleted.       */
/***                                                                  */
/***  A parameter of R or REPLACE can be specified to replace any     */
/***  previously CUT lines (that have not yet been PASTEd) with the   */
/***  newly selected lines.  Otherwise, the selected lines will be    */
/***  added to any previously CUT lines.                              */
/***                                                                  */
/***  An arbitrary limit of 1000 lines is set in the macro but this   */
/***  can be changed by providing a new limit on the macro call.      */
/***  For example, to process up to 2000 lines enter CUT 2000 on the  */
/***  COMMAND line.  Be aware that each line gets stored in your      */
/***  PROFILE.                                                        */
/***                                                                  */
/**********************************************************************/
Trace
Address ISPEXEC
'ISREDIT MACRO (PARM1) NOPROCESS'
parm1 = translate(parm1)
If parm1 = '?' Then
  Do
    Call help
    Exit 
  End
 
If parm1 ^= ' ' & parm1 ^= 'R' & parm1 ^= 'REPLACE' Then
  Do
    If datatype(parm1,w) = 1 & parm1 > 0 Then
      Do 
        /* set new limit for maximum number of lines cut to profile */
        cutlimit = parm1
        'VPUT (CUTLIMIT) PROFILE'
      End
    Else 
      Do 
        zedsmsg = 'Invalid parameter'
        msg = 'Use a whole number > 0, ? for help,'
        zedlmsg = msg 'R or REPLACE to replace previous lines'
        'SETMSG MSG(ISRZ001)'
        Exit 12
      End
  End
 
/* Process line commands, check if C or M was specified              */
'ISREDIT PROCESS RANGE C M'
Select
  When rc = 0 Then
    Do
      'ISREDIT (CMD) = RANGE_CMD'          /* Get the command        */
      'ISREDIT (LINE1) = LINENUM .ZFRANGE' /* Get first line in range*/
      'ISREDIT (LINE2) = LINENUM .ZLRANGE' /* Get last line in range */
      linestocut = line2 - line1 + 1
    End
  When rc <= 4 Then /* No C or M entered */
    Do
      zedsmsg = 'Enter "C"/"M" line cmd'
      zedlmsg = 'CUT requires a "C" or "M" line command'
      'SETMSG MSG(ISRZ001)'
      Exit 12
    End
  Otherwise  /* Line command conflict - Edit will create message*/
    Exit 12
End
 
/* Get the number of lines that have been cut but not pasted,        */
/* initialize to zero if first time.                                 */
'VGET (CUTCNTMX) PROFILE'
If rc ^= 0 Then
  cutcntmx = 0
 
/* Get the maximum number of lines to be stored in the profile,      */
/* initialize to 1000 if first time.                                 */
'VGET (CUTLIMIT) PROFILE'
If rc ^= 0 Then
  Do
    cutlimit = 1000
    'VPUT (CUTLIMIT) PROFILE'
  End
 
If parm1 = 'R' | parm1 = 'REPLACE' Then
  Do
    If linestocut < cutcntmx Then
      Do 
        /* delete variables that will not be overwritten */
        'VGET (ZENVIR) SHARED'
        Do i = 1 to cutcntmx by 1
          'VERASE (CL'i') PROFILE'
        End
      End
    cutcntmx = 0
  End
cutcntmxsave = cutcntmx
/* Check to see if the limit will be exceeded by storing the lines   */
/* into the profile.                                                 */
count = cutcntmx + linestocut
If count > cutlimit Then
  Do
    zedsmsg = '> 'cutlimit 'lines to cut'
    zedlmsg = 'Reduce the range or change limit with CUT 'count
    'SETMSG MSG(ISRZ001)'
    Exit 12
  End
 
 
/* cut the lines to the profile */
cutcnt = cutcntmx
Do i = line1 to line2
  cutcnt = cutcnt + 1
  'ISREDIT (CL'cutcnt') = LINE' i
 
  Interpret "CL"cutcnt"= Strip(CL"cutcnt",'T')"
 
  'VPUT (CL'cutcnt') PROFILE'
End
 
 
/* Put the number of lines cut into the profile for use by PASTE     */
'VPUT (CUTCNT) PROFILE'
 
/* If the number of lines cut this time is greater than the maximum  */
/* cut, then save the new maximum.  PASTE will set this variable to  */
/* zero if it deletes the variables.                                 */
If cutcnt > cutcntmx Then
  Do
    cutcntmx = cutcnt
    'VPUT (CUTCNTMX) PROFILE'
  End
 
If cmd = 'M' Then
  Do
    'ISREDIT DELETE 'line1 line2
    If cutcntmxsave = 0 Then
      Do 
        zedsmsg = linestocut 'lines cut and deleted'
        msg = 'lines were cut and deleted from the current file'
        zedlmsg = linestocut msg
      End
    Else 
      Do 
        zedsmsg = linestocut 'lines cut and deleted'
        msg ='A total of 'cutcntmx' lines have been cut'
        zedlmsg = msg '- last 'linestocut' were deleted'
      End
    'SETMSG MSG(ISRZ000)'
  End
Else
  Do
    If cutcntmxsave = 0 Then
      Do 
        zedsmsg = linestocut 'lines cut'
        zedlmsg = linestocut 'lines were cut from the current file'
      End
    Else 
      Do 
        zedsmsg = linestocut' lines plus 'cutcntmxsave 'lines cut'
        zedlmsg ='A total of 'cutcntmx' lines have been cut'
      End
    'SETMSG MSG(ISRZ000)'
  End
 
Exit
 
help:
Say '                                                                '
Say ' ISPF/PDF edit macro to write lines from a file to the user     '
Say ' PROFILE pool for later inclusion by the PASTE macro.           '
Say '                                                                '
Say ' To run:                                                        '
Say '  Enter CUT on the COMMAND line and use the C or M line commands'
Say '  (in any form) to select the lines to be cut.                  '
Say '                                                                '
Say '  If the M line command is used, the lines will be deleted.     '
Say '                                                                '
Say '  A parameter of R or REPLACE can be specified to replace any   '
Say '  previously CUT lines (that have not yet been PASTEd) with the '
Say '  newly selected lines.  Otherwise, the selected lines will be  '
Say '  added to any previously CUT lines.                            '
Say '                                                                '
Say '  An arbitrary limit of 1000 lines is set in the macro but this '
Say '  can be changed by providing a new limit on the macro call.    '
Say '  For example, to process up to 2000 lines enter CUT 2000 on the'
Say '  COMMAND line.  Be aware that each line gets stored in your    '
Say '  PROFILE.                                                      '
Say '                                                                '
Return

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN

Reply via email to