Return to generate_vax_transfer.com CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / packages / vms |
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'