#!/bin/sh
# $Id: gcc-stricter,v 1.25 2025/07/20 19:47:10 tom Exp $
#
# _CONST_X_STRING is my own ifdef to X11/Intrinsic.h, to make
#       typedef const char *String;
# Doing that will help me make the "const" strings in xterm, xvile match with X.
#
# I also changed X11/XResource.h to use _Xconst in XrmOptionDescRec.
#
OPTS=
 
: ${ACTUAL_GCC:=gcc}
case "$ACTUAL_GCC" in
gcc-[ceins]*)
        ACTUAL_GCC=gcc
        ;;
esac
 
NEXT_STAGE=gcc-strict
case "$*" in
*-E*|*--version*)
        NEXT_STAGE=$ACTUAL_GCC
        ;;
*)
VERS=`$ACTUAL_GCC --version 2>/dev/null | \
head -n 1 | \
sed     -e 's/([^)][^)]*)//g' \
        -e 's/[[:space:]]*$//' \
        -e 's/[[:space:]]\{1,\}[[:digit:]]\{8,8\}$//' \
        -e 's/^.*[[:space:]]//'`
MAIN=`echo "$VERS" | sed -e 's/\..*//'`
 
# Not useful:
#       -Wc90-c99-compat unnecessarily reminds about boolean type
#       -Wformat=2
#       -Wmissing-format-attribute
#       -Wsuggest-attribute=format does not work for va_list parameter
# Possibly useful:
#       OPTS="$OPTS -Wsuggest-attribute=const"
#       OPTS="$OPTS -Wsuggest-attribute=pure"
 
case x$VERS in
x[1-4][0-9].[0-9]*|x[5-9].[0-9]*.*[0-9])
        OPTS="$OPTS -Wdeclaration-after-statement"
        OPTS="$OPTS -Werror=format-security"
        OPTS="$OPTS -Wformat=1"
        OPTS="$OPTS -Wmissing-noreturn"
        OPTS="$OPTS -Wshadow"
        OPTS="$OPTS -fstack-protector-strong"
        if [ $MAIN -ge 10 ]
        then
                OPTS="$OPTS -Walloc-zero"
                OPTS="$OPTS -Wduplicated-branches"
                OPTS="$OPTS -Wduplicated-cond"
                OPTS="$OPTS -Wformat-truncation=2"
        fi
        if [ $MAIN -gt 14 ]
        then
                OPTS="$OPTS -Wdeprecated-non-prototype"
                OPTS="$OPTS -Wmissing-parameter-name"
                OPTS="$OPTS -Wtrailing-whitespace"
                OPTS="$OPTS -Wunterminated-string-initialization"
                OPTS="$OPTS -Wzero-as-null-pointer-constant"
        fi
        if [ $MAIN -ge 14 ]
        then
                OPTS="$OPTS -Walloc-size"
                OPTS="$OPTS -Wcalloc-transposed-args"
        fi
        if [ $MAIN -ge 14 ]
        then
                OPTS="$OPTS -std=c2x"
        elif [ $MAIN -ge 12 ]
        then
                OPTS="$OPTS -std=c11"
        elif [ $MAIN -ge 9 ]
        then
                OPTS="$OPTS -Wlogical-op"
                OPTS="$OPTS -Wsuggest-attribute=malloc"
                OPTS="$OPTS -Wsuggest-attribute=noreturn"
        fi
        case x`partition` in
        x*debian*)
                OPTS="$OPTS -fsanitize=undefined"
                ;;
        esac
        ;;
x)
        $ACTUAL_GCC --version
        exit 1
        ;;
esac
 
case "$*" in
*-D_FORTIFY_SOURCE=*)
        ;;
*)
        OPTS="$OPTS -D_FORTIFY_SOURCE=2"
        ;;
esac
;;
esac
 
exec $NEXT_STAGE \
        -O2 \
        -D_CONST_X_STRING \
        $OPTS "$@"