File indexing completed on 2024-04-14 05:35:09

0001 #!/bin/sh
0002 
0003 # Apply kdelibs coding style to all c, cpp and header files in and below the current directory
0004 #
0005 # The coding style is defined in http://techbase.kde.org/Policies/Kdelibs_Coding_Style
0006 #
0007 # Requirements:
0008 # - installed astyle, with patches below
0009 # - $QT_NORMALIZE_TOOL pointing to qtrepotools/util/normalize/normalize (after compiling it)
0010 #
0011 # IMPORTANT: use astyle 2.05 or later. Patch astyle if you use older version.
0012 # Older versions of astyle misparse the Qt "keywords" like foreach and Q_FOREACH, which
0013 # inside the parenthesis, leading to things like:
0014 # Q_FOREACH(const QString & it, l) // note the space after the '&'.
0015 #
0016 # To fix this, patch astyle with http://www.davidfaure.fr/kde/astyle_qt.diff
0017 # Mentionned upstream in https://sourceforge.net/p/astyle/bugs/154/
0018 #
0019 # Another feature was implemented: removing spaces before ',' and ';'.
0020 # Apply http://www.davidfaure.fr/kde/astyle_comma.diff
0021 # This has been sent upstream in https://sourceforge.net/p/astyle/bugs/100/
0022 #
0023 # Instructions for OpenSuSE users:
0024 #   zypper si astyle
0025 #   cd ~/rpmbuild/SOURCES ; wget http://www.davidfaure.fr/kde/astyle_qt.diff
0026 #                           wget http://www.davidfaure.fr/kde/astyle_comma.diff
0027 #   cd ../SPECS ; wget http://www.davidfaure.fr/kde/astyle.spec.diff
0028 #   patch astyle.spec < astyle.spec.diff
0029 #   rpmbuild -ba astyle.spec
0030 #   sudo rpm -Uvh --force ~/rpmbuild/RPMS/x86_64/astyle-*.rpm
0031 
0032 files=`find -type f -name '*.c' -or -name '*.cpp' -or -name '*.cc' -or -name '*.h'`
0033 if [ -z "$files" ]; then
0034   # nothing to do
0035   exit 0
0036 fi
0037 
0038 if test -z "$QT_NORMALIZE_TOOL"; then
0039   echo "Please export QT_NORMALIZE_TOOL=<qt5>/qtrepotools/util/normalize/normalize"
0040   exit 1
0041 fi
0042 
0043 astyle -n -Q \
0044       --indent=spaces=4 --style=otbs \
0045       --indent-labels --pad-oper --unpad-paren --pad-header \
0046       --keep-one-line-statements \
0047       --convert-tabs \
0048       --indent-preprocessor \
0049       --align-pointer=name \
0050       $files
0051 
0052 # --max-code-length=100 is not used, on purpose. It's a hard limit, sometimes making things
0053 # less readable than if the code is kept on a single line. 100 is just a recommendation
0054 # in the coding style.
0055 
0056 # Watch out for things that lead to method implementations being parsed as if inside other methods,
0057 # e.g. due to '{' inside #ifdef and #else and '}' outside.
0058 grep '^\S* \S*::.*) {$' $files && echo "WARNING: check for wrong '{' placement in method definitions, in above grep results"
0059 
0060 # Remove old emacs mode-lines
0061 perl -pi -e '$_ = "" if /c-basic-offset: [1-8]/' $files
0062 
0063 # Remove old kate mode-lines
0064 perl -pi -e '$_ = "" if /kate: .*indent-width/ || /kate:.*tab-width/' $files
0065 
0066 # Remove old vim mode-lines
0067 perl -pi -e '$_ = "" if /\/\/.* vim:/' $files
0068 # They are often in a two-liner C comment, so we need a bit of perl magic to remove these
0069 perl - $files <<EOF
0070   foreach my \$file (@ARGV) {
0071    open F, "+<", \$file or do { print STDERR "open(\$file) failed : \"\$!\"\n"; next };
0072    my \$str = join '', <F>;
0073    if( \$str =~ m/vim:/ ) {
0074      #print STDERR "Removing multi-line vim modeline from \$file\n";
0075      \$str =~ s!/\*\**\s*\**\s*vim:[^\n]*\n\s*\*/!!smg;
0076      seek F, 0, 0;
0077      print F \$str;
0078      truncate F, tell(F);
0079    }
0080    close F;
0081   }
0082 EOF
0083 
0084 # Remove consecutive blank lines
0085 perl - $files <<EOF
0086   foreach my \$file (@ARGV) {
0087    open F, "+<", \$file or do { print STDERR "open(\$file) failed : \"\$!\"\n"; next };
0088    my \$str = join '', <F>;
0089    if (\$str =~ s/\s*\n\s*\n\s*\n\n*/\n\n/smg ) {
0090      seek F, 0, 0;
0091      print F \$str;
0092      truncate F, tell(F);
0093    }
0094    close F;
0095   }
0096 EOF
0097 
0098 # Normalize signals/slots
0099 $QT_NORMALIZE_TOOL --modify .
0100 
0101 # TODO: add command-line option to trigger this
0102 # It's not wanted when working on a fix
0103 #git commit -q -a -m "Code reformatted using kde-dev-scripts/astyle-kdelibs.
0104 #Use git blame -w `git rev-parse --short HEAD` to show authorship as it was before this commit."
0105