summaryrefslogtreecommitdiff
path: root/tests/group-qemu-caps.pl
blob: 514764f47f0234d00115fd3f247117bb41491601 (plain)
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
#!/usr/bin/env perl
#
# This library 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.
#
# This library 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 for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library.  If not, see
# <http://www.gnu.org/licenses/>.
#
#
# Regroup array values into smaller groups separated by numbered comments.
#
# If --check is the first parameter, the script will return
# a non-zero value if a file is not grouped correctly.
# Otherwise the files are regrouped in place.

use strict;
use warnings;

my $check = 0;

if (defined $ARGV[0] && $ARGV[0] eq "--check") {
    $check = 1;
    shift @ARGV;
}

my $prefix = '';
if (defined $ARGV[0]) {
    $prefix = $ARGV[0];
    shift @ARGV;
}

my $ret = 0;
if (&regroup_caps($prefix . 'src/qemu/qemu_capabilities.c',
                  '^VIR_ENUM_IMPL\(virQEMUCaps,',
                  '\);',
                  0,
                  "              ") < 0) {
    $ret = 1;
}
if (&regroup_caps($prefix . 'src/qemu/qemu_capabilities.h',
                  'virQEMUCapsFlags grouping marker',
                  'QEMU_CAPS_LAST \/\* this must',
                  1,
                  "    ") < 0) {
    $ret = 1;
}

exit $ret;

sub regroup_caps {
    my $filename = shift;
    my $start_regex = shift;
    my $end_regex = shift;
    my $trailing_newline = shift;
    my $counter_prefix = shift;
    my $step = 5;

    open FILE, '<', $filename or die "cannot open $filename: $!";
    my @original = <FILE>;
    close FILE;

    my @fixed;
    my $game_on = 0;
    my $counter = 0;
    foreach (@original) {
        if ($game_on) {
            next if ($_ =~ '/\* [0-9]+ \*/');
            next if (/^\s+$/);
            if ($counter % $step == 0) {
                if ($counter != 0) {
                    push @fixed, "\n";
                }
                push @fixed, "$counter_prefix/* $counter */\n";
            }
            if (!($_ =~ '/\*' && !($_ =~ '\*/'))) {
                # count two-line comments as one line
                $counter++;
            }
        }
        if (/$start_regex/) {
            $game_on = 1;
        } elsif ($game_on && $_ =~ /$end_regex/) {
            if (($counter -1) % $step == 0) {
                pop @fixed; # /* $counter */
                if ($counter != 1) {
                    pop @fixed; # \n
                }
            }
            if ($trailing_newline) {
                push @fixed, "\n";
            }
            $game_on = 0;
        }
        push @fixed, $_;
    }

    if ($check) {
        my $nl = join('', @fixed);
        my $ol = join('', @original);
        unless ($nl eq $ol) {
            open DIFF, "| diff -u $filename -" or die "cannot run diff: $!";
            print DIFF $nl;
            close DIFF;

            print STDERR "Incorrect array grouping in $filename\n";
            print STDERR "Use group-qemu-caps.pl to group long array members\n";
            return -1;
        }
    } else {
        open FILE, '>', $filename or die "cannot open $filename: $!";
        foreach my $line (@fixed) {
            print FILE $line;
        }
        close FILE;
    }
}