home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / turbo55 / tp55 / tasm / filt.asm < prev    next >
Assembly Source File  |  1989-05-01  |  9KB  |  334 lines

  1.  
  2. Title 'FILT.ASM', 'Text Filter'
  3.  
  4. ;   Text FILTer
  5. ;   Version 1.0
  6. ;   Copyright (c) 1988, 1989 by Borland International, Inc.
  7. ;   Used by permission of the author.
  8. ;
  9. ;   This program performs various text filter functions.
  10. ;
  11. ;   Usage:
  12. ;
  13. ;       FILT [options] < in_file > out_file
  14. ;
  15. ;   Options:
  16. ;
  17. ;       x  = expand tabs to spaces           e  = erase all tab stops
  18. ;       c  = compress spaces to tabs         t# = set tab stop
  19. ;
  20. ;       S  = strip high bits                 m  = left margin
  21. ;       C  = strip control chars             d  = delete left margin
  22. ;       H  = strip high (>127) bytes         l# = truncate long lines
  23. ;       U  = all letters to upper-case       r  = remove trailing spaces
  24. ;       L  = all letters to lower-case       b# = byte to end input lines
  25. ;       A  = capitalize words                s  = save carriage returns
  26. ;
  27. ;       Z  = write ^Z to output              i# = input buffer size (20000)
  28. ;       z  = ignore ^Z in input              o# = output buffer size (20000)
  29.  
  30. include globals.inc
  31.  
  32. _STACK  segment
  33.     DW  500h dup (?)
  34.     EndStack    LABEL  BYTE
  35. _STACK  ends
  36. _DATA   segment
  37.  
  38. PSP    DW      ?
  39.  
  40. BUFLEN =       130
  41. CMDBUF DB      130 dup (?)
  42.  
  43. ;   line definition
  44. LeftMar DW      0       ;left margin
  45. LeftDel DW      0       ;left characters to delete
  46. Trunc   DW      0       ;truncate line length (truncate if non-zero)
  47.  
  48. ;   input control block
  49.  
  50. InpBlk  LABEL   WORD
  51.         DW      0       ;status
  52.         DW      20000   ;buffer size
  53.         DW      ?
  54.         DW      ?
  55.         DW      0       ;standard input device
  56.         DW      ?
  57.  
  58. ;   output control block
  59.  
  60. OutBlk  LABEL   WORD
  61.         DW      1       ;status
  62.         DW      20000   ;buffer size
  63.         DW      ?
  64.         DW      ?
  65.         DW      1       ;standard output device
  66.         DW      ?
  67.  
  68. ;   special characters
  69.  
  70. FF      EQU     12      ;form feed
  71. EOF     EQU     26      ;carriage return
  72. EOL     DB      LF      ;end of line character
  73.  
  74. ;   character options
  75.  
  76. STR_LOB EQU     0001h   ;strip low (control) bytes
  77. STR_HIB EQU     0002h   ;strip high bytes
  78. STR_BIT EQU     0004h   ;strip high bits
  79. MAK_UPR EQU     0008h   ;make upper-case
  80. MAK_LWR EQU     0010h   ;make lower-case
  81. MAK_CAP EQU     0020h   ;capitalize
  82. REP_TAB EQU     0040h   ;replace tabs with spaces
  83. REP_SPC EQU     0080h   ;replace spaces with tabs
  84. SAV_CR  EQU     0100h   ;save CR's
  85. REM_SPC EQU     0200h   ;delete trailing spaces
  86. SKP_EOF EQU     0400h   ;skip input EOF
  87. SUP_EOF EQU     0800h   ;suppress output EOF
  88.  
  89. Options DW      0
  90.  
  91. InpSta  DW      0
  92.  
  93. ;   help message
  94.  
  95. Help    LABEL   BYTE
  96.   DB  13,10
  97.   DB  'Text Filter, Version 1.0',13,10
  98.   DB  13,10
  99.   DB  'Usage: FILT [options] < input_file > output_file',13,10
  100.   DB  13,10
  101.   DB  'Tab Replacement:                 Tab Assignment:',13,10
  102.   DB  '  x  = expand tabs to spaces       e  = erase all tab stops',13,10
  103.   DB  '  c  = compress spaces to tabs     t# = set tab stop',13,10
  104.   DB  'Character Replacement:           Line Format:',13,10
  105.   DB  '  S  = strip high bits             m  = add left margin',13,10
  106.   DB  '  C  = strip control chars         d  = delete left margin',13,10
  107.   DB  '  H  = strip high (>127) bytes     l# = truncate long lines',13,10
  108.   DB  '  U  = all letters to upper-case   r  = remove trailing spaces',13,10
  109.   DB  '  L  = all letters to lower-case   b# = byte to end input lines',13,10
  110.   DB  '  A  = capitalize words            s  = save carriage returns',13,10
  111.   DB  'End of File:                     I/O Buffer:',13,10
  112.   DB  '  z  = ignore ^Z in input          i# = input buffer size (20000)',13,10
  113.   DB  '  Z  = suppress ^Z in output       o# = output buffer size (20000)',13,10
  114.   DB  '$'
  115.  
  116. ;   Messages and return codes.
  117.  
  118. ;   messages
  119.  
  120. mess1    DB      37, 'Option error: "?", enter ? for help',13,10
  121. mess2    DB      21, 'Insufficient memory',13,10
  122. mess3    DB      12, 'Read error',13,10
  123. mess4    DB      13, 'Write error',13,10
  124.  
  125. ;   error table
  126.  
  127. ErrTbl  LABEL   BYTE
  128.         DB      3
  129.     DW      OFFSET mess1         ;option error           (0)
  130.         DB      4
  131.     DW      OFFSET mess2         ;insufficient memory    (1)
  132.         DB      2
  133.     DW      OFFSET mess3         ;input error            (2)
  134.         DB      1
  135.     DW      OFFSET mess4         ;output error           (3)
  136.  
  137. ;   Uninitialized data.
  138.  
  139. InpBuf  DB      ?               ;input read location
  140.  
  141. Margin  DB      MAXLIN dup (?)  ;margin
  142.  
  143. LinBuf  DB      MAXLIN+2 dup (?) ;line buffer
  144.  
  145. TabTbl  DB      MAXLIN dup (?)  ;tab table
  146. TabEndx LABEL   BYTE
  147. TabEnd  EQU     OFFSET TabEndx  ;end of tab table
  148.  
  149. SpcCnt  DW       ?              ;space count (for compressing spaces)
  150.  
  151. TabOff  LABEL   WORD            ;tab offset (decrements tab column number)
  152.         DW       502 dup (?)
  153.  
  154. ;     Option table.
  155.  
  156. OptTab  LABEL   BYTE
  157.         DB      ' '
  158.     DW       0, 0                 ;option delimiter
  159.  
  160.         DB      ','
  161.     DW       0, 0                 ;option delimiter
  162.  
  163.         DB      '-'
  164.     DW       0, 0                 ;option delimiter
  165.  
  166.         DB      '/'
  167.     DW       0, 0                 ;option delimiter
  168.  
  169.         DB      'x' 
  170.         DW       0, REP_TAB           ;expand tabs
  171.  
  172.         DB      'c'
  173.     DW       0, REP_SPC           ;compress spaces with tabs
  174.  
  175.         DB      'e'
  176.     DW       OFFSET SetOpt4, 0    ;erase all tab stops
  177.  
  178.         DB      't'
  179.     DW       OFFSET SetOpt5, 0    ;set tab stop
  180.  
  181.         DB      'S'
  182.     DW       0, STR_BIT           ;strip high bits
  183.  
  184.         DB      'C'
  185.     DW       0, STR_LOB           ;strip control (<32) chars
  186.  
  187.         DB      'H'
  188.     DW       0, STR_HIB           ;strip high (>127) bytes
  189.  
  190.         DB      'U'
  191.     DW       0, MAK_UPR           ;all letters to upper-case
  192.  
  193.         DB      'L'
  194.     DW       0, MAK_LWR           ;all letters to lower-case
  195.  
  196.         DB      'A'
  197.     DW       0, MAK_CAP           ;capitalize words
  198.  
  199.         DB      'm'
  200.     DW       OFFSET SetOpt7, 0    ;left margin
  201.  
  202.         DB      'd'
  203.     DW       OFFSET SetOpt8, 0    ;delete left margin
  204.  
  205.         DB      'l'
  206.     DW       OFFSET SetOpt6, 0    ;truncate lines
  207.  
  208.         DB      'r'
  209.     DW       0, REM_SPC           ;remove trailing spaces
  210.  
  211.         DB      'b'
  212.     DW       OFFSET SetOpt3, 0    ;byte to end input lines
  213.  
  214.         DB      's'
  215.     DW       0, SAV_CR            ;save CR's
  216.  
  217.         DB      'z'
  218.     DW       0, SKP_EOF           ;ignore input EOF
  219.  
  220.         DB      'Z' 
  221.     DW       0, SUP_EOF           ;suppress output EOF
  222.  
  223.         DB      'i'
  224.     DW       OFFSET SetOpt1,  0   ;input buffer size (20000)
  225.  
  226.         DB      'o'
  227.     DW       OFFSET SetOpt2,  0   ;output buffer size (20000)
  228.  
  229.         DB      '?'
  230.     DW       OFFSET SetOpt9,  0   ;display help
  231.  
  232.         DB      'h'
  233.     DW       OFFSET SetOpt9,  0   ;display help
  234.  
  235.         DB      0
  236.  
  237. _DATA   ends
  238.  
  239. _TEXT   segment
  240.  
  241.  
  242. ;   Main program.
  243.  
  244. ;   set up stack and reduce memory allocation
  245.  
  246. FiltStart:
  247.     lea     bx, EndStack     ;end of program
  248.     mov     cl, 4
  249.     shr     bx, cl          ;adjust to paragraph
  250.     inc     bx              ;round up
  251.     mov     ax, ss
  252.     add     bx, ax
  253.     mov     ax, ds
  254.     sub     bx, ax
  255.     mov     ah, 4ah         ;function
  256.     int     21h             ;execute
  257.  
  258.     ;    initialize
  259.  
  260.     mov     dx, DGROUP
  261.     mov     ds, dx
  262.     mov     PSP, es         ;saved Program Segment Prefix
  263.     mov     es, dx
  264.     mov     dx, MAXLIN      ;max margin spaces
  265.     lea     di, Margin      ;margin area
  266.     call    Spaces          ;store spaces
  267.     call    TabReset        ;set default tab stops
  268.     call    ParseCmd        ;parse command line
  269.  
  270.     ;     input read buffer
  271.  
  272.     lea     bx, InpBlk      ;control block
  273.     call    FileAlloc       ;set up buffer
  274.     jc      main3
  275.  
  276.     ;     output write buffer
  277.  
  278.     lea     bx, OutBlk      ;control block
  279.     call    FileAlloc       ;set up buffer
  280.     jc      main3
  281.  
  282.     ;     process file
  283.  
  284.     call    ProcDoc         ;process document
  285.  
  286.     test    InpSta, INP_ERR
  287.     jnz     main4
  288.     test    InpSta, OUT_ERR
  289.     jnz     main5
  290.  
  291.     ;     close input buffer
  292.  
  293.     lea     bx, InpBlk      ;control block
  294.     call    FileFree        ;close buffer
  295.  
  296.     ;     close output buffer
  297.  
  298.     lea     bx, OutBlk      ;control block
  299.     call    FileFlush       ;flush file first
  300.     jc      main5
  301.     call    FileFree        ;close buffer
  302.  
  303.     mov     ax, 4c00h
  304.     int     21h
  305.  
  306.     ;     not enough memory
  307.  
  308. main3:
  309.     mov     al, 1
  310.     call   ErrorExit
  311.  
  312.     ;     error reading input file
  313.  
  314. main4:
  315.     mov     al, 2
  316.     call   ErrorExit
  317.  
  318.     ;     error writing output file
  319.  
  320. main5:
  321.     mov     al, 3
  322.     call   ErrorExit
  323.  
  324. ;   Error routine.
  325. ;
  326. ;   Input
  327. ;      al - local error number
  328.  
  329.     call   ErrorExit                ;error routine
  330.  
  331. _TEXT    ends
  332.  
  333. END    FiltStart
  334.