* UMAC: A panel exit to enable line macros in edit (Version 1.06) * * Author:Doug Nadel (nadel@us.ibm.com) * Original published date: May 15, 1999 * Last update date: May 28, 1999 * (C) IBM CORP., 1999. ALL RIGHTS RESERVED. * * IBM PROVIDES THIS PROGRAM ON AN "AS IS" BASIS WITHOUT WARRANTY * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. * * =====> Updates sometimes require panel changes. Please verify * =====> that your panels match the instructions here. * * Please read the entire prolog before installing this. * * This is a panel exit that allows users to type user defined * line commands in the ISPF editor without having to type * anything on the command line or pressing a pf key. When a * line command that is not built in to ISPF edit is found, * this exit puts a macro name followed by the non-Block * version of the command on the command line. There must be * an edit macro that accepts the name of the line * command. For better performance, use a program macro and * be sure to prefix the name with an exclaimation point. * * * Commands are recognized in both block and nonblock format: * A block format is any command that is either doubled, such * as QBQB or ends in a double character (QBB). * Because ISPF edit macros don't recognize the doubled format * (QBQB), this macro alters the screen to the other format. * (QBB). This will cause problems if you name macros with * repeated sequences such as 'QQ'. * * Other restrictions for line macros apply such as you can not * enter a user defined line command on a special line. * * Installation: * 1) Modify the section called 'commands' to indicate the * specific commands to intercept or to indicate that you * want to intercept all otherwise invalid commands. * 2) Modify the field called EDITMAC to indicate the * name of the macro to be invoked. * 3) Assemble this program and place it in ISPLLIB, * STEPLIB, LINKLIST or LPA. * 4) Change your edit panels (ISREDDE2, 3, 4, 5 and the * SCLM versions if you use them) as follows: * (Just to test this, modifying ISREDDE2 should be fine). * * *-----------------------------------------------* * * Note: add these lines shown below at the END * * * of the )INIT, )REINIT and )PROC sections * * *-----------------------------------------------* * * * A) In the )REINIT and )INIT sections add the following * starting in column 1: * * PANEXIT ((ZWIDTH,ZDATA,ZCMD),LOAD,UMAC) * * B) In the )PROC section, add these lines starting * in columns 1,3 and 3 respectively: * * IF (&ZCMD = &Z) * &ZCMD = '123456789012345' * PANEXIT ((ZWIDTH,ZDATA,ZCMD,ZCURSOR,ZCSROFF),LOAD,UMAC) * * 5) Write the edit macro and place it in sysproc * or whereever you need to place it. * * As shipped this enables trapping of 4 line commands, CE, RV, LEF, * and RIT. The default macro name is LINEMAC and it is shown here. * * /* Rexx implement CE, RV, LEF, and RIT line commands */ * Address isredit * 'MACRO (PARM) NOPROCESS' * Address ispexec 'CONTROL ERRORS RETURN' * If wordpos(parm,'CE RV LEF RIT') = 0 Then * Do /* not a line command we handle */ * zinfo=parm * Address ispexec 'SETMSG MSG(ISRE041)' * Exit 8 /* let ISPF handle the error */ * End * 'PROCESS RANGE 'parm /* get range for command */ * If rc>0 Then * Do * Address ispexec 'SETMSG MSG(ISRZ002)' * Exit 8 /* let ISPF handle the error */ * End * '(START) = LINENUM .ZFRANGE' * '(STOP) = LINENUM .ZLRANGE' * '(DW) = DATA_WIDTH' * Do a = start to stop * '(LINE) = LINE 'a * SELECT * When(parm = 'CE') Then * line=center(strip(line),dw) /* Center */ * When(parm = 'RV') Then * line=reverse(line) /* Reverse */ * When(parm = 'LEF') Then * line=strip(line,'L') /* Left justify */ * When(parm = 'RIT') Then * line=right(strip(line,'T'),dw) /* Rightt justify */ * Otherwise Nop * End /* SELECT */ * 'LINE 'a' = (LINE)' * End * Exit 0 * *UMAC: * proc (exdata,panname,pansect,msgid,araydim,varname,varlen,varval) * options(main,amode(31),rmode(24),reentrant); *%INCLUDE syslib(dclssys); * dcl * exdata fixed bin(31), /* Not used here */ * panname char(8), /* Panel name */ * pansect char(1), /* Panel section */ * msgid char(8), /* Last message id */ * araydim fixed bin(31), /* Array dimention */ * varname char(8), /* Variable names passed in */ * varlen(*) fixed bin(31), /* Variable value lengths */ * varval char(*); /* String of values */ * dcl * zwidth_p ptr(31), /* Pointer to width of screen */ * zwidth char(*) based(zwidth_p), /* Width of screen */ * zdata_p ptr(31), /* Pointer to zdata dynamic area */ * zdata char(*) based(zdata_p), /* Zdata dynamic area */ * zcmd_p ptr(31), /* Pointer to zcmd variable */ * zcmd char(15) based(zcmd_p), /* Zcmd command line */ * zcursor_p ptr(31), /* Pointer to zcursor variable */ * zcursor char(*) based(zcursor_p), /* zcursor */ * zcsroff_p ptr(31), /* Pointer to zcsroff variable */ * zcsroff char(*) based(zcsroff_p); /* zcsroff */ * dcl * EDITMAC char(8) gend static local, * 1 commands gend static local, * 3 known# fixed, * 3 known$(*) char(6); * dcl * a fixed bin(31), /* Index into zdata */ * b fixed bin(31), /* Index into zdata */ * k fixed bin(31), /* Index into known commands */ * packed char(8) boundary(dword), * 1 flags bit(8), * 3 double bit(1), /* Indicates user entered xyxy * form of block command and that * it needs to be converted to * xyy format */ * 3 found bit(1), /* Indicates user command found * and selected as input to the * macro */ * trtable static local char(256) bdy(dword) gend, * width fixed bin(31), * total fixed bin(31), * csroff fixed bin(31), * csrrow fixed bin(31), * csrcol fixed bin(31), * row fixed, * linearea char(6), * linecmd char(6); * flags = ''B; * zwidth_p = addr(varval); /* Zwidth is at start of string */ * zdata_p = zwidth_p + varlen(1); /* Zdata is adjacent to width */ * zcmd_p = zdata_p + varlen(2); /* Zcmd is adjacent to zdata */ * pack(packed,zwidth(1:varlen(1))); /* Convert zwidth to binary */ * cvb(width,packed); /* Placing it in 'width' */ * total = varlen(2) - 7; /* For loop control */ * if magicbit = off then /* If cancel */ * select (pansect); * when ('I','R') /* If init or reinit */ * do; /* Never show linecmd on command * line */ * if varlen(3) > 7 & zcmd(1:8) = EDITMAC then * zcmd(1:varlen(3)) = ' '; * end; * when ('P') /* If proc section */ * do; * zcursor_p = zcmd_p + varlen(3); /* Zcursor adjacent to * zcmd */ * zcsroff_p = zcursor_p + varlen(4); /* Zcsroff adjacent to * zcursor */ * csrrow = 0; * csrcol = 0; * pack(packed,zcsroff(1:varlen(5))); /* Convert zcsroff to * binary */ * cvb(csroff,packed); /* Placing it in 'csroff' */ * if zcursor(1:5) = 'ZDATA' then * do; * csrcol = 1 + (csroff - 1) // width; * csrrow = 1 + (csroff - 1) / width; * end; * zcmd = ''; /* clear zcmd */ * row = 0; *loop: * do a = 2 to total by width; /* Loop thru lines and */ * row = row + 1; * linearea = zdata(a::6); * if linearea = ' ' then * iterate; /* Past eod */ * if linearea(1) = '.' /* Label */ * | linearea(1) = '*' /* Top or bottom of data */ * | linearea(1) = ')' /* Shift */ * | linearea(1) = '<' /* Shift */ * then * iterate loop; * if row = csrrow & csrcol > 2 & csrcol < 8 then * do; * linearea(csrcol-1:6) = ''; * zdata(a::6) = linearea; * end; * tr(linearea,trtable); * do b = 1 to 5 while(linearea(1)=' '); /* Left justify */ * mvc(linearea(1::5),linearea(2::5)); * linearea(6) = ' '; * end; * if linearea(1) ^= ' ' then * do; * do b = 2 to 6 until(linearea(b)=' '); /* scan for * space */ * end; * if b < 7 then /* if imbeded space */ * do b = b to 6; /* delete everything after space */ * linearea(b) = ' '; * end; * if linearea(1) = ' ' /* Nothing */ * then * iterate loop; * do b = 6 downto 1 until(linearea(b)^=' '); * end; * if b > 1 & linearea(b-1) = linearea(b) then * linecmd = linearea(1:b-1); * else * if b // 2 = 0 & linearea(1:b/2) = linearea(b/2+1:b) * then * do; * double = on; * linecmd = linearea(1:b/2); * end; * else * linecmd = linearea; * select (linecmd); * when ( /* */ * 'A ', /* Built-In a after */ * 'B ', /* Built-In b before */ * 'C ', /* Built-In c copy */ * 'D ', /* Built-In d delete */ * 'F ', /* Built-In f first */ * 'I ', /* Built-In i insert */ * 'L ', /* Built-In l last */ * 'LC ', /* Built-In lc lowercase */ * 'LLC ', /* Built-In lc lowercase block */ * 'M ', /* Built-In m move */ * 'MASK ', /* Built-In m move */ * 'MD ', /* Built-In md make data */ * 'MMD ', /* Built-In md make data block */ * 'O ', /* Built-In o overlay */ * 'R ', /* Built-In r repeat */ * 'S ', /* Built-In s show */ * 'TE ', /* Built-In te text entry */ * 'TF ', /* Built-In tf text split */ * 'TS ', /* Built-In ts text show */ * 'UC ', /* Built-In uc uppercase */ * 'UUC ', /* Built-In uc uppercase block */ * 'X ', /* Built-In x exclude */ * 'ERR ', /* Built-In ==Err> */ * 'CHG ', /* Built-In ==Chg> */ * 'BNDS ', /* Built-In =Bnds> */ * 'MASK ', /* Built-In =Mask> */ * 'BND ', /* Built-In bounds */ * 'BOUND ', /* Built-In bounds */ * 'BOUNDS', /* Built-In bounds */ * 'BOU ', /* Built-In bounds */ * 'COL ', /* Built-In cols */ * 'TAB ', /* Built-In tab */ * 'COLS ', /* Built-In =Cols> */ * 'TABS ', /* Built-In =Cols> */ * 'PROF ', /* Built-In =Prof> */ * 'NOTE ', /* Built-In =Note> */ * 'MSG ') /* Built-In ==Msg> */ * ; /* Do nothing */ * otherwise * do; * if found = off then * do; * if known# > 0 then * do k = 1 to known#; * if known$(k) = linecmd then * found = on; * end; * else * found = on; * if found = on then * do; * zcmd(1:8) = EDITMAC; * zcmd(10::6) = linecmd; * if double = on then * do; * zdata(a::6) = ''; * zdata(a::b/2) = linecmd; * zdata(a+b/2) = linecmd(b/2); * end; * end; * end; * end; * end select; * double = off; /* Reset incase it was an ISPF * cmd */ * end; * end; * end; * otherwise * ; * end select; * else /* cancel requested */ * if varlen(3) > 0 then /* if command line not blank */ * zcmd(1:varlen(3)) = ' '; /* clear command line */ * return code(0); /* Always return a zero */ * GEN DATA DEFS (TRTABLE,commands); ** *TRTABLE DC 256X'40' * ORG TRTABLE+(C'A') * DC CL9'ABCDEFGHI' * ORG TRTABLE+(C'J') * DC CL9'JKLMNOPQR' * ORG TRTABLE+(C'S') * DC CL8'STUVWXYZ' * ORG TRTABLE+(C'A'-C' ') * DC CL9'ABCDEFGHI' * ORG TRTABLE+(C'J'-C' ') * DC CL9'JKLMNOPQR' * ORG TRTABLE+(C'S'-C' ') * DC CL8'STUVWXYZ' * ORG TRTABLE+(C'$') * DC CL1'$' * ORG TRTABLE+(C'#') * DC CL1'#' * ORG TRTABLE+(C'@') * DC CL1'@' * ORG TRTABLE+256 ********************************************************************** ** Customize this section * ********************************************************************** *EDITMAC DC CL8'LINEMAC ' NAME OF EDIT MACRO TO INVOKE. USE A ** 7 OR 8 CHARACTER NAME! *COMMANDS DC F'4' SET TO 0 TO INTERCEPT ALL COMMANDS ** OR SET TO THE NUMBER OF LINES BELOW * DC CL6'RV ' 1ST COMMAND TO INTERCEPT * DC CL6'RIT ' 2ND COMMAND TO INTERCEPT * DC CL6'LEF ' 3RD COMMAND TO INTERCEPT * DC CL6'CE ' 4TH COMMAND TO INTERCEPT ********************************************************************** *@ENDGEN; * end UMAC; *---------------------------------------------------------------------* *-------------------- Assembler code starts below --------------------* *---------------------------------------------------------------------* TITLE ' /* UMAC: A panel exit to enable line macros in edit (V* ersion 1' UMAC CSECT , UMAC AMODE 31 UMAC RMODE 24 STM 14,12,12(13) LR 12,15 USING UMAC,12 LA 15,0 L 0,DSECT_SZ+4 GETMAIN RU,LV=(0),SP=(15) LR 11,1 USING @DATD,11 ST 13,4(,11) ST 11,8(,13) LM 15,1,16(13) LR 13,11 MVC INPUTPTRS1(32),0(1) * flags = ''B; MVI FLAGS,X'00' * zwidth_p = addr(varval); /* Zwidth is at start of string */ L 3,INPUTPTRS1+28 * zdata_p = zwidth_p + varlen(1); /* Zdata is adjacent to width */ L 2,INPUTPTRS1+24 L 4,0(,2) LR 8,3 ALR 8,4 * zcmd_p = zdata_p + varlen(2); /* Zcmd is adjacent to zdata */ L 5,4(,2) LR 6,8 ALR 6,5 * pack(packed,zwidth(1:varlen(1))); /* Convert zwidth to binary */ LR 7,4 BCTR 7,0 N 7,=X'0000000F' EX 7,INSTRUCTION1 -> PACK PACKED(8),0(0,3) * cvb(width,packed); /* Placing it in 'width' */ CVB 10,PACKED ST 10,WIDTH * total = varlen(2) - 7; /* For loop control */ LR 3,5 LA 7,7 SLR 3,7 ST 3,TOTAL * IF magicbit = off THEN /* If cancel */ TM 144+4(9),B'10000000' BNZ LABEL_23 * SELECT(pansect); L 3,INPUTPTRS1+8 CLI 0(3),C'I' BE LABEL_1 CLI 0(3),C'R' BE LABEL_1 CLI 0(3),C'P' BNE LABEL_24 B LABEL_2 * WHEN('I','R') /* If init or reinit */ LABEL_1 DS 0H * DO; /* Never show linecmd on command * line */ * IF varlen(3) > 7 & zcmd(1:8) = EDITMAC THEN L 3,8(,2) LA 8,7 CR 3,8 BNH LABEL_24 CLC 0(8,6),EDITMAC BNE LABEL_24 * zcmd(1:varlen(3)) = ' '; MVI TEMPSTRING1,C' ' MVC TEMPSTRING1+1(14),TEMPSTRING1 LR 10,3 BCTR 10,0 EX 10,INSTRUCTION2 -> MVC 0(0,6),TEMPSTRING1 * END; * WHEN('P') /* If proc section */ B LABEL_24 LABEL_2 DS 0H * DO; * zcursor_p = zcmd_p + varlen(3); /* Zcursor adjacent to * zcmd */ LR 3,6 AL 3,8(,2) * zcsroff_p = zcursor_p + varlen(4); /* Zcsroff adjacent to * zcursor */ LR 4,3 AL 4,12(,2) * csrrow = 0; SLR 5,5 ST 5,CSRROW * csrcol = 0; LR 10,5 * pack(packed,zcsroff(1:varlen(5))); /* Convert zcsroff to * binary */ L 7,16(,2) BCTR 7,0 N 7,=X'0000000F' EX 7,INSTRUCTION3 -> PACK PACKED(8),0(0,4) * cvb(csroff,packed); /* Placing it in 'csroff' */ CVB 2,PACKED * IF zcursor(1:5) = 'ZDATA' THEN CLC 0(5,3),=CL5'0' BNE LABEL_3 * DO; * csrcol = 1 + (csroff - 1) // width; LR 3,2 BCTR 3,0 LA 4,1 L 7,WIDTH LR 14,3 SRDA 14,32 DR 14,7 ALR 14,4 LR 10,14 * csrrow = 1 + (csroff - 1) / width; LR 0,3 SRDA 0,32 DR 0,7 ALR 1,4 ST 1,CSRROW * END; * zcmd = ''; /* clear zcmd */ LABEL_3 MVI 0(6),C' ' MVC 1(14,6),0(6) * row = 0; ST 5,ROW *loop: * DO a = 2 to total by width; /* Loop thru lines and */ LOOP LA 5,2 C 5,TOTAL BH LABEL_24 LA 7,1 LABEL_4 DS 0H * row = row + 1; LR 4,7 AL 4,ROW ST 4,ROW * linearea = zdata(a::6); LR 14,8 ALR 14,5 BCTR 14,0 MVC LINEAREA(6),0(14) * IF linearea = ' ' THEN CLC LINEAREA(6),CL_BLANKS BE LABEL_22 * ITERATE; /* Past eod */ * IF linearea(1) = '.' /* Label */ * | linearea(1) = '*' /* Top or bottom of data */ * | linearea(1) = ')' /* Shift */ * | linearea(1) = '<' /* Shift */ * THEN CLI LINEAREA,C'.' BE LABEL_22 CLI LINEAREA,C'*' BE LABEL_22 CLI LINEAREA,C')' BE LABEL_22 CLI LINEAREA,C'<' BE LABEL_22 * ITERATE loop; * IF row = csrrow & csrcol > 2 & csrcol < 8 THEN C 4,CSRROW BNE LABEL_5 LA 4,2 CR 10,4 BNH LABEL_5 LA 4,8 CR 10,4 BNL LABEL_5 * DO; * linearea(csrcol-1:6) = ''; LA 4,LINEAREA-2(10) LA 14,7 SLR 14,10 EX 14,INSTRUCTION4 -> MVC 0(0,4),CL_BLANKS * zdata(a::6) = linearea; LR 4,8 ALR 4,5 BCTR 4,0 MVC 0(6,4),LINEAREA * END; * tr(linearea,trtable); LABEL_5 TR LINEAREA(6),TRTABLE * DO b = 1 to 5 while(linearea(1)=' '); /* Left justify */ LR 2,7 CLI LINEAREA,C' ' BNE LABEL_7 LA 3,5 LABEL_6 DS 0H * mvc(linearea(1::5),linearea(2::5)); MVC LINEAREA(5),LINEAREA+1 * linearea(6) = ' '; MVI LINEAREA+5,C' ' * END; ALR 2,7 CR 2,3 BH LABEL_7 CLI LINEAREA,C' ' BE LABEL_6 LABEL_7 DS 0H * IF linearea(1) ^= ' ' THEN CLI LINEAREA,C' ' BE LABEL_22 * DO; * DO b = 2 to 6 until(linearea(b)=' '); /* scan for * space */ LA 2,2 LABEL_8 DS 0H * END; LA 3,LINEAREA-1(2) CLI 0(3),C' ' BE LABEL_9 ALR 2,7 LA 3,6 CR 2,3 BNH LABEL_8 LABEL_9 DS 0H * IF b < 7 THEN /* if imbeded space */ LA 4,7 CR 2,4 BNL LABEL_11 * DO b = b to 6; /* delete everything after space */ LA 3,6 CR 2,3 BH LABEL_11 LABEL_10 DS 0H * linearea(b) = ' '; LA 4,LINEAREA-1(2) MVI 0(4),C' ' * END; ALR 2,7 CR 2,3 BNH LABEL_10 LABEL_11 DS 0H * IF linearea(1) = ' ' /* Nothing */ * THEN CLI LINEAREA,C' ' BE LABEL_22 * ITERATE loop; * DO b = 6 downto 1 until(linearea(b)^=' '); LA 3,6 LABEL_12 DS 0H * END; LA 4,LINEAREA-1(3) CLI 0(4),C' ' BNE LABEL_13 BCTR 3,0 LTR 3,3 BP LABEL_12 LABEL_13 DS 0H * IF b > 1 & linearea(b-1) = linearea(b) THEN CR 3,7 BNH LABEL_14 LA 2,LINEAREA-2(3) LA 4,LINEAREA-1(3) CLC 0(1,2),0(4) BNE LABEL_14 * linecmd = linearea(1:b-1); MVI LINECMD+1,C' ' MVC LINECMD+2(4),LINECMD+1 LR 2,3 BCTR 2,0 BCTR 2,0 EX 2,INSTRUCTION5 -> MVC LINECMD(0),LINEAREA * ELSE * IF b // 2 = 0 & linearea(1:b/2) = linearea(b/2+1:b) * THEN B LABEL_16 LABEL_14 LR 14,3 SRDA 14,32 LA 1,2 DR 14,1 LTR 14,14 BNZ LABEL_15 LR 2,3 LR 14,2 SRL 14,31 ALR 2,14 SRA 2,1 LR 4,2 BCTR 4,0 MVI TEMPSTRING1+1,C' ' MVC TEMPSTRING1+2(4),TEMPSTRING1+1 EX 4,INSTRUCTION6 -> MVC TEMPSTRING1(0),LINEAREA MVI TEMPSTRING1+7,C' ' MVC TEMPSTRING1+8(4),TEMPSTRING1+7 LR 14,3 SLR 14,2 BCTR 14,0 LA 15,LINEAREA(2) EX 14,INSTRUCTION7 -> MVC TEMPSTRING1+6(0),0(15) CLC TEMPSTRING1(6),TEMPSTRING1+6 BNE LABEL_15 * DO; * double = on; OI DOUBLE,B'10000000' * linecmd = linearea(1:b/2); MVI LINECMD+1,C' ' MVC LINECMD+2(4),LINECMD+1 EX 4,INSTRUCTION5 -> MVC LINECMD(0),LINEAREA * END; * ELSE * linecmd = linearea; B LABEL_16 LABEL_15 MVC LINECMD(6),LINEAREA * SELECT(linecmd); LABEL_16 CLC LINECMD(6),=CL6'A ' BE LABEL_21 CLC LINECMD(6),=CL6'B ' BE LABEL_21 CLC LINECMD(6),=CL6'C ' BE LABEL_21 CLC LINECMD(6),=CL6'D ' BE LABEL_21 CLC LINECMD(6),=CL6'F ' BE LABEL_21 CLC LINECMD(6),=CL6'I ' BE LABEL_21 CLC LINECMD(6),=CL6'L ' BE LABEL_21 CLC LINECMD(6),=CL6'LC ' BE LABEL_21 CLC LINECMD(6),=CL6'LLC ' BE LABEL_21 CLC LINECMD(6),=CL6'M ' BE LABEL_21 CLC LINECMD(6),=CL6'MASK ' BE LABEL_21 CLC LINECMD(6),=CL6'MD ' BE LABEL_21 CLC LINECMD(6),=CL6'MMD ' BE LABEL_21 CLC LINECMD(6),=CL6'O ' BE LABEL_21 CLC LINECMD(6),=CL6'R ' BE LABEL_21 CLC LINECMD(6),=CL6'S ' BE LABEL_21 CLC LINECMD(6),=CL6'TE ' BE LABEL_21 CLC LINECMD(6),=CL6'TF ' BE LABEL_21 CLC LINECMD(6),=CL6'TS ' BE LABEL_21 CLC LINECMD(6),=CL6'UC ' BE LABEL_21 CLC LINECMD(6),=CL6'UUC ' BE LABEL_21 CLC LINECMD(6),=CL6'X ' BE LABEL_21 CLC LINECMD(6),=CL6'ERR ' BE LABEL_21 CLC LINECMD(6),=CL6'CHG ' BE LABEL_21 CLC LINECMD(6),=CL6'BNDS ' BE LABEL_21 CLC LINECMD(6),=CL6'MASK ' BE LABEL_21 CLC LINECMD(6),=CL6'BND ' BE LABEL_21 CLC LINECMD(6),=CL6'BOUND ' BE LABEL_21 CLC LINECMD(6),=CL6'BOUNDS' BE LABEL_21 CLC LINECMD(6),=CL6'BOU ' BE LABEL_21 CLC LINECMD(6),=CL6'COL ' BE LABEL_21 CLC LINECMD(6),=CL6'TAB ' BE LABEL_21 CLC LINECMD(6),=CL6'COLS ' BE LABEL_21 CLC LINECMD(6),=CL6'TABS ' BE LABEL_21 CLC LINECMD(6),=CL6'PROF ' BE LABEL_21 CLC LINECMD(6),=CL6'NOTE ' BE LABEL_21 CLC LINECMD(6),=CL6'MSG ' BE LABEL_21 * WHEN( /* */ * 'A ', /* Built-In a after */ * 'B ', /* Built-In b before */ * 'C ', /* Built-In c copy */ * 'D ', /* Built-In d delete */ * 'F ', /* Built-In f first */ * 'I ', /* Built-In i insert */ * 'L ', /* Built-In l last */ * 'LC ', /* Built-In lc lowercase */ * 'LLC ', /* Built-In lc lowercase block */ * 'M ', /* Built-In m move */ * 'MASK ', /* Built-In m move */ * 'MD ', /* Built-In md make data */ * 'MMD ', /* Built-In md make data block */ * 'O ', /* Built-In o overlay */ * 'R ', /* Built-In r repeat */ * 'S ', /* Built-In s show */ * 'TE ', /* Built-In te text entry */ * 'TF ', /* Built-In tf text split */ * 'TS ', /* Built-In ts text show */ * 'UC ', /* Built-In uc uppercase */ * 'UUC ', /* Built-In uc uppercase block */ * 'X ', /* Built-In x exclude */ * 'ERR ', /* Built-In ==Err> */ * 'CHG ', /* Built-In ==Chg> */ * 'BNDS ', /* Built-In =Bnds> */ * 'MASK ', /* Built-In =Mask> */ * 'BND ', /* Built-In bounds */ * 'BOUND ', /* Built-In bounds */ * 'BOUNDS', /* Built-In bounds */ * 'BOU ', /* Built-In bounds */ * 'COL ', /* Built-In cols */ * 'TAB ', /* Built-In tab */ * 'COLS ', /* Built-In =Cols> */ * 'TABS ', /* Built-In =Cols> */ * 'PROF ', /* Built-In =Prof> */ * 'NOTE ', /* Built-In =Note> */ * 'MSG ') /* Built-In ==Msg> */ * ; /* Do nothing */ * OTHERWISE * DO; * IF found = off THEN TM FLAGS,B'01000000' BNZ LABEL_21 * DO; * IF known# > 0 THEN ICM 14,15,COMMANDS BNP LABEL_19 * DO k = 1 to known#; LR 2,7 CR 2,14 BH LABEL_20 LR 4,2 ALR 4,4 ALR 4,2 ALR 4,4 LABEL_17 DS 0H * IF known$(k) = linecmd THEN LA 14,COMMANDS+4-6(4) CLC 0(6,14),LINECMD BNE LABEL_18 * found = on; OI FLAGS,B'01000000' * END; LABEL_18 ALR 2,7 LA 0,6 ALR 4,0 C 2,COMMANDS BNH LABEL_17 * ELSE * found = on; B LABEL_20 LABEL_19 OI FLAGS,B'01000000' * IF found = on THEN LABEL_20 TM FLAGS,B'01000000' BNO LABEL_21 * DO; * zcmd(1:8) = EDITMAC; MVC 0(8,6),EDITMAC * zcmd(10::6) = linecmd; MVC 9(6,6),LINECMD * IF double = on THEN TM DOUBLE,B'10000000' BNO LABEL_21 * DO; * zdata(a::6) = ''; LR 4,8 ALR 4,5 BCTR 4,0 MVC 0(6,4),CL_BLANKS * zdata(a::b/2) = linecmd; LR 2,3 LR 4,2 SRL 4,31 ALR 2,4 SRA 2,1 LR 4,8 ALR 4,5 BCTR 4,0 MVI TEMPSTRING1+6,C' ' MVC TEMPSTRING1+7(249),TEMPSTRING1+6 MVC TEMPSTRING1(6),LINECMD LR 14,2 BCTR 14,0 EX 14,INSTRUCTION8 -> MVC 0(0,4),TEMPSTRING1 * zdata(a+b/2) = linecmd(b/2); LR 4,5 ALR 4,2 ALR 4,8 BCTR 4,0 LA 14,LINECMD-1(2) MVC 0(1,4),0(14) * END; * END; LABEL_21 DS 0H * END; * END; * END select; * double = off; /* Reset incase it was an ISPF * cmd */ NI DOUBLE,B'01111111' * END; * END; LABEL_22 AL 5,WIDTH C 5,TOTAL BNH LABEL_4 * END; * OTHERWISE B LABEL_24 * ; * END select; * ELSE /* cancel requested */ * IF varlen(3) > 0 THEN /* if command line not blank */ LABEL_23 ICM 3,15,8(2) BNP LABEL_24 * zcmd(1:varlen(3)) = ' '; /* clear command line */ MVI TEMPSTRING1,C' ' MVC TEMPSTRING1+1(14),TEMPSTRING1 LR 7,3 BCTR 7,0 EX 7,INSTRUCTION2 -> MVC 0(0,6),TEMPSTRING1 * RETURN code(0); /* Always return a zero */ LABEL_24 LR 1,11 L 13,4(,13) LA 15,0 L 0,DSECT_SZ+4 FREEMAIN RU,LV=(0),A=(1),SP=(15) SLR 15,15 L 14,12(,13) LM 0,12,20(13) BR 14 * GENERATE DATA DEFS (TRTABLE,commands); * END UMAC; INSTRUCTION1 PACK PACKED(8),0(0,3) INSTRUCTION2 MVC 0(0,6),TEMPSTRING1 INSTRUCTION3 PACK PACKED(8),0(0,4) INSTRUCTION4 MVC 0(0,4),CL_BLANKS INSTRUCTION5 MVC LINECMD(0),LINEAREA INSTRUCTION6 MVC TEMPSTRING1(0),LINEAREA INSTRUCTION7 MVC TEMPSTRING1+6(0),0(15) INSTRUCTION8 MVC 0(0,4),TEMPSTRING1 LTORG CL_BLANKS DS 0C DC 6C' ' * TRTABLE DC 256X'40' ORG TRTABLE+(C'A') DC CL9'ABCDEFGHI' ORG TRTABLE+(C'J') DC CL9'JKLMNOPQR' ORG TRTABLE+(C'S') DC CL8'STUVWXYZ' ORG TRTABLE+(C'A'-C' ') DC CL9'ABCDEFGHI' ORG TRTABLE+(C'J'-C' ') DC CL9'JKLMNOPQR' ORG TRTABLE+(C'S'-C' ') DC CL8'STUVWXYZ' ORG TRTABLE+(C'$') DC CL1'$' ORG TRTABLE+(C'#') DC CL1'#' ORG TRTABLE+(C'@') DC CL1'@' ORG TRTABLE+256 ********************************************************************* * Customize this section * ********************************************************************* EDITMAC DC CL8'LINEMAC ' NAME OF EDIT MACRO TO INVOKE. USE A * 7 OR 8 CHARACTER NAME! COMMANDS DC F'4' SET TO 0 TO INTERCEPT ALL COMMANDS * OR SET TO THE NUMBER OF LINES BELOW DC CL6'RV ' 1ST COMMAND TO INTERCEPT DC CL6'RIT ' 2ND COMMAND TO INTERCEPT DC CL6'LEF ' 3RD COMMAND TO INTERCEPT DC CL6'CE ' 4TH COMMAND TO INTERCEPT ********************************************************************* DSECT_SZ DS 0A DC AL1(0) DC AL3(((@ENDDATD-@DATD+7)/8)*8) DC A(((@ENDDATD-@DATD+7)/8)*8) @DATD DSECT SAVEAREA_1 DS 18F INPUTPTRS1 DS 8F WIDTH DS F TOTAL DS F CSRROW DS F ROW DS F TEMPSTRING1 DS CL256 FLAGS DS 0BL1 DOUBLE DS BL1 LINEAREA DS CL6 LINECMD DS CL6 DS CL3 PACKED DS CL8 ORG *+1-(*-@DATD)/(*-@DATD) @ENDDATD DS 0X END UMAC,(PL/X-370,0104,99149)