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