Imported Upstream version 7.59.0
[platform/upstream/curl.git] / packages / vms / generate_vax_transfer.com
1 $! File: generate_vax_transfer.com
2 $!
3 $! $Id$
4 $!
5 $! File to generate and compile the VAX transfer vectors from reading in the
6 $! Alpha/Itanium gnv_libcurl_symbols.opt file.
7 $!
8 $! This procedure patches the VAX Macro32 assembler to be case sensitive
9 $! and then compiles the generated
10 $!
11 $! The output of this procedure is:
12 $!     gnv_libcurl_xfer.mar_exact
13 $!     gnv_libcurl_xfer.obj
14 $!     gnv_libcurl_xfer.opt
15 $!     macro32_exactcase.exe
16 $!
17 $! Copyright 2013, John Malmberg
18 $!
19 $! Permission to use, copy, modify, and/or distribute this software for any
20 $! purpose with or without fee is hereby granted, provided that the above
21 $! copyright notice and this permission notice appear in all copies.
22 $!
23 $! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
24 $! WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
25 $! MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
26 $! ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
27 $! WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
28 $! ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
29 $! OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30 $!
31 $! 20-Jul-2013  J. Malmberg
32 $!============================================================================
33 $!
34 $! Save this so we can get back.
35 $ default_dir = f$environment("default")
36 $!
37 $ on warning then goto all_exit
38 $!
39 $! Want hard tabs in the generated file.
40 $ tab[0,8] = 9
41 $!
42 $! This procedure is used on VAX only
43 $ if (f$getsyi("HW_MODEL") .ge. 1024)
44 $ then
45 $   write sys$output "This procedure is only used on VAX."
46 $   goto all_exit
47 $ endif
48 $!
49 $!
50 $! Get the libcurl version to generate the ident string.
51 $! ident string is max of 31 characters.
52 $!
53 $ ident_string = "unknown"
54 $ open/read cver [-.-.include.curl]curlver.h
55 $cver_loop:
56 $ read/end=cver_loop_end cver line_in
57 $ line_in = f$edit(line_in, "COMPRESS,TRIM")
58 $ if line_in .eqs. "" then goto cver_loop
59 $ code = f$extract(0, 1, line_in)
60 $ if code .nes. "#" then goto cver_loop
61 $ directive = f$element(0, " ", line_in)
62 $ if directive .nes. "#define" then goto cver_loop
63 $ name = f$element(1, " ", line_in)
64 $ if name .nes. "LIBCURL_VERSION" then goto cver_loop
65 $ ident_string = f$element(2, " ", line_in) - "" - ""
66 $cver_loop_end:
67 $ close cver
68 $!
69 $ open/read aopt gnv_libcurl_symbols.opt
70 $!
71 $! Write out the header
72 $ gosub do_header
73 $!
74 $ open/append vopt gnv_libcurl_xfer.mar_exact
75 $ write vopt tab,".IDENT /", ident_string, "/"
76 $!
77 $ write vopt tab, ".PSECT LIBCURL_XFERVECTORS  -"
78 $ write vopt tab,tab,tab, "PIC,USR,CON,REL,GBL,SHR,EXE,RD,NOWRT,QUAD"
79 $ write vopt ""
80 $ write vopt tab, "SPARE", tab, "; never delete this spare"
81 $ write vopt ";"
82 $ write vopt ";", tab, "Exact case and upper case transfer vectors"
83 $!
84 $ alias_count = 0
85 $vector_loop:
86 $!
87 $!  Read in symbol_vector
88 $!
89 $   read/end=vector_loop_end aopt line_in
90 $   line = f$edit(line_in, "UNCOMMENT,COMPRESS,TRIM")
91 $   if line .eqs. "" then goto vector_loop
92 $!
93 $   line_u = f$edit(line, "UPCASE")
94 $   key = f$element(0, "=", line_u)
95 $   if (key .eqs. "SYMBOL_VECTOR")
96 $   then
97 $       symbol_string = f$element(1, "=", line) - "("
98 $       symbol_type = f$element(2, "=", line_u) - ")"
99 $       symbol_name = f$element(1, "/", symbol_string)
100 $       if symbol_type .nes. "PROCEDURE"
101 $       then
102 $           write sys$output "%CURLBUILD-W-NOTPROC, " + -
103 $                            "This procedure can only handle procedure vectors"
104 $           write sys$output -
105 "Data vectors require manual construction for which this procedure or"
106 $           write sys$output -
107 "the shared library needs to be updated to resolve."
108 $           write sys$output -
109 "the preferred solution is to have a procedure return the address of the "
110 $           write sys$output -
111 "the variable instead of having a variable, as if the size of the variable "
112             write sys$output -
113 "changes, the symbol vector is no longer backwards compatible."
114 $       endif
115 $       if (symbol_name .eqs. "/")
116 $       then
117 $           symbol_name = symbol_string
118 $           write vopt tab, symbol_type, tab, symbol_name
119 $       else
120 $           alias_count = alias_count + 1
121 $           symbol_alias = f$element(0, "/", symbol_string)
122 $           write vopt -
123                   tab, "''symbol_type_U", tab, symbol_name, tab, symbol_alias
124 $       endif
125 $   endif
126 $   goto vector_loop
127 $vector_loop_end:
128 $!
129 $! End of pass one, second pass needed if aliases exist
130 $ close aopt
131 $!
132 $ if alias_count .eq. 0 then goto finish_file
133 $!
134 $! Start pass 2, write stub routine header
135 $!
136 $ open/read aopt gnv_libcurl_symbols.opt
137 $!
138 $alias_loop:
139 $!
140 $!  Read in symbol_vector
141 $!
142 $   read/end=alias_loop_end aopt line_in
143 $   line = f$edit(line_in, "UNCOMMENT,COMPRESS,TRIM")
144 $   if line .eqs. "" then goto alias_loop
145 $!
146 $   line_u = f$edit(line, "UPCASE")
147 $   key = f$element(0, "=", line_u)
148 $   if (key .eqs. "SYMBOL_VECTOR")
149 $   then
150 $       symbol_string = f$element(1, "=", line) - "("
151 $       symbol_type = f$element(2, "=", line_u) - ")"
152 $       symbol_name = f$element(1, "/", symbol_string)
153 $       if (symbol_name .eqs. "/")
154 $       then
155 $           symbol_name = symbol_string
156 $       else
157 $           alias_count = alias_count + 1
158 $           symbol_alias = f$element(0, "/", symbol_string)
159 $           write vopt tab, ".ENTRY", tab, symbol_alias, ", ^M<>"
160 $       endif
161 $   endif
162 $   goto alias_loop
163 $! read in symbol_vector
164 $! if not alias, then loop
165 $! write out subroutine name
166 $!
167 $alias_loop_end:
168 $!
169 $ write vopt tab, "MOVL #1, R0"
170 $ write vopt tab, "RET"
171 $!
172 $finish_file:
173 $!
174 $ write vopt ""
175 $ write vopt tab, ".END"
176 $!
177 $ close aopt
178 $ close vopt
179 $!
180 $! Patch the Macro32 compiler
181 $!----------------------------
182 $ patched_macro = "sys$disk:[]macro32_exactcase.exe"
183 $ if f$search(patched_macro) .eqs. ""
184 $ then
185 $   copy sys$system:macro32.exe 'patched_macro'
186 $   patch @macro32_exactcase.patch
187 $ endif
188 $ define/user macro32 'patched_macro'
189 $ macro/object=gnv_libcurl_xfer.obj gnv_libcurl_xfer.mar_exact
190 $!
191 $! Create the option file for linking the shared image.
192 $ create gnv_libcurl_xfer.opt
193 $ open/append lco gnv_libcurl_xfer.opt
194 $ write lco "gsmatch=lequal,1,1"
195 $ write lco "cluster=transfer_vector,,,''default_dir'gnv_libcurl_xfer"
196 $ write lco "collect=libcurl_global, libcurl_xfervectors"
197 $ close lco
198 $!
199 $!
200 $ goto all_exit
201 $!
202 $! Process the header
203 $do_header:
204 $!
205 $! Force the mode of the file to same as text editor generated.
206 $ create gnv_libcurl_xfer.mar_exact
207 $deck
208 ; File: gnv_libcurl_xfer.mar_exact
209 ;
210 ; VAX transfer vectors
211 ;
212 ; This needs to be compiled with a specialized patch on Macro32 to make it
213 ; preserve the case of symbols instead of converting it to uppercase.
214 ;
215 ; This patched Macro32 requires all directives to be in upper case.
216 ;
217 ; There are three sets of symbols for transfer vectors here.
218 ;
219 ; The first for upper case which matches the tradition method of generating
220 ; VAX transfer vectors.
221 ;
222 ; The second is the exact case for compatibility with open source C programs
223 ; that expect exact case symbols in images.  These are separated because a
224 ; previous kit had only upper case symbols.
225 ;
226 ; The third is the routine stub that is used to resolve part of the upper
227 ; case transfer vectors, with exact case entry symbols.
228 ;
229 ; When you add routines, you need to add them after the second set of transfer
230 ; vectors for both upper and exact case, and then additional entry points
231 ; in upper case added to stub routines.
232 ;
233 ;*************************************************************************
234
235         .TITLE libcurl_xfer - Transfer vector for libcurl
236         .DISABLE GLOBAL
237
238 ;
239 ; Macro to generate a transfer vector entry
240 ;
241         .MACRO  PROCEDURE       NAME
242         .EXTRN          'NAME
243         .ALIGN  QUAD
244         .TRANSFER       'NAME
245         .MASK           'NAME
246         JMP             'NAME+2
247         .ENDM
248
249         .MACRO  PROCEDUREU      NAME    NAMEU
250         .EXTRN          'NAME
251         .ALIGN  QUAD
252         .TRANSFER       'NAMEU
253         .MASK           'NAME
254         JMP             'NAME+2
255
256         .ENDM
257 ;
258 ;
259 ; Macro to reserve a spare entry.
260 ;
261         .MACRO  SPARE
262         .ALIGN QUAD
263         .ALIGN QUAD
264         .QUAD   0
265         .ENDM
266
267 $EOD
268 $!
269 $!
270 $ return
271 $!
272 $all_exit:
273 $set def 'default_dir'
274 $exit '$status'