home *** CD-ROM | disk | FTP | other *** search
- name tee
- page 52,132
- title 'TEE - tee junction for DOS pipes'
- ;
- ; TEE---A 'tee' junction for DOS 2.x pipes
- ; after the fashion of the Unix function TEE
- ;
- ; TEE reads from the standard input (redirectable) and
- ; outputs to both the standard output (redirectable)
- ; and a file, e.g. : DIR | TEE C:\MYDIR\FILE.EXT | SORT
- ;
- ; The file can be CON, LPT1, etc. If it is CON, then
- ; keyboard Control-S pauses the display as usual.
-
- command equ 80h ;buffer for command tail
- buflen equ 16384 ;buffer length, alter to taste
-
- cr equ 0dh ;ASCII Carriage Return
- lf equ 0ah ;ASCII Line Feed
- ff equ 0ch ;ASCII Form Feed
- eof equ 01ah ;End-Of-File marker
- tab equ 09h ;ASCII Tab
- blank equ 20h ;ASCII blank
-
- ;DOS pre-defined handles
- stdin equ 0000 ;standard input file
- stdout equ 0001 ;standard output file
- stderr equ 0002 ;standard error file
- stdaux equ 0003 ;standard auxilliary file (i.e. COMM1)
- stdprn equ 0004 ;standard printer file
-
- cseg segment para public 'CODE'
-
- assume cs:cseg, ds:cseg
-
- org 100h ;this is going to be a .COM
-
- tee proc far
-
- mov cl,ds:command ;get length of command tail
- xor ch,ch
- ;address of command string
- mov si,offset command + 1
- mov di,offset command + 1
- tee1: ;squeeze out leading spaces
- mov al,byte ptr[si]
- cmp al,blank
- jbe tee2
- mov byte ptr[di],al
- inc di
-
- tee2: inc si ;look through command tail
- loop tee1 ;until it's exhausted
- mov byte ptr[di],0 ;make ASCIIZ string
- mov ah,3ch ;create output file
- mov cx,0 ;attribute=0
- mov dx,offset command+1
- int 21h
- jc tee6 ;can't create file
- mov handle,ax ;save token for file
-
- tee3: mov ah,3fh ;read standard input
- mov bx,stdin
- mov cx,buflen
- lea dx,buffer
- int 21h
- jc tee4 ;jump, error
- mov nchar,ax ;save length of read
- cmp ax,0 ;nothing read in?
- je tee4 ;end of file, exit
- mov ah,40h ;write to file...
- mov bx,handle
- mov cx,nchar
- int 21h
- jc tee7 ;jump, write failed
- ; cmp ax,nchar
- ; jne tee7 ;jump, write failed
- mov ah,40h ;now write to standard output...
- mov bx,stdout
- int 21h
- jc tee7 ;jump, write failed
- cmp ax,nchar
- jne tee7 ;jump, write failed
- jmp tee3 ;read again until end of file
-
- tee4: mov ah,3eh ;close output file
- mov bx,handle
- int 21h
-
- tee5: mov ax,4c00h ;exit with retcode 0
- int 21h
-
- tee6: mov dx,offset err1 ;print "Can't create file"
- mov cx,err1len
- mov ah,40h ;display error message and exit
- mov bx,stderr
- int 21h
- mov ax,4c01h ;exit with retcode 1
- int 21h
-
- tee7: mov dx,offset err2 ;print "Disk is full"
- mov cx,err2len
- mov ah,40h ;display error message and exit
- mov bx,stderr
- int 21h
- mov ah,3eh ;close output file
- mov bx,handle
- int 21h
- mov ax,4c02h ;exit with retcode 2
- int 21h
-
- tee endp
-
- nchar dw 0 ;number of chars actually input
- handle dw 0 ;token for output file
-
- err1 db cr,lf
- db 'tee: Cannot create file'
- db cr,lf
- err1len equ (this byte)-(offset err1)
-
- err2 db cr,lf
- db 'tee: Disk is full.'
- db cr,lf
- err2len equ (this byte)-(offset err2)
-
- buffer equ this byte ;data is read here from standard input
-
- cseg ends
-
- end tee
-