Hi,
https://gerrit.libreoffice.org/#/c/2875/
At least on Linux with
--without-java --enable-werror
works for me.
I only replaced guards like *_HXX_, *_HXX__ and *_HXX_INCLUDED which are
not used at any other place. Those are ~8700 matches. Approx. 500 look
like guards, but don't match the scheme and ~400 hxx headers don't have
guards at all. So the replace of the 8700 matches should be a good estimate.
The script is some kind of weirdo, but it should demonstrate the
difference between guard and pragma. I inserted #if 1 to ignore the
#endif at the end of the file.
Files which RSC touches cannot be converted, because he complains about
#pragma once. If you get RSC errors then some hrc or src includes a hxx
with pragma once.
So the door is open for a comparison.
Happy benchmarking.
Thomas
rm guards-all.log
rm guards-all-count.log
# get a list of all guards from all hxx files (~8700)
# ZIPFILE_HXX
# ZIPFILE_HXX_
# ZIPFILE_HXX_INCLUDED
git grep -h '^\s*#\s*ifndef\s*.*_HXX\(_\|__\|_INCLUDED\)\?$' -- '*.hxx' | sed
's/^\s*#\s*ifndef\s\+//g' | sort -u > guards-all.log
# those must not be in the list
# INCLUDED_COMPHELPER_IMPLBASE_VAR_HXX*
# omitted: those don't match to _HXX scheme (~500)
#git grep '^\s*#\s*ifndef\s*.*' -- '*.hxx' | grep -v '_HXX'
# omit those which are used in other files, too
# for this we count them (takes some time)
for i in `cat guards-all.log`; do
git grep -w $i > guards.tmp; # safe to save greps
# there has to be at least one define and one ifndef otherwise it's no guard
if [ `cat guards.tmp | grep "#\s*ifndef\s\+$i" | wc -l` == 1 ] && [ `cat guards.tmp | grep
"#\s*define\s\+$i" | wc -l` == 1 ]; then
countfiles=`cat guards.tmp | cut -d':' -f1 | sort -u | wc -l`
countmatches=`cat guards.tmp | cut -d':' -f2- |
grep -v "#\s*ifndef\s\+$i" |
grep -v "#\s*define\s\+$i" |
grep -v '#\s*endif' |
grep -v "//\s*$i" |
wc -l`
### log it
# row 1: matches n files (should be one)
# row 2: k matches expect those guard lines (should be zero)
echo $countfiles $countmatches $i >> guards-all-count.log;
### substitute
# dirty fix: delete include guard and use #pragma once
# at the moment don't care about #endif -> insert #if 1
# TODO: insert pragma nicely right after the licence header
# one newline before and after, no more
# safe are those which are in one file and have no further matches than the defined
above
if [ $countfiles == 1 ] && [ $countmatches == 0 ]; then
file=`cat guards.tmp | cut -d':' -f1 | sort -u`
echo $file; # for progress
# FIXME: doing this in one regex would be safer (CSV_CSV_ENV_HXX_HAD_NDEBUG)
sed -i "s/\s*\#\s*ifndef\s\+$i/#pragma once/" $file;
sed -i "s/\s*\#\s*define\s\+$i/#if 1/g" $file;
fi
fi;
done
### whitelist hrc and src included hxx files (rsc complies)
# omit guards in header files which are included in [sh]rc files
# fixed with git checking out the list of includes-hsrc.log at the moment
# get all includes from hrc and src files, only hxx files
for i in `find . -name *.hrc -or -name *.src | grep -v '/workdir/' | grep -v '/solver/'`; do grep
'^\s*#\s*include\s*[<"]' $i | grep '\.hxx[">]'; done >includes-hsrc-all.log
# extract filename
cat includes-hsrc-all.log | sed 's/^\s*#\s*include\s*[<"]\([^">]*\)[">].*/\1/g' | sort -u >
includes-hsrc.log
# reset them
for i in `cat includes-hsrc.log`; do find . -name `basename $i` | grep -v '/workdir/' | grep -v
'/solver/'; done | xargs git checkout
# there are more
git checkout ./basic/inc/basic/sbxdef.hxx
## manual cross check
# there should be only added two lines with excatly these expressions
# git diff HEAD | grep '^+[^+]' | grep -v '^+#if 1$' | grep -v '^+#pragma once$'
Context
Re: #ifdef vs #if for feature checks · Norbert Thiebaud
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.