Annotation of embedaddon/curl/packages/vms/generate_vax_transfer.com, revision 1.1.1.1
1.1 misho 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 - 2020, 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'
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>