$! $! 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 it's 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 <...>" $ write sys$output " @OS_VMS_FIX <...>" $ 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