1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
|
#!/bin/bash
# $Id: style_source.sh 12914 2013-12-29 20:11:07Z airwin $
# This script will run uncrustify on all source files registered in
# the lists below (and scripts/convert_comment.py on all C source
# files registered below) and summarize which uncrustified or
# comment-converted files would be different. (convert_comment.py
# converts /* ... */ style comments to the c99-acceptable // form of
# comments because uncrustify does not (yet) have that configuration
# choice.) Also there are options to view the differences in detail
# and/or apply them. This script must be run from the top-level
# directory of the PLplot source tree.
# Copyright (C) 2009-2010 Alan W. Irwin
#
# This file is part of PLplot.
#
# PLplot is free software; you can redistribute it and/or modify
# it under the terms of the GNU Library General Public License as published
# by the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PLplot 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 Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with PLplot; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
usage()
{
echo '
Usage: ./style_source.sh [OPTIONS]
Options:
[--diff [diff options]] Show detailed style differences in source code
with optional concatenated diff options headed
by a single hyphen. If no diff options are
specified, then -auw is used by default.
[--nodiff] Summarize style differences in source code (default).
[--apply] Apply style differences to source code (POWERFUL).
[--noapply] Do not apply style differences to source code (default).
[--help] Show this message.
'
exit $1
}
transform_source()
{
# $1 is a list of source files of a particular language.
# $2 is the language identification string for those source files in
# the form needed by uncrustify. From the uncrustify man page those
# language id forms are C, CPP, D, CS, JAVA, PAWN, VALA, OC, OC+
u_command="uncrustify -c uncrustify.cfg -q -l $2"
# $3 is either "comments" to indicate comments will be transformed
# using scripts/convert_comment.py or any other string (or
# nothing) to indicate comment style processing will not be used.
if [ "$3" = "comments" ] ; then
c_command="scripts/convert_comment.py"
# Check all files for run-time errors with the python script.
# These run-time errors signal that there is some comment
# style which the script cannot handle. The reason we do this
# complete independent check here is that run-time errors can
# be lost in the noise if a large conversion is being done.
# Also, run-time errors will not occur for the usual case
# below where cmp finds an early difference.
for language_source in $1 ; do
$c_command < $language_source >/dev/null
c_command_rc=$?
if [ $c_command_rc -ne 0 ] ; then
echo "ERROR: $c_command failed for file $language_source"
exit 1
fi
done
else
c_command="cat -"
fi
# Swig-language *.i files are approximately the same as C or C++
# other than the %whatever swig directives. $4 is either "swig"
# to indicate a sed script should be applied to get rid of issues
# imposed by uncrustify and which is not acceptable in swig
# directives or any other string (or nothing) to indicate that
# this swig correction should not be applied.
if [ "$4" = "swig" ] ; then
# Splitting s_command into multiple invocations of sed is
# required (for reasons I have not figured out) in order for
# the changes to be done as designed.
# The first two stanzas are to deal with uncrustify
# splitting both %} and %{ by newline characters and
# also getting rid of any surrounding blanks.
# The next two stanzas are to take care of blanks inserted by
# uncrustify after % and to get rid of any
# uncrustify-generated indentation for all % swig directives.
# The next two stanzas are to place %} and %{ on individually
# separate lines.
# The next two stanzas are to deal with $ variables.
s_command='sed -e "/%$/ N" -e "s? *%\n *\([{}]\)?%\1?" |sed -e "s?% ?%?g" -e "s? *%?%?g" | sed -e "s?\(%[{}]\)\(..*\)?\1\n\2?" -e "s?\(..*\)\(%[{}]\)?\1\n\2?" | sed -e "s?\$ \* ?\$\*?g" -e "s?\$ & ?\$\&?g"'
else
s_command="cat -"
fi
# Process $c_command after $u_command so that comments will be rendered
# in standard form by uncrustify before scripts/convert_comment.py
# is run. Process the $s_command (with eval because of the
# quotes) after the $c_command to correct introduced swig styling
# errors (if in fact you are styling swig source).
# N.B. for the --apply option, transform_source is called twice;
# once with apply=OFF and once with it on. For the first call
# with apply=OFF the logic below lists all files (and diffs all
# files if that option is used) that will be changed. For the
# second call with apply=ON, the logic below changes the source
# files and then lists (and diffs if that option is set) any
# remaining changes that still have to be done. (On rare
# occasions, uncrustify has to be applied iteratively.)
for language_source in $1 ; do
if [ "$apply" = "ON" ] ; then
$u_command < $language_source | $c_command | eval $s_command | \
cmp --quiet $language_source -
if [ "$?" -ne 0 ] ; then
$u_command < $language_source | $c_command | eval $s_command >| /tmp/temporary.file
mv -f /tmp/temporary.file $language_source
fi
fi
$u_command < $language_source | $c_command | eval $s_command | \
cmp --quiet $language_source -
if [ "$?" -ne 0 ] ; then
ls $language_source
if [ "$diff" = "ON" ] ; then
$u_command < $language_source | $c_command | eval $s_command | \
diff $diff_options $language_source -
fi
fi
done
}
# Figure out what script options were specified by the user.
# Defaults
export diff=OFF
export apply=OFF
export diff_options="-auw"
while test $# -gt 0; do
case $1 in
--diff)
diff=ON
case $2 in
-[^-]*)
diff_options=$2
shift
;;
esac
;;
--nodiff)
diff=OFF
;;
--apply)
apply=ON
;;
--noapply)
apply=OFF
;;
--help)
usage 0 1>&2
;;
*)
usage 1 1>&2
;;
esac
shift
done
allowed_version=0.58
version=$(uncrustify --version)
if [ "$version" != "uncrustify $allowed_version" ] ; then
echo "
Detected uncrustify version = '$version'.
This script only works with uncrustify $allowed_version."
exit 1
fi
if [ ! -f src/plcore.c ] ; then
echo "This script can only be run from PLplot top-level source tree."
exit 1
fi
export csource_LIST
# Top level directory.
csource_LIST="plplot_config.h.in"
# src directory
csource_LIST="$csource_LIST src/*.[ch]"
# All C source (i.e., exclude qt.h) in include directory.
csource_LIST="$csource_LIST $(ls include/*.h include/*.h.in |grep -v qt.h)"
# Every subdirectory of lib.
csource_LIST="$csource_LIST lib/*/*.[ch] lib/qsastime/qsastimeP.h.in"
# C part of drivers.
csource_LIST="$csource_LIST drivers/*.c"
# C part of examples.
csource_LIST="$csource_LIST examples/c/*.[ch] examples/tk/*.c"
# C source in fonts.
csource_LIST="$csource_LIST fonts/*.c"
# C source in utils.
csource_LIST="$csource_LIST utils/*.c"
csource_LIST="$csource_LIST bindings/tcl/*.[ch] bindings/f95/*.c bindings/f95/plstubs.h bindings/gnome2/*/*.c bindings/ocaml/plplot_impl.c bindings/ocaml/plcairo/plcairo_impl.c bindings/python/plplot_widgetmodule.c bindings/tk/*.[ch] bindings/tk-x-plat/*.[ch] bindings/octave/plplot_octave.h.in bindings/octave/plplot_octave_rej.h bindings/octave/massage.c"
export cppsource_LIST
# C++ part of bindings/c++
cppsource_LIST="bindings/c++/plstream.cc bindings/c++/plstream.h"
# C++ part of include.
cppsource_LIST="$cppsource_LIST include/qt.h"
# C++ part of drivers.
cppsource_LIST="$cppsource_LIST drivers/wxwidgets.h drivers/*.cpp drivers/*.cc"
# C++ part of examples.
cppsource_LIST="$cppsource_LIST examples/c++/*.cc examples/c++/*.cpp examples/c++/*.h"
# C++ source in bindings.
cppsource_LIST="$cppsource_LIST bindings/qt_gui/plqt.cpp bindings/wxwidgets/wxPLplotstream.cpp bindings/wxwidgets/wxPLplotwindow.cpp bindings/wxwidgets/wxPLplotwindow.h bindings/wxwidgets/wxPLplotstream.h.in"
export javasource_LIST
# Java part of bindings/java
javasource_LIST="bindings/java/*.java bindings/java/*.java.in"
# Java part of examples/java
javasource_LIST="$javasource_LIST examples/java/*.java"
export dsource_LIST
# D part of bindings/d
dsource_LIST="bindings/d/*.d"
# D part of examples/d
dsource_LIST="$dsource_LIST examples/d/*.d"
export swig_csource_LIST
# API description for Swig being sure to ignore the generated file,
# bindings/swig-support/swig_documentation.i
swig_csource_LIST=bindings/swig-support/plplotcapi.i
# Use specific names here for each C-like file controlling specific
# language bindings since some files (e.g., bindings/python/fragments.i)
# are copied from swig itself so don't mess with them. Also, ignore octave
# since that C++-like file goes under swig_cppsource_LIST.
swig_csource_LIST="$swig_csource_LIST bindings/java/plplotjavac.i"
swig_csource_LIST="$swig_csource_LIST bindings/lua/plplotluac.i"
swig_csource_LIST="$swig_csource_LIST bindings/python/plplotcmodule.i"
export swig_cppsource_LIST
swig_cppsource_LIST=bindings/octave/plplot_octave.i
# Check that source file lists actually refer to files.
for source in $csource_LIST $cppsource_LIST $javasource_LIST $dsource_LIST $swig_csource_LIST $swig_cppsource_LIST; do
if [ ! -f $source ] ; then
echo $source is not a regular file so this script will not work without further editing.
exit 1
fi
done
if [ "$apply" = "ON" ] ; then
apply=OFF
# Should be the exact same transform_source commands as below.
transform_source "$csource_LIST" C "comments"
transform_source "$cppsource_LIST" CPP "comments"
transform_source "$javasource_LIST" JAVA "comments"
transform_source "$dsource_LIST" D "comments"
transform_source "$swig_csource_LIST" C "comments" "swig"
transform_source "$swig_cppsource_LIST" CPP "comments" "swig"
apply=ON
echo '
The --apply option is POWERFUL and will replace _all_ files mentioned above
(if any) with their styled versions.
'
ANSWER=
while [ "$ANSWER" != "yes" -a "$ANSWER" != "no" ] ; do
echo -n "Continue (yes/no)? "
read ANSWER
done
if [ "$ANSWER" = "no" ] ; then
echo "Immediate exit specified!"
exit
fi
fi
transform_source "$csource_LIST" C "comments"
transform_source "$cppsource_LIST" CPP "comments"
transform_source "$javasource_LIST" JAVA "comments"
transform_source "$dsource_LIST" D "comments"
transform_source "$swig_csource_LIST" C "comments" "swig"
transform_source "$swig_cppsource_LIST" CPP "comments" "swig"
|