Paul, Bob, et al.: here is a version of LINEMAC and a dsn extractor I have
used before. Feel free to treat this like open source - modify/fix/enhance
and re-share it!
Thanks!
On Tue, Sep 15, 2009 at 10:58 AM, Beesley, Paul <[email protected]
> wrote:
> I did send mine to Don.
> As you said pretty please I'll find somewhere appropriate to post them
> :)
>
>
> Regards
> Paul
>
> -----Original Message-----
> From: IBM Mainframe Discussion List [mailto:[email protected]] On
> Behalf Of Richards, Robert B.
> Sent: 15 September 2009 12:56
> To: [email protected]
> Subject: Re: User-written ISPF-Editor line commands
>
> Did anyone ever post their source for the line commands they spoke
> about? If not, can you, pretty please! :-)
>
> Mark, you are exempt. I got yours from your website. Good stuff!
>
> Bob
>
> -----Original Message-----
> From: IBM Mainframe Discussion List [mailto:[email protected]] On
> Behalf Of Donald Johnson
> Sent: Friday, September 11, 2009 8:01 AM
> To: [email protected]
> Subject: Re: User-written ISPF-Editor line commands
>
> Paul, I like the sounds of these - would you be free to post/send the
> source for these commands?
> Don
>
> On Thu, Sep 10, 2009 at 5:53 PM, Beesley, Paul
> <[email protected]>wrote:
>
> > A few more to add ..
> >
> > NA, NC, NJ, NR, NP - convert line to a comment (
> > Assembler/Cobol/JCL/Rexx/PL1 ) - as per Roscoe equivalents JJ - Join
> > JCL lines, removing the // from the front JS - Split a JCL line at the
>
> > cursor, inserting a // and spaces to line it up / - scroll this line
> > to the top ( cos I kept thinking I was in CMS edit ... )
> >
> >
> > Regards
> > Paul
> >
>
> _______________________________________________________
>
> Atos Origin and Atos Consulting are trading names used by the Atos Origin
> group. The following trading entities are registered in England and Wales:
> Atos Origin IT Services UK Limited (registered number 01245534) and Atos
> Consulting Limited (registered number 04312380). The registered office for
> each is at 4 Triton Square, Regents Place, London, NW1 3HG.The VAT No. for
> each is: GB232327983
>
> This e-mail and the documents attached are confidential and intended solely
> for the addressee, and may contain confidential or privileged information.
> If you receive this e-mail in error, you are not authorised to copy,
> disclose, use or retain it. Please notify the sender immediately and delete
> this email from your systems. As emails may be intercepted, amended or
> lost, they are not secure. Atos Origin therefore can accept no liability
> for any errors or their content. Although Atos Origin endeavours to
> maintain a virus-free network, we do not warrant that this transmission is
> virus-free and can accept no liability for any damages resulting from any
> virus transmitted. The risks are deemed to be accepted by everyone who
> communicates with Atos Origin by email.
> _______________________________________________________
>
> ----------------------------------------------------------------------
> For IBM-MAIN subscribe / signoff / archive access instructions,
> send email to [email protected] with the message: GET IBM-MAIN INFO
> Search the archives at http://bama.ua.edu/archives/ibm-main.html
>
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: GET IBM-MAIN INFO
Search the archives at http://bama.ua.edu/archives/ibm-main.html
/* Rexx implement line commands */
Trace o;
Address "ISPEXEC";
isp = "ISPEXEC ";
isr = "ISREDIT ";
isr "MACRO (lc) NOPROCESS"; /* Get line command */
isp "CONTROL ERRORS RETURN" /* Return ispf errors */
valid_cmds = "/ CEN REV SL SR AUTH DB DT CB CE CV NA NC NJ NR SJ EOJ";
/*
> ------------------------------------------------------------------- <
> Valid line commands processed here: <
> / - Sets the cursor line at top of the screen <
> CEN - Centers the cursor line <
> REV - Reverses the cursor line <
> SL - Left Justifies the cursor line <
> SR - Right justifies the cursor line <
> DB - Deletes from the cursor line to the bottom <
> DT - Deletes from the cursor line to the top <
> CB - Invokes BROWSE on the filename at the cursor <
> CE - Invokes EDIT on the filename at the cursor <
> CV - Invokes VIEW on the filename at the cursor <
> NA - Turns the cursor line into a comment for ASM <
> NC - Turns the cursor line into a comment for COBOL <
> NJ - Turns the cursor line into a comment for JCL <
> NR - Turns the cursor line into a comment for REXX <
> SJ - Executes SplitJoin processing at the cursor <
> EOJ - Inserts a JCL EOJ card following the cursor line <
> ------------------------------------------------------------------- <
*/
If wordpos(lc,valid_cmds) = 0 Then /* If the command is not valid */
Do; /* */
zinfo = lc; /* move the command to err msg */
isp "SETMSG MSG(ISRE041)" /* Set the ISPF Error message */
Exit 8 /* Leave with RC = 8 */
End /* */
/* */
isr "PROCESS RANGE" lc; /* Get the range for commands */
If rc > 0 Then /* If the range is invalid */
Do; /* */
zedsmsg = zerrsm; /* Set the error message */
zedlmsg = zerrlm; /* */
isp "SETMSG MSG(ISRZ001)"; /* */
Exit rc; /* Leave with the failed RC */
End; /* */
/* */
isr "(START) = LINENUM .ZFRANGE"; /* Get 1st line no in the range */
isr "(STOP) = LINENUM .ZLRANGE"; /* Get last line no in the range */
isr "(L$BOT) = LINENUM .ZLAST"; /* Get last line no of the member*/
isr "(DW) = DATA_WIDTH"; /* Get width of editable data */
nl.0 = 1; /* Initialize stem variable count*/
nl.1 = ""; /* Initialize first new line fld */
/*
> ------------------------------------------------------------------- <
> Process non-block commands <
> ------------------------------------------------------------------- <
*/
Select;
When (lc = "/") Then /* Set the selected line to top */
Do;
isr "(D$T,D$B) = DISPLAY_LINES";
scr = start - d$t;
isr "DOWN CURSOR";
Exit 0;
End;
When (lc = "DT") Then /* Delete selected line to top */
Do;
isr "LABEL 1 = .FROM";
isr "LABEL" start "= .TO";
isr "DELETE ALL .FROM .TO";
End;
When (lc = "DB") Then /* Delete selected line to bot */
Do;
isr "LABEL" start "= .FROM"
isr "LABEL" l$bot "= .TO"
isr "DELETE ALL .FROM .TO"
End;
When (lc = "SJ") Then /* Process SPLIT/JOIN */
Do;
isr "(SJ1) = LINE" start; /* Get contents of first line */
isr "(CR,CC) = CURSOR"; /* Where is the cursor in line? */
/* --------------------------------------------
> This section assumes a JCL line, or line <
> that can split at comma. If the cursor is <
> anywhere in the data, find the previous <
> comma and place the trailing data on the <
> next line. If JCL, it will line up the <
> split data with the line above or in column <
> 16. For anything else, it will line up with <
> the first non-blank column. <
> -------------------------------------------- */
If (cc > 0) & (Length(Strip(sj1,"T")) > cc) Then
Do;
If Substr(sj1,cc,1) = "," Then
sj2_st = cc + 1;
Else
sj2_st = Lastpos(",",sj1,cc) + 1;
If sj2_st = 1 Then Exit 4;
sj2 = Strip(Substr(sj1,sj2_st));
nl.1 = Substr(sj1,1,sj2_st - 1);
If Substr(sj1,1,2) = "//" Then
Do;
If Word(nl.1,2) = "DD" Then
sj2_st = Wordindex(nl.1,3) - 3;
Else
sj2_st = Wordindex(nl.1,2) - 3;
nl.2 = "//" || Copies(" ",sj2_st) || sj2;
End;
Else
nl.2 = Copies(" ",Verify(nl.1," ","N",1) - 1) || sj2;
nl.0 = 2;
End;
Else
Do;
If start = l$bot Then
Do;
zedsmsg = "Invalid on this line";
zedlmsg = "SJ cannot be executed on the last line";
isp "SETMSG MSG(ISRZ001)";
Exit 12;
End;
isr "(SJ1) = LINE" start; /* Get first line */
isr "(SJ2) = LINE" start+1; /* Get next line */
sj1 = Strip(sj1,"T");
If Substr(sj2,1,2) = "//" Then
Do;
sj2 = Strip(Substr(sj2,3),"B");
maxl = 71;
End;
Else
Do;
sj2 = Strip(Substr(sj2,1),"B");
maxl = dw;
End;
If Length(sj1) + Length(sj2) > maxl Then
Do;
zedsmsg = "Cannot JOIN lines";
zedlmsg = "Joined lines would exceed max length";
isp "SETMSG MSG(ISRZ001)";
Exit 4;
End;
nl.1 = sj1 || sj2;
isr "DELETE" start + 1;
End;
End;
When (lc = "EOJ") Then /* Insert JCL EOJ cards */
Do;
isr "(OL) = LINE" start;
exec_str = right(ol, Length(ol) - Length(Word(ol,1)));
nl.1 = ol;
nl.2 = "// ";
nl.3 = "//* END OF JOB CARD ADDED BY EOJ LINE COMMAND";
nl.4 = "// ";
nl.0 = 4;
End;
Otherwise Nop;
End;
/*
> ------------------------------------------------------------------- <
> Process possible block commands <
> ------------------------------------------------------------------- <
*/
Do a = start To stop; /* Process the range of lines */
isr "(OL) = LINE" a; /* Get line to process */
Select
When (lc = "CEN") Then nl.1=Center(Strip(ol),dw); /* Center */
When (lc = "REV") Then nl.1=Reverse(ol); /* Reverse */
When (lc = "SL") Then nl.1=Strip(ol,"L"); /* Left justify */
When (lc = "SR") Then nl.1=Right(Strip(ol,"T"),dw); /* Right Justify */
When (lc = "NA") Then nl.1="* <NA>" Strip(ol) "*"; /* ASM Comment */
When (lc = "NC") Then nl.1="C <NC>" Strip(ol); /* COB Comment */
When (lc = "NJ") Then nl.1="//*<NJ>" Strip(line); /* JCL Comment */
When (lc = "NR") Then nl.1="/* <NR>" Strip(line) "*/"; /* REXX Comment */
When (lc = "CB") |, /* Browse file on this line */
(lc = "CV") |, /* View file on this line */
(lc = "CE") Then /* Edit file on this line */
Do;
type = Word("BROWSE VIEW EDIT",Wordpos(lc,"CB CV CE"));
isr "(CR,CC) = CURSOR"; /* Where is the cursor in line? */
dsn = Dsname(cc,ol); /* Extract the dsn from the line */
isp type "DATASET('"dsn"')"
If rc /= 0 Then isp "SETMSG MSG("zerrmsg")";
isr "CURSOR = (cr,cc)"; /* put cursor back to last pos */
End;
Otherwise Exit; /* Otherwise leave the program */
End
/*
> ------------------------------------------------------------------- <
> Replace the existing line, and add any additional lines <
> ------------------------------------------------------------------- <
*/
If nl.1 > "" Then /* If lines have been changed */
Do; /* */
nl = nl.1; /* set a non-stem variable */
isr "LINE" a "= (NL)"; /* set line data from the var */
/* */
Do loop = 2 to nl.0 /* If lines have been added */
nl = nl.loop; /* set the non-stem variable */
isr "LINE_AFTER" a "= (NL)"; /* add lines as needed */
a = a + 1; /* */
End; /* */
End; /* */
End; /* Do a = start to stop */
Exit 0;
/* REXX THIS LINE MUST BE PRESENT FOR THIS EXEC TO FUNCTION! */
/*--------------------------------------------------------------------*/
TRACE o;
/*--------------------------------------------------------------------*/
cc = Arg(1); line = Arg(2); sw = Arg(3); Upper sw;
ADDRESS "ISPEXEC";
"CONTROL ERRORS RETURN";
delim = " ~`!%_=+\{|};:'<,>/?()" || '"';
If cc > 0 Then
Do;
memtest = Substr(line,cc-9,18);
in_member = (Pos("(",memtest) > 0) & (Pos(")",memtest) > 0);
b_line = Reverse(Substr(line,1,cc-1)) || " ";
f_line = Substr(line,cc,Length(line)) || " ";
If in_member Then
Do
s_col = cc - Verify(b_line,delim,"M",Pos("(",b_line)+1) + 1;
e_col = cc + Verify(f_line,delim,"M",Pos(")",f_line)+1) - 2;
End;
Else
Do
s_col = cc - Verify(b_line,delim,"M") + 1;
e_col = cc + Verify(f_line,delim,"M") - 2;
End;
If Substr(line,e_col+1,1) = "(" Then
memname = Substr(line, e_col+1,Pos(")",line,e_col+2) - e_col);
Else
memname = "";
End;
Else
Do;
Select
When Pos("DSN=",line) > 0 Then s_col = Pos("DSN=",line) + 4;
When Pos("DSNAME=",line) > 0 Then s_col = Pos("DSNAME=",line) + 7;
Otherwise s_col = 1;
End;
l_paren = Pos("(",line,s_col);
r_paren = Pos(")",line,l_paren+1);
beg_srch = Max(s_col,r_paren) + 1;
e_col = Verify(line,delim,"M",beg_srch) - 1;
memname = "";
End;
dsn = Substr(line,s_col,e_col- s_col + 1) || memname;
Select;
When sw = "COLS" Then
Return Right("000"||S_COL,3) || Right("000"||e_col,3);
When sw = "BOTH" Then
Return dsn || Right("000"||S_COL,3) || Right("000"||e_col,3);
Otherwise
If Left(dsn,8) = "&SYSUID." Then
dsn = Sysvar(SYSUID) || Substr(dsn,9);
Return dsn;
End;