comparison src/os_vms_fix.com @ 7:3fc0f57ecb91 v7.0001

updated for version 7.0001
author vimboss
date Sun, 13 Jun 2004 20:20:40 +0000
parents
children 6e4e0d43b20b
comparison
equal deleted inserted replaced
6:c2daee826b8f 7:3fc0f57ecb91
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