# No shebang here is intended!


# Catch GNU style help request
if test "$1" = "--help"
then
   printf "To modify the configuration, edit the file 'CONFIG'.\n"
   printf "Additionally, the following environment variables are honoured:\n"
   printf "PREFIX    Overrides 'CFG_PREFIX' in file 'CONFIG'\n"
   printf "CPPFLAGS  Flags for C/C++ preprocessor (prepended first)\n"
   printf "CC        C compiler\n"
   printf "CFLAGS    Flags for C compiler (appended last)\n"
   printf "CXX       C++ compiler\n"
   printf "CXXFLAGS  Flags for C++ compiler (appended last)\n"
   printf "LDFLAGS   Flags for linker\n"
   printf "LIBS      Additional libraries for linker\n"
   printf "Please read the file 'INSTALL' for more information.\n"
   printf "\n"
fi

# Print error if started directly
if test "$CFG_ENABLE_SWITCH" != "1"
then
   printf "Don't execute 'mkconfig' manually, because it must run with the\n"
   printf "shell specified in the file 'CONFIG'. 'make' will take care of it.\n"
   printf "To build only the configuration, use 'make config'.\n"
   exit 1
fi


# Exit on error
set -e
# Fail on expansion of unset variables
set -u


# Import config file
printf "Import config file ... "
CONFIGFILE="./CONFIG"
if test ! -f "$CONFIGFILE"
then
   printf "Error\nConfig file 'CONFIG' not found!\n"
   exit 1
fi
. "$CONFIGFILE"
printf "OK\n"


# Reset locale settings
LC_ALL=POSIX
export LC_ALL

# Internal variables (do not change)
CFG_DATE=`$UTIL_DATE -u +"%Y-%m-%d %H:%M:%S"`
CFG_FILE_LIST=`$UTIL_PWD`/src/installed_files
CFG_POSIX2="1"                     # POSIX.2-1992
CFG_POSIX2_UP="1"                  # POSIX.2a-1992
CFG_POSIX="199009"                 # POSIX.1-1990
CFG_TMR="1"                        # POSIX.1b-1993 Timers option
CFG_FSC="1"                        # POSIX.1b-1993 File Synchronization option
CFG_IP6="200112"                   # POSIX.1-2001 IPv6 option
CFG_THREADS="1"                    # POSIX.1c-1995
CFG_THREAD_SAFE_FUNCTIONS="1"      # POSIX.1c-1995
CFG_CLB="1"                        # POSIX.2 C-language binding
CFG_XOPEN="500"                    # X/Open SUSv2
CFG_ZLIB="0x1230"                  # zlib 1.2.3

# Files
CFG_TMPDIR="tmp"
CFG_RULES="cfg/config.mk"
CFG_RULES_TMP="cfg/config.mk.tmp"
CFG_HEADER="cfg/config.h"
CFG_OK="cfg/.cfg_valid"
CFG_LOG="config.log"


# C header files to check (in alphabetical order)
# Exception: <sys/types.h> is checked first because it is used by test program!
# Attention: No spaces are allowed in the names!
CFG_C_HEADERS="\
   sys/types.h \
   inttypes.h \
   regex.h \
   sys/select.h \
   openssl/ssl.h \
"

# C++ header files to check
# No spaces are allowed in the names!
CFG_CXX_HEADERS="\
   sstream \
   FL/Fl.H \
"


# Clean up function
cleanup ()
{
   # Remove temporary files
   #printf "\nClean up ... "
   if test -d "./$CFG_TMPDIR"
   then
      $UTIL_RM -rf "./$CFG_TMPDIR"
   fi
   # Remove configuration files after error
   if test ! -f "./$CFG_OK"
   then
      if test -f "./$CFG_RULES"
      then
         $UTIL_RM -f "./$CFG_RULES"
      fi
      if test -f "./$CFG_HEADER"
      then
         $UTIL_RM -f "./$CFG_HEADER"
      fi
   fi

   # Workaround for posh, ksh and zsh bug (EXIT handler fails with 'set -e'):
   # Uninstalling the exit handler here allows us to call this function
   # directly from the signal handling too
   trap '' EXIT
   #printf "OK\n"
   return
}


# Signal handler
signal ()
{
   if test $1 = "EXIT"
   then
      # Regular exit
      cleanup
      return
   else
      # Signal handling
      # Treat all trapped signals as abort request
      printf "\nSignal received, abort ... \n"
      cleanup
      exit 1
   fi
}


# Install signal handlers
trap 'signal "EXIT"' EXIT
trap 'signal "SIGNAL"' INT QUIT TERM


# ==============================================================================
# Check environment and utilities of operating system
printf "===> Check environment and utilities of operating system\n"


# Check for /dev/null (mandatory for POSIX.1 compliant systems)
# We check for existance only because the standard don't explicitly require that
# this device must be implemented as a character special file
printf "Check for /dev/null ... "
if test ! -c "/dev/null"
then
   printf "Failed\n"
   printf "Error: File '/dev/null' only supported as character special file!\n"
   exit 1
fi
printf "OK\n"


# Check for getconf
printf "Check for getconf utility ... "
UTIL_GETCONF="getconf"
set +e
TMP=`$UTIL_GETCONF _POSIX_VERSION 2>/dev/null` || \
{
   printf "Not found\n"
   exit 1
}
set -e
printf "OK\n"


# Check system for POSIX.2 compliance
printf "Check for POSIX.2 utilities ... "
set +e
POSIX2_VERSION=`$UTIL_GETCONF _POSIX2_VERSION 2>/dev/null` || \
{
   POSIX2_VERSION=`$UTIL_GETCONF POSIX2_VERSION 2>/dev/null` || \
   {
      printf "Failed\n"
      printf "Error: System is not POSIX.2 compliant!\n"
      exit 1
   }
}
set -e
if test "$POSIX2_VERSION" = "undefined"
then
   case "$($UTIL_UNAME -s)" in
      IRIX*)
         # IRIX seems to have enough POSIX.2 functionality => Ignore error
         printf "Not found, using IRIX workaround\n"
         POSIX2_VERSION=$CFG_POSIX2
      ;;
      *)
         printf "Not found\n"
         exit 1
      ;;
   esac
else
   if test $POSIX2_VERSION -lt $CFG_POSIX2
   then
      printf "%s\n" "$POSIX2_VERSION (Not supported)"
      exit 1
   else
      printf "%s\n" "$POSIX2_VERSION"
   fi
fi


# Check system for POSIX.2a compliance
printf "Check for POSIX.2a user portability (UP) utilities ... "
set +e
POSIX2_UP=`$UTIL_GETCONF _POSIX2_UPE 2>/dev/null` || \
{
   POSIX2_UP=`$UTIL_GETCONF POSIX2_UPE 2>/dev/null` || \
   {
      printf "Failed\n"
      printf "Error: System is not POSIX.2a compliant!\n"
      exit 1
   }
}
set -e
if test "$POSIX2_UP" = "undefined"
then
   printf "Not found\n"
   POSIX2_UP=0
else
   if test $POSIX2_UP -lt $CFG_POSIX2_UP
   then
      printf "%s\n" "$POSIX2_UP (Not supported)"
      POSIX2_UP=0
   else
      printf "%s\n" "$POSIX2_UP"
   fi
fi
if test $POSIX2_UP -eq 0
then
   # POSIX.2a UP extension not available or not sufficient
   if test $CFG_FORCE_UP -ne 0
   then
      printf "Warning: Trying forced use of UP extension on user request!\n"
      POSIX2_UP=$CFG_POSIX2_UP
   else
      printf "Error: UP extension not found or not sufficient.\n"
      printf "Consider setting 'CFG_FORCE_UP' in configuration file\n"
      exit 1
   fi
fi


# Check whether word splitting of shell is POSIX.2 compliant
printf "Check word splitting of shell ... "
TMP="1 2 3"
for UTIL in $TMP
do
   if test "$UTIL" = "$TMP"
   then
      printf "Failed\n"
      printf "Error: Word splitting is not POSIX.2 compliant!\n"
      exit 1
   fi
done
printf "OK\n"


# Check whether utilities are present and usable
printf "Check utilities ... "
UTIL_COMMAND="command -v"
( $UTIL_COMMAND "printf" ) >/dev/null 2>&1 ||
{
   printf "Failed\n"
   printf "Error: Missing or broken 'command -v'\n"
   exit 1
}
COMMA=""
for UTIL in $CFG_UTILS
do
   printf "%s%s" "$COMMA" "$UTIL"
   COMMA=", "
   # Check whether utility is present
   $UTIL_COMMAND "$UTIL" >/dev/null 2>&1 || \
   {
      printf "\n"
      printf "%s\n" "Error: $UTIL not found!"
      exit 1
   }
   # Test awk
   if test "$UTIL_AWK" = "$UTIL"
   then
      # Check whether awk accept ": " as field separator
      set +e
      TMP=`printf "XXX: Test 1 2 3\n" | \
           $UTIL_AWK -F ": " '/XXX:/ {printf "%s", $2}' 2>/dev/null`
      set -e
      if test "$TMP" != "Test 1 2 3"
      then
         printf "\n"
         printf "Error: Your awk is broken! (fails with ': ' field separator)\n"
         exit 1
      fi
      # Check whether awk can handle character classes
      set +e
      TMP=`printf "Bla 1.2.3\n" | \
           $UTIL_AWK '/[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*/ {printf "%s", $2}' 2>/dev/null`
      set -e
      if test "$TMP" != "1.2.3"
      then
         printf "\n"
         printf "Error: Your awk is broken! (doesn't support character classes)\n"
         exit 1
      fi
   fi
   # Test sed
   if test "$UTIL_SED" = "$UTIL"
   then
      # Check whether sed understand "-e" and "backslash-slash" in regexp
      set +e
      TMP=`printf "1/2/3\n" | $UTIL_SED -e "s/\///g" 2>/dev/null`
      set -e
      if test "$TMP" != "123"
      then
         printf "\n"
         printf "Error: Your sed is broken! (fails with '-e' option or '"
            printf '\\\\' ; printf "' in regex)\n"
         exit 1
      fi
      # Check whether sed can handle character classes
      set +e
      TMP=`printf "1a3BLA4\n" | $UTIL_SED -e "s/\([[:alnum:]]\)BLA/\1/g" 2>/dev/null`
      set -e
      if test "$TMP" != "1a34"
      then
         printf "\n"
         printf "Error: Your sed is broken! (doesn't support character classes)\n"
         exit 1
      fi
   fi
done
printf "\n"


# Determine path of shell
printf "Determine absolute path of shell ... "
CFG_SHELL=`$UTIL_COMMAND "$UTIL_SH"`
printf "%s\n" "$CFG_SHELL"

# Check whether command substitution of shell is POSIX.2 compliant
printf "Check command substitution of shell ... "
set +e
eval `$CFG_SHELL -c "TEST=$(echo Bla)" >/dev/null 2>&1`
TMP=$?
if test ! "$TMP" = "0"
then
   printf "Failed\n"
   printf "Error: Command substitution of shell is not POSIX.2 compliant!\n"
   exit 1
fi
set -e
printf "OK\n"

# Check whether arithmetic expansion of shell is POSIX.2 compliant
printf "Check arithmetic expansion of shell ... "
set +e
eval $($CFG_SHELL -c "TMP=$(( 1 ))" >/dev/null 2>&1)
TMP=$?
if test ! "$TMP" = "0"
then
   printf "Failed\n"
   printf "Error: Arithmetic expansion of shell is not POSIX.2 compliant!\n"
   exit 1
fi
set -e
printf "OK\n"

# Check whether shells 'export' is POSIX.2 compliant
printf "Check export command of shell ... "
set +e
eval $($CFG_SHELL -c "export TMP=Bla" >/dev/null 2>&1)
TMP=$?
if test ! "$TMP" = "0"
then
   printf "Failed\n"
   printf "Error: Command export of shell is not POSIX.2 compliant!\n"
   exit 1
fi
set -e
printf "OK\n"


# Check whether environment contains 'HOME' variable
printf "Check for variable HOME in environment ... "
set +u
if test ! "$HOME"
then
   printf "Failed\n"
   printf "Error: Your environment is not POSIX.2a compliant!\n"
   exit 1
fi
set -u
printf "OK\n"


# ==============================================================================
# Define functions (after shell has been checked)


# Check for leap year (gregorian calendar)
# SDE_LEAP is set to one, if a leap year is detected
sde_is_leap_year ()
{
   SDE_LEAP=0
   if test 0 -eq $(( $1 % 100 ))
   then
      if test 0 -eq $(( $1 % 400 ))
      then
         SDE_LEAP=1
      fi
   elif test 0 -eq $(( $1 % 4 ))
   then
      SDE_LEAP=1
   fi
}


# Function to format date specified as seconds since epoch
# Used to implement SOURCE_DATE_EPOCH (SDE) specification:
# https://reproducible-builds.org/specs/source-date-epoch/
#
# The examples require a date utility with GNU oder BSD extensions:
# https://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html
#
# Output is placed in SDE_DATE with format: YYYY-MM-DD HH:MM:SS
sde_format_date ()
{
   # Clamp negative timestamp to zero
   if test $1 -lt 0
   then
      SDE_SSE=0
   else
      SDE_SSE=$1
   fi

   # A POSIX day always has 86400 seconds:
   # https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html
   # (Section 4.16)
   SDE_DAY_FACTOR=86400
   SDE_SECS_IN_TIME=$(( $SDE_SSE % $SDE_DAY_FACTOR ))
   SDE_SECS_IN_DATE=$(( $SDE_SSE - $SDE_SECS_IN_TIME ))

   # Time
   SDE_HOUR=$(( $SDE_SECS_IN_TIME / 3600 ))
   SDE_MINUTE=$(( $SDE_SECS_IN_TIME % 3600 / 60 ))
   SDE_SECOND=$(( $SDE_SECS_IN_TIME % 60 ))
   SDE_TIME=$(printf "%02d:%02d:%02d\n" $SDE_HOUR $SDE_MINUTE $SDE_SECOND)

   # Year
   SDE_YEAR=1970
   SDE_DAY=$(( $SDE_SECS_IN_DATE / $SDE_DAY_FACTOR ))
   while test $SDE_DAY -ge 365
   do
      sde_is_leap_year $SDE_YEAR
      if test 0 -ne $SDE_LEAP
      then
         # Leap year
         if test $SDE_DAY -ge 366
         then
            SDE_DAY=$(( $SDE_DAY - 366 ))
         else
            break
         fi
      else
         SDE_DAY=$(( $SDE_DAY - 365 ))
      fi
      SDE_YEAR=$(( $SDE_YEAR + 1 ))
   done

   # Month and day
   SDE_MONTH=1
   for SDE_DAYS_IN_MONTH in 31 28 31 30 31 30 31 31 30 31 30 31
   do
      # Check for leap year
      if test 28 -eq $SDE_DAYS_IN_MONTH
      then
         sde_is_leap_year $SDE_YEAR
         if test 0 -ne $SDE_LEAP
         then
            SDE_DAYS_IN_MONTH=29
         fi
      fi

      if test $SDE_DAY -lt $(( $SDE_DAYS_IN_MONTH ))
      then
         # Count day of month from 1
         SDE_DAY=$(( $SDE_DAY + 1 ))
         break
      else
         SDE_DAY=$(( $SDE_DAY - $SDE_DAYS_IN_MONTH ))
      fi
      SDE_MONTH=$(( $SDE_MONTH + 1 ))
   done
   TMP=$(printf "%04d-%02d-%02d\n" $SDE_YEAR $SDE_MONTH $SDE_DAY)

   SDE_DATE=$(printf "%s %s" $TMP $SDE_TIME)
}


# Function to check whether C header file is present
check_c_header ()
{
   printf "%s" "Check for C header file $1 ... "
   printf "\n%s\n" "Check for C header file $1 ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   OBJECT_FILE="./$CFG_TMPDIR/test.o"
   BUILD_CMD="$CC $CFLAGS -c -o $OBJECT_FILE $SOURCE_FILE"
   printf "/* Don't use feature test macro */\n" >$SOURCE_FILE
   if test "$1" != "sys/types.h"
   then
      printf "/* Maybe required for old systems */\n" >>$SOURCE_FILE
      printf "#include <sys/types.h>\n" >>$SOURCE_FILE
   fi
   printf "#include <$1>\n" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   TMP=$(printf "%s" "$1" | $UTIL_TR '[:lower:]' '[:upper:]')
   TMP=$(printf "%s\n" "$TMP" | $UTIL_SED -e "s/\./_/g")
   TMP=$(printf "%s\n" "$TMP" | $UTIL_SED -e "s/\//_/g")
   if test $RES -eq 0
   then
      printf "%s\n" "#define CFG_HDR_$TMP  1" >>./$CFG_HEADER
      printf "Result: OK\n" >>$CFG_LOG
      printf "OK\n"
   else
      printf "%s\n" "#define CFG_HDR_$TMP  0" >>./$CFG_HEADER
      printf "Result: Not found\n" >>$CFG_LOG
      printf "Not found\n"
      # Return 1 (error) for mandatory headers
      if test "$1" = "sys/types.h"; then  return 1; fi
      # Set flag indicating missing OpenSSL header files
      if test "$1" = "openssl/ssl.h"
      then
         if test $OPENSSL_FOUND -eq 1
         then
            printf "%s\n" "OpenSSL was found, but header files are missing!"
            return 1
         fi
      fi
   fi
}


# Function to check whether C++ header file is present
check_cxx_header ()
{
   printf "%s" "Check for C++ header file $1 ... "
   printf "\n%s\n" "Check for C++ header file $1 ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.cxx"
   OBJECT_FILE="./$CFG_TMPDIR/test.o"
   BUILD_CMD="$CXX $CXXFLAGS -c -o $OBJECT_FILE $SOURCE_FILE"
   printf "#include <$1>\n" >$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   TMP=$(printf "%s" "$1" | $UTIL_TR '[:lower:]' '[:upper:]')
   TMP=$(printf "%s\n" "$TMP" | $UTIL_SED -e "s/\./_/g")
   TMP=$(printf "%s\n" "$TMP" | $UTIL_SED -e "s/\//_/g")
   if test $RES -eq 0
   then
      printf "%s\n" "#define CFG_HDR_$TMP  1" >>./$CFG_HEADER
      printf "Result: OK\n" >>$CFG_LOG
      printf "OK\n"
   else
      printf "%s\n" "#define CFG_HDR_$TMP  0" >>./$CFG_HEADER
      printf "Result: Not found\n" >>$CFG_LOG
      printf "Not found\n"
      # Return 1 (error) for mandatory headers */
      if test "$1" = "sstream"; then  return 1; fi
      if test "$1" = "Fl/Fl.H"; then  return 1; fi
   fi
}


# Function to check whether C compiler works
check_c_compiler ()
{
   printf "%s" "Check C compiler ... "
   printf "\n%s\n" "Check C compiler ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#include <stdio.h>" >$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "#if __STDC_VERSION__ >= 201710L" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"C17\\n\");" >>$SOURCE_FILE
   printf "%s\n" "#elif __STDC_VERSION__ >= 201112L" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"C11\\n\");" >>$SOURCE_FILE
   printf "%s\n" "#elif __STDC_VERSION__ >= 199901L" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"C99\\n\");" >>$SOURCE_FILE
   printf "%s\n" "#elif __STDC_VERSION__ >= 199409L" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"C95\\n\");" >>$SOURCE_FILE
   printf "%s\n" "#elif __STDC__" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"C90\\n\");" >>$SOURCE_FILE
   printf "%s\n" "#else" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"Pre_C90\\n\");" >>$SOURCE_FILE
   printf "%s\n" "#endif" >>$SOURCE_FILE
   printf "%s\n" "   exit(0);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      case "$($BINARY_FILE)" in
         C17)
            printf "Result: C17\n" >>$CFG_LOG
            printf "C17\n"
         ;;
         C11)
            printf "Result: C11\n" >>$CFG_LOG
            printf "C11\n"
         ;;
         C99)
            printf "Result: C99\n" >>$CFG_LOG
            printf "C99\n"
         ;;
         C95)
            printf "Result: C95\n" >>$CFG_LOG
            printf "C95\n"
         ;;
         C90)
            printf "Result: C90\n" >>$CFG_LOG
            printf "C90\n"
         ;;
         Pre_C90)
            printf "Result: Pre_C90\n" >>$CFG_LOG
            printf "Warning: Compiler too old, trying nonetheless!\n" >>$CFG_LOG
            printf "Pre C90\n"
            printf "Warning: Compiler too old, trying nonetheless!\n"
         ;;
         *)
            printf "Result: %s\n" "$($BINARY_FILE)" >>$CFG_LOG
            printf "Created binary does not work\n" >>$CFG_LOG
            printf "Created binary does not work\n"
            return 1
         ;;
      esac
   fi
}


# Function to check whether C++ compiler works
check_cxx_compiler ()
{
   printf "%s" "Check C++ compiler ... "
   printf "\n%s\n" "Check C++ compiler ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.cxx"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CXX $CXXFLAGS $LDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#include <cstdlib>" >$SOURCE_FILE
   printf "%s\n" "#include <iostream>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "#if __cplusplus >= 202002L" >>$SOURCE_FILE
   printf "%s\n" "   std::cout << \"C++20\" << std::endl;" >>$SOURCE_FILE
   printf "%s\n" "#elif __cplusplus >= 201703L" >>$SOURCE_FILE
   printf "%s\n" "   std::cout << \"C++17\" << std::endl;" >>$SOURCE_FILE
   printf "%s\n" "#elif __cplusplus >= 201402L" >>$SOURCE_FILE
   printf "%s\n" "   std::cout << \"C++14\" << std::endl;" >>$SOURCE_FILE
   printf "%s\n" "#elif __cplusplus >= 201103L" >>$SOURCE_FILE
   printf "%s\n" "   std::cout << \"C++11\" << std::endl;" >>$SOURCE_FILE
   printf "%s\n" "#elif __cplusplus >= 199711L" >>$SOURCE_FILE
   printf "%s\n" "   std::cout << \"C++98\" << std::endl;" >>$SOURCE_FILE
   printf "%s\n" "#else" >>$SOURCE_FILE
   printf "%s\n" "   std::cout << \"Pre_C++98\" << std::endl;" >>$SOURCE_FILE
   printf "%s\n" "#endif" >>$SOURCE_FILE
   printf "%s\n" "   exit(0);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      case "$($BINARY_FILE)" in
         C++20)
            printf "Result: C++20\n" >>$CFG_LOG
            printf "C++20\n"
         ;;
         C++17)
            printf "Result: C++17\n" >>$CFG_LOG
            printf "C++17\n"
         ;;
         C++14)
            printf "Result: C++14\n" >>$CFG_LOG
            printf "C++14\n"
         ;;
         C++11)
            printf "Result: C++11\n" >>$CFG_LOG
            printf "C++11\n"
         ;;
         C++98)
            printf "Result: C++98\n" >>$CFG_LOG
            printf "C++98\n"
         ;;
         Pre_C++98)
            printf "Result: Pre_Cxx98\n" >>$CFG_LOG
            printf "Warning: Compiler too old, trying nonetheless!\n" >>$CFG_LOG
            printf "Pre C++98\n"
            printf "Warning: Compiler too old, trying nonetheless!\n"
         ;;
         *)
            printf "Result: %s\n" "$($BINARY_FILE)" >>$CFG_LOG
            printf "Created binary does not work\n" >>$CFG_LOG
            printf "Created binary does not work\n"
            return 1
         ;;
      esac
   fi
}


# Function to check POSIX version of OS
check_posix_version ()
{
   printf "%s" "Check for POSIX.1 ... "
   printf "\n%s\n" "Check for POSIX.1 ..." >>$CFG_LOG
   POSIX_VERSION=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_SOURCE" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  ver;" >>$SOURCE_FILE
   printf "%s\n" "   ver = sysconf(_SC_VERSION);" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%ld\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if(-1L == ver)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   else if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      else
         POSIX_VERSION="$($BINARY_FILE)"
         printf "Result: %s\n" "$POSIX_VERSION" >>$CFG_LOG
         printf "%s\n" "$POSIX_VERSION"
      fi
   fi
}


# Function to check whether system supports POSIX.1c thread extension
check_posix_threads ()
{
   printf "%s" "Check for POSIX.1c thread (THR) extension ... "
   printf "\n%s\n" "Check for POSIX.1c thread (THR) extension ..." >>$CFG_LOG
   POSIX_THREADS=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  199506L" >$SOURCE_FILE
   printf "%s\n" "#include <pthread.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  ver;" >>$SOURCE_FILE
   printf "%s\n" "   ver = sysconf(_SC_THREADS);" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%ld\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if(-1L == ver)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   else if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      else
         POSIX_THREADS="$($BINARY_FILE)"
         printf "Result: %s\n" "$POSIX_THREADS" >>$CFG_LOG
         printf "%s\n" "$POSIX_THREADS"
      fi
   fi
}


# Function to check whether system supports POSIX.1c thread-safe functions
# option
check_posix_thread_safe_functions ()
{
   printf "%s" "Check for POSIX.1c thread-safe functions (TSF) option ... "
   printf "\n%s\n" "Check for POSIX.1c thread-safe functions (TSF) option ..." \
      >>$CFG_LOG
   POSIX_THREAD_SAFE_FUNCTIONS=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  199506L" >$SOURCE_FILE
   printf "%s\n" "#include <pthread.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  ver;" >>$SOURCE_FILE
   printf "%s\n" "   ver = sysconf(_SC_THREAD_SAFE_FUNCTIONS);" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%ld\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if(-1L == ver)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   else if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      else
         POSIX_THREAD_SAFE_FUNCTIONS="$($BINARY_FILE)"
         printf "Result: %s\n" "$POSIX_THREAD_SAFE_FUNCTIONS" >>$CFG_LOG
         printf "%s\n" "$POSIX_THREAD_SAFE_FUNCTIONS"
      fi
   fi
}


# Function to check whether system supports POSIX.1b timers option
check_posix_tmr ()
{
   printf "%s" "Check for POSIX.1b timers (TMR) option ... "
   printf "\n%s\n" "Check for POSIX.1b timers (TMR) option ..." >>$CFG_LOG
   POSIX_TMR=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  199309L" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  ver;" >>$SOURCE_FILE
   printf "%s\n" "   ver = sysconf(_SC_TIMERS);" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%ld\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if(-1L == ver)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   else if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      else
         POSIX_TMR="$($BINARY_FILE)"
         printf "Result: %s\n" "$POSIX_TMR" >>$CFG_LOG
         printf "%s\n" "$POSIX_TMR"
      fi
   fi
}


# Function to check whether system supports POSIX.1 file synchronization option
check_posix_fsc ()
{
   printf "%s" "Check for POSIX.1 file synchronization (FSC) option ... "
   printf "\n%s\n" "Check for POSIX.1 file synchronization (FSC) option ..." \
      >>$CFG_LOG
   POSIX_FSC=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  200112L" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  ver;" >>$SOURCE_FILE
   printf "%s\n" "   ver = sysconf(_SC_FSYNC);" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%ld\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if(-1L == ver)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   else if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      else
         POSIX_FSC="$($BINARY_FILE)"
         printf "Result: %s\n" "$POSIX_FSC" >>$CFG_LOG
         printf "%s\n" "$POSIX_FSC"
      fi
   fi
}


# Function to check whether system supports POSIX.1 IP6 option
check_posix_ipv6 ()
{
   printf "%s" "Check for POSIX.1 IPv6 (IP6) option ... "
   printf "\n%s\n" "Check for POSIX.1 IPv6 (IP6) option ..." \
      >>$CFG_LOG
   POSIX_IP6=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  200112L" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  ver;" >>$SOURCE_FILE
   printf "%s\n" "   ver = sysconf(_SC_IPV6);" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%ld\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if(-1L == ver)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   else if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      elif test $CFG_IP6_DISABLE -ne 0
      then
         printf "Available, but disabled by configuration\n"
         return 1
      else
         POSIX_IP6="$($BINARY_FILE)"
         printf "Result: %s\n" "$POSIX_IP6" >>$CFG_LOG
         printf "%s\n" "$POSIX_IP6"
      fi
   fi
}


# Function to check whether system supports POSIX.2 C-language binding
check_posix_clb ()
{
   printf "%s" "Check for POSIX.2 C-language binding (CLB) ... "
   printf "\n%s\n" "Check for POSIX.2 C-language binding ..." >>$CFG_LOG
   POSIX_CLB=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  2" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  ver;" >>$SOURCE_FILE
   printf "%s\n" "   ver = sysconf(_SC_2_C_BIND);" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%ld\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if(-1L == ver)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   else if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      else
         POSIX_CLB="$($BINARY_FILE)"
         printf "Result: %s\n" "$POSIX_CLB" >>$CFG_LOG
         printf "%s\n" "$POSIX_CLB"
      fi
   fi
}


# Function to check X/Open version of OS
check_xopen_version ()
{
   printf "%s" "Check for X/Open system interface (XSI) extension ... "
   printf "\n%s\n" "Check for X/Open system interface (XSI) extension ..." \
      >>$CFG_LOG
   XOPEN_VERSION=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _XOPEN_SOURCE  $CFG_XOPEN" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   int  ver;" >>$SOURCE_FILE
   printf "%s\n" "   ver = sysconf(_SC_XOPEN_VERSION);" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%d\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if(-1 == ver)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   else if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      else
         XOPEN_VERSION="$($BINARY_FILE)"
         printf "Result: %s\n" "$XOPEN_VERSION" >>$CFG_LOG
         printf "%s\n" "$XOPEN_VERSION"
      fi
   fi
}


# Function to check zlib version
check_zlib_version ()
{
   printf "%s" "Check for zlib version ... "
   printf "\n%s\n" "Check for zlib version ..." >>$CFG_LOG
   ZLIB_VERSION=""
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_SOURCE" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <zlib.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   int  ver = ZLIB_VERNUM;" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"0x%X\n\", ver);" >>$SOURCE_FILE
   printf "%s\n" "   if($1 > ver)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
            printf "Result: %s\n" "$($BINARY_FILE) (Not supported)" >>$CFG_LOG
         else
            printf "Not found\n"
            printf "Result: Not found\n" >>$CFG_LOG
         fi
         return 1
      else
         ZLIB_VERSION="$($BINARY_FILE)"
         printf "Result: %s\n" "$ZLIB_VERSION" >>$CFG_LOG
         printf "%s\n" "$ZLIB_VERSION"
      fi
   fi
}


get_unsigned_16bit_type ()
{
   printf "%s" "Get unsigned 16 bit integer type ... "
   printf "\n%s\n" "Get unsigned 16 bit integer type ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  199506L" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   if(2 != sizeof(unsigned short int))" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   else" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      printf(\"unsigned short int\n\");" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         printf "Failed\n"
         return 1
      else
         UINT16_TYPE="$($BINARY_FILE)"
         printf "Result: %s\n" "$UINT16_TYPE" >>$CFG_LOG
         printf "%s\n" "$UINT16_TYPE"
      fi
   fi
}


get_unsigned_32bit_type ()
{
   printf "%s" "Get unsigned 32 bit integer type ... "
   printf "\n%s\n" "Get unsigned 32 bit integer type ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  199506L" >$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   if(4 == sizeof(unsigned short int))" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      printf(\"unsigned short int\n\");" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   else if(4 == sizeof(unsigned int))" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      printf(\"unsigned int\n\");" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   else if(4 == sizeof(unsigned long int))" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      printf(\"unsigned long int\n\");" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   else" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         printf "Failed\n"
         return 1
      else
         UINT32_TYPE="$($BINARY_FILE)"
         printf "Result: %s\n" "$UINT32_TYPE" >>$CFG_LOG
         printf "%s\n" "$UINT32_TYPE"
      fi
   fi
}


check_size_max ()
{
   printf "%s" "Verify that SIZE_MAX is at least INT_MAX ... "
   printf "\n%s\n" "Verify that SIZE_MAX is at least INT_MAX ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  199506L" >$SOURCE_FILE
   printf "%s\n" "#include <limits.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   int  intmax = INT_MAX;" >>$SOURCE_FILE
   printf "%s\n" "   /* This should actually check 'SIZE_MAX' */" >>$SOURCE_FILE
   printf "%s\n" "   ssize_t  ssizemax = SSIZE_MAX;" >>$SOURCE_FILE
   printf "%s\n" "   if(ssizemax < intmax)" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         printf "Failed\n"
         return 1
      else
         printf "OK\n" >>$CFG_LOG
         printf "OK\n"
      fi
   fi
}


check_pid_size ()
{
   printf "%s" "Verify that pid_t is not larger than long int ... "
   printf "\n%s\n" "Verify that pid_t is not larger than long int ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  199506L" >$SOURCE_FILE
   printf "%s\n" "#include <sys/types.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   if(sizeof(pid_t) > sizeof(long int))" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      res = -1;" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         printf "Failed\n"
         return 1
      else
         printf "OK\n" >>$CFG_LOG
         printf "OK\n"
      fi
   fi
}


check_line_and_argument_length ()
{
   printf "%s" "Check maximum line length ... "
   printf "\n%s\n" "Check maximum line length ..." >>$CFG_LOG
   SOURCE_FILE="./$CFG_TMPDIR/test.c"
   BINARY_FILE="./$CFG_TMPDIR/test"
   BUILD_CMD="$CC $CFLAGS $CLDFLAGS -o $BINARY_FILE $SOURCE_FILE $LIBS"
   printf "%s\n" "#define _POSIX_C_SOURCE  199506L" >$SOURCE_FILE
   printf "%s\n" "#include <limits.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdio.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <stdlib.h>" >>$SOURCE_FILE
   printf "%s\n" "#include <unistd.h>" >>$SOURCE_FILE
   printf "%s\n" "int  main(int  argc, char**  argv)" >>$SOURCE_FILE
   printf "%s\n" "{" >>$SOURCE_FILE
   printf "%s\n" "   int  res = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  len = 0;" >>$SOURCE_FILE
   printf "%s\n" "   long int  lmin = 2048;" >>$SOURCE_FILE
   printf "%s\n" "   long int  amin = 4096;" >>$SOURCE_FILE
   printf "%s\n" "   if(1 == argc)" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      len = sysconf(_SC_LINE_MAX);" >>$SOURCE_FILE
   printf "%s\n" "      if(-1L == len)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "      else if(len < lmin)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   if (2 == argc)" >>$SOURCE_FILE
   printf "%s\n" "   {" >>$SOURCE_FILE
   printf "%s\n" "      len = sysconf(_SC_ARG_MAX);" >>$SOURCE_FILE
   printf "%s\n" "      if(-1L == len)  res = -1;" >>$SOURCE_FILE
   printf "%s\n" "      else if(len < amin)  res = 1;" >>$SOURCE_FILE
   printf "%s\n" "   }" >>$SOURCE_FILE
   printf "%s\n" "   printf(\"%ld\n\", len);" >>$SOURCE_FILE
   printf "%s\n" "   exit(res);" >>$SOURCE_FILE
   printf "%s\n" "}" >>$SOURCE_FILE
   set +e
   printf "Test program:\n" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   cat $SOURCE_FILE >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   printf "Build command:\n" >>$CFG_LOG
   printf "%s\n" "$BUILD_CMD" >>$CFG_LOG
   printf "%s\n" "----------" >>$CFG_LOG
   $BUILD_CMD >>$CFG_LOG 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      printf "Cannot create binary\n"
      return 1
   else
      set +e
      $BINARY_FILE >/dev/null 2>&1
      RES=$?
      set -e
      if test $RES -ne 0
      then
         if test $RES -eq 1
         then
            printf "%s\n" "$($BINARY_FILE) (Not supported)"
         else
            printf "Failed\n"
         fi
         return 1
      else
         printf "Result: %s\n" "$($BINARY_FILE)" >>$CFG_LOG
         printf "%s\n" "$($BINARY_FILE)"
      fi
   fi
   printf "\n%s\n" "Check maximum exec() argument length ..." >>$CFG_LOG
   printf "%s" "Check maximum exec() argument length ... "
   set +e
   $BINARY_FILE A >/dev/null 2>&1
   RES=$?
   set -e
   if test $RES -ne 0
   then
      if test $RES -eq 1
      then
         printf "%s\n" "$($BINARY_FILE A) (Not supported)"
      else
         printf "Failed\n"
      fi
      return 1
   else
      printf "Result: %s\n" "$($BINARY_FILE A)" >>$CFG_LOG
      printf "%s\n" "$($BINARY_FILE A)"
   fi
}


# ==============================================================================
# Prepare for configuration
printf "===> Prepare configuration\n"


# Create logfile
printf "%s\n" "Check the following data if mkconfig script has failed." \
    >$CFG_LOG


# Create temporary directory if it doesn't exist
if test ! -d "./$CFG_TMPDIR"
then
   printf "Create directory for temporary files ... "
   $UTIL_MKDIR "./$CFG_TMPDIR"
   printf "OK\n"
fi


# Create configuration directory if it doesn't exist
if test ! -d "./cfg"
then
   printf "Create configuration directory ... "
   $UTIL_MKDIR ./cfg
   printf "OK\n"
fi
# Prepare empty configuration files
if test -f "./$CFG_OK"
then
   $UTIL_RM -f "./$CFG_OK"
fi
printf "" >./$CFG_RULES
printf "" >./$CFG_HEADER


# ==============================================================================
# Check dependencies
printf "===> Check dependencies\n"


# Check FLTK toolkit API
printf "%s" "Check for FLTK ... "
printf "\n%s\n" "Check for FLTK ..." >>$CFG_LOG
FLTK3_CONFIG="fltk3-config"
FLTK3_VERSION=""
$UTIL_COMMAND "$FLTK3_CONFIG" >/dev/null 2>&1 && \
{
   FLTK3_VERSION=$($FLTK3_CONFIG --api-version 2>/dev/null) || FLTK3_VERSION=""
}
FLTK2_CONFIG="fltk2-config"
FLTK2_VERSION=""
$UTIL_COMMAND "$FLTK2_CONFIG" >/dev/null 2>&1 && \
{
   FLTK2_VERSION=$($FLTK2_CONFIG --api-version 2>/dev/null) || FLTK2_VERSION=""
}
FLTK1_CONFIG="fltk-config"
FLTK1_VERSION=""
$UTIL_COMMAND "$FLTK1_CONFIG" >/dev/null 2>&1 && \
{
   FLTK1_VERSION=$($FLTK1_CONFIG --api-version 2>/dev/null) || FLTK1_VERSION=""
}
FLTK_VERSION=$FLTK1_VERSION
FLTK_CONFIG=$FLTK1_CONFIG
if test ! "$FLTK_VERSION"
then
   printf "Not found\n"
   exit 1
else
   printf "API $FLTK_VERSION"
   printf "%s\n" "API $FLTK_VERSION" >>$CFG_LOG
   CFG_FLTKAPI_MAJOR=$(printf "%s\n" "$FLTK_VERSION" | $UTIL_SED -e "s/\..*//")
   CFG_FLTKAPI_MINOR=$(printf "%s\n" "$FLTK_VERSION" | $UTIL_SED -e "s/.*\.//")
   TMP=1
   if test ! "$CFG_FLTKAPI_MAJOR"; then TMP=0; fi
   if test ! "$CFG_FLTKAPI_MINOR"; then TMP=0; fi
   if test $TMP -ne 1
   then
      printf "\nError: Cannot extract version components!\n"
      exit 1
   fi
   if test $CFG_FLTKAPI_MAJOR -ne 1; then TMP=0; fi
   if test $CFG_FLTKAPI_MINOR -lt 3; then TMP=0; fi
   if test $TMP -eq 0
   then
      printf " (not supported)\n"
      exit 1
   else
      printf "\n"
   fi
fi


# Check for OpenSSL API
printf "%s" "Check for OpenSSL ... "
printf "\n%s\n" "Check for OpenSSL ..." >>$CFG_LOG
OPENSSL_CONFIG="openssl"
OPENSSL_VERSION=""
OPENSSL_NAME=""
OPENSSL_FOUND=0
LIBRESSL_FLAG=0
LIBRESSL_3_5_FLAG=0
$UTIL_COMMAND "$OPENSSL_CONFIG" >/dev/null 2>&1 && \
{
   OPENSSL_VERSION=$($OPENSSL_CONFIG version -v 2>/dev/null) || OPENSSL_VERSION=""
}
if test ! "$OPENSSL_VERSION"
then
   printf "%s\n" "Not found"
   printf "%s\n" "Not found" >>$CFG_LOG
else
   printf "%s\n" "$OPENSSL_VERSION" >>$CFG_LOG
   OPENSSL_NAME=$(printf "%s\n" "$OPENSSL_VERSION" \
                  | $UTIL_AWK '{printf "%s\n", $1 ; exit}')
   printf "%s\n" "Detected library name: $OPENSSL_NAME" >>$CFG_LOG
   if test "$OPENSSL_NAME" = "LibreSSL"
   then
      # LibreSSL
      LIBRESSL_VERSION=$(printf "%s\n" "$OPENSSL_VERSION" | $UTIL_AWK '{ \
          start=match($0,/[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*/) ; \
          ver=substr($0,start,RLENGTH) ; printf "%s\n", ver }')
      if test ! "$LIBRESSL_VERSION"
      then
         printf "\nError: Cannot extract version components!\n"
         exit 1
      else
         LIBRESSL_VERSION=$(printf "%s\n" "$LIBRESSL_VERSION" | $UTIL_AWK '{ \
            split($0,a,/\./) ; printf "%d %d %d\n", a[1], a[2], a[3] }')
         LIBRESSL_MAJOR=$(printf "%s\n" "$LIBRESSL_VERSION" \
                          | $UTIL_AWK '{print $1}')
         LIBRESSL_MINOR=$(printf "%s\n" "$LIBRESSL_VERSION" \
                          | $UTIL_AWK '{print $2}')
         # This flag is intended to disable incompatible code for all versions
         LIBRESSL_FLAG=1
         # Limit usage to OpenSSL API 1.0 by default (for old versions)
         CFG_OPENSSLAPI_MAJOR=1
         CFG_OPENSSLAPI_MINOR=0
         # Since version 3.5 LibreSSL dropped OpenSSL 1.0 compatibility
         if test $LIBRESSL_MAJOR -ge 3
         then
            if test $LIBRESSL_MAJOR -gt 3
            then
               LIBRESSL_3_5_FLAG=1
            elif test $LIBRESSL_MINOR -ge 5
            then
               LIBRESSL_3_5_FLAG=1
            fi
         fi
      fi
   else
      # OpenSSL
      OPENSSL_VERSION=$(printf "%s\n" "$OPENSSL_VERSION" | $UTIL_AWK '{ \
          start=match($0,/[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*/) ; \
          ver=substr($0,start,RLENGTH) ; printf "%s\n", ver }')
      if test ! "$OPENSSL_VERSION"
      then
         printf "\nError: Cannot extract version components!\n"
         exit 1
      else
         OPENSSL_VERSION=$(printf "%s\n" "$OPENSSL_VERSION" | $UTIL_AWK '{ \
            split($0,a,/\./) ; printf "%d %d %d\n", a[1], a[2], a[3] }')
         CFG_OPENSSLAPI_MAJOR=$(printf "%s\n" "$OPENSSL_VERSION" \
                                | $UTIL_AWK '{print $1}')
         CFG_OPENSSLAPI_MINOR=$(printf "%s\n" "$OPENSSL_VERSION" \
                                | $UTIL_AWK '{print $2}')
      fi
   fi
   if test $CFG_OPENSSLAPI_MAJOR -eq 1
   then
      printf "%s" "API $CFG_OPENSSLAPI_MAJOR.$CFG_OPENSSLAPI_MINOR"
      printf "%s" "API $CFG_OPENSSLAPI_MAJOR.$CFG_OPENSSLAPI_MINOR" >>$CFG_LOG
   else
      printf "%s" "API $CFG_OPENSSLAPI_MAJOR"
      printf "%s" "API $CFG_OPENSSLAPI_MAJOR" >>$CFG_LOG
   fi
   # Check whether API is supported
   TMP=1;
   if test $CFG_OPENSSLAPI_MAJOR -lt 1; then TMP=0; fi
   if test $CFG_OPENSSLAPI_MAJOR -eq 2; then TMP=0; fi
   if test $CFG_OPENSSLAPI_MAJOR -eq 1; then
      if test $CFG_OPENSSLAPI_MINOR -gt 1; then TMP=0; fi
   fi
   if test $CFG_OPENSSLAPI_MAJOR -gt 3; then TMP=0; fi
   if test $TMP -eq 0
   then
      printf " (not supported)\n"
      printf "%s\n" " (not supported)" >>$CFG_LOG
   else
      printf "\n"
      printf "\n" >>$CFG_LOG
      OPENSSL_FOUND=1
   fi
fi


# ==============================================================================
# Create configuration section for Makefile
printf "===> Create configuration section for Makefile\n"


printf "%s\n" "Configuration date ... $CFG_DATE"

# Check SOURCE_DATE_EPOCH for reproducible builds
# https://reproducible-builds.org/specs/source-date-epoch/
printf "%s" "Check for SOURCE_DATE_EPOCH ... "
TMP=-1
set +u
if test "$SOURCE_DATE_EPOCH"
then
   TMP=$SOURCE_DATE_EPOCH
   if test $TMP -lt 0
   then
      printf "%s\n" "Invalid"
      printf "%s\n" "The value of SOURCE_DATE_EPOCH must not be negative!"
      return 1
   fi
   printf "%s\n" "$TMP"
   printf "%s\n" "Enable reproducible build"
else
   printf "%s\n" "Undefined"
   printf "%s\n" "Disable reproducible build"
fi
set -u

# Set CFG_DATE to time from SOURCE_DATE_EPOCH for reproducible builds
if test $TMP -ge 0
then
   # The examples from <https://reproducible-builds.org/docs/source-date-epoch/>
   # don't work with POSIX date => Format date with the POSIX shell (UTIL_SH).
   sde_format_date $SOURCE_DATE_EPOCH
   CFG_DATE=$SDE_DATE
fi


printf "%s\n" "# ==============================================================\
================" >>./$CFG_RULES
printf "%s\n#\n" \
    "# Configuration header created at $CFG_DATE by mkconfig script" \
    >>./$CFG_RULES
printf "%s\n\n" ".POSIX:" >>./$CFG_RULES

printf "%s\n" "Store build date ... $CFG_DATE"
printf "%s\n" "DATE=$(printf "%s\n" "$CFG_DATE" | $UTIL_SED -e "s/ .*//")" \
   >>./$CFG_RULES
printf "%s\n" "DATE_TIME=$(printf "%s\n" "$CFG_DATE" \
   | $UTIL_AWK '{ printf "%sT%sZ\n", $1, $2 }')" >>./$CFG_RULES
printf "%s\n" "Store installation prefix ... $CFG_PREFIX"
printf "%s\n" "PREFIX=$CFG_PREFIX" >>./$CFG_RULES
printf "%s\n" "Store target name ... $CFG_NAME"
printf "%s\n" "TARGET=$CFG_NAME" >>./$CFG_RULES
printf "%s\n" "Store version ... $CFG_VERSION"
printf "%s\n" "VERSION=$CFG_VERSION" >>./$CFG_RULES
printf "%s\n" "Store maintainer ... $CFG_MAINTAINER"
printf "%s\n" "MAINTAINER=$CFG_MAINTAINER" >>./$CFG_RULES

printf "\n" >>./$CFG_RULES

printf "%s\n" "Store shell ... $CFG_SHELL"
printf "%s\n" "SHELL=$CFG_SHELL" >>./$CFG_RULES

set +u
if test ! "$CC"
then
   CC=$($FLTK_CONFIG --cc 2>/dev/null)
fi
set -u
printf "%s\n" "Store C compiler ... $CC"
printf "%s\n" "CC=$CC" >>./$CFG_RULES

set +u
if test ! "$CXX"
then
   CXX=$($FLTK_CONFIG --cxx 2>/dev/null)
   # Workaround for bug in FLTK2 (reports C instead of C++ compiler)
   if test $CFG_FLTKAPI_MAJOR -eq 2
   then
      CXX=$(printf "%s\n" "$CXX" | $UTIL_SED -e "s/gcc/g++/")
      CXX=$(printf "%s\n" "$CXX" | $UTIL_SED -e "s/cc/c++/")
   fi
fi
set -u
printf "%s\n" "Store C++ compiler ... $CXX"
printf "%s\n" "CXX=$CXX" >>./$CFG_RULES
printf "%s" "Check whether C++ compiler is egcs ... "
set +e
TMP=$($CXX --version 2>/dev/null)
RES=$?
set -e
if test $RES -ne 0
then
   printf "No\n"
   TMP=""
else
   TMP=$(printf "%s" "$TMP" | $UTIL_HEAD -n 1 | $UTIL_SED -e "s/-.*//g")
   if test "egcs" != "$TMP"
   then
      printf "No\n"
      TMP=""
   else
      printf "Yes\n"
      printf "Warning: egcs lacks some required features, using workaround!\n"
      TMP="-I./egcs-fixes -DSSTREAM_INLINE --include ./egcs-fixes/libfixes.h"
   fi
fi

set +u
if test ! "$CPPFLAGS"
then
   CPPFLAGS="-I./include"
else
   CPPFLAGS="-I./include $CPPFLAGS"
fi
FLTK_OPTIM=$($FLTK_CONFIG --optim 2>/dev/null)
if test ! "$CFLAGS"
then
   CFLAGS="$FLTK_OPTIM $($FLTK_CONFIG --cflags 2>/dev/null)"
else
   CFLAGS="$FLTK_OPTIM $($FLTK_CONFIG --cflags 2>/dev/null) $CFLAGS"
fi
if test ! "$CXXFLAGS"
then
   CXXFLAGS="$FLTK_OPTIM $($FLTK_CONFIG --cxxflags 2>/dev/null)"
else
   CXXFLAGS="$FLTK_OPTIM $($FLTK_CONFIG --cxxflags 2>/dev/null) $CXXFLAGS"
fi
set -u
CFLAGS="$CPPFLAGS $CFLAGS"
# TMP contains additional flags used for egcs workaround
CXXFLAGS="$TMP $CPPFLAGS $CXXFLAGS"
printf "%s\n" "Store C compiler flags ... $CFLAGS"
printf "%s\n" "CFLAGS=$CFLAGS" >>./$CFG_RULES
printf "%s\n" "Store C++ compiler flags ... $CXXFLAGS"
printf "%s\n" "CXXFLAGS=$CXXFLAGS" >>./$CFG_RULES

set +u
if test ! "$LDFLAGS"
then
   LDFLAGS=""
fi
set -u
# 'CLDFLAGS' is used for tests only (linking C++ libs to C program will fail)
CLDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS $($FLTK_CONFIG --ldflags 2>/dev/null)"
printf "%s\n" "Store linker flags ... $LDFLAGS"
printf "%s\n" "LDFLAGS=$LDFLAGS" >>./$CFG_RULES

set +u
if test ! "$LIBS"
then
   LIBS=""
fi
set -u
if test $OPENSSL_FOUND -eq 1
then
   LIBS="$LIBS -lssl -lcrypto"
fi
. ./mksyslibs
if test "" != "$LIBS"
then
   printf "%s\n" "Store additional libraries ... $LIBS"
else
   printf "%s\n" "Store additional libraries ... OK"
fi
printf "%s\n" "LIBS=$LIBS" >>./$CFG_RULES

printf "\n" >>./$CFG_RULES

printf "Store C dependency command ... "
printf "%s\n" "CC_DEP_COMMAND=$CFG_CC_DEP_COMMAND" >>./$CFG_RULES
printf "OK\n"
printf "Store C++ dependency command ... "
printf "%s\n" "CXX_DEP_COMMAND=$CFG_CXX_DEP_COMMAND" >>./$CFG_RULES
printf "OK\n"

printf "\n" >>./$CFG_RULES

printf "Store utilities ... "
printf "%s\n" "UTIL_AWK=$UTIL_AWK" >>./$CFG_RULES
printf "%s\n" "UTIL_CAT=$UTIL_CAT" >>./$CFG_RULES
printf "%s\n" "UTIL_CHMOD=$UTIL_CHMOD" >>./$CFG_RULES
printf "%s\n" "UTIL_DATE=$UTIL_DATE" >>./$CFG_RULES
printf "%s\n" "UTIL_MKDIR=$UTIL_MKDIR" >>./$CFG_RULES
printf "%s\n" "UTIL_RM=$UTIL_RM" >>./$CFG_RULES
printf "%s\n" "UTIL_SED=$UTIL_SED" >>./$CFG_RULES
printf "%s\n" "UTIL_SLEEP=$UTIL_SLEEP" >>./$CFG_RULES
printf "%s\n" "UTIL_STRIP=$UTIL_STRIP" >>./$CFG_RULES
printf "%s\n" "UTIL_TOUCH=$UTIL_TOUCH" >>./$CFG_RULES
printf "OK\n"

printf "\n" >>./$CFG_RULES

printf "%s\n" "MAN_PATH=$CFG_MAN_PATH" >>./$CFG_RULES
printf "%s\n" "LICENSE_PATH=$CFG_LICENSE_PATH" >>./$CFG_RULES
printf "%s\n" "XDGD_PATH=$CFG_XDG_DESKTOP_PATH" >>./$CFG_RULES
printf "%s\n" "XDGI_PATH=$CFG_XDG_ICON_THEME_PATH" >>./$CFG_RULES
printf "Store pathname of list with installed files ... "
printf "%s\n" "FILE_LIST=$CFG_FILE_LIST" >>./$CFG_RULES
printf "%s\n" "$CFG_FILE_LIST"

printf "\n" >>./$CFG_RULES

printf "Store rule for first sublevel Makefile ... "
printf "# Rule to build first level Makefile\n" >>./$CFG_RULES
printf "%s\n" "build1.mk: mk/config.mk mk/prebuild.mk" >>./$CFG_RULES
printf "%s\n" '	$(UTIL_CAT) mk/config.mk mk/prebuild.mk >$@' \
   >>./$CFG_RULES
printf "OK\n"

printf "\n" >>./$CFG_RULES

printf "Store XDG file installation switching macro ... "
if test $CFG_XDG_DISABLE -ne 0
then
   printf "%s\n" "USE_XDG=0" >>./$CFG_RULES
else
   if test $CFG_NAME != "flnews"
   then
      # Matching XDG files must be created for different program name
      printf "%s\n" "USE_XDG=0" >>./$CFG_RULES
   else
      printf "%s\n" "USE_XDG=1" >>./$CFG_RULES
   fi
fi
printf "OK\n"

printf "\n" >>./$CFG_RULES

printf "Store NLS switching rule ... "
printf "# Rule to switch NLS usage\n" >>./$CFG_RULES
printf "nls/.nls_switch: mk/config.mk" >>./$CFG_RULES
printf "OK\n"


# ==============================================================================
# Check compilers
printf "===> Check compilers\n"


# Check C compiler
check_c_compiler


# Check C++ compiler
check_cxx_compiler


# ==============================================================================
# Create configuration header file
printf "===> Create configuration header file\n"


# Create configuration header file
printf "%s\n" "/* Created at $CFG_DATE by mkconfig script */" >>./$CFG_HEADER
printf "#ifndef CONFIG_H\n" >>./$CFG_HEADER
printf "#define CONFIG_H  1\n\n\n" >>./$CFG_HEADER

printf "%s\n" "Store program name ... $CFG_NAME"
printf "%s\n" "#define CFG_NAME  \"$CFG_NAME\"" >>./$CFG_HEADER

printf "%s\n" "Store program version ... $CFG_VERSION"
printf "%s\n" "#define CFG_VERSION  \"$CFG_VERSION\"" >>./$CFG_HEADER

printf "Determine operating system ... "
TMP=$($UTIL_UNAME -s)
TMP=$(printf "%s\n" "$TMP" | $UTIL_SED -e "s/Linux/GNU\/Linux/")
printf "%s\n" "#define CFG_OS  \"$TMP\"" >>./$CFG_HEADER
printf "%s\n" "$TMP"

printf "\n" >>./$CFG_HEADER

printf "%s\n" "Store modification flag ... $CFG_MODIFIED"
printf "%s\n" "#define CFG_MODIFIED  $CFG_MODIFIED" >>./$CFG_HEADER

printf "%s\n" "Store maintainer ... $CFG_MAINTAINER"
printf "%s\n" "#define CFG_MAINTAINER  \"$CFG_MAINTAINER\"" >>./$CFG_HEADER

printf "\n" >>./$CFG_HEADER

for HEADER in $CFG_C_HEADERS
do
   check_c_header $HEADER
done

for HEADER in $CFG_CXX_HEADERS
do
   check_cxx_header $HEADER
done

printf "\n" >>./$CFG_HEADER

# Memory debugging configuration (no official option, always disabled)
printf "%s\n" "#define CFG_USE_MEMDEBUG  0" >>./$CFG_HEADER

# Check POSIX.1 version
check_posix_version $CFG_POSIX
if test $POSIX_VERSION -gt 200809
then
   # POSIX version too new => Try newest supported version
   printf "Warning: POSIX version too new (trying POSIX.1-2008)!\n"
   POSIX_VERSION=200809
fi
printf "%s  %s\n" "#define CFG_USE_POSIX_API" "$POSIX_VERSION" >>./$CFG_HEADER

# Check POSIX.1c thread (THR) extension
check_posix_threads $CFG_THREADS || \
{
   # System reports POSIX.1c thread extension as not available
   if test $CFG_FORCE_THR -ne 0
   then
      printf "Warning: Trying forced use of THR extension on user request!\n"
      POSIX_THREADS=$CFG_THREADS
   else
      printf "Error: THR extension not found or not sufficient.\n"
      printf "Consider setting 'CFG_FORCE_THR' in configuration file\n"
      exit 1
   fi
}

# Check POSIX.1c thread-safe functions (TSF) option
check_posix_thread_safe_functions $CFG_THREAD_SAFE_FUNCTIONS || \
{
   # System reports POSIX.1c thread-safe functions option as not available
   if test $CFG_FORCE_TSF -ne 0
   then
      printf "Warning: Trying forced use of TSF option on user request!\n"
      POSIX_THREAD_SAFE_FUNCTIONS=$CFG_THREAD_SAFE_FUNCTIONS
   else
      printf "Error: TSF option not found or not sufficient.\n"
      printf "Consider setting 'CFG_FORCE_TSF' in configuration file\n"
      exit 1
   fi
}

# Check POSIX.1b realtime extension, timers (TMR) option
check_posix_tmr $CFG_TMR || \
{
   # System reports POSIX.1b realtime extension, timers option as not available
   if test $CFG_FORCE_TMR -ne 0
   then
      printf "Warning: Trying forced use of TMR option on user request!\n"
      POSIX_TMR=$CFG_TMR
   else
      printf "Error: TMR option not found or not sufficient.\n"
      printf "Consider setting 'CFG_FORCE_TMR' in configuration file\n"
      exit 1
   fi
}

# Check POSIX.1 IPv6 (IP6) option
check_posix_ipv6 $CFG_IP6 || \
{
   # System reports POSIX.1 IPv6 (IP6) option as not available
   if test $CFG_FORCE_IP6 -eq 0
   then
      printf "Warning: No IP6 option, some features will be disabled!\n"
   else
      printf "Warning: Trying forced use of IP6 option on user request!\n"
      POSIX_IP6=$CFG_IP6
   fi
}
if test ! "$POSIX_IP6"
then
   printf "%s\n" "#define CFG_USE_IP6  0" >>./$CFG_HEADER
else
   # We need at least POSIX.1-200112 for IPv6 support
   if test $POSIX_VERSION -ge 200112
   then
      printf "%s\n" "#define CFG_USE_IP6  1" >>./$CFG_HEADER
   else
      printf "Warning: IPv6 support disabled, POSIX version not sufficient!\n"
      printf "%s\n" "#define CFG_USE_IP6  0" >>./$CFG_HEADER
   fi
fi

# Check POSIX.2 C-language binding
check_posix_clb $CFG_CLB || \
{
   printf "Warning: POSIX.2 C-language binding not found or not sufficient.\n"
}
if test ! "$POSIX_CLB"
then
   printf "%s\n" "#define CFG_USE_CLB  0" >>./$CFG_HEADER
else
   printf "%s\n" "#define CFG_USE_CLB  1" >>./$CFG_HEADER
fi

# Check X/Open system interface (XSI) extension version
check_xopen_version $CFG_XOPEN || \
{
   # System reports X/Open XSI extension as not available
   if test $CFG_FORCE_XSI -ne 0
   then
      printf "Warning: Trying forced use of XSI extension on user request!\n"
      XOPEN_VERSION=$CFG_XOPEN
   else
      printf "Warning: No XSI extension, some features will be disabled!\n"
   fi
}
if test ! "$XOPEN_VERSION"
then
   printf "%s\n" "#define CFG_USE_XSI  0" >>./$CFG_HEADER
else
   printf "%s\n" "#define CFG_USE_XSI  1" >>./$CFG_HEADER
fi

# Check POSIX.1b realtime extension, file synchronization (FSC) option
check_posix_fsc $CFG_FSC || \
{
   printf "Warning: No FSC option, some features will be disabled!\n"
}
if test ! "$POSIX_FSC"
then
   printf "%s\n" "#define CFG_USE_FSC  0" >>./$CFG_HEADER
else
   # FSC option is only usable with at least POSIX.1-2001 or XSI extension
   TMP=0
   if test "$XOPEN_VERSION"
   then
      TMP=1
   fi
   if test $POSIX_VERSION -ge 200112
   then
      TMP=1
   fi
   if test $TMP -eq 0
   then
      printf "Warning: FSC option not usable, some features will be disabled!\n"
   fi
   printf "%s\n" "#define CFG_USE_FSC  $TMP" >>./$CFG_HEADER
fi

# Check for zlib availability and version
check_zlib_version $CFG_ZLIB || \
{
   printf "Warning: zlib not available or too old.\n"
}
if test ! "$ZLIB_VERSION"
then
   printf "%s\n" "#define CFG_USE_ZLIB  0" >>./$CFG_HEADER
else
   if test $CFG_CMPR_DISABLE -ne 0
   then
      printf "Note: Compression support disabled in configuration file.\n"
      ZLIB_VERSION=""
      printf "%s\n" "#define CFG_USE_ZLIB  0" >>./$CFG_HEADER
   else
      printf "%s\n" "#define CFG_USE_ZLIB  1" >>./$CFG_HEADER
   fi
fi

# Store TCP connection timeout configuration
printf "Store TCP connection timeout ... "
if test $CFG_TCP_CONNECT_TIMEOUT -gt 0
then
   printf "$CFG_TCP_CONNECT_TIMEOUT seconds\n"
   printf "%s\n" "#define CFG_USE_CONNECT_TIMEOUT  $CFG_TCP_CONNECT_TIMEOUT" \
      >>./$CFG_HEADER
else
   printf "0 (OS default)\n"
   printf "%s\n" "#define CFG_USE_CONNECT_TIMEOUT  0" >>./$CFG_HEADER
fi

# Store OpenSSL flag
printf "Store OpenSSL availability flag ... "
if test $OPENSSL_FOUND -ne 1
then
   printf "%s\n" "#define CFG_USE_TLS  0" >>./$CFG_HEADER
   printf "OK\n"
else
   printf "%s\n" "#define CFG_USE_TLS  1" >>./$CFG_HEADER
   printf "OK\n"
   printf "Store OpenSSL API availability flags ... "
   if test $CFG_OPENSSLAPI_MAJOR -eq 1
   then
      printf "%s\n" "#define CFG_USE_OPENSSL_API_3  0" >>./$CFG_HEADER
      if test $CFG_OPENSSLAPI_MINOR -lt 1
      then
         printf "%s\n" "#define CFG_USE_OPENSSL_API_1_1  0" >>./$CFG_HEADER
      else
         printf "%s\n" "#define CFG_USE_OPENSSL_API_1_1  1" >>./$CFG_HEADER
      fi
      if test $LIBRESSL_FLAG -eq 0
      then
         printf "%s\n" "#define CFG_USE_LIBRESSL  0" >>./$CFG_HEADER
         printf "%s\n" "#define CFG_USE_LIBRESSL_API_3_5  0" >>./$CFG_HEADER
      else
         printf "%s\n" "#define CFG_USE_LIBRESSL  1" >>./$CFG_HEADER
         if test $LIBRESSL_3_5_FLAG -eq 0
         then
            printf "%s\n" "#define CFG_USE_LIBRESSL_API_3_5  0" >>./$CFG_HEADER
         else
            printf "%s\n" "#define CFG_USE_LIBRESSL_API_3_5  1" >>./$CFG_HEADER
         fi
      fi
   else
      printf "%s\n" "#define CFG_USE_OPENSSL_API_3  1" >>./$CFG_HEADER
      printf "%s\n" "#define CFG_USE_OPENSSL_API_1_1  1" >>./$CFG_HEADER
      printf "%s\n" "#define CFG_USE_LIBRESSL  0" >>./$CFG_HEADER
   fi
   printf "OK\n"
fi

printf "\n" >>./$CFG_HEADER

# Get unsigned 16 bit and 32bit integer data types
get_unsigned_16bit_type
printf "%s\n" "#define CFG_UINT16_TYPE  $UINT16_TYPE" >>./$CFG_HEADER
get_unsigned_32bit_type
printf "%s\n" "#define CFG_UINT32_TYPE  $UINT32_TYPE" >>./$CFG_HEADER

printf "\n" >>./$CFG_HEADER

# Store path for license file
printf "%s\n" "Store path for license file ... $CFG_LICENSE_PATH"
printf "%s\n" "#define CFG_LICENSE_PATH  \"$CFG_LICENSE_PATH\"" >>./$CFG_HEADER

printf "\n" >>./$CFG_HEADER

# Store double buffering configuration
printf "Check for double buffering ... "
if test $CFG_DB_DISABLE -ne 0
then
   printf "%s\n" "#define CFG_DB_DISABLE  1" >>./$CFG_HEADER
   printf "Disabled\n"
else
   printf "%s\n" "#define CFG_DB_DISABLE  0" >>./$CFG_HEADER
   printf "Enabled if available\n"
fi

#
printf "Check for Cocoa system menubar option ... "
if test $CFG_COCOA_SYS_MENUBAR -ne 0
then
   # Use only with FLTK 1.4 (see FLTK STR #3317)
   # It must work with a FLTK 1.3.0 shared library
   if test $CFG_FLTKAPI_MAJOR -eq 1
   then
      if test $CFG_FLTKAPI_MINOR -ge 4
      then
         printf "%s\n" "#define CFG_COCOA_SYS_MENUBAR  1" >>./$CFG_HEADER
      fi
   fi
   printf "Enabled if available\n"
else
   printf "%s\n" "#define CFG_COCOA_SYS_MENUBAR  0" >>./$CFG_HEADER
   printf "Disabled\n"
fi

# Store compression configuration
printf "Check for compression ... "
if test $CFG_CMPR_DISABLE -ne 0
then
   printf "%s\n" "#define CFG_CMPR_DISABLE  1" >>./$CFG_HEADER
   printf "Disabled\n"
else
   printf "%s\n" "#define CFG_CMPR_DISABLE  0" >>./$CFG_HEADER
   printf "Enabled if available\n"
fi

# Store unencrypted authentication configuration
printf "Check for unencrypted authentication ... "
if test $CFG_NNTP_AUTH_UNENCRYPTED -ne 0
then
   printf "%s\n" "#define CFG_NNTP_AUTH_UNENCRYPTED  1" >>./$CFG_HEADER
   printf "Enabled\n"
else
   printf "%s\n" "#define CFG_NNTP_AUTH_UNENCRYPTED  0" >>./$CFG_HEADER
   printf "Disabled\n"
fi

# Store TLS configuration for security vulnerability checks
printf "Check for TLS warnings ... "
if test $CFG_TLS_WARNING_DISABLE -ne 0
then
   printf "%s\n" "#define CFG_TLS_WARNING_DISABLE  1" >>./$CFG_HEADER
   printf "Disabled\n"
else
   printf "%s\n" "#define CFG_TLS_WARNING_DISABLE  0" >>./$CFG_HEADER
   printf "Enabled\n"
fi

# Store TLS configuration for usage of CRLs
printf "Check for TLS usage of CRLs ... "
if test $CFG_TLS_CRLS_DISABLE -ne 0
then
   printf "%s\n" "#define CFG_TLS_CRLS_DISABLE  1" >>./$CFG_HEADER
   printf "Disabled\n"
else
   # We need at least POSIX.1-200112 for CRL checks
   if test $POSIX_VERSION -ge 200112
   then
      printf "%s\n" "#define CFG_TLS_CRLS_DISABLE  0" >>./$CFG_HEADER
      printf "Enabled\n"
   else
      # XSI extension can be used too
      if test "$XOPEN_VERSION"
      then
         printf "%s\n" "#define CFG_TLS_CRLS_DISABLE  0" >>./$CFG_HEADER
         printf "Enabled\n"
      else
         printf "%s\n" "#define CFG_TLS_CRLS_DISABLE  1" >>./$CFG_HEADER
         printf "Disabled (POSIX.1-2001 or XSI extension required)\n"
      fi
   fi
fi

# Check whether NLS is supported and can be used
USE_NLS=0
printf "Check for NLS ... "
if test ! "$XOPEN_VERSION"
then
   printf "%s\n" "Not supported (XSI extension not available)"
elif test $CFG_NLS_DISABLE -ne 0
then
   printf "%s\n" "#define CFG_NLS_DISABLE  1" >>./$CFG_HEADER
   printf "Disabled\n"
else
   USE_NLS=1
   # Check whether gencat utility is present
   UTIL_GENCAT="gencat"
   $UTIL_COMMAND "$UTIL_GENCAT" >/dev/null 2>&1 || \
   {
      USE_NLS=0
      printf "%s\n" "#define CFG_NLS_DISABLE  1" >>./$CFG_HEADER
      printf "%s\n" "Not supported ($UTIL_GENCAT not available)"
   }
   if test $USE_NLS -eq 1
   then
      printf "%s\n" "#define CFG_NLS_DISABLE  0" >>./$CFG_HEADER
      printf "Enabled\n"
   fi
fi
# Store NLS macros
printf "Store NLS macros ... "
printf "%s\n" "#define SC(s)  NLS_COMMENT(s)" >>./$CFG_HEADER
printf "%s\n" "#define S(s)  NLS_STRING(s)" >>./$CFG_HEADER
printf "OK\n"

# Store NLS catalog path
if test $USE_NLS -eq 1
then
   printf "%s\n" "Store NLS catalog path ... $CFG_NLS_PATH"
   printf "%s\n" "#define CFG_NLS_PATH  \"$CFG_NLS_PATH\"" >>./$CFG_HEADER
fi

# Determine locale to use for 'gencat' utility
if test $USE_NLS -eq 1
then
   printf "Determine locale to use for gencat ... "
   # Default to POSIX, most old systems don't check encoding and this
   # nevertheless works with our UTF-8 encoded data
   USE_LOCALE_GENCAT="POSIX"
   # Newer, more pedantic systems should have UTF-8 or ISO 8859 locales
   # Check whether locale utility is present
   $UTIL_COMMAND locale >/dev/null 2>&1 && \
   {
      # Yes => Search for an UTF-8 locale
      TMP=$(locale -a | $UTIL_GREP -i 'UTF[-]\{0,1\}8' | $UTIL_HEAD -n 1)
      if test "" != "$TMP"
      then
         USE_LOCALE_GENCAT=$TMP
      else
         # No UTF-8 locale found, search for ISO 8859 locale
         TMP=$(locale -a | $UTIL_GREP 8859 | $UTIL_HEAD -n 1)
         if test "" != "$TMP"
         then
            USE_LOCALE_GENCAT=$TMP
         fi
      fi
   }
   printf "%s\n" "$USE_LOCALE_GENCAT"
fi

# End of configuration header
printf "\n\n#endif  /* CONFIG_H */\n" >>./$CFG_HEADER
printf "\n/* EOF */\n" >>./$CFG_HEADER


# ==============================================================================
# Complete NLS switching rule of Makefile


if test $USE_NLS -eq 1
then
   # Complete NLS switching rule
   printf " nls/.nls_support\n" >>./$CFG_RULES
   printf "%s\n" '	$(UTIL_SLEEP) 1' >>./$CFG_RULES
   printf "%s\n\n" '	$(UTIL_TOUCH) $@' >>./$CFG_RULES
   # Add gencat utility (and the locale to use for it)
   printf "%s\n" "UTIL_GENCAT=$UTIL_GENCAT" >>./$CFG_RULES
   printf "%s\n" "LOCALE_GENCAT=$USE_LOCALE_GENCAT" >>./$CFG_RULES
   # Add NLS catalog path
   printf "%s\n" "NLS_PATH=$CFG_NLS_PATH" >>./$CFG_RULES
   # Add NLS indicator
   printf "%s\n" "USE_NLS=1" >>./$CFG_RULES
else
   # Complete NLS switching rule
   printf "\n" >>./$CFG_RULES
   printf "%s\n" '	-$(UTIL_RM) -f nls/.nls_support' >>./$CFG_RULES
   printf "%s\n" '	$(UTIL_SLEEP) 1' >>./$CFG_RULES
   printf "%s\n\n" '	$(UTIL_TOUCH) $@' >>./$CFG_RULES
   # Add NLS indicator
   printf "%s\n" "USE_NLS=0" >>./$CFG_RULES
fi
printf "\n\n" >>./$CFG_RULES


# ==============================================================================
# Add missing optional libraries
printf "===> Update additional libraries\n"


if test "$ZLIB_VERSION"
then
   LIBS_NEW="$LIBS"

   LIBS_ZLIB="-lz"
   printf "%s\n" "For zlib ... $LIBS_ZLIB"
   LIBS_NEW="$LIBS_NEW $LIBS_ZLIB"
   $UTIL_CAT ./$CFG_RULES >./$CFG_RULES_TMP
   $UTIL_SED "s/^LIBS=.*/LIBS=$LIBS_NEW/1" ./$CFG_RULES_TMP >./$CFG_RULES
   $UTIL_RM ./$CFG_RULES_TMP

   printf "%s\n" "Complete new list ... $LIBS_NEW"
else
   printf "%s\n" "Nothing to do"
fi


# ==============================================================================
# Miscellaneous additional checks
printf "===> Miscellaneous additional checks\n"


# Verify that 'SIZE_MAX' is at least 'INT_MAX'
check_size_max


# Verify that pid_t is not larger than long int
check_pid_size


# Check maximum line and argument length (only POSIX compliance is checked)
check_line_and_argument_length


# ==============================================================================
# Success, mark configuration valid
printf "===> Store result\n"


printf "Set valid flag ... "
$UTIL_TOUCH  "./$CFG_OK"
printf "OK\n"
printf "\n%s\n" "Configuration successfully completed." >>$CFG_LOG
printf "%s\n" "Configuration successfully completed."


# EOF
