[comp.os.vms] PIPE source part 3 of 3

kenw@noah.arc.CDN (Ken Wallewein) (08/23/87)

$ File_is="PIPE.HLP"
$ Check_Sum_is=996867714
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X1	PIPE
X	Allows commands to be combined a la unix.
X
X	PIPE command [args...] [<fromfile] [>tofile] [| ...]
X
X	eg: pipe SHOW LOGICALS * | grep DU | srt >LP:
X
X2	COUNT
X	Counts number of lines/entries 
X
X2	DUPS
X	Finds duplicate entries in the specified portion of the line
X
X	DUPS start length
X
X	eg: PIPE  D1 | DUPS 1 10
X
X2	EDIT
X	EDIT edit_options
X	
X	Performs a DCL F$EDIT on each line of text
X
X	eg: PIPE <TEXT.LIS EDIT UPCASE,TRIM >FIXED.LIX
X
X2	ELEMENT
X	ELEMENT element_number
X	where the first element is 0
X
X	Performs a DCL F$ELEMENT(n," ",line) on each line of input, where
X	" " represents any combination of spaces and tabs
X
X	eg: PIPE SHOW DEV D |SKIP 3 |ELEMENT 0
X
X2	EXTRACT
X	EXTRACT offset length
X
X	Performs a DCL F$EXTRACT(P1,P2,line) on each line of input
X
X
X2	GREP
X	GREP search_spec
X
X	Pass only entries containing given text by performing a DCL
X	SEARCH SYS$INPUT
X
X	eg: sho log * | grep du
X
X	finds only logicals referring to du* drives
X
X2	JUSTIFY
X
X	Not currently inplemented
X
X	Useful for using context to align data into columns, suchs as
X	aligning all file extensions prior to sorting.
X
X	JUSTIFY	find_char to_column [find_char to_column...]
X
X2	MORE
X	
X	Equivalent to TYPE/PAGE SYS$INPUT
X
X2	NOCTRL
X	Filters out control characters - allows viewing binary files for
X	embedded text.
X
X2	NODUPS
X
X	Everything BUT duplicates
X
X2	SKIP
X	SKIP number_of_lines
X
X	Skips the first number_of_lines lines in the input. Useful for
X	skipping heading.
X
X2	TEE
X	TEE filespec
X
X	Splits writes a copy of the input to the specified file
X
X	eg: PIPE <filename TEE TT: >LP:
X
X2	TOTAL
X	Total value of all entries in given columns
X
X	TOTAL start-column length
X
X	eg: PIPE DIR/SIZ | TOTAL 30 10
X
X2	UNIQ
X	See NODUPS
X
X2	WIDE
X	Prints lists in wide format
X
X2	XARGS
X
X	Executes a command using input as arguments
X
X	eg: PIPE DIR *.TXT/SINCE=TODAY |XARGS TYPE/CONFIRM
X
X2	Requirements
X	The following commands must executed for PIPE to be able
X	to run:
X
X	DEFINE PIPE home_directory (eg: sys$locroot:[pipe])
X	PIPE :== @PIPE:PIPE
X
X2	Files
X
X	For PIPE commands (see pipe.ini for definitions)
X		ALLDUPS.COM	
X		DUPS.BAS	
X		DUPS.COM
X		DUPS.EXE
X		NOCTRL.C
X		NOCTRL.EXE
X		NODUPS.COM
X		WIDE.BAS
X		WIDE.EXE
X
X	Support
X		PIPE.COM	PIPE itself
X		PIPE.INI	initializer
X
X		STEM.BAS	stub code for do-it-yourself filters
X		STEM.C
X		STEM.COM
X		STEMS.C
$ GoSub Convert_File
$ File_is="PURGABLE.COM"
$ Check_Sum_is=439895041
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X$ say "purgable.com - show purgable files"
X$ say "working..."
X$
X$ on error then goto exit
X$ on control_y then goto exit
X$
X$ file_name := SYS$SCRATCH:purgable.lis
X$
X$ dir/notr/out='file_name 'p1
X$ filnam1 = f$search(file_name)
X$
X$ dir/notr/out='file_name 'p1;
X$ filnam2 = f$search(file_name)
X$
X$ diff/sep=master 'filnam1 'filnam2
X$
X$exit:
X$ if "''filnam1'" .nes. "" then delete 'filnam1
X$ if "''filnam2'" .nes. "" then delete 'filnam2
$ GoSub Convert_File
$ File_is="SKIP.COM"
$ Check_Sum_is=2084386474
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X! SKIP.COM - skip n lines at beinning of input 
X!	   - synopsis: skpi lines
X!
X$       DEASS SYS$INPUT
X$       DEASS SYS$OUTPUT
X$       IF F$LOGICAL("PIPE_INPUT") .NES. "" THEN ASSIGN PIPE_INPUT  SYS$INPUT 
X$       IF F$LOGICAL("PIPE_OUTPUT") .NES. "" THEN ASSIGN PIPE_OUTPUT SYS$OUTPUT
X$
X$	skipcnt = f$integer(p1)+1
X$SKIP:	skipcnt = skipcnt-1
X$READ:  READ/END=DONE SYS$INPUT LINE
X$	if skipcnt .ne. 0 then goto skip
X$	WRITE SYS$OUTPUT line
X$       GOTO READ
X$DONE:
$ GoSub Convert_File
$ File_is="STEM.BAS"
$ Check_Sum_is=1746151268
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X1       ! STEM.BAS V1.0 - PIPE STEM !
X        ON ERROR GOTO 32000
X
X        EXTERNAL LONG FUNCTION LIB$GET_FOREIGN
X        EXTERNAL INTEGER CONSTANT SS$_NORMAL
X
X        DIM P$(31)
X
X        COMMAND_BUFFER$ = SPACE$(80)
X
X        OPEN "SYS$COMMAND" AS FILE #1%
X
X10      STATUS% = LIB$GET_FOREIGN(COMMAND_BUFFER$,,COMMAND_LENGTH%)
X        IF STATUS% <> SS$_NORMAL
X        THEN
X            PRINT #1%, '%GET_COMMAND error'; STATUS%
X            GOTO 32767
X        END IF
X
X        CMD_CNT% = 0%
X
X        IF COMMAND_LENGTH% > 0%
X        THEN
X
X            COMMAND$ = LEFT$(COMMAND_BUFFER$,COMMAND_LENGTH%) + ' '
X
X        !   PRINT #1%, 'COMMAND WAS: "'; COMMAND$; '"'
X
X            OS% = 0%
X            S% = INSTR(OS%+1%,COMMAND$,' ')
X
X            WHILE S% > 0%
X                CMD_CNT% = CMD_CNT%+1%
X                P$(CMD_CNT%) = MID$(COMMAND$,OS%+1%,S%-OS%-1%)
X        !       PRINT #1%, 'P$(';CMD_CNT%;'): "'; P$(CMD_CNT%); '"'
X                OS% = S%
X                S% = INSTR(OS%+1%,COMMAND$,' ')
X            NEXT
X
X20      ! READ LOOP
X        LINPUT A$
X        GOSUB 100
X        PRINT A$
X        GOTO 20
X
X100     ! YOUR CODE HERE
X        ! NOTE:
X        !       AVAILABLE HERE ARE THE FOLLOWING COMMAND LINE VARIABLES:
X        !       COMMAND$ - CONTAINS ALL OPTIONS INCLUDED WITH THE COMMAND
X        !       P$()     - CONTAINS OPTIONS PARSED BY SPACES
X        !       CMD_CNT% - CONTAINS NUMBER OF OPTIONS FOUND
X
X999     RETURN
X
X32000   ! ERROR TRAPS
X
X        IF ERR=11       ! NORMAL EOF?
X        THEN
X                IF ERL=20
X                THEN
X                        RESUME 32767
X                END IF
X        END IF
X
X32100 ON ERROR GOTO 0   ! FATAL ERRORS
X
X32767 END
X
$ GoSub Convert_File
$ File_is="STEM.C"
$ Check_Sum_is=1380208176
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X/* stem.c v1.0 - pipe stem */
X
X#define EOF -1
X
Xmain()
X{
X        int byte;
X
X        while ( (byte=getchar()) != EOF )
X        {
X                /* your code here */
X                putchar( byte );
X        }
X}
X 
X
$ GoSub Convert_File
$ File_is="STEM.COM"
$ Check_Sum_is=1312981018
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X$!	PIPESTEM.COM - STUB FRONT END FOR COM FILES USED BY PIPE
X$!
X$	DEASS SYS$INPUT
X$	DEASS SYS$OUTPUT
X$	IF F$LOGICAL("PIPE_INPUT") .NES. "" THEN ASSIGN PIPE_INPUT  SYS$INPUT 
X$	IF F$LOGICAL("PIPE_OUTPUT") .NES. "" THEN ASSIGN PIPE_OUTPUT SYS$OUTPUT
X$!
X$READ:  READ/END=DONE SYS$INPUT LINE
X$!
X$!	PUT CODE HERE...
X$!
X$	WRITE SYS$OUTPUT LINE
X$	GOTO READ
X$DONE:
$ GoSub Convert_File
$ File_is="STEMS.C"
$ Check_Sum_is=573192461
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X/* stems.c - line oriented c pipestem */
X
Xchar *string[255];
X
Xmain()
X{
X        while ( gets( string ) )
X        {
X
X                /* your code here */
X
X                puts( string );
X        }
X}
X
$ GoSub Convert_File
$ File_is="SUBSTITUTE.COM"
$ Check_Sum_is=578776391
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X!SUBSTITUTE.COM V1.0 - search/substitute on a file using FORALL and EDT
X!
X$	on error then goto edit
X$	on control_y then goto exit
X$
X$	if p1 .eqs. "" .or. p2 .eqs. "" then goto badargs
X$
X$	file_name := SYS$SCRATCH:SUBSTITUTE.EDT
X$
X$	open/write file 'file_name
X$	filnam = f$search(file_name)
X$
X$	write file "subs~''p2'~''p3'~w"
X$	close file
X$
X$	FORALL 'p1 EDIT/COMMAND='filnam
X$	goto exit
X$
X$badargs:
X$	write sys$output "SUBSTITUTE filespec search_string [substitute_string]"
X$
X$exit:
X$	if f$trnlnm("file") .nes."" then -
X			close file
X$	if "''filnam'" .nes. "" .or. f$trnlnm("file") .nes."" then -
X			delete 'filnam
$ GoSub Convert_File
$ File_is="TEE.COM"
$ Check_Sum_is=1042044897
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X!       tee.COM - send a copy of sys$input to specified file
X$       DEASS SYS$INPUT
X$       DEASS SYS$OUTPUT
X$       IF F$LOGICAL("PIPE_INPUT") .NES. "" THEN ASSIGN PIPE_INPUT  SYS$INPUT 
X
X$       IF F$LOGICAL("PIPE_OUTPUT") .NES. "" THEN ASSIGN PIPE_OUTPUT SYS$OUTPUT
X!
X$READ:  READ/END=DONE SYS$INPUT LINE
X$ 
X$	write 'p1 line
X$
X$       WRITE SYS$OUTPUT LINE
X$       GOTO READ
X$DONE:
X
$ GoSub Convert_File
$ File_is="TIME.COM"
$ Check_Sum_is=1565686740
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X!time.com - times stuff
X!
X$	prev_time = "''time'"
X$	time == 'f$cvtime(,,"second")*100 + 'f$cvtime(,,"hundredth")
X$	elapsed = time - prev_time
X$
X$CMD := 'P1 'P2 'P3 'P4 'P5 'P6 'P7 'P8
X$
X$	IF CMD .EQS. "" THEN goto done
X$
X$'cmd
X$
X$	prev_time = 'time
X$	time == 'f$cvtime(,,"second")*100 + 'f$cvtime(,,"hundredth")
X$	elapsed = time - prev_time
X$
X$done:
X$	secs = elapsed/100
X$	hund = elapsed - secs*100
X$	write sys$output "elapsed: ''secs'.''hund'"
$ GoSub Convert_File
$ File_is="TOTAL.COM"
$ Check_Sum_is=779694361
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X!       TOTAL.COM - total up all items in given column
X!		  - parameters: column_offset length [output_file]
X!
X$       DEASS SYS$INPUT
X$       DEASS SYS$OUTPUT
X$       IF F$LOGICAL("PIPE_INPUT") .NES. "" THEN ASSIGN PIPE_INPUT  SYS$INPUT 
X$       IF F$LOGICAL("PIPE_OUTPUT") .NES. "" THEN ASSIGN PIPE_OUTPUT SYS$OUTPUT
X$!
X$	total = 0
X$!
X$READ:  READ/END=DONE SYS$INPUT LINE
X$!
X$	total = total + f$integer(f$extract('p1,'p2,line))
X$!
X$       if p3 .nes. "" then WRITE SYS$OUTPUT line
X$       GOTO READ
X$DONE:
X$       if p3 .eqs. "" then WRITE SYS$OUTPUT total
X$       if p3 .nes. "" then WRITE 'p3 total
$ GoSub Convert_File
$ File_is="WIDE.BAS"
$ Check_Sum_is=1761703608
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X1       ! WIDE.BAS V1.0 - PIPE WIDE LIST PRINTER !
X        ON ERROR GOTO 32000
X
X        EXTERNAL LONG FUNCTION LIB$GET_FOREIGN
X        EXTERNAL INTEGER CONSTANT SS$_NORMAL
X
X        DECLARE INTEGER CONSTANT        TRUE  = -1
X        DECLARE INTEGER CONSTANT        FALSE = 0
X
X        DECLARE INTEGER CONSTANT        OUT   = 2
X
X        COMMAND_BUFFER$ = SPACE$(80)
X
X        OPEN "SYS$OUTPUT"  FOR OUTPUT AS FILE #OUT,     &
X                RECORDSIZE 132
X
X10      STATUS% = LIB$GET_FOREIGN(COMMAND_BUFFER$)
X        MAXLEN% = VAL(COMMAND$)
X        MAXLEN% = 128%  UNLESS MAXLEN%
X
X        LINLEN% = 0%
X
X100     LINPUT LINE$
X
X        IF LINLEN%+LEN(LINE$) > MAXLEN%
X        THEN
X                PRINT #OUT
X                LINLEN%=0%
X        END IF
X        PRINT #OUT, LINE$; "   ";
X        LINLEN% = LINLEN%+LEN(LINE$)+3%
X
X        GOTO 100
X
X
X32000   ! ERROR TRAPS
X
X        IF ERR=11       ! NORMAL EOF?
X        THEN
X                IF ERL=100
X                THEN
X                        PRINT #OUT
X                        RESUME 32767
X                END IF
X        END IF
X
X32100 ON ERROR GOTO 0   ! FATAL ERRORS
X
X32767 END
X
$ GoSub Convert_File