1*53ee8cc1Swenshuai.xi#!/bin/sh 2*53ee8cc1Swenshuai.xi 3*53ee8cc1Swenshuai.xiSPATCH="`which ${SPATCH:=spatch}`" 4*53ee8cc1Swenshuai.xi 5*53ee8cc1Swenshuai.xiif [ "$C" = "1" -o "$C" = "2" ]; then 6*53ee8cc1Swenshuai.xi ONLINE=1 7*53ee8cc1Swenshuai.xi 8*53ee8cc1Swenshuai.xi# This requires Coccinelle >= 0.2.3 9*53ee8cc1Swenshuai.xi# FLAGS="-ignore_unknown_options -very_quiet" 10*53ee8cc1Swenshuai.xi# OPTIONS=$* 11*53ee8cc1Swenshuai.xi 12*53ee8cc1Swenshuai.xi# Workaround for Coccinelle < 0.2.3 13*53ee8cc1Swenshuai.xi FLAGS="-I $srctree/include -very_quiet" 14*53ee8cc1Swenshuai.xi shift $(( $# - 1 )) 15*53ee8cc1Swenshuai.xi OPTIONS=$1 16*53ee8cc1Swenshuai.xielse 17*53ee8cc1Swenshuai.xi ONLINE=0 18*53ee8cc1Swenshuai.xi FLAGS="-very_quiet" 19*53ee8cc1Swenshuai.xi OPTIONS="-dir $srctree" 20*53ee8cc1Swenshuai.xifi 21*53ee8cc1Swenshuai.xi 22*53ee8cc1Swenshuai.xiif [ ! -x "$SPATCH" ]; then 23*53ee8cc1Swenshuai.xi echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/' 24*53ee8cc1Swenshuai.xi exit 1 25*53ee8cc1Swenshuai.xifi 26*53ee8cc1Swenshuai.xi 27*53ee8cc1Swenshuai.xiif [ "$MODE" = "" ] ; then 28*53ee8cc1Swenshuai.xi if [ "$ONLINE" = "0" ] ; then 29*53ee8cc1Swenshuai.xi echo 'You have not explicitly specified the mode to use. Using default "chain" mode.' 30*53ee8cc1Swenshuai.xi echo 'All available modes will be tried (in that order): patch, report, context, org' 31*53ee8cc1Swenshuai.xi echo 'You can specify the mode with "make coccicheck MODE=<mode>"' 32*53ee8cc1Swenshuai.xi fi 33*53ee8cc1Swenshuai.xi MODE="chain" 34*53ee8cc1Swenshuai.xielif [ "$MODE" = "report" -o "$MODE" = "org" ] ; then 35*53ee8cc1Swenshuai.xi FLAGS="$FLAGS -no_show_diff" 36*53ee8cc1Swenshuai.xifi 37*53ee8cc1Swenshuai.xi 38*53ee8cc1Swenshuai.xiif [ "$ONLINE" = "0" ] ; then 39*53ee8cc1Swenshuai.xi echo '' 40*53ee8cc1Swenshuai.xi echo 'Please check for false positives in the output before submitting a patch.' 41*53ee8cc1Swenshuai.xi echo 'When using "patch" mode, carefully review the patch before submitting it.' 42*53ee8cc1Swenshuai.xi echo '' 43*53ee8cc1Swenshuai.xifi 44*53ee8cc1Swenshuai.xi 45*53ee8cc1Swenshuai.xicoccinelle () { 46*53ee8cc1Swenshuai.xi COCCI="$1" 47*53ee8cc1Swenshuai.xi 48*53ee8cc1Swenshuai.xi OPT=`grep "Option" $COCCI | cut -d':' -f2` 49*53ee8cc1Swenshuai.xi 50*53ee8cc1Swenshuai.xi# The option '-parse_cocci' can be used to syntactically check the SmPL files. 51*53ee8cc1Swenshuai.xi# 52*53ee8cc1Swenshuai.xi# $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null 53*53ee8cc1Swenshuai.xi 54*53ee8cc1Swenshuai.xi if [ "$ONLINE" = "0" ] ; then 55*53ee8cc1Swenshuai.xi 56*53ee8cc1Swenshuai.xi FILE=`echo $COCCI | sed "s|$srctree/||"` 57*53ee8cc1Swenshuai.xi 58*53ee8cc1Swenshuai.xi echo "Processing `basename $COCCI`" 59*53ee8cc1Swenshuai.xi echo "with option(s) \"$OPT\"" 60*53ee8cc1Swenshuai.xi echo '' 61*53ee8cc1Swenshuai.xi echo 'Message example to submit a patch:' 62*53ee8cc1Swenshuai.xi 63*53ee8cc1Swenshuai.xi sed -ne 's|^///||p' $COCCI 64*53ee8cc1Swenshuai.xi 65*53ee8cc1Swenshuai.xi if [ "$MODE" = "patch" ] ; then 66*53ee8cc1Swenshuai.xi echo ' The semantic patch that makes this change is available' 67*53ee8cc1Swenshuai.xi elif [ "$MODE" = "report" ] ; then 68*53ee8cc1Swenshuai.xi echo ' The semantic patch that makes this report is available' 69*53ee8cc1Swenshuai.xi elif [ "$MODE" = "context" ] ; then 70*53ee8cc1Swenshuai.xi echo ' The semantic patch that spots this code is available' 71*53ee8cc1Swenshuai.xi elif [ "$MODE" = "org" ] ; then 72*53ee8cc1Swenshuai.xi echo ' The semantic patch that makes this Org report is available' 73*53ee8cc1Swenshuai.xi else 74*53ee8cc1Swenshuai.xi echo ' The semantic patch that makes this output is available' 75*53ee8cc1Swenshuai.xi fi 76*53ee8cc1Swenshuai.xi echo " in $FILE." 77*53ee8cc1Swenshuai.xi echo '' 78*53ee8cc1Swenshuai.xi echo ' More information about semantic patching is available at' 79*53ee8cc1Swenshuai.xi echo ' http://coccinelle.lip6.fr/' 80*53ee8cc1Swenshuai.xi echo '' 81*53ee8cc1Swenshuai.xi 82*53ee8cc1Swenshuai.xi if [ "`sed -ne 's|^//#||p' $COCCI`" ] ; then 83*53ee8cc1Swenshuai.xi echo 'Semantic patch information:' 84*53ee8cc1Swenshuai.xi sed -ne 's|^//#||p' $COCCI 85*53ee8cc1Swenshuai.xi echo '' 86*53ee8cc1Swenshuai.xi fi 87*53ee8cc1Swenshuai.xi fi 88*53ee8cc1Swenshuai.xi 89*53ee8cc1Swenshuai.xi if [ "$MODE" = "chain" ] ; then 90*53ee8cc1Swenshuai.xi $SPATCH -D patch $FLAGS -sp_file $COCCI $OPT $OPTIONS || \ 91*53ee8cc1Swenshuai.xi $SPATCH -D report $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || \ 92*53ee8cc1Swenshuai.xi $SPATCH -D context $FLAGS -sp_file $COCCI $OPT $OPTIONS || \ 93*53ee8cc1Swenshuai.xi $SPATCH -D org $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || exit 1 94*53ee8cc1Swenshuai.xi else 95*53ee8cc1Swenshuai.xi $SPATCH -D $MODE $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1 96*53ee8cc1Swenshuai.xi fi 97*53ee8cc1Swenshuai.xi 98*53ee8cc1Swenshuai.xi} 99*53ee8cc1Swenshuai.xi 100*53ee8cc1Swenshuai.xiif [ "$COCCI" = "" ] ; then 101*53ee8cc1Swenshuai.xi for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do 102*53ee8cc1Swenshuai.xi coccinelle $f 103*53ee8cc1Swenshuai.xi done 104*53ee8cc1Swenshuai.xielse 105*53ee8cc1Swenshuai.xi coccinelle $COCCI 106*53ee8cc1Swenshuai.xifi 107