#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#

ZEPHYR_BASE=$( builtin cd "$( dirname "$DIR" )" && pwd ${PWD_OPT})
DIR="$(dirname $(readlink -f $0))/.."
SPATCH="`which ${SPATCH:=spatch}`"

if [ ! -x "$SPATCH" ]; then
    echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
    exit 1
fi

VERBOSE=0
usage="Usage: ./scripts/coccicheck [OPTIONS]... [DIRECTORY|FILE]...

OPTIONS:
-------

-m= , --mode=		specify the mode use {report, patch, org, context, chain}
-v= , --verbose=	enable verbose output {1}
-j= , --jobs=		number of jobs to use {0 - `nproc`}
-c= , --cocci=		specify cocci script to use
-d= , --debug=		specify file to store debug log
-f= , --sp-flag=	pass additional flag to spatch
-h  , --help		display help and exit

Default values if any OPTION is not supplied:
--------------------------------------------

mode	= report
verbose = 0 (disabled)
jobs	= maximum jobs available on the machine
cocci	= all cocci scripts available at scripts/coccinelle/*

If no [DIRECTORY|FILE] is supplied, entire codebase is processed.

For detailed documentation refer: doc/application/coccinelle.rst"

for i in "$@"
do
	case $i in
		-m=*|--mode=*)
			MODE="${i#*=}"
			shift # past argument=value
			;;
		-v=*|--verbose=*)
			VERBOSE="${i#*=}"
			shift # past argument=value
			;;
		-j=*|--jobs=*)
			J="${i#*=}"
			shift
			;;
		-c=*|--cocci=*)
			COCCI="${i#*=}"
			shift
			;;
		-d=*|--debug=*)
			DEBUG_FILE="${i#*=}"
			shift
			;;
		-f=*|--sp-flag=*)
			SPFLAGS="${i#*=}"
			shift
			;;
		-h|--help)
			echo "$usage"
			exit 1
			;;
		*)
			FILE="${i#*=}"
			if [ ! -e "$FILE" ]; then
				echo "unknown option: '${i#*=}'"
				echo "$usage"
				exit 2
			fi
			;;
	esac
done

FLAGS="--very-quiet"

if [ "$FILE" = "" ] ; then
	OPTIONS="--dir $ZEPHYR_BASE"
else
	OPTIONS="--dir $FILE"
fi

if [ -z "$J" ]; then
	NPROC=$(getconf _NPROCESSORS_ONLN)
else
	NPROC="$J"
fi

if [ "$FILE" != "" ] ; then
    OPTIONS="--patch $ZEPHYR_BASE $OPTIONS"
fi

if [ "$NPROC" != "1" ]; then
	# Using 0 should work as well, refer to _SC_NPROCESSORS_ONLN use on
	# https://github.com/rdicosmo/parmap/blob/master/setcore_stubs.c
	OPTIONS="$OPTIONS --jobs $NPROC --chunksize 1"
fi

if [ "$MODE" = "" ] ; then
	echo 'You have not explicitly specified the mode to use. Using default "report" mode.'
	echo 'Available modes are the following: 'patch', 'report', 'context', 'org''
	echo 'You can specify the mode with "./scripts/coccicheck --mode=<mode>"'
	echo 'Note however that some modes are not implemented by some semantic patches.'
    MODE="report"
fi

if [ "$MODE" = "chain" ] ; then
	echo 'You have selected the "chain" mode.'
	echo 'All available modes will be tried (in that order): patch, report, context, org'
elif [ "$MODE" = "report" -o "$MODE" = "org" ] ; then
    FLAGS="--no-show-diff $FLAGS"
fi

    echo ''
    echo 'Please check for false positives in the output before submitting a patch.'
    echo 'When using "patch" mode, carefully review the patch before submitting it.'
    echo ''

run_cmd_parmap() {
	if [ $VERBOSE -ne 0 ] ; then
		echo "Running ($NPROC in parallel): $@"
	fi
	echo $@ >>$DEBUG_FILE
	$@ 2>>$DEBUG_FILE
	err=$?
	if [[ $err -ne 0 ]]; then
		echo "coccicheck failed"
		exit $err
	fi
}

# You can override heuristics with SPFLAGS, these must always go last
OPTIONS="$OPTIONS $SPFLAGS"

coccinelle () {
    COCCI="$1"
    OPT=`grep "Options:" $COCCI | cut -d':' -f2`
    VIRTUAL=`grep "virtual" $COCCI | cut -d' ' -f2`

    if [[ $VIRTUAL = "" ]]; then
	    echo "No available modes found in \"$COCCI\" script."
	    echo "Consider adding virtual rules to the script."
	    exit 1
    elif [[ $VIRTUAL != *"$MODE"* ]]; then
	    echo "Invalid mode \"$MODE\" supplied!"
	    echo "Available modes for \"`basename $COCCI`\" are: "$VIRTUAL""

	    if [[ $VIRTUAL == *report* ]]; then
		    MODE=report
	    elif [[ $VIRTUAL == *context* ]]; then
		    MODE=context
	    elif [[ $VIRTUAL == *patch* ]]; then
		    MODE=patch
	    else
		    MODE=org
	    fi
	    echo "Using random available mode: \"$MODE\""
	    echo ''
    fi

    if [ $VERBOSE -ne 0 ] ; then

	FILE=${COCCI#$ZEPHYR_BASE/}

	echo "Processing `basename $COCCI`"
	echo "with option(s) \"$OPT\""
	echo ''
	echo 'Message example to submit a patch:'

	sed -ne 's|^///||p' $COCCI

	if [ "$MODE" = "patch" ] ; then
	    echo ' The semantic patch that makes this change is available'
	elif [ "$MODE" = "report" ] ; then
	    echo ' The semantic patch that makes this report is available'
	elif [ "$MODE" = "context" ] ; then
	    echo ' The semantic patch that spots this code is available'
	elif [ "$MODE" = "org" ] ; then
	    echo ' The semantic patch that makes this Org report is available'
	else
	    echo ' The semantic patch that makes this output is available'
	fi
	echo " in $FILE."
	echo ''
	echo ' More information about semantic patching is available at'
	echo ' http://coccinelle.lip6.fr/'
	echo ''

	if [ "`sed -ne 's|^//#||p' $COCCI`" ] ; then
	    echo 'Semantic patch information:'
	    sed -ne 's|^//#||p' $COCCI
	    echo ''
	fi
    fi

    if [ "$MODE" = "chain" ] ; then
	run_cmd_parmap $SPATCH -D patch   \
		$FLAGS --cocci-file $COCCI $OPT $OPTIONS               || \
	run_cmd_parmap $SPATCH -D report  \
		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || \
	run_cmd_parmap $SPATCH -D context \
		$FLAGS --cocci-file $COCCI $OPT $OPTIONS               || \
	run_cmd_parmap $SPATCH -D org     \
		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || exit 1
    elif [ "$MODE" = "rep+ctxt" ] ; then
	run_cmd_parmap $SPATCH -D report  \
		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff && \
	run_cmd_parmap $SPATCH -D context \
		$FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1
    else
	run_cmd_parmap $SPATCH -D $MODE   $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1
    fi

    MODE=report
}

if [ "$DEBUG_FILE" != "/dev/null" -a "$DEBUG_FILE" != "" ]; then
	if [ -f $DEBUG_FILE ]; then
		echo "Debug file \"$DEBUG_FILE\" exists, bailing ..."
		exit
	fi
else
	DEBUG_FILE="/dev/null"
fi

if [ "$COCCI" = "" ] ; then
    for f in `find $ZEPHYR_BASE/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do
	coccinelle $f
	echo '-------------------------------------------------------------------------'
	echo ''
    done
else
    coccinelle $COCCI
fi
