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