7
|
1 $!
|
|
2 $! OS_VMS_FIX.COM
|
|
3 $! Copyright (C) 2000, Stephen P. Wall
|
|
4 $!
|
|
5 $! Filter files for "#if" line continuations using a '\' and convert
|
|
6 $! them to use comments for the continuation. Necessary for VAXC - it
|
|
7 $! doesn't understand the '\'.
|
|
8 $!
|
|
9 $! Yes, this is honkin' ugly code, but I deliberately avoided
|
|
10 $! if ...
|
|
11 $! then
|
|
12 $! ....
|
|
13 $! endif
|
|
14 $! and call/subroutine/endsubroutine constructs, because I can still
|
|
15 $! remember when DCL didn't have them, and I wanted this to be as
|
|
16 $! portable as possible, so... If you want to structure it nicer for
|
|
17 $! your own use, please feel free to do so. However, please only
|
|
18 $! distribute it in it's original form.
|
|
19 $!
|
|
20 $! I wrote it in DCL for portability and ease of use - a C version
|
|
21 $! would definitely run faster, but then I'd have to deal with compiler
|
|
22 $! differences, and users would have to deal with configuring and
|
|
23 $! building it. With DCL, it runs out-of-the-box.
|
|
24 $!
|
|
25 $! Note that if you use this from a VMS system to modify files on a
|
|
26 $! mounted network drive, f$search() may return only the first matching
|
|
27 $! file when it tries to resolve wildcards. I have been unable to find
|
|
28 $! a way around this. Either copy the files to a local disk, or specify
|
|
29 $! each file individually (Keep in mind if you do this that VMS limits
|
|
30 $! you to eight parameters, so you'll only be able to filter eight files
|
|
31 $! at a time).
|
|
32 $!
|
|
33 $! Ideas...
|
|
34 $! - Use 'search filespec "#","if","\"/mat=and' to quickly eliminate
|
|
35 $! files that definitely don't need filtering. This should speed
|
|
36 $! things up considerable. Reading and writing every line from every
|
|
37 $! file takes quite a bit of time...
|
|
38 $! - Error handling isn't great. Come up with something better....
|
|
39 $!
|
|
40 $! E-mail addresses:
|
|
41 $! Steve Wall hitched97@velnet.com
|
|
42 $! Zoltan Arpadffy arpadffy@polarhome.com
|
|
43 $! John W. Hamill jhamill3@ford.com
|
|
44 $!
|
|
45 $! Modification History:
|
|
46 $! 13Jul00 SWall Initial Version
|
|
47 $! 14Jul00 ZArpadffy Display usage
|
|
48 $! 06Mar01 JHamill Ctrl-M problem fix
|
|
49 $!
|
|
50 $! If no parameters, or "-h" for a parameter, print usage and exit
|
|
51 $
|
|
52 $ all = "''p1'''p2'''p3'''p4'''p5'''p6'''p7'''p8'"
|
|
53 $ if (all .nes. "") .and. (p1 .nes. "-h") .and. (p1 .nes. "-H") then goto startup
|
|
54 $
|
|
55 $ write sys$output "OS_VMS_FIX - DECC->VAXC pre-processor directive convert script"
|
|
56 $ write sys$output "Usage: @OS_VMS_FIX <filename_1> <filename_2> <...>"
|
|
57 $ write sys$output " @OS_VMS_FIX <filename with wildcard> <...>"
|
|
58 $ write sys$output ""
|
|
59 $ write sys$output "Example: @OS_VMS_FIX *.c *.h [.proto]*.pro"
|
|
60 $ write sys$output "Please note, you can define up to 8 parameters."
|
|
61 $ write sys$output ""
|
|
62 $ exit
|
|
63 $
|
|
64 $! Create an FDL file to convert VFC format files to Stream_LF.
|
|
65 $! VMS OPEN/WRITE command creates VFC files. When VFC files are read
|
|
66 $! out under unix, they appear to have binary data embedded in them.
|
|
67 $! To be friendly, we'll convert them to Stream_LF, which reads just
|
|
68 $! file on unix.
|
|
69 $
|
|
70 $startup:
|
|
71 $ on control_y then goto stopfdl
|
|
72 $ open/write fdl []convert.fdl
|
|
73 $ write fdl "SYSTEM"
|
|
74 $ write fdl " SOURCE VAX/VMS"
|
|
75 $ write fdl "FILE"
|
|
76 $ write fdl " ORGANIZATION SEQUENTIAL"
|
|
77 $ write fdl "RECORD"
|
|
78 $ write fdl " BLOCK_SPAN YES"
|
|
79 $ write fdl " CARRIAGE_CONTROL CARRIAGE_RETURN"
|
|
80 $ write fdl " FORMAT STREAM"
|
|
81 $ write fdl " SIZE 0"
|
|
82 $ close fdl
|
|
83 $ on control_y then goto endparamloop
|
|
84 $
|
|
85 $! Some symbols for use later on...
|
|
86 $
|
|
87 $ spc = ""
|
|
88 $ spc[0,8] = 32
|
|
89 $ tab = ""
|
|
90 $ tab[0,8] = 9
|
|
91 $
|
|
92 $! Scan all positional arguments, do wildcard expansion, and call the
|
|
93 $! filter routine on each resulting filename.
|
|
94 $
|
|
95 $ cnt = 0
|
|
96 $paramloop:
|
|
97 $ cnt = cnt + 1
|
|
98 $
|
|
99 $! VMS only allows command line parameters P1 - P8, so stop after
|
|
100 $! processing 8 arguments.
|
|
101 $
|
|
102 $ if cnt .eq. 9 then goto endparamloop
|
|
103 $
|
|
104 $! Skip any empty parameter.
|
|
105 $
|
|
106 $ if P'cnt' .eqs. "" then goto paramloop
|
|
107 $
|
|
108 $! Got a parameter - do wildcard expansion.
|
|
109 $
|
|
110 $ arg = f$parse(P'cnt')
|
|
111 $ write sys$output "Parsing ''arg'..."
|
|
112 $ last = ""
|
|
113 $fileloop:
|
|
114 $ file = f$search(arg, 1)
|
|
115 $
|
|
116 $! f$search() returns "" after the last of multiple matches.
|
|
117 $
|
|
118 $ if file .eqs. "" then goto endfileloop
|
|
119 $
|
|
120 $! Strip the version number.
|
|
121 $
|
|
122 $ file = f$parse(file,,,"DEVICE") + f$parse(file,,,"DIRECTORY") + -
|
|
123 f$parse(file,,,"NAME") + f$parse(file,,,"TYPE")
|
|
124 $
|
|
125 $! f$search() returns the same filename over and over if there are no
|
|
126 $! wildcards in it.
|
|
127 $
|
|
128 $ if file .eqs. last then goto endfileloop
|
|
129 $ last = file
|
|
130 $
|
|
131 $! Got a valid file - filter it.
|
|
132 $
|
|
133 $ gosub filter
|
|
134 $
|
|
135 $! Reset our error handling.
|
|
136 $
|
|
137 $ on control_y then goto endparamloop
|
|
138 $
|
|
139 $! See if there's another matching filename.
|
|
140 $
|
|
141 $ goto fileloop
|
|
142 $endfileloop:
|
|
143 $
|
|
144 $! Check for another parameter.
|
|
145 $
|
|
146 $ goto paramloop
|
|
147 $endparamloop:
|
|
148 $
|
|
149 $! Finished - delete the FDL file.
|
|
150 $
|
|
151 $ delete []convert.fdl;
|
|
152 $
|
|
153 $! So long, and thanks for all the fish...
|
|
154 $
|
|
155 $ exit
|
|
156 $
|
|
157 $
|
|
158 $! User aborted with Control-Y during creation of FDL file.
|
|
159 $! Close the file, delete it, and exit with an error status.
|
|
160 $
|
|
161 $stopfdl:
|
|
162 $ close fdl
|
|
163 $ delete []convert.fdl;
|
|
164 $ exit %X10000000
|
|
165 $
|
|
166 $
|
|
167 $! Filter a file.
|
|
168 $
|
|
169 $filter:
|
|
170 $ write sys$output "Filtering ''file'..."
|
|
171 $
|
|
172 $! Get a temporary filename from the subroutine parameter.
|
|
173 $
|
|
174 $ tmp = f$parse(file,,,"DEVICE") + f$parse(file,,,"DIRECTORY") + -
|
|
175 "tmp_" + f$parse(file,,,"NAME") + f$parse(file,,,"TYPE")
|
|
176 $ on control_y then goto aborted
|
|
177 $ open /read input 'file'
|
|
178 $ open /write output 'tmp'
|
|
179 $ changed = 0
|
|
180 $readloop:
|
|
181 $ read/end_of_file=endreadloop/error=readlooperror input line
|
|
182 $
|
|
183 $! Get the first 3 non-blank character on the line.
|
|
184 $
|
|
185 $ start = f$extract(0,3,f$edit(line,"COLLAPSE,LOWERCASE"))
|
|
186 $
|
|
187 $! If the line doesn't start with some form of "#if", just write it to
|
|
188 $! the temp file.
|
|
189 $
|
|
190 $ if start .nes. "#if" then goto writeit
|
|
191 $chkbkslsh:
|
|
192 $
|
|
193 $! See if the line ends in a backslash. If not, write it to the temp file.
|
|
194 $
|
|
195 $ if f$extract(f$length(line)-1,1,line) .nes. "\" then goto writeit
|
|
196 $
|
|
197 $! Ok, got a line that needs to be modified. Mark this file as changed,
|
|
198 $! then replace the backslash at the end with the beginning of a comment
|
|
199 $! (/*), and write it to the temp file.
|
|
200 $
|
|
201 $ changed = 1
|
|
202 $ line = f$extract(0,f$length(line)-1,line) + "/*"
|
|
203 $ write/symbol output line
|
|
204 $
|
|
205 $! Get another line from the input.
|
|
206 $
|
|
207 $ read/end_of_file=endreadloop/error=readlooperror input line
|
|
208 $
|
|
209 $! Grab all the blank space from the beginning of the line.
|
|
210 $
|
|
211 $ spaces = ""
|
|
212 $spaceloop:
|
|
213 $ if (f$extract(0,1,line) .nes. spc) .and. (f$extract(0,1,line) .nes. tab) -
|
|
214 then goto endspaceloop
|
|
215 $ spaces = spaces + f$extract(0,1,line)
|
|
216 $ line = f$extract(1,f$length(line)-1,line)
|
|
217 $ goto spaceloop
|
|
218 $endspaceloop:
|
|
219 $
|
|
220 $! Stick an end-comment (*/) after the leading blanks, then go back and
|
|
221 $! check for a trailing backslash again, to catch code that continues
|
|
222 $! across multiple lines.
|
|
223 $
|
|
224 $ line = spaces + "*/ " + line
|
|
225 $ goto chkbkslsh
|
|
226 $
|
|
227 $! Write the current line, (will either be an untouched line, or the
|
|
228 $! last line of a continuation) to the temp file, and go back to look
|
|
229 $! for more input.
|
|
230 $!
|
|
231 $writeit:
|
|
232 $ write/symbol output line
|
|
233 $ goto readloop
|
|
234 $
|
|
235 $! Hit EOF. Close the input & output, and if the file was marked as
|
|
236 $! changed, convert it from VMS VFC format, to the more common Stream_LF
|
|
237 $! format, so it doesn't show up full of garbage if someone tries to
|
|
238 $! edit it on another OS.
|
|
239 $!
|
|
240 $endreadloop:
|
|
241 $ close input
|
|
242 $ close output
|
|
243 $ if changed .eq. 0 then goto nocopy
|
|
244 $ convert 'tmp' 'file' /fdl=[]convert.fdl
|
|
245 $nocopy:
|
|
246 $ delete 'tmp';
|
|
247 $
|
|
248 $! Exit this subroutine.
|
|
249 $
|
|
250 $ goto endfunc
|
|
251 $
|
|
252 $! Got a read error. Say so, and trash the temp file.
|
|
253 $
|
|
254 $readlooperror:
|
|
255 $ write sys$error "Error processing file ''file'"
|
|
256 $ goto errorend
|
|
257 $
|
|
258 $! Got an interrupt. Say so, and trash the temp file.
|
|
259 $
|
|
260 $aborted:
|
|
261 $ write sys$error "Aborted while processing file ''file'"
|
|
262 $
|
|
263 $! Common code for read errors and interrupts.
|
|
264 $
|
|
265 $errorend:
|
|
266 $ close input
|
|
267 $ close output
|
|
268 $ delete 'tmp';
|
|
269 $ return %X10000000
|
|
270 $
|
|
271 $! End of filter subroutine.
|
|
272 $
|
|
273 $endfunc:
|
|
274 $ return
|
|
275 $
|
|
276 $! EOF
|