view src/os_vms_fix.com @ 30549:190885deceac

Added tag v9.0.0609 for changeset 84ea6d876d43b9e1e26fa2d0ecf040cf33ea2454
author Bram Moolenaar <Bram@vim.org>
date Tue, 27 Sep 2022 19:00:05 +0200
parents 6e4e0d43b20b
children
line wrap: on
line source

$!
$! 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