Mercurial > vim
annotate src/os_vms_fix.com @ 17248:6ad25d3ae8ce
Added tag v8.1.1623 for changeset cbd0432cf8ff581fa2368ee7156f4bea16715717
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 04 Jul 2019 12:00:10 +0200 |
parents | 6e4e0d43b20b |
children |
rev | line source |
---|---|
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 | |
15034
6e4e0d43b20b
patch 8.1.0528: various typos in comments
Bram Moolenaar <Bram@vim.org>
parents:
7
diff
changeset
|
18 $! distribute it in its original form. |
7 | 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 |