I took the freedom to enhance the code a bit.
I did regret that there was no way to for example perform a hex sort. So,
my enhancement allows the user to pass either simple arguments for the SORT
stage, or to pass a few stages, which would normally include a SORT. I also
changed the parse of the input parameters.
I didn't like that such a SORT would not be seen as a change (the code
restored the alteration count). So, I bump the alteration counts by 1.
And, there was no need to turn AUTOSAVE OFF while the macro runs. XEDIT
performs an autosave only after that a macro ends.
Here's the result:
/* This XEDIT macro makes it possible to use PIPEs to sort in XEDIT
+-----------------------------------------------------------+
| format: | PSORT sort_args |
+-----------------------------------------------------------+
"sort_args" can have two formats
- arguments recognized by PIPE's SORT stage
Example: PSORT W3.2
- When "sort args" starts with a | character, then you can add some
extra PIPE stages (you must explicitly insert the SORT stage too)
Example: to sort minidisk addresses in Hex:
PSORT |XLATE W4 A-F FA-FF |SORT W3.2|XLATE W4 FA-FF A-F
or PSORT |xlate W4 E2A |sort W3.2|xlate w4 A2E
There is no check that a SORT stage is present. As end-user you
should assure there is at least one stage that buffers the records,
otherwise XEDIT records get lost.
Created by:
Mike Walter, Aon Corporation
with the help of Rob van der Heij, Velocity
Some improvements by myself.
Written by: Kris Buelens IBM Belgium; BUELENSC at BRUVMBRS 23 Dec 2010*/
/* PIPXESRT XEDIT - CMS Pipelines sort in XEDIT w/o disk I/O */
/* No Pipelines Runtime Library (RTL) reliance */
parse source xos xct xfn xft xfm xcmd xenvir .
parse arg operands
if left(strip(operands,'L'),1)='|' then sortit=operands
else sortit='|SORT' operands
'COMMAND EXTRACT /MSGMODE/ALT/' /* Current settings */
'COMMAND SET MSGMODE OFF' /* Many line deletes */
'COMMAND TOP'
address command,
'PIPE (END ?)' ,
'| XEDIT', /* Read recs from XEDIT ring file */
sortit, /* Sort and pass XEDIT input recs */
'| o: FANOUT' , /* Copy sorted recs to XEDIT ring file */
'| TAKE FIRST 1' , /* Do not buffer full file */
'| SPECS /:0 DELETE */' ,
'| SUBCOM XEDIT' , /* Execute ":0 DELETE *" command */
'? o:' , /* Accept sorted records from FANOUT */
'| XEDIT' /* Write sorted recs to XEDIT ring file*/
src=rc
'COMMAND SET ALT' alt.1+1 alt.2+1 /* Prevent AUTOSAVE & QUIT*/
'COMMAND TOP' /* Back to first line */
'COMMAND SET MSGMODE' msgmode.1 /* Restore setting */
Exit src
2010/12/15 Mike Walter <[email protected]>
>
> Finally closing the loop with this thread:
> With offline help from Rob, the following are two slightly different means
> to accomplish the same thing - answering my original question about how to
> sort a file within XEDIT without performing disk I/O, and without needlessly
> buffering the whole file twice in XEDIT, and not even mentioning avoidance
> of the XEDIT command "INSERT" (which truncates very long records based on
> the maximum command line input).
>
> Mike Walter
> Aon Corporation
> The opinions expressed herein are mine alone, not my employer's.
>
> /* PIPXESRT XEDIT - CMS Pipelines sort in XEDIT w/o disk I/O */
> /* No Pipelines Runtime Library (RTL) reliance */
> parse source xos xct xfn xft xfm xcmd xenvir .
> parse upper arg parms 1 operands '(' options ')' parmrest
>
> parse var operands sortargs
>
> 'COMMAND EXTRACT /MSGMODE/AUTOSAVE/ALT/' /* Current settings */
> $alt.1=alt.1
> $alt.2=alt.2
>
> 'COMMAND SET MSGMODE OFF' /* Many line deletes */
> 'COMMAND SET AUTOSAVE OFF' /* Many line deletes */
> 'COMMAND TOP'
> address command,
> 'PIPE (END ?)' ,
> '| XEDIT', /* Read recs from XEDIT ring file */
> '| SORT' sortargs , /* Sort and pass XEDIT input recs */
> '| o: FANOUT' , /* Copy sorted recs to XEDIT ring file */
> '| TAKE FIRST 1' , /* Do not buffer full file */
> '| SPECS /:0 DELETE */' ,
> '| SUBCOM XEDIT' , /* Execute ":0 DELETE *" command */
> '? o:' , /* Accept sorted records from FANOUT */
> '| XEDIT' /* Write sorted recs to XEDIT ring file*/
> src=rc
>
> 'COMMAND SET ALT' $alt.1 $alt.2 /* Prevent AUTOSAVE */
> 'COMMAND SET AUTOSAVE' autosave.1 /* Restore setting */
> 'COMMAND TOP' /* Back to first line */
> 'COMMAND SET MSGMODE' msgmode.1 /* Restore setting */
> Exit src
>
>
> The following is a nearly-identical version, but which requires the
> Pipelines RunTime Library "CONDITIONAL" keyword on the STRLITERAL stage
> (see: PIPELINE NEWS1111), and also provides an example of the "IF" stage.
> The "IF" stage _is_ present in the distributed CMS Pipelines, just not
> documented there - perhaps because it was never fully tested?
>
>
> /* RTLXESRT XEDIT - CMS Pipelines sort in XEDIT w/o disk I/O */
> /* Prereq: Pipelines Runtime Library (RTL) "COND" */
> parse source xos xct xfn xft xfm xcmd xenvir .
> parse upper arg parms 1 operands '(' options ')' parmrest
>
> parse var operands sortargs
>
> 'COMMAND EXTRACT /MSGMODE/AUTOSAVE/ALT/LRECL/' /* Curr settings */
> $alt.1=alt.1
> $alt.2=alt.2
>
> 'COMMAND SET MSGMODE OFF' /* Many line deletes */
> 'COMMAND SET AUTOSAVE OFF' /* Many line deletes */
> 'COMMAND TOP'
> address command,
> 'PIPE (END ?)' ,
> '| XEDIT', /* Read recs from XEDIT ring file */
> '| SORT' sortargs , /* Sort and pass XEDIT input recs */
> '| STRLITERAL PREFACE CONDITIONAL /:0 DELETE */' , /*Preface*/
> '| PAD' lrecl.1 , /* Force cmd to match file lrecl */
> '| x: IF TAKE' , /* "IF" recs (yes: ":0 DELETE *" + recs*/
> '| SUBCOM XEDIT' , /* "THEN" execute ":0 DELETE *" cmd */
> '| x:' , /* "ELSE" */
> '| XEDIT' , /* Write sorted recs to XEDIT ring file*/
> '| x:' /* "ENDIF" */
> src=rc
>
> 'COMMAND SET ALT' $alt.1 $alt.2 /* Prevent AUTOSAVE */
> 'COMMAND SET AUTOSAVE' autosave.1 /* Restore setting */
> 'COMMAND TOP' /* Back to first line */
> 'COMMAND SET MSGMODE' msgmode.1 /* Restore setting */
> Exit src
>
> ------------------------------
>
> The information contained in this e-mail and any accompanying documents may
> contain information that is confidential or otherwise protected from
> disclosure. If you are not the intended recipient of this message, or if
> this message has been addressed to you in error, please immediately alert
> the sender by reply e-mail and then delete this message, including any
> attachments. Any dissemination, distribution or other use of the contents of
> this message by anyone other than the intended recipient is strictly
> prohibited. All messages sent to and from this e-mail address may be
> monitored as permitted by applicable law and regulations to ensure
> compliance with our internal policies and to protect our business. E-mails
> are not secure and cannot be guaranteed to be error free as they can be
> intercepted, amended, lost or destroyed, or contain viruses. You are deemed
> to have accepted these risks if you communicate with us by e-mail.
--
Kris Buelens,
IBM Belgium, VM customer support