Annotation of embedaddon/curl/packages/vms/generate_vax_transfer.com, revision 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>