home *** CD-ROM | disk | FTP | other *** search
- Name Snglspc
- Title Convert doublespace to singlespace (remove blank lines.)
- page ,132
- comment /
-
- This program is a filter that delete blank lines from a file.
-
- Examples:
- Snglspc abc.txt read input from abc.txt,
- Snglspc abc.txt >abcnew.txt
- Snglspc <abc.txt >abcnew.txt
- Snglspc abc.txt | find "ABC"
- find "abc" abc.txt | Snglspc | sort
- /
- ;===================================================================
- code segment public
- ;===================================================================
- ;
- ; command line is at 80h of psp - first byte is length
- ;
- org 80h
- parmsize db ?
- parm db 7fh dup (?)
- ;
- ; .com starts at 100h - but must jump around any data area
- ;
- org 100h ; com file starts here
- assume cs:code,ds:code,es:code
- snglspc:
- jmp clear
- ;===================================================================
- ;
- ; data area for .com programs
- ;
- cr equ 0dh
- lf equ 0ah
- eof equ 1ah
- ;
- handle dw 0h ; assume standard input
- bufsiz equ 255
- bufferin db bufsiz dup (?)
- bufferout db bufsiz dup (?)
- flag db 0h
- outcount dw 0h ; output char count
- ;
- ;===================================================================
- clear:
- ;
- ; start of actual code is here (clear)
- ;
- ;
- ; now figure out which file to read from - parm line or standard input
- ;
- cmp parmsize,0h ; if zero, no parm
- jz again ; assume standard input
- ;
- ; parm length is not zero - assume the parm is a file name. If not
- ; found, quit.
- ;
- mov al,parmsize ; get size of parm
- xor ah,ah ; zero out top part of accum.
- mov si,ax ; use length as a pointer into the dta
- mov [si]+parm,0h ; to tack on a zero byte (asciiz).
- ;
- ; now try to open the file
- ;
- lea dx,parm+1 ; address of 'filename'
- mov al,0h ; open for read only
- mov ah,3dh ; dos open function
- int 21h ; invoke function
- jc oops ; open error - quit
- mov handle,ax ; save file handle
- again:
- mov bx,handle ; read from standard input or file
- mov cx,bufsiz ; # of characters to read
- lea dx,bufferin ; seg:off address of buffer area
- mov ah,3fh ; dos read function
- int 21h ; invoke function
- ;
- jc oops ; error!
- cmp ax,0h ; if zero, end of file
- jz oops
- ;
- mov cx,ax ; cx (and ax) contain # characters read
- mov outcount,0h ; init output character counter
- lea si,bufferin ; offset of buffer
- lea di,bufferout ; address of output area
- loop1:
- lodsb ; get a character. If cr or lf,
- cmp al,cr ; increment flag.
- jne next
- add flag,1h
- jmp next3
- next:
- cmp al,lf
- jne next2
- add flag,1h
- jmp next3
- next2:
- mov flag,0h ; not cr/lf, reset flag
- next3:
- cmp flag,02h ; if flag is greater than 2, skip
- jg skip ; the characters.
- inc outcount ; increment count of characters output
- stosb
- skip:
- loop loop1 ; and repeat for entire buffer
- ;
- mov cx,outcount ; restore character count
- mov bx,1h ; standard output device
- lea dx,bufferout ; output buffer
- mov ah,40h ; dos write function
- int 21h ; invoke dos function
-
- jmp again ; repeat until end of file or error
- oops:
- int 20h ; return to dos
- code ends
- end snglspc