276 lines
7.6 KiB
Text
276 lines
7.6 KiB
Text
$!
|
|
$! OS_VMS_FIX.COM
|
|
$! Copyright (C) 2000, Stephen P. Wall
|
|
$!
|
|
$! Filter files for "#if" line continuations using a '\' and convert
|
|
$! them to use comments for the continuation. Necessary for VAXC - it
|
|
$! doesn't understand the '\'.
|
|
$!
|
|
$! Yes, this is honkin' ugly code, but I deliberately avoided
|
|
$! if ...
|
|
$! then
|
|
$! ....
|
|
$! endif
|
|
$! and call/subroutine/endsubroutine constructs, because I can still
|
|
$! remember when DCL didn't have them, and I wanted this to be as
|
|
$! portable as possible, so... If you want to structure it nicer for
|
|
$! your own use, please feel free to do so. However, please only
|
|
$! distribute it in its original form.
|
|
$!
|
|
$! I wrote it in DCL for portability and ease of use - a C version
|
|
$! would definitely run faster, but then I'd have to deal with compiler
|
|
$! differences, and users would have to deal with configuring and
|
|
$! building it. With DCL, it runs out-of-the-box.
|
|
$!
|
|
$! Note that if you use this from a VMS system to modify files on a
|
|
$! mounted network drive, f$search() may return only the first matching
|
|
$! file when it tries to resolve wildcards. I have been unable to find
|
|
$! a way around this. Either copy the files to a local disk, or specify
|
|
$! each file individually (Keep in mind if you do this that VMS limits
|
|
$! you to eight parameters, so you'll only be able to filter eight files
|
|
$! at a time).
|
|
$!
|
|
$! Ideas...
|
|
$! - Use 'search filespec "#","if","\"/mat=and' to quickly eliminate
|
|
$! files that definitely don't need filtering. This should speed
|
|
$! things up considerable. Reading and writing every line from every
|
|
$! file takes quite a bit of time...
|
|
$! - Error handling isn't great. Come up with something better....
|
|
$!
|
|
$! E-mail addresses:
|
|
$! Steve Wall hitched97@velnet.com
|
|
$! Zoltan Arpadffy arpadffy@polarhome.com
|
|
$! John W. Hamill jhamill3@ford.com
|
|
$!
|
|
$! Modification History:
|
|
$! 13Jul00 SWall Initial Version
|
|
$! 14Jul00 ZArpadffy Display usage
|
|
$! 06Mar01 JHamill Ctrl-M problem fix
|
|
$!
|
|
$! If no parameters, or "-h" for a parameter, print usage and exit
|
|
$
|
|
$ all = "''p1'''p2'''p3'''p4'''p5'''p6'''p7'''p8'"
|
|
$ if (all .nes. "") .and. (p1 .nes. "-h") .and. (p1 .nes. "-H") then goto startup
|
|
$
|
|
$ write sys$output "OS_VMS_FIX - DECC->VAXC pre-processor directive convert script"
|
|
$ write sys$output "Usage: @OS_VMS_FIX <filename_1> <filename_2> <...>"
|
|
$ write sys$output " @OS_VMS_FIX <filename with wildcard> <...>"
|
|
$ write sys$output ""
|
|
$ write sys$output "Example: @OS_VMS_FIX *.c *.h [.proto]*.pro"
|
|
$ write sys$output "Please note, you can define up to 8 parameters."
|
|
$ write sys$output ""
|
|
$ exit
|
|
$
|
|
$! Create an FDL file to convert VFC format files to Stream_LF.
|
|
$! VMS OPEN/WRITE command creates VFC files. When VFC files are read
|
|
$! out under unix, they appear to have binary data embedded in them.
|
|
$! To be friendly, we'll convert them to Stream_LF, which reads just
|
|
$! file on unix.
|
|
$
|
|
$startup:
|
|
$ on control_y then goto stopfdl
|
|
$ open/write fdl []convert.fdl
|
|
$ write fdl "SYSTEM"
|
|
$ write fdl " SOURCE VAX/VMS"
|
|
$ write fdl "FILE"
|
|
$ write fdl " ORGANIZATION SEQUENTIAL"
|
|
$ write fdl "RECORD"
|
|
$ write fdl " BLOCK_SPAN YES"
|
|
$ write fdl " CARRIAGE_CONTROL CARRIAGE_RETURN"
|
|
$ write fdl " FORMAT STREAM"
|
|
$ write fdl " SIZE 0"
|
|
$ close fdl
|
|
$ on control_y then goto endparamloop
|
|
$
|
|
$! Some symbols for use later on...
|
|
$
|
|
$ spc = ""
|
|
$ spc[0,8] = 32
|
|
$ tab = ""
|
|
$ tab[0,8] = 9
|
|
$
|
|
$! Scan all positional arguments, do wildcard expansion, and call the
|
|
$! filter routine on each resulting filename.
|
|
$
|
|
$ cnt = 0
|
|
$paramloop:
|
|
$ cnt = cnt + 1
|
|
$
|
|
$! VMS only allows command line parameters P1 - P8, so stop after
|
|
$! processing 8 arguments.
|
|
$
|
|
$ if cnt .eq. 9 then goto endparamloop
|
|
$
|
|
$! Skip any empty parameter.
|
|
$
|
|
$ if P'cnt' .eqs. "" then goto paramloop
|
|
$
|
|
$! Got a parameter - do wildcard expansion.
|
|
$
|
|
$ arg = f$parse(P'cnt')
|
|
$ write sys$output "Parsing ''arg'..."
|
|
$ last = ""
|
|
$fileloop:
|
|
$ file = f$search(arg, 1)
|
|
$
|
|
$! f$search() returns "" after the last of multiple matches.
|
|
$
|
|
$ if file .eqs. "" then goto endfileloop
|
|
$
|
|
$! Strip the version number.
|
|
$
|
|
$ file = f$parse(file,,,"DEVICE") + f$parse(file,,,"DIRECTORY") + -
|
|
f$parse(file,,,"NAME") + f$parse(file,,,"TYPE")
|
|
$
|
|
$! f$search() returns the same filename over and over if there are no
|
|
$! wildcards in it.
|
|
$
|
|
$ if file .eqs. last then goto endfileloop
|
|
$ last = file
|
|
$
|
|
$! Got a valid file - filter it.
|
|
$
|
|
$ gosub filter
|
|
$
|
|
$! Reset our error handling.
|
|
$
|
|
$ on control_y then goto endparamloop
|
|
$
|
|
$! See if there's another matching filename.
|
|
$
|
|
$ goto fileloop
|
|
$endfileloop:
|
|
$
|
|
$! Check for another parameter.
|
|
$
|
|
$ goto paramloop
|
|
$endparamloop:
|
|
$
|
|
$! Finished - delete the FDL file.
|
|
$
|
|
$ delete []convert.fdl;
|
|
$
|
|
$! So long, and thanks for all the fish...
|
|
$
|
|
$ exit
|
|
$
|
|
$
|
|
$! User aborted with Control-Y during creation of FDL file.
|
|
$! Close the file, delete it, and exit with an error status.
|
|
$
|
|
$stopfdl:
|
|
$ close fdl
|
|
$ delete []convert.fdl;
|
|
$ exit %X10000000
|
|
$
|
|
$
|
|
$! Filter a file.
|
|
$
|
|
$filter:
|
|
$ write sys$output "Filtering ''file'..."
|
|
$
|
|
$! Get a temporary filename from the subroutine parameter.
|
|
$
|
|
$ tmp = f$parse(file,,,"DEVICE") + f$parse(file,,,"DIRECTORY") + -
|
|
"tmp_" + f$parse(file,,,"NAME") + f$parse(file,,,"TYPE")
|
|
$ on control_y then goto aborted
|
|
$ open /read input 'file'
|
|
$ open /write output 'tmp'
|
|
$ changed = 0
|
|
$readloop:
|
|
$ read/end_of_file=endreadloop/error=readlooperror input line
|
|
$
|
|
$! Get the first 3 non-blank character on the line.
|
|
$
|
|
$ start = f$extract(0,3,f$edit(line,"COLLAPSE,LOWERCASE"))
|
|
$
|
|
$! If the line doesn't start with some form of "#if", just write it to
|
|
$! the temp file.
|
|
$
|
|
$ if start .nes. "#if" then goto writeit
|
|
$chkbkslsh:
|
|
$
|
|
$! See if the line ends in a backslash. If not, write it to the temp file.
|
|
$
|
|
$ if f$extract(f$length(line)-1,1,line) .nes. "\" then goto writeit
|
|
$
|
|
$! Ok, got a line that needs to be modified. Mark this file as changed,
|
|
$! then replace the backslash at the end with the beginning of a comment
|
|
$! (/*), and write it to the temp file.
|
|
$
|
|
$ changed = 1
|
|
$ line = f$extract(0,f$length(line)-1,line) + "/*"
|
|
$ write/symbol output line
|
|
$
|
|
$! Get another line from the input.
|
|
$
|
|
$ read/end_of_file=endreadloop/error=readlooperror input line
|
|
$
|
|
$! Grab all the blank space from the beginning of the line.
|
|
$
|
|
$ spaces = ""
|
|
$spaceloop:
|
|
$ if (f$extract(0,1,line) .nes. spc) .and. (f$extract(0,1,line) .nes. tab) -
|
|
then goto endspaceloop
|
|
$ spaces = spaces + f$extract(0,1,line)
|
|
$ line = f$extract(1,f$length(line)-1,line)
|
|
$ goto spaceloop
|
|
$endspaceloop:
|
|
$
|
|
$! Stick an end-comment (*/) after the leading blanks, then go back and
|
|
$! check for a trailing backslash again, to catch code that continues
|
|
$! across multiple lines.
|
|
$
|
|
$ line = spaces + "*/ " + line
|
|
$ goto chkbkslsh
|
|
$
|
|
$! Write the current line, (will either be an untouched line, or the
|
|
$! last line of a continuation) to the temp file, and go back to look
|
|
$! for more input.
|
|
$!
|
|
$writeit:
|
|
$ write/symbol output line
|
|
$ goto readloop
|
|
$
|
|
$! Hit EOF. Close the input & output, and if the file was marked as
|
|
$! changed, convert it from VMS VFC format, to the more common Stream_LF
|
|
$! format, so it doesn't show up full of garbage if someone tries to
|
|
$! edit it on another OS.
|
|
$!
|
|
$endreadloop:
|
|
$ close input
|
|
$ close output
|
|
$ if changed .eq. 0 then goto nocopy
|
|
$ convert 'tmp' 'file' /fdl=[]convert.fdl
|
|
$nocopy:
|
|
$ delete 'tmp';
|
|
$
|
|
$! Exit this subroutine.
|
|
$
|
|
$ goto endfunc
|
|
$
|
|
$! Got a read error. Say so, and trash the temp file.
|
|
$
|
|
$readlooperror:
|
|
$ write sys$error "Error processing file ''file'"
|
|
$ goto errorend
|
|
$
|
|
$! Got an interrupt. Say so, and trash the temp file.
|
|
$
|
|
$aborted:
|
|
$ write sys$error "Aborted while processing file ''file'"
|
|
$
|
|
$! Common code for read errors and interrupts.
|
|
$
|
|
$errorend:
|
|
$ close input
|
|
$ close output
|
|
$ delete 'tmp';
|
|
$ return %X10000000
|
|
$
|
|
$! End of filter subroutine.
|
|
$
|
|
$endfunc:
|
|
$ return
|
|
$
|
|
$! EOF
|