https://bugs.documentfoundation.org/show_bug.cgi?id=124176

George Bateman <[email protected]> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
                 CC|                            |[email protected]
           Assignee|[email protected] |[email protected]
                   |desktop.org                 |

--- Comment #97 from George Bateman <[email protected]> ---
I am working on this as my first LO bug, using a suitable Python script to make
the changes en masse. Currently I've got the script to make the vast majority
of changes successfully and have had to edit just the following few files
manually:

chart2/source/inc/InternalData.hxx
include/svx/svdmodel.hxx
include/vcl/glxtestprocess.hxx

Unfortunately the tests are failing on my machine even with my changes removed
but the build at least is successful.

The script is:

#!/usr/bin/python3

import re
import subprocess
import sys

debug = len(sys.argv) > 1

if debug:
    files = sys.argv[1:]
else:
    files = subprocess.run(['git', 'grep', '--name-only', '#ifndef
INCLUDED_.*_HXX'],
        text=True, capture_output=True).stdout.splitlines()

for file_name in files:
    with open(file_name, 'r+') as f:
        lines = list(f)
        flag_name = None
        flag_start = None
        flag_def = None
        flag_end = None
        is_bad = False
        else_in_top_lvl = False
        if_lvl = 0

        if debug:
            print("Processing %s with %d lines" % (file_name, len(lines)))

        for i, line in enumerate(lines):
            if re.match('^\\s*#\\s*if', line):
                if_lvl += 1
                if if_lvl == 1 and flag_start is not None:
                    # There is a top-level if statement after the include
guard.
                    is_bad = True
            elif re.match('^\\s*#\\s*el', line):
                if if_lvl <= 1:
                    else_in_top_lvl = True
            elif re.match('^\\s*#\\s*endif', line):
                if_lvl -= 1

            if flag_name is None:
                if m := re.match('#ifndef (INCLUDED_.*_HXX)', line):
                    flag_name = m.group(1)
                    flag_start = i
            elif flag_def is None:
                if m := re.match('#define (INCLUDED_.*_HXX)', line):
                    if m.group(1) == flag_name and i == flag_start + 1:
                        flag_def = i
            elif flag_end is None:
                if re.match('^\\s*#\\s*endif', line) and if_lvl == 0:
                    flag_end = i
            else:
                if not (re.match('^\\s*$', line) or
re.match('^\\s*/\\*.*\\*/\\s*$', line)
                        or re.match('^\\s*//', line)):
                    is_bad = True

            if debug:
                print(f"Line {i}\tflags
{flag_start}\t{flag_def}\t{flag_end}\t{if_lvl}\t{else_in_top_lvl}\t{is_bad}")

        if flag_start is not None and (flag_end is None or else_in_top_lvl):
            is_bad = True
        if is_bad:
            print("%s is bad!" % file_name)
            continue
        if flag_start is None: continue
        if debug: continue

        lines[flag_start] = '#pragma once\n'
        lines.pop(flag_end)
        lines.pop(flag_def)
        f.seek(0)
        f.truncate()
        f.write(''.join(lines))

It parses preprocessor commands at a fairly basic level and makes the needed
changes if they seem safe (i.e. is_bad is false), or if passed file paths
prints debugging information to explain why they are bad. The only outstanding
file with a "weird" include guard is vcl/inc/unx/gtk/gtkgdi.hxx. This file has
an #else command half-way though the include guard which may not be correct.

-- 
You are receiving this mail because:
You are the assignee for the bug.
_______________________________________________
Libreoffice-bugs mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice-bugs

Reply via email to