home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / sysutl / tee11.arc / TEE11.ASM next >
Assembly Source File  |  1988-09-21  |  5KB  |  167 lines

  1.     TITLE    'TEE - tee junction for DOS pipes'
  2. ;From Dr Dobbs Journal, Apr 85
  3. ;Author:  A. K. Head, 6 Duffryn Place, Melbourne Australia 3142
  4. ;    reformatted and error handling added by Ray Duncan
  5. ;
  6. ; TEE reads from the standard input (redirectable) and
  7. ; outputs to both the standard output (redirectable)
  8. ; and a file, e.g.:  DIR | TEE C:\MYDIR\FILE.EXT | SORT
  9. ; [Toad Hall Note:  The above example does NOT work (is not sorted).]
  10.  
  11. ; The file can be CON, LPT1, etc.  If it is CON, then
  12. ; keyboard Control-S pauses the display as usual.
  13. ;
  14. ;(Excerpt from the 16-Bit Software Toolbox column by Ray Duncan,
  15. ; same issue)
  16. ;
  17.  
  18. ;TEE    - A standard filter in Unix systems, is used in a pipe to make
  19. ;    two copies of the standard input, directing one to a file and
  20. ;    the other to the standard output (which might also be redirected
  21. ;    into a file).  Where you normally would use a filename, here you
  22. ;    can use any logical device such as PRN: or CON:.  For example,
  23. ;    you could enter the command:
  24. ;    DIR |SORT|TEE C:SORTED.DIR
  25. ; [Toad Hall Note:  The above example DOES work.]
  26.  
  27. ;    This would direct the output of the directory command to the SORT
  28. ;    filter and thence to TEE, which would send one copy of the sorted
  29. ;    listing to the disk file C:SORTED.DIR and the other copy to the
  30. ;    standard output (console, in this case).  This version of TEE
  31. ;    doesn't support the Unix switches -i (ignore interrupts) or -a
  32. ;    (append to previous contents of a file).
  33. ;
  34. ;
  35. ;v1.1
  36. ; - Toad Hall Tweak
  37. ; - Typed in from Dr Dobbs listing
  38. ; - Slightly tweaked
  39. ; David Kirschbaum
  40. ; Toad Hall
  41. ; kirsch@braggvax.ARPA
  42.  
  43.  
  44. COMMAND    equ    80H        ;buffer for command tail
  45. BUFLEN    equ    16384        ;buffer length, alter to taste
  46.  
  47. CR    equ    0DH        ;ASCII carriage return
  48. LF    equ    0AH        ;ASCII line feed
  49. ;FF    equ    0CH        ;ASCII form feed
  50. EOF    equ    01AH        ;End-of-file marker
  51. ;TAB    equ    09H        ;ASCII tab code
  52. BLANK    equ    20H        ;ASCII blank
  53.  
  54.                 ;DOS 2.x pre-defined handles
  55. STDIN    equ    0000        ; standard input file
  56. ;STDOUT    equ    0001        ; standard output file
  57. STDERR    equ    0002        ; standard error file
  58. ;STDAUX    equ    0003        ; standard auxiliary file
  59. ;STDPRN    equ    0004        ; standard printer file
  60.  
  61. Cseg    SEGMENT PARA PUBLIC 'Code'
  62.  
  63.     ASSUME    CS:Cseg, DS:Cseg
  64.  
  65.     org    100H
  66.  
  67. Tee    proc    near        ;TH was FAR, but no reason for that
  68.  
  69.     xor    ax,ax            ;TH clear msb
  70.     mov    si,COMMAND        ;TH address of command string
  71.     cld                ;TH insure fwd
  72.     lodsb                ;TH snarf length of cmd tail, bump SI
  73.     mov    cx,ax            ;TH length in CX for counter
  74.     mov    di,si            ;TH point DI to command string+1
  75.     mov    dx,si            ;TH DX needs COMMAND+1 later
  76.  
  77. Tee1:                    ;squeeze out leading spaces
  78.     lodsb                ;TH snarf cmd line char
  79.     cmp    al,BLANK        ;a space or less?
  80.     jbe    Tee2            ;yep, skip it
  81.      stosb                ;TH stuff in command buffer, bump DI
  82. Tee2:
  83.     loop    Tee1            ;go until it's exhausted
  84.  
  85. ;TH cx is already 0 from the Tee1 loop
  86.     mov    [di],ah            ;make ASCIIZ string
  87.  
  88.     mov    ah,3CH            ;create output file
  89. ;    xor    cx,cx            ;TH attribute=0
  90. ;    mov    dx,COMMAND+1        ;command string
  91.     int    21H
  92.     jb    Tee6            ;can't create file
  93.  
  94.     mov    handle,ax        ;save token for file
  95.  
  96. Tee3:    mov    ah,3FH            ;read standard input
  97. ;    mov    bx,STDIN
  98.     xor    bx,bx            ;TH 0 = STDIN
  99.     mov    cx,BUFLEN
  100.     mov    dx,offset buffer    ;TH was LEA
  101.     int    21H
  102.     jb    Tee4            ;read error
  103.  
  104.     mov    nchar,ax        ;save length of read
  105.     or    ax,ax            ;anything read in?
  106.     jz    Tee4            ;nope, end of file, exit
  107.  
  108.     mov    cx,ax            ;TH nr chars read = nr to write
  109.     mov    ah,40H            ;write to file
  110.     mov    bx,handle
  111. ;    mov    cx,nchar
  112.     int    21H
  113.     jb    Tee7            ;write error
  114.  
  115. ;    cmp    ax,nchar        ;did we write all we read?
  116.     cmp    ax,cx            ;TH did we write all we read?
  117.     je    Tee3            ;TH yep, read again until EOF
  118. ;Bug report says this count may be short 1 if DOS hit a Ctrl Z EOF
  119. ;in a file.  Let's check...
  120.     mov    si,offset buffer    ;point to buffer
  121.     add    si,ax            ;short char count = buffer ptr
  122.     cmp    byte ptr [si],EOF    ;Is that char the EOF?
  123.     jne    Tee7            ;nope, some other write error
  124.                     ;else just close up w/o error
  125.  
  126. Tee4:    mov    ah,3EH            ;close output file
  127.     mov    bx,handle
  128.     int    21H
  129.  
  130. Tee5:    mov    ax,4C00H        ;terminate, ERRORLEVEL 0
  131.     int    21H
  132.  
  133. Tee6:    mov    dx,offset err1        ;'Can't create file'
  134.     mov    cx,ERR1LEN        ;length of err msg
  135.     mov    ah,40H            ;display error msg & exit
  136.     mov    bx,STDERR
  137.     int    21H
  138.     mov    ax,4C01H        ;terminate, ERRORLEVEL 1
  139.     int    21H
  140.  
  141. Tee7:    mov    dx,offset err2        ;'Disk is full'
  142.     mov    cx,ERR2LEN        ;length of error msg
  143.     mov    ah,40H            ;display error msg & exit
  144.     mov    bx,STDERR
  145.     int    21H
  146.     mov    ah,3EH            ;close output file
  147.     mov    bx,handle
  148.     int    21H
  149.     mov    ax,4C02H        ;terminate, ERRORLEVEL 2
  150.     int    21H
  151.  
  152. Tee    endp
  153.  
  154. nchar    dw    0            ;nr of chars actually input
  155. handle    dw    0            ;token for output file
  156.  
  157. err1    db    CR,LF,'Tee: Cannot create file',CR,LF
  158. ERR1LEN    equ    $-offset err1
  159.  
  160. err2    db    CR,LF,'Tee: Disk is full.',CR,LF
  161. ERR2LEN    equ    $-offset err2
  162.  
  163. buffer    equ    $        ;data is read here from standard input
  164.  
  165. Cseg    ends
  166.     end    Tee
  167.