$! File: config_h.com $! $! $Id: config_h.com,v 1.1.1.1 2012/12/02 19:25:21 wb8tyw Exp $ $! $! This procedure attempts to figure out how to build a config.h file $! for the current project. $! $! P1 specifies the config.h.in file or equivalent. If it is not specified $! then this procedure will search for several common names of the file. $! $! The CONFIGURE shell script will be examined for hints and a few symbols $! but most of the tests will not produce valid results on OpenVMS. Some $! will produce false positives and some will produce false negatives. $! $! It is easier to just read the config.h_in file and make up tests based $! on what is in it! $! $! This file will create an empty config_vms.h file if one does not exist. $! The config_vms.h is intended for manual edits to handle things that $! this procedure can not. $! $! The config_vms.h will be invoked by the resulting config.h file. $! $! This procedure knows about the DEC C RTL on the system it is on. $! Future versions may be handle the GNV, the OpenVMS porting library, $! and others. $! $! This procedure may not guess the options correctly for all architectures, $! and is a work in progress. $! $! Copyright 2011 - 2020, John Malmberg $! $! Permission to use, copy, modify, and/or distribute this software for any $! purpose with or without fee is hereby granted, provided that the above $! copyright notice and this permission notice appear in all copies. $! $! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES $! WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF $! MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR $! ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES $! WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN $! ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT $! OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. $! $! 15-Jan-2001 J. Malmberg Original $! 29-Apr-2001 J. Malmberg Also look for config.*in* in a [.include] $! subdirectory $! 30-Apr-2001 J. Malmberg Update for SAMBA checks $! 09-Apr-2005 J. Malmberg Update for RSYNC and large file. $! 29-Sep-2011 J. Malmberg Update for Bash 4.2 $! 01-Mar-2012 J. Malmberg Warn about getcwd(0,0) $! 21-Dec-2012 J. Malmberg Update for gawk $! 29-Dec-2012 J. Malmberg Update for curl $!============================================================================ $! $ss_normal = 1 $ss_abort = 44 $ss_control_y = 1556 $status = ss_normal $on control_y then goto control_y $on warning then goto general_error $!on warning then set ver $! $! Some information for writing timestamps to created files $!---------------------------------------------------------- $my_proc = f$environment("PROCEDURE") $my_proc_file = f$parse(my_proc,,,"NAME") + f$parse(my_proc,,,"TYPE") $tab[0,8] = 9 $datetime = f$element(0,".",f$cvtime(,"ABSOLUTE","DATETIME")) $username = f$edit(f$getjpi("","USERNAME"),"TRIM") $! $pid = f$getjpi("","PID") $tfile1 = "SYS$SCRATCH:config_h_temp1_''pid'.TEMP" $dchfile = "SYS$SCRATCH:config_h_decc_''pid'.TEMP" $starhfile = "SYS$SCRATCH:config_h_starlet_''pid'.TEMP" $configure_script = "SYS$SCRATCH:configure_script_''pid'.TEMP" $! $! Get the system type $!---------------------- $arch_type = f$getsyi("arch_type") $! $! Does config_vms.h exist? $!------------------------- $update_config_vms = 0 $file = f$search("sys$disk:[]config_vms.h") $if file .nes. "" $then $ write sys$output "Found existing custom file ''file'." $else $ update_config_vms = 1 $ write sys$output "Creating new sys$disk:[]config_vms.h for you." $ gosub write_config_vms $endif $! $! $! On some platforms, DCL search has problems with searching a file $! on a NFS mounted volume. So copy it to sys$scratch: $! $if f$search(configure_script) .nes. "" then delete 'configure_script';* $copy sys$disk:[]configure 'configure_script' $! $ssl_header_dir = "OPENSSL:" $if f$trnlnm("OPENSSL") .eqs. "" $then $ ssl_header_dir = "SSL$INCLUDE:" $endif $! $! $! Write out the header $!---------------------- $gosub write_config_h_header $! $! $! $! config.h.in could have at least five different names depending $! on how it was transferred to OpenVMS $!------------------------------------------------------------------ $if p1 .nes. "" $then $ cfile = p1 $else $ cfile = f$search("sys$disk:[]config.h.in") $ if cfile .eqs. "" $ then $ cfile = f$search("sys$disk:[]config.h_in") $ if cfile .eqs. "" $ then $ cfile = f$search("sys$disk:[]configh.in") $ if cfile .eqs. "" $ then $ cfile = f$search("sys$disk:[]config__2eh.in") $ if cfile .eqs. "" $ then $ cfile = f$search("sys$disk:[]config.h__2ein") $ endif $ endif $ endif $ endif $endif $if f$trnlnm("PRJ_INCLUDE") .nes. "" $then $ cfile = f$search("PRJ_INCLUDE:config.h.in") $ if cfile .eqs. "" $ then $ cfile = f$search("PRJ_INCLUDE:config.h_in") $ if cfile .eqs. "" $ then $ cfile = f$search("PRJ_INCLUDE:config__2eh.in") $ if cfile .eqs. "" $ then $ cfile = f$search("PRJ_INCLUDE:config__2eh.in") $ if cfile .eqs. "" $ then $ cfile = f$search("PRJ_INCLUDE:config.h__2ein") $ endif $ endif $ endif $ endif $endif $if cfile .eqs. "" $then $ write sys$output "Can not find sys$disk:config.h.in" $ line_out = "Looked for config.h.in, config.h_in, configh.in, " $ line_out = line_out + "config__2eh.in, config.h__2ein" $ write/symbol sys$output line_out $ if f$trnlnm("PRJ_INCLUDE") .nes. "" $ then $ write sys$output "Also looked in PRJ_INCLUDE: for these files." $ endif $! $ write tf "" $ write tf - " /* Could not find sys$disk:config.h.in */" $ write tf - " /* Looked also for config.h_in, configh.in, config__2eh.in, */" $ write tf - " /* config.h__2ein */" $ if f$trnlnm("PRJ_INCLUDE") .nes. "" $ then $ write tf - " /* Also looked in PRJ_INCLUDE: for these files. */" $ endif $ write tf - "/*--------------------------------------------------------------*/ $ write tf "" $ goto write_tail $endif $! $! $! Locate the DECC libraries in use $!----------------------------------- $decc_rtldef = f$parse("decc$rtldef","sys$library:.tlb;0") $decc_starletdef = f$parse("sys$starlet_c","sys$library:.tlb;0") $decc_shr = f$parse("decc$shr","sys$share:.exe;0") $! $! Dump the DECC header names into a file $!---------------------------------------- $if f$search(dchfile) .nes. "" then delete 'dchfile';* $if f$search(tfile1) .nes. "" then delete 'tfile1';* $define/user sys$output 'tfile1' $library/list 'decc_rtldef' $open/read/error=rtldef_loop1_end tf1 'tfile1' $open/write/error=rtldef_loop1_end tf2 'dchfile' $rtldef_loop1: $ read/end=rtldef_loop1_end tf1 line_in $ line_in = f$edit(line_in,"TRIM,COMPRESS") $ key1 = f$element(0," ",line_in) $ key2 = f$element(1," ",line_in) $ if key1 .eqs. " " .or. key1 .eqs. "" then goto rtldef_loop1 $ if key2 .nes. " " .and. key2 .nes. "" then goto rtldef_loop1 $ write tf2 "|",key1,"|" $ goto rtldef_loop1 $rtldef_loop1_end: $if f$trnlnm("tf1","lnm$process",,"SUPERVISOR") .nes. "" then close tf1 $if f$trnlnm("tf2","lnm$process",,"SUPERVISOR") .nes. "" then close tf2 $if f$search(tfile1) .nes. "" then delete 'tfile1';* $! $! Dump the STARLET header names into a file $!---------------------------------------- $if f$search(starhfile) .nes. "" then delete 'starhfile';* $if f$search(tfile1) .nes. "" then delete 'tfile1';* $define/user sys$output 'tfile1' $library/list 'decc_starletdef' $open/read/error=stardef_loop1_end tf1 'tfile1' $open/write/error=stardef_loop1_end tf2 'starhfile' $stardef_loop1: $ read/end=stardef_loop1_end tf1 line_in $ line_in = f$edit(line_in,"TRIM,COMPRESS") $ key1 = f$element(0," ",line_in) $ key2 = f$element(1," ",line_in) $ if key1 .eqs. " " .or. key1 .eqs. "" then goto stardef_loop1 $ if key2 .nes. " " .and. key2 .nes. "" then goto stardef_loop1 $ write tf2 "|",key1,"|" $ goto stardef_loop1 $stardef_loop1_end: $if f$trnlnm("tf1","lnm$process",,"SUPERVISOR") .nes. "" then close tf1 $if f$trnlnm("tf2","lnm$process",,"SUPERVISOR") .nes. "" then close tf2 $if f$search(tfile1) .nes. "" then delete 'tfile1';* $! $! $! Now calculate what should be in the file from reading $! config.h.in and CONFIGURE. $!--------------------------------------------------------------- $open/read inf 'cfile' $do_comment = 0 $if_block = 0 $cfgh_in_loop1: $!set nover $ read/end=cfgh_in_loop1_end inf line_in $ xline = f$edit(line_in,"TRIM,COMPRESS") $! $! Blank line handling $!--------------------- $ if xline .eqs. "" $ then $ write tf "" $ goto cfgh_in_loop1 $ endif $ xlen = f$length(xline) $ key = f$extract(0,2,xline) $! $! deal with comments by copying exactly $!----------------------------------------- $ if (do_comment .eq. 1) .or. (key .eqs. "/*") $ then $ do_comment = 1 $ write tf line_in $ key = f$extract(xlen - 2, 2, xline) $ if key .eqs. "*/" then do_comment = 0 $ goto cfgh_in_loop1 $ endif $! $! Some quick parsing $!---------------------- $ keyif = f$extract(0,3,xline) $ key1 = f$element(0," ",xline) $ key2 = f$element(1," ",xline) $ key2a = f$element(0,"_",key2) $ key2b = f$element(1,"_",key2) $ key2_len = f$length(key2) $ key2_h = f$extract(key2_len - 2, 2, key2) $ key2_t = f$extract(key2_len - 5, 5, key2) $ if key2_t .eqs. "_TYPE" then key2_h = "_T" $ key64 = 0 $ if f$locate("64", xline) .lt. xlen then key64 = 1 $! $!write sys$output "xline = ''xline'" $! $! Comment out this section of the ifblock $!----------------------------------------- $ if if_block .ge. 3 $ then $ write tf "/* ", xline, " */" $ if keyif .eqs. "#en" then if_block = 0 $ goto cfgh_in_loop1 $ endif $! $! Handle the end of an ifblock $!------------------------------- $ if keyif .eqs. "#en" $ then $ write tf xline $ if_block = 0 $ goto cfgh_in_loop1 $ endif $! $ if key1 .eqs. "#ifndef" $ then $! Manual check for _ALL_SOURCE on AIX error $!----------------------------------------------- $ if key2 .eqs. "_ALL_SOURCE" $ then $ write tf "/* ", xline, " */" $! $! Ignore the rest of the block $!-------------------------------------- $ if_block = 3 $ goto cfgh_in_loop1 $ endif $ endif $! $! $! Default action for an #if/#else/#endif $!------------------------------------------ $ if keyif .eqs. "#if" .or. keyif .eqs. "#el" $ then $ if_block = 1 $ write tf xline $ goto cfgh_in_loop1 $ endif $! $! $! Process "normal?" stuff $!--------------------------- $ if key1 .eqs. "#undef" $ then $ key2c = f$element(2, "_", key2) $ if (key2c .eqs. "_") .or. (key2c .eqs. "H") then key2c = "" $ key2d = f$element(3, "_", key2) $ if (key2d .eqs. "_") .or. (key2d .eqs. "H") then key2d = "" $ key2e = f$element(4, "_", key2) $ if (key2e .eqs. "_") .or. (key2e .eqs. "H") then key2e = "" $ if key2d .eqs. "T" $ then $ if key2e .eqs. "TYPE" $ then $ key2_h = "_T" $ key2d = "" $ endif $ endif $! $ double_under = 0 $! $! Process FCNTL directives $!------------------------------------- $ if (key2b .eqs. "FCNTL") .and. (key2c .eqs. "O") .and. - (key2d .eqs. "NONBLOCK") $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Process GETADDRINFO directives $!------------------------------------- $ if key2 .eqs. "GETADDRINFO_THREADSAFE" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Process IOCTL directives $!------------------------------------- $ if (key2b .eqs. "IOCTL") .and. (key2c .nes. "") $ then $ if (key2c .eqs. "FIONBIO") .or. (key2c .eqs. "SIOCGIFADDR") $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ endif $! $! $! Manual check for LL on $!----------------------------------------------- $ if key2 .eqs. "LL" $ then $ write tf "#ifndef __VAX $ write tf "#define HAVE_''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "bool_t" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' short" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "bits16_t" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' short" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "u_bits16_t" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' unsigned short" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "bits32_t" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "u_bits32_t" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' unsigned int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "intmax_t" $ then $ write tf "#ifndef ''key2'" $ write tf "#ifdef __VAX" $ write tf "#define ''key2' long" $ write tf "#else" $ write tf "#define ''key2' long long" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "uintmax_t" $ then $ write tf "#ifndef ''key2'" $ write tf "#ifdef __VAX" $ write tf "#define ''key2' unsigned long" $ write tf "#else" $ write tf "#define ''key2' unsigned long long" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "socklen_t" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "GETGROUPS_T" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' gid_t" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_SYS_SIGLIST" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 0" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_SYS_ERRLIST" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_STRUCT_DIRENT_D_INO" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_STRUCT_TIMEVAL" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! ! The header files have this information, however $! ! The ioctl() call only works on sockets. $! if key2 .eqs. "FIONREAD_IN_SYS_IOCTL" $! then $! write tf "#ifndef ''key2'" $! write tf "#define ''key2' 1" $! write tf "#endif" $! goto cfgh_in_loop1 $! endif $! $! ! The header files have this information, however $! ! The ioctl() call only works on sockets. $! if key2 .eqs. "GWINSZ_IN_SYS_IOCTL" $! then $! write tf "#ifndef ''key2'" $! write tf "#define ''key2' 1" $! write tf "#endif" $! goto cfgh_in_loop1 $! endif $! $! ! The header files have this information, however $! ! The ioctl() call only works on sockets. $! if key2 .eqs. "STRUCT_WINSIZE_IN_SYS_IOCTL" $! then $! write tf "#ifndef ''key2'" $! write tf "#define ''key2' 0" $! write tf "#endif" $! goto cfgh_in_loop1 $! endif $! $ if key2 .eqs. "HAVE_STRUCT_TM_TM_ZONE" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_TM_ZONE" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_TIMEVAL" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "WEXITSTATUS_OFFSET" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 2" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_GETPW_DECLS" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_CONFSTR" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_PRINTF" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_SBRK" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_STRSIGNAL" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 0" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2a .eqs. "HAVE_DECL_STRTOLD" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 0" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_STRTOIMAX" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 0" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_STRTOL" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_STRTOLL" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_STRTOUL" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_STRTOULL" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_STRTOUMAX" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 0" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "GETPGRP_VOID" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "NAMED_PIPES_MISSING" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "OPENDIR_NOT_ROBUST" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "PGRP_PIPE" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "CAN_REDEFINE_GETENV" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_PRINTF_A_FORMAT" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "CTYPE_NON_ASCII" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_LANGINFO_CODESET" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 0" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! This wants execve() to do this automagically to pass. $! if key2 .eqs. "HAVE_HASH_BANG_EXEC" $! then $! write tf "#ifndef ''key2'" $! write tf "#define ''key2' 1" $! write tf "#endif" $! goto cfgh_in_loop1 $! endif $! $ if key2 .eqs. "ICONV_CONST" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2'" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "VOID_SIGHANDLER" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_POSIX_SIGNALS" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "UNUSABLE_RT_SIGNALS" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2a .eqs. "HAVE_DECL_FPURGE" $ then $ write tf "#ifndef ''key2a'" $ write tf "#define ''key2a' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_DECL_SETREGID" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_POSIX_SIGSETJMP" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "HAVE_LIBDL" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2b .eqs. "RAND" .and. key2c .nes. "" .and. key2d .eqs. "" $ then $ if (key2c .eqs. "EGD") .or. - (key2c .eqs. "STATUS") .or. - (key2c .eqs. "SCREEN") $ then $ if f$search("''ssl_header_dir'rand.h") .nes. "" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ else $ write tf "/* #undef ''key2' */" $ endif $ endif $ endif $! $ if key2 .eqs. "STRCOLL_BROKEN" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if key2 .eqs. "DUP_BROKEN" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! This is for a test that getcwd(0,0) works. $! It does not on VMS. $!-------------------------- $ if key2 .eqs. "GETCWD_BROKEN" $ then $ write sys$output "" $ write sys$output - "%CONFIG_H-I-NONPORT, ''key2' being tested for!" $ write sys$output - "-CONFIG_H-I-GETCWD, GETCWD(0,0) does not work on VMS." $ write sys$output - "-CONFIG_H-I-GETCWD2, Work around hack probably required." $ write sys$output - "-CONFIG_H-I-REVIEW, Manual Code review required!" $ if update_config_vms $ then $ open/append tfcv sys$disk:[]config_vms.h $ write tfcv "" $ write tfcv - "/* Check config.h for use of ''key2' settings */" $ write tfcv "" $ close tfcv $ endif $ $ goto cfgh_in_loop1 $ endif $! $ if (key2a .eqs. "HAVE") .or. (key2a .eqs. "STAT") .or. - (key2 .eqs. "ENABLE_IPV6") .or. (key2b .eqs. "LDAP") $ then $! $! Process extra underscores $!------------------------------------ $ if f$locate("HAVE___", key2) .lt. key2_len $ then $ key2b = "__" + key2d $ key2d = "" $ double_under = 1 $ else $ if f$locate("HAVE__", key2) .lt. key2_len $ then $ key2b = "_" + key2c $ key2c = "" $ double_under = 1 $ endif $ endif $! $ if (key2_h .eqs. "_H") .or. (key2 .eqs. "ENABLE_IPV6") .or. - (key2b .eqs. "LDAP") $ then $! $! Looking for a header file $!--------------------------------------- $ headf = key2b $ if key2c .nes. "" then headf = headf + "_" + key2c $ if key2d .nes. "" then headf = headf + "_" + key2d $! $! (key2b .eqs. "READLINE") $! $! Some special parsing $!------------------------------------------ $ if (key2b .eqs. "SYS") .or. (key2b .eqs. "ARPA") .or. - (key2b .eqs. "NET") .or. (key2b .eqs. "NETINET") $ then $ if key2c .nes. "" $ then $ headf = key2c $ if key2d .nes. "" then headf = key2c + "_" + key2d $ endif $ endif $! $! And of course what's life with out some special cases $!-------------------------------------------------------------------- $ if key2 .eqs. "ENABLE_IPV6" $ then $ headf = "in6" $ endif $! $ if key2b .eqs. "LDAP" $ then $ if (key2 .eqs. "HAVE_LDAP_SSL") .or. - (key2 .eqs. "HAVE_LDAP_URL_PARSE") $ then $ headf = "ldap" $ endif $ endif $! $! $ if key2b .eqs. "FILE" $ then $ write sys$output "" $ write sys$output - "%CONFIG_H-I-NONPORT, ''key2' being asked for!" $ write sys$output - "-CONFIG_H-I-FILE_OLD, file.h will not be configured as is obsolete!" $ write sys$output - "-CONFIG_H_I-FCNTL_NEW, "Expecting fcntl.h to be configured instead!" $ write sys$output - "-CONFIG_H_I-FCNTL_CHK, "Unable to verify at this time!" $ write sys$output - "-CONFIG_H-I-REVIEW, Manual Code review required!" $! $ if update_config_vms $ then $ open/append tfcv sys$disk:[]config_vms.h $ write tfcv "" $ write tfcv - "/* Check config.h for use of fcntl.h instead of file.h */" $ write tfcv "" $ close tfcv $ endif $ endif $! $! Now look it up in the DEC C RTL $!--------------------------------------------- $ define/user sys$output nl: $ define/user sys$error nl: $ search/output=nl: 'dchfile' |'headf'|/exact $ if '$severity' .eq. 1 $ then $ if key64 then write tf "#ifndef __VAX" $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $if p2 .nes. "" then write sys$output "''dchfile' - #define ''key2' 1" $ write tf "#endif" $ if key64 then write tf "#endif" $set nover $ goto cfgh_in_loop1 $ endif $! $! $! Now look it up in the DEC C STARLET_C $!--------------------------------------------- $ define/user sys$output nl: $ define/user sys$error nl: $ search/output=nl: 'starhfile' |'headf'|/exact $ if '$severity' .eq. 1 $ then $ if key64 then write tf "#ifndef __VAX" $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $if p2 .nes. "" then write sys$output "''starfile' - #define ''key2' 1" $ write tf "#endif" $ if key64 then write tf "#endif" $set nover $ goto cfgh_in_loop1 $ endif $! $! Now look for OPENSSL headers $!--------------------------------------------------------- $ if key2b .eqs. "OPENSSL" $ then $ headf = headf - "OPENSSL_" $ header = f$search("''ssl_header_dir'''headf'.h") $ if header .nes. "" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $set nover $ goto cfgh_in_loop1 $ endif $ endif $! $! Now look for Kerberos $!------------------------------------------------------------ $ if key2b .eqs. "GSSAPI" $ then $ header_dir = "sys$sysroot:[kerberos.include]" $ headf = headf - "GSSAPI_" $ header = f$search("''header_dir'''headf'.h") $ if header .nes. "" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $set nover $ goto cfgh_in_loop1 $ endif $ endif $! $set nover $ else $! $! Looking for a routine or a symbol $!------------------------------------------------ $ if key2c .eqs. "MACRO" $ then $ if (key2b .eqs. "FILE") .or. (key2b .eqs. "DATE") - .or. (key2b .eqs. "LINE") .or. (key2b .eqs. "TIME") $ then $ write tf "#ifndef HAVE_''key2b'" $ write tf "#define HAVE_''key2b' 1" $ write tf "#endif" $ endif $ goto cfgh_in_loop1 $ endif $! $! Special false tests $!------------------------------------- $ if double_under $ then $ if key2b .eqs. "_FCNTL" .or. key2b .eqs. "__FCNTL" $ then $ write tf "/* #undef HAVE_''key2b' */" $ goto cfgh_in_loop1 $ endif $! $ if key2b .eqs. "_STAT" .or. key2b .eqs. "__STAT" $ then $ write tf "/* #undef HAVE_''key2b' */" $ goto cfgh_in_loop1 $ endif $! $ if key2b .eqs. "_READ" .or. key2b .eqs. "__READ" $ then $ write tf "/* #undef HAVE_''key2b' */" $ goto cfgh_in_loop1 $ endif $ endif $! $ keysym = key2b $ if key2c .nes. "" then keysym = keysym + "_" + key2c $ if key2d .nes. "" then keysym = keysym + "_" + key2d $ if key2e .nes. "" then keysym = keysym + "_" + key2e $! $! $! Stat structure members $!------------------------------------- $ if key2b .eqs. "STRUCT" $ then $ if key2c .eqs. "STAT" .and (key2d .nes. "") $ then $ key2b = key2b + "_" + key2c + "_" + key2d $ key2c = key2e $ key2d = "" $ key2e = "" $ endif $ endif $ if (key2b .eqs. "ST") .or. (key2b .eqs. "STRUCT_STAT_ST") $ then $ keysym = "ST" + "_" + key2c $ keysym = f$edit(keysym,"LOWERCASE") $ endif $ if key2a .eqs. "STAT" $ then $ if (f$locate("STATVFS", key2b) .eq. 0) .and. key2c .eqs. "" $ then $ keysym = f$edit(key2b, "LOWERCASE") $ endif $!$ if (key2b .eqs. "STATVFS" .or. key2b .eqs. "STATFS2" - $! .or. key2b .eqs. "STATFS3") .and. key2c .nes. "" $! $ if (key2b .eqs. "STATVFS") .and. key2c .nes. "" $ then $! Should really verify that the structure $! named by key2b actually exists first. $!------------------------------------------------------------ $! $! Statvfs structure members $!------------------------------------------------- $ keysym = "f_" + f$edit(key2c,"LOWERCASE") $ endif $ endif $! $! UTMPX structure members $!-------------------------------------- $ if key2b .eqs. "UT" .and. key2c .eqs. "UT" $ then $ keysym = "ut_" + f$edit(key2d,"LOWERCASE") $ endif $! $ if f$locate("MMAP",key2) .lt. key2_len $ then $ write sys$output "" $ write sys$output - "%CONFIG_H-I-NONPORT, ''key2' being asked for!" $ write sys$output - "-CONFIG_H-I-MMAP, MMAP operations only work on STREAM and BINARY files!" $ write sys$output - "-CONFIG_H-I-REVIEW, Manual Code review required!" $ if update_config_vms $ then $ open/append tfcv sys$disk:[]config_vms.h $ write tfcv "" $ write tfcv - "/* Check config.h for use of ''key2' settings */" $ write tfcv "" $ close tfcv $ endif $ endif $! $! $ if keysym .eqs. "CRYPT" $ then $ write sys$output "" $ write sys$output - "%CONFIG_H-I-NONPORT, ''key2' being asked for!" $ write sys$output - "-CONFIG_H-I-CRYPT, CRYPT operations on the VMS SYSUAF may not work!" $ write sys$output - "-CONFIG_H-I-REVIEW, Manual Code review required!" $ if update_config_vms $ then $ open/append tfcv sys$disk:[]config_vms.h $ write tfcv "" $ write tfcv - "/* Check config.h for use of ''keysym' */" $ write tfcv "" $ close tfcv $ endif $ endif $! $! $ if keysym .eqs. "EXECL" $ then $ write sys$output "" $ write sys$output - "%CONFIG_H-I-NONPORT, ''key2' being asked for!" $ write sys$output - "-CONFIG_H-I-EXCEL, EXECL configured, Will probably not work." $ write sys$output - "-CONFIG_H-I-REVIEW, Manual Code review required!" $ if update_config_vms $ then $ open/append tfcv sys$disk:[]config_vms.h $ write tfcv "" $ write tfcv - "/* Check config.h for use of ''keysym' */" $ write tfcv "" $ close tfcv $ endif $ endif $! $! $! Process if cpp supports ANSI-C stringizing '#' operator $!----------------------------------------------------------------------- $ if keysym .eqs. "STRINGIZE" $ then $ write tf "#ifndef HAVE_STRINGIZE" $ write tf "#define HAVE_STRINGSIZE 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if keysym .eqs. "VOLATILE" $ then $ write tf "#ifndef HAVE_VOLATILE" $ write tf "#define HAVE_VOLATILE 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if keysym .eqs. "ALLOCA" $ then $ write tf "#ifndef HAVE_ALLOCA" $ write tf "#define HAVE_ALLOCA 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if keysym .eqs. "ERRNO_DECL" $ then $ write tf "#ifndef HAVE_ERRNO_DECL" $ write tf "#define HAVE_ERRNO_DECL 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if keysym .eqs. "LONGLONG" $ then $ write tf "#ifndef __VAX" $ write tf "#pragma message disable longlongtype" $ write tf "#ifndef HAVE_LONGLONG" $ write tf "#define HAVE_LONGLONG 1" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! May need to test compiler version $!----------------------------------------------- $ if keysym .eqs. "LONG_LONG" $ then $ write tf "#ifndef __VAX" $ write tf "#pragma message disable longlongtype" $ write tf "#ifndef HAVE_LONG_LONG" $ write tf "#define HAVE_LONG_LONG 1" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! May need to test compiler version $!----------------------------------------------- $ if keysym .eqs. "UNSIGNED_LONG_LONG" $ then $ write tf "#ifndef __VAX" $ write tf "#pragma message disable longlongtype" $ write tf "#ifndef HAVE_UNSIGNED_LONG_LONG" $ write tf "#define HAVE_UNSIGNED_LONG_LONG 1" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! May need to test compiler version $!----------------------------------------------- $ if keysym .eqs. "UNSIGNED_LONG_LONG_INT" $ then $ write tf "#ifndef __VAX" $ write tf "#pragma message disable longlongtype" $ write tf "#ifndef HAVE_UNSIGNED_LONG_LONG_INT" $ write tf "#define HAVE_UNSIGNED_LONG_LONG_INT 1" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! May need to test compiler version $!----------------------------------------------- $ if keysym .eqs. "LONG_DOUBLE" $ then $ write tf "#ifndef __VAX" $ write tf "#pragma message disable longlongtype" $ write tf "#ifndef HAVE_LONG_DOUBLE" $ write tf "#define HAVE_LONG_DOUBLE 1" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $ if keysym .eqs. "FCNTL_LOCK" $ then $ write sys$output - "%CONFIG_H-I-NONPORT, ''key2' being asked for! $ write sys$output - "-CONFIG_H-I-REVIEW, Manual Code review required!" $ goto cfgh_in_loop1 $ endif $! $! $! These libraries are provided by the DEC C RTL $!------------------------------------------------------------- $ if keysym .eqs. "LIBINET" .or. keysym .eqs. "LIBSOCKET" $ then $ write tf "#ifndef HAVE_''keysym'" $ write tf "#define HAVE_''keysym' 1" $if p2 .nes. "" then write sys$output "''decc_shr' #define ''keysym' 1" $ write tf "#endif $ goto cfgh_in_loop1 $ endif $! $ if keysym .eqs. "HERRNO" then keysym = "h_errno" $ if keysym .eqs. "UTIMBUF" then keysym = "utimbuf" $ if key2c .eqs. "STRUCT" $ then $ keysym = f$edit(key2d,"LOWERCASE") $ else $ if key2_h .eqs. "_T" $ then $ if key2_t .eqs. "_TYPE" $ then $ keysym = f$extract(0, key2_len - 5, key2) - "HAVE_" $ endif $ keysym = f$edit(keysym,"LOWERCASE") $ endif $ endif $! $! Check the DEC C RTL shared image first $!------------------------------------------------------ $ if f$search(tfile1) .nes. "" then delete 'tfile1';* $ define/user sys$output nl: $ define/user sys$error nl: $ search/format=nonull/out='tfile1' 'decc_shr' 'keysym' $ if '$severity' .eq. 1 $ then $! $! Not documented, but from observation $!------------------------------------------------------ $ define/user sys$output nl: $ define/user sys$error nl: $ if arch_type .eq. 3 $ then $ keyterm = "''keysym'" $ else $ if arch_type .eq. 2 $ then $ keyterm = "''keysym'" $ else $ keyterm = "''keysym'" $ endif $ endif $ search/out=nl: 'tfile1' - "$''keyterm'","$g''keyterm'","$__utc_''keyterm'",- "$__utctz_''keyterm'","$__bsd44_''keyterm'","$bsd_''keyterm'",- "$''keysym'decc$","$G''keysym'decc$","$GX''keyterm'" $ severity = '$severity' $! $! $! Of course the 64 bit stuff is different $!--------------------------------------------------------- $ if severity .ne. 1 .and. key64 $ then $ define/user sys$output nl: $ define/user sys$error nl: $ search/out=nl: 'tfile1' "$_''keyterm'" $! search/out 'tfile1' "$_''keyterm'" $ severity = '$severity' $ endif $! $! Unix compatibility routines $!--------------------------------------------- $ if severity .ne. 1 $ then $ define/user sys$output nl: $ define/user sys$error nl: $ search/out=nl: 'tfile1' - "$__unix_''keyterm'","$__vms_''keyterm'","$_posix_''keyterm'" $ severity = '$severity' $ endif $! $! Show the result of the search $!------------------------------------------------ $ if 'severity' .eq. 1 $ then $ if key64 then write tf "#ifndef __VAX" $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $if p2 .nes. "" then write sys$output "''decc_shr' #define ''key2' 1" $ write tf "#endif" $ if key64 then write tf "#endif" $ goto cfgh_in_loop1 $ endif $ endif $ if f$search(tfile1) .nes. "" then delete 'tfile1';* $! $! Check the DECC Header files next $!---------------------------------------------- $ define/user sys$output nl: $ define/user sys$error nl: $ search/out=nl: 'decc_rtldef' - "''keysym';", "''keysym'[", "struct ''keysym'"/exact $ severity = '$severity' $ if severity .eq. 1 $ then $ if key64 then write tf "#ifndef __VAX" $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $if p2 .nes. "" then write sys$output "''decc_rtldef' #define ''key2' 1" $ write tf "#endif" $ if key64 then write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Check kerberos $!-------------------------------------------- $ if f$search("SYS$SYSROOT:[kerberos]include.dir") .nes. "" $ then $ test_mit = "SYS$SYSROOT:[kerberos.include]gssapi_krb5.h" $ if (key2 .eqs. "HAVE_GSSAPI") $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! This is really do we have the newer MIT Kerberos $!---------------------------------------------------------------------- $ if (key2 .eqs. "HAVE_GSSMIT") $ then $ if f$search(test_mit) .nes. "" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ else $ write tf "#ifdef ''key2'" $ write tf "#undef ''key2'" $ endif $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Older MIT looks like Heimdal $!------------------------------------------------ $ if (key2 .eqs. "HAVE_HEIMDAL") $ then $ if f$search(test_mit) .eqs. "" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' 1" $ else $ write tf "#ifdef ''key2'" $ write tf "#undef ''key2'" $ endif $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ endif $! $ endif $ write tf "/* ", xline, " */" $ goto cfgh_in_loop1 $ endif $! $! $! Process SIZEOF directives found in SAMBA and others $!---------------------------------------------------------- $ if key2a .eqs. "SIZEOF" $ then $ if key2b .eqs. "INO" .and. key2_h .eqs. "_T" $ then $ write tf "#ifndef SIZEOF_INO_T" $ write tf "#if !__USING_STD_STAT $ write tf "#define SIZEOF_INO_T 6" $ write tf "#else $ write tf "#define SIZEOF_INO_T 8" $ write tf "#endif $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "INTMAX" .and. key2_h .eqs. "_T" $ then $ write tf "#ifndef SIZEOF_INTMAX_T" $ write tf "#ifdef __VAX" $ write tf "#define SIZEOF_INTMAX_T 4" $ write tf "#else" $ write tf "#define SIZEOF_INTMAX_T 8" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "OFF" .and. key2_h .eqs. "_T" $ then $ write tf "#ifndef SIZEOF_OFF_T" $ write tf "#if __USE_OFF64_T" $ write tf "#define SIZEOF_OFF_T 8" $ write tf "#else" $ write tf "#define SIZEOF_OFF_T 4" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "CHAR" .and. key2_h .eqs. "_P" $ then $ write tf "#ifndef SIZEOF_CHAR_P" $ write tf "#if __INITIAL_POINTER_SIZE == 64" $ write tf "#define SIZEOF_CHAR_P 8" $ write tf "#else" $ write tf "#define SIZEOF_CHAR_P 4" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "VOIDP" $ then $ write tf "#ifndef SIZEOF_VOIDP" $ write tf "#if __INITIAL_POINTER_SIZE == 64" $ write tf "#define SIZEOF_VOIDP 8" $ write tf "#else" $ write tf "#define SIZEOF_VOIDP 4" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "INT" $ then $ write tf "#ifndef SIZEOF_INT" $ write tf "#define SIZEOF_INT 4" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "SIZE" .and. key2_h .eqs. "_T" $ then $ write tf "#ifndef SIZEOF_SIZE_T" $ write tf "#define SIZEOF_SIZE_T 4" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "TIME" .and. key2_h .eqs. "_T" $ then $ write tf "#ifndef SIZEOF_TIME_T" $ write tf "#define SIZEOF_TIME_T 4" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "DOUBLE" $ then $ write tf "#ifndef SIZEOF_DOUBLE" $ write tf "#define SIZEOF_DOUBLE 8" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "LONG" $ then $ if key2c .eqs. "" $ then $ write tf "#ifndef SIZEOF_LONG" $ write tf "#define SIZEOF_LONG 4" $ write tf "#endif" $ else $ write tf "#ifndef SIZEOF_LONG_LONG" $ write tf "#ifndef __VAX" $ write tf "#define SIZEOF_LONG_LONG 8" $ write tf "#endif" $ write tf "#endif" $ endif $ goto cfgh_in_loop1 $ endif $ if key2b .eqs. "SHORT" $ then $ write tf "#ifndef SIZEOF_SHORT" $ write tf "#define SIZEOF_SHORT 2" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ write tf "/* ", xline, " */" $ goto cfgh_in_loop1 $ endif $! $! Process NEED directives $!------------------------------- $ if key2a .eqs. "NEED" $ then $ if key2b .eqs. "STRINGS" .and. key2_h .eqs. "_H" $ then $ write tf "#ifndef NEED_STRINGS_H" $ write tf "#define NEED_STRINGS_H 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ write tf "/* ", xline, " */" $ goto cfgh_in_loop1 $ endif $! $! Process GETHOSTNAME directives $!------------------------------------- $ if key2 .eqs. "GETHOSTNAME_TYPE_ARG2" $ then $ write tf "#ifndef ''key2'" $ write tf "#ifdef _DECC_V4_SOURCE" $ write tf "#define ''key2' int" $ write tf "#else" $ write tf "#define ''key2' size_t" $ write tf "#endif" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Process GETNAMEINFO directives $!------------------------------------- $ if key2a .eqs. "GETNAMEINFO" $ then $ if key2 .eqs. "GETNAMEINFO_QUAL_ARG1" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' const" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "GETNAMEINFO_TYPE_ARG1" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' struct sockaddr *" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "GETNAMEINFO_TYPE_ARG2" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' size_t" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "GETNAMEINFO_TYPE_ARG46" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' size_t" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "GETNAMEINFO_TYPE_ARG7" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ endif $! $! Process RECV directives $!------------------------------------- $ if key2a .eqs. "RECV" $ then $ if key2 .eqs. "RECV_TYPE_ARG1" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECV_TYPE_ARG2" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' void *" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECV_TYPE_ARG3" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' size_t" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECV_TYPE_ARG4" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECV_TYPE_RETV" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ endif $! $! $! Process RECVFROM directives $!------------------------------------- $ if key2a .eqs. "RECVFROM" $ then $ if key2 .eqs. "RECVFROM_QUAL_ARG5" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2'" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECVFROM_TYPE_ARG1" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECVFROM_TYPE_ARG2" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' void *" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECVFROM_TYPE_ARG3" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' size_t" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECVFROM_TYPE_ARG4" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECVFROM_TYPE_ARG5" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' struct sockaddr" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECVFROM_TYPE_ARG6" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' unsigned int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "RECVFROM_TYPE_RETV" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ endif $! $! Process SELECT directives $!------------------------------------- $ if key2a .eqs. "SELECT" $ then $ if key2 .eqs. "SELECT_QUAL_ARG5" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' const" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SELECT_TYPE_ARG1" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SELECT_TYPE_ARG2" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' void *" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SELECT_TYPE_ARG234" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' fd_set *" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SELECT_TYPE_ARG5" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' struct timeval *" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SELECT_TYPE_RETV" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ endif $! $! Process SEND directives $!------------------------------------- $ if key2a .eqs. "SEND" $ then $ if key2 .eqs. "SEND_QUAL_ARG2" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' const" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SEND_TYPE_ARG1" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SEND_TYPE_ARG2" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' void *" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SEND_TYPE_ARG3" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' size_t" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SEND_TYPE_ARG4" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ if key2 .eqs. "SEND_TYPE_RETV" $ then $ write tf "#ifndef ''key2'" $ write tf "#define ''key2' int" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $ endif $! $! $! Process STATFS directives $!------------------------------- $! if key2a .eqs. "STATFS" $! then $! write tf "/* ", xline, " */" $! goto cfgh_in_loop1 $! endif $! $! Process inline directive $!------------------------------ $ if key2 .eqs. "inline" $ then $ write tf "#ifndef inline" $ write tf "#define inline __inline" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Process restrict directive $!-------------------------------- $ if key2 .eqs. "restrict" $ then $ write tf "#ifndef restrict" $ write tf "#define restrict __restrict" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Process RETSIGTYPE directive $!---------------------------------- $ if key2 .eqs. "RETSIGTYPE" $ then $ write tf "#ifndef RETSIGTYPE" $ write tf "#define RETSIGTYPE void" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Process STDC_HEADERS (SAMBA!) $!--------------------------- $ if key2 .eqs. "STDC_HEADERS" $ then $ write tf "#ifndef STDC_HEADERS" $ write tf "#define STDC_HEADERS 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Process PROTOTYPES directive $!------------------------------------- $ if key2 .eqs. "PROTOTYPES" $ then $ write tf "#ifndef PROTOTYPES" $ write tf "#define PROTOTYPES 1" $ write tf "#endif" $ goto cfgh_in_loop1 $ endif $! $! Special for SEEKDIR_RETURNS_VOID $!--------------------------------------- $ if key2 .eqs. "SEEKDIR_RETURNS_VOID" $ then $ write tf "#ifndef SEEKDIR_RETURNS_VOID" $ write tf "#define SEEKDIR_RETURNS_VOID 1" $ write tf "#endif" $ endif $! $! Unknown - See if CONFIGURE can give a clue for this $!---------------------------------------------------------- $ pflag = 0 $ set_flag = 0 $! gproj_name = proj_name - "_VMS" - "-VMS" $ if f$search(tfile1) .nes. "" then delete 'tfile1';* $ define/user sys$output nl: $ define/user sys$error nl: $! if f$locate("FILE", key2) .lt. key2_len then pflag = 1 $! if f$locate("DIR", key2) .eq. key2_len - 3 then pflag = 1 $! if f$locate("PATH", key2) .eq. key2_len - 4 then pflag = 1 $! $ search/out='tfile1' 'configure_script' "''key2'="/exact $ search_sev = '$severity' $ if 'search_sev' .eq. 1 $ then $ open/read/err=unknown_cf_rd_error sf 'tfile1' $search_file_rd_loop: $ read/end=unknown_cf_rd_err sf line_in $ line_in = f$edit(line_in, "TRIM") $ skey1 = f$element(0,"=",line_in) $ if skey1 .eqs. key2 $ then $ skey2 = f$element(1,"=",line_in) $ skey2a = f$extract(0,2,skey2) $! $! $! We can not handle assignment to shell symbols. $! For now skip them. $!------------------------------------------------------------ $ if f$locate("$", skey2) .lt. f$length(skey2) $ then $ write tf "/* ", xline, " */" $ set_flag = 1 $ goto found_in_configure $ endif $! $! Keep these two cases separate to make it easier to add $! more future intelligence to this routine $!---------------------------------------------------------------------- $ if skey2a .eqs. """`" $ then $! if pflag .eq. 1 $! then $! write tf "#ifndef ''key2'" $! write tf "#define ",key2," """,gproj_name,"_",key2,"""" $! write tf "#endif" $! else $! Ignore this for now $!------------------------------------------ $ write tf "/* ", xline, " */" $! endif $ set_flag = 1 $ goto found_in_configure $ endif $ if skey2a .eqs. """$" $ then $! if pflag .eq. 1 $! then $! write tf "#ifndef ''key2'" $! write tf "#define ",key2," """,gproj_name,"_",key2,"""" $! write tf "#endif" $! else $! Ignore this for now $!------------------------------------------- $ write tf "/* ", xline, " */" $! endif $ set_flag = 1 $ goto found_in_configure $ endif $! $! Remove multiple layers of quotes if present $!---------------------------------------------------------- $ if f$extract(0, 1, skey2) .eqs. "'" $ then $ skey2 = skey2 - "'" - "'" - "'" - "'" $ endif $ if f$extract(0, 1, skey2) .eqs. """" $ then $ skey2 = skey2 - """" - """" - """" - """" $ endif $ write tf "#ifndef ''key2'" $ if skey2 .eqs. "" $ then $ write tf "#define ",key2 $ else $! Only quote non-numbers $!---------------------------------------- $ if f$string(skey2+0) .eqs. skey2 $ then $ write tf "#define ",key2," ",skey2 $ else $ write tf "#define ",key2," """,skey2,"""" $ endif $ endif $ write tf "#endif" $ set_flag = 1 $ else $ goto search_file_rd_loop $! if pflag .eq. 1 $! then $! write tf "#ifndef ''key2'" $! write tf "#define ",key2," """,gproj_name,"_",key2,"""" $! write tf "#endif" $! set_flag = 1 $! endif $ endif $found_in_configure: $unknown_cf_rd_err: $ if f$trnlnm("sf","lnm$process",,"SUPERVISOR") .nes. "" $ then $ close sf $ endif $ if f$search(tfile1) .nes. "" then delete 'tfile1';* $ if set_flag .eq. 1 then goto cfgh_in_loop1 $ endif $ endif $! $! $! $! If it falls through everything else, comment it out $!----------------------------------------------------- $ write tf "/* ", xline, " */" $ goto cfgh_in_loop1 $cfgh_in_loop1_end: $close inf $! $! $! Write out the tail $!-------------------- $write_tail: $gosub write_config_h_tail $! $! Exit and clean up $!-------------------- $general_error: $status = '$status' $all_exit: $set noon $if f$trnlnm("sf","lnm$process",,"SUPERVISOR") .nes. "" then close sf $if f$trnlnm("tf","lnm$process",,"SUPERVISOR") .nes. "" then close tf $if f$trnlnm("inf","lnm$process",,"SUPERVISOR") .nes. "" then close inf $if f$trnlnm("tf1","lnm$process",,"SUPERVISOR") .nes. "" then close tf1 $if f$trnlnm("tf2","lnm$process",,"SUPERVISOR") .nes. "" then close tf2 $if f$trnlnm("tfcv","lnm$process",,"SUPERVISOR") .nes. "" then close tfcv $if f$type(tfile1) .eqs. "STRING" $then $ if f$search(tfile1) .nes. "" then delete 'tfile1';* $endif $if f$type(dchfile) .eqs. "STRING" $then $ if f$search(dchfile) .nes. "" then delete 'dchfile';* $endif $if f$type(starhfile) .eqs. "STRING" $then $ if f$search(starhfile) .nes. "" then delete 'starhfile';* $endif $if f$type(configure_script) .eqs. "STRING" $then $ if f$search(configure_script) .nes. "" then delete 'configure_script';* $endif $exit 'status' $! $! $control_y: $ status = ss_control_y $ goto all_exit $! $! $! $! Gosub to write a new config_vms.h $!----------------------------------- $write_config_vms: $outfile = "sys$disk:[]config_vms.h" $create 'outfile' $open/append tf 'outfile' $write tf "/* File: config_vms.h" $write tf "**" $write tf "** This file contains the manual edits needed for porting" $!write tf "** the ''proj_name' package to OpenVMS. $write tf "**" $write tf "** Edit this file as needed. The procedure that automatically" $write tf "** generated this header stub will not overwrite or make any" $write tf "** changes to this file." $write tf "**" $write tf - "** ", datetime, tab, username, tab, "Generated by ''my_proc_file'" $write tf "**" $write tf - "**========================================================================*/" $write tf "" $close tf $return $! $! gosub to write out a documentation header for config.h $!---------------------------------------------------------------- $write_config_h_header: $outfile = "sys$disk:[]config.h" $create 'outfile' $open/append tf 'outfile' $write tf "#ifndef CONFIG_H" $write tf "#define CONFIG_H" $write tf "/* File: config.h" $write tf "**" $write tf - "** This file contains the options needed for porting " $write tf "** the project on a VMS system." $write tf "**" $write tf "** Try not to make any edits to this file, as it is" $write tf "** automagically generated." $write tf "**" $write tf "** Manual edits should be made to the config_vms.h file." $write tf "**" $write tf - "** ", datetime, tab, username, tab, "Generated by ''my_proc_file'" $write tf "**" $write tf - "**========================================================================*/" $write tf "" $write tf "#if (__CRTL_VER >= 70200000) && !defined (__VAX)" $write tf "#define _LARGEFILE 1" $write tf "#endif" $write tf "" $write tf "#ifndef __VAX" $write tf "#ifdef __CRTL_VER" $write tf "#if __CRTL_VER >= 80200000" $write tf "#define _USE_STD_STAT 1" $write tf "#endif" $write tf "#endif" $write tf "#endif" $write tf "" $! $write tf " /* Allow compiler builtins */" $write tf "/*-------------------------*/" $write tf "#ifdef __DECC_VER" $write tf "#include " $write tf "#endif" $! $write tf "" $return $! $! gosub to write out the tail for config.h and close it $!--------------------------------------------------------- $write_config_h_tail: $write tf "" $write tf " /* Include the hand customized settings */" $write tf "/*--------------------------------------*/" $write tf "#include ""config_vms.h""" $write tf "" $write tf "#endif /* CONFIG_H */" $close tf $return $!