home *** CD-ROM | disk | FTP | other *** search
- Name forclean
- Title
- page ,132
- comment /
-
- This program is a filter that reads a fortran file and
- removes comment lines and numeric labels from the code.
- Used with trunc and find, this can help list all subroutines
- used by a program.
-
- ==> FIND "CALL" FORTRAN.FOR|FORCLEAN|TRUNC (|SORT|UNIQUE
- --------
- /
- ;===================================================================
- 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
- forclean:
- jmp clear
- ;===================================================================
- ;
- ; data area for .com programs
- ;
- inchar db ?
- count dw ?
- ;
- ;===================================================================
- clear:
- ;
- ; start of actual code is here (clear)
- ;
- ;
- ; Read a character. If it is 'C' skip the line. If numeric, convert
- ; to space.
- ;
- ; These two i/o parameters are constants.
- ;
- parmok:
- lea dx,inchar ; offset of inchar
- mov cx,1h ; get 1 character
- mov count,0h ; position of character in line
- again:
- ;
- ; read a character
- ;
- xor bx,bx ; zero is handle of standard input
- mov ah,3fh ; read a file/device function
- int 21h ; invoke the function
- ;
- ; if carry set of ax=0 exit
- ;
- jc oops ; i/o error
- and ax,ax ; set flags
- jz oops ; eof
- ;
- inc count ; character position in line
- ;
- ; compare character against parmline.
- ;
- cmp count,1h ; if 1, test for '$' and 'C'
- jne notfirst
- ;
- ; if C or $ skip the whole line. (It's a comment or metacommand.)
- ;
- ; If TAB, add 7 to count.
- ;
- cmp inchar,09h ; tab character?
- jne testc
- add count,07h ; adjust for tab
- jmp notfirst
- testc:
- cmp inchar,'C'
- je skip
- cmp inchar,'$'
- je skip
- ;
- ; If character is '0'-'9' and count <6 convert to space.
- ;
- notfirst:
- cmp count,6h ; test for position
- jge output ; don't test at all if count >=6.
- cmp inchar,'0' ; if '0' >= inchar >= '9' convert it.
- jl output
- cmp inchar,'9'
- jg output
- mov inchar,' ' ; convert to space
- jmp output ; output the character
- ;
- ; First character was C or $ - skip the rest of the line.
- ;
- skip:
- xor bx,bx ; zero is handle of standard input
- mov cx,1h ; get 1 character
- mov ah,3fh ; read a file/device function
- int 21h ; invoke the function
- ;
- ; if carry set of ax=0 exit
- ;
- jc oops ; i/o error
- and ax,ax ; set flags
- jz oops ; eof
- ;
- ; look for <lf>
- ;
- cmp inchar,0Ah ; if inchar is <LF>, start i/o again.
- jne skip ; otherwise skip it.
- mov count,0h
- jmp again
- output:
- mov bx,1h ; standard output handle
- mov ah,40h ; dx still points at inchar
- int 21h ; call dos output function
- ;
- ; if character just output was a <lf>, re-init the position counter
- ;
- cmp inchar,0Ah
- jne again
- mov count,0h
- jmp again ; repeat cycle
- oops:
- int 20h ; return to dos
- code ends
- end forclean