Browse Source

Add a "myccoci.sh" script, similar to coccicheck.

Cyril Roelandt 13 years ago
parent
commit
2bd92a2fbc
1 changed files with 148 additions and 0 deletions
  1. 148 0
      tools/dev/mycocci.sh

+ 148 - 0
tools/dev/mycocci.sh

@@ -0,0 +1,148 @@
+#/bin/bash
+
+# StarPU --- Runtime system for heterogeneous multicore architectures.
+#
+# Copyright (C) 2012  inria
+#
+# StarPU is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or (at
+# your option) any later version.
+#
+# StarPU is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See the GNU Lesser General Public License in COPYING.LGPL for more details.
+
+mode="chain" # By default, let's do everything !
+results="./results" # TODO Add an option for this
+scripts_dir=
+target=
+spatch=`which spatch`
+
+if [ $spatch = "" ]
+then
+	echo "Could not find spatch."
+	exit 1;
+fi
+
+delete_if_empty()
+{
+	test -s $1 || rm $1
+}
+
+create_directories()
+{
+	if [ $1 == "chain" ]
+	then
+		# XXX mkdir -p ${results}/{context,org,patch,report} ?
+		mkdir -p ${results}/context
+		mkdir -p ${results}/org
+		mkdir -p ${results}/patch
+		mkdir -p ${results}/report
+	else
+		mkdir -p ${results}/$1
+	fi
+}
+
+run_script()
+{
+	script=$1
+	mode=$2
+
+	output_file=`basename ${script}`
+	output_file=${results}/${mode}/${output_file%cocci}${mode}
+	error_file=${output_file%${mode}}err
+
+	options="-very_quiet"
+
+	echo "Running ${script} with mode ${mode}."
+	# Seems like we do not need to specify -dir.
+	# XXX Try to use -o
+	$spatch $script $target -D $mode ${options} > ${output_file} 2>${error_file}
+
+	# Nobody cares about empty files
+	delete_if_empty ${output_file}
+	delete_if_empty ${error_file}
+}
+
+run_scripts ()
+{
+	mode=$1
+	for script in `find $scripts_dir -name "*.cocci"`
+	do
+		# XXX This is ugly.
+		if [ $mode = "context" -o $mode = "chain" ]
+		then
+			run_script ${script} "context"
+		fi
+		if [ $mode = "org" -o $mode = "chain" ]
+		then
+			run_script ${script} "org"
+		fi
+		if [ $mode = "patch" -o $mode = "chain" ]
+		then
+			run_script ${script} "patch"
+		fi
+		if [ $mode = "report" -o $mode = "chain" ]
+		then
+			run_script ${script} "report"
+		fi
+	done
+}
+
+usage ()
+{
+	echo "\
+$0 [OPTIONS]
+
+-h               Print this help
+-m <mode>        Mode to use : chain, context, org, patch, report
+-s <scripts_dir> Path to the directory where the cocci scripts are stored
+-t <target>      File or directory to parse
+"
+}
+
+while getopts ":hm:s:t:" opt;
+do
+	case $opt in
+	h)
+		usage
+		exit 0;
+		;;
+	m)
+		mode=$OPTARG;
+		;;
+	s)
+		scripts_dir=$OPTARG;
+		;;
+	t)
+		target=$OPTARG;
+		;;
+	\?)
+		echo "Invalid option -$OPTARG"
+		exit 1
+		;;	
+	\:)
+		echo "Option -$OPTARG requires an argument"
+		exit 1
+		;;
+	esac
+done
+
+# Is that {} thing portable ?
+test -n "$target" || { echo "-t <target> must be specified" && exit 1; }
+test -n "$scripts_dir" || { echo "-s <scripts_dir> must be specified" && exit 1; }
+
+create_directories $mode
+if [ "$mode" = "chain" ]
+then
+	run_scripts "context"
+	run_scripts "org"
+	run_scripts "patch"
+	run_scripts "report"
+else
+	run_scripts $mode
+fi
+exit 0