1*6afeb397SPaolo Bonzini#! /bin/sh
2*6afeb397SPaolo Bonzini#
3*6afeb397SPaolo Bonzini# Fix multiline comments to match CODING_STYLE
4*6afeb397SPaolo Bonzini#
5*6afeb397SPaolo Bonzini# Copyright (C) 2018 Red Hat, Inc.
6*6afeb397SPaolo Bonzini#
7*6afeb397SPaolo Bonzini# Author: Paolo Bonzini
8*6afeb397SPaolo Bonzini#
9*6afeb397SPaolo Bonzini# Usage: scripts/fix-multiline-comments.sh [-i] FILE...
10*6afeb397SPaolo Bonzini#
11*6afeb397SPaolo Bonzini# -i edits the file in place (requires gawk 4.1.0).
12*6afeb397SPaolo Bonzini#
13*6afeb397SPaolo Bonzini# Set the AWK environment variable to choose the awk interpreter to use
14*6afeb397SPaolo Bonzini# (default 'awk')
15*6afeb397SPaolo Bonzini
16*6afeb397SPaolo Bonziniif test "$1" = -i; then
17*6afeb397SPaolo Bonzini  # gawk extension
18*6afeb397SPaolo Bonzini  inplace="-i inplace"
19*6afeb397SPaolo Bonzini  shift
20*6afeb397SPaolo Bonzinifi
21*6afeb397SPaolo Bonzini${AWK-awk} $inplace 'BEGIN { indent = -1 }
22*6afeb397SPaolo Bonzini{
23*6afeb397SPaolo Bonzini    line = $0
24*6afeb397SPaolo Bonzini    # apply a star to the indent on lines after the first
25*6afeb397SPaolo Bonzini    if (indent != -1) {
26*6afeb397SPaolo Bonzini        if (line == "") {
27*6afeb397SPaolo Bonzini            line = sp " *"
28*6afeb397SPaolo Bonzini        } else if (substr(line, 1, indent + 2) == sp "  ") {
29*6afeb397SPaolo Bonzini            line = sp " *" substr(line, indent + 3)
30*6afeb397SPaolo Bonzini        }
31*6afeb397SPaolo Bonzini    }
32*6afeb397SPaolo Bonzini
33*6afeb397SPaolo Bonzini    is_lead = (line ~ /^[ \t]*\/\*/)
34*6afeb397SPaolo Bonzini    is_trail = (line ~ /\*\//)
35*6afeb397SPaolo Bonzini    if (is_lead && !is_trail) {
36*6afeb397SPaolo Bonzini        # grab the indent at the start of a comment, but not for
37*6afeb397SPaolo Bonzini        # single-line comments
38*6afeb397SPaolo Bonzini        match(line, /^[ \t]*\/\*/)
39*6afeb397SPaolo Bonzini        indent = RLENGTH - 2
40*6afeb397SPaolo Bonzini        sp = substr(line, 1, indent)
41*6afeb397SPaolo Bonzini    }
42*6afeb397SPaolo Bonzini
43*6afeb397SPaolo Bonzini    # the regular expression filters out lone /*, /**, or */
44*6afeb397SPaolo Bonzini    if (indent != -1 && !(line ~ /^[ \t]*(\/\*+|\*\/)[ \t]*$/)) {
45*6afeb397SPaolo Bonzini        if (is_lead) {
46*6afeb397SPaolo Bonzini            # split the leading /* or /** on a separate line
47*6afeb397SPaolo Bonzini            match(line, /^[ \t]*\/\*+/)
48*6afeb397SPaolo Bonzini            lead = substr(line, 1, RLENGTH)
49*6afeb397SPaolo Bonzini            match(line, /^[ \t]*\/\*+[ \t]*/)
50*6afeb397SPaolo Bonzini            line = lead "\n" sp " *" substr(line, RLENGTH)
51*6afeb397SPaolo Bonzini        }
52*6afeb397SPaolo Bonzini        if (is_trail) {
53*6afeb397SPaolo Bonzini            # split the trailing */ on a separate line
54*6afeb397SPaolo Bonzini            match(line, /[ \t]*\*\//)
55*6afeb397SPaolo Bonzini            line = substr(line, 1, RSTART - 1) "\n" sp " */"
56*6afeb397SPaolo Bonzini        }
57*6afeb397SPaolo Bonzini    }
58*6afeb397SPaolo Bonzini    if (is_trail) {
59*6afeb397SPaolo Bonzini        indent = -1
60*6afeb397SPaolo Bonzini    }
61*6afeb397SPaolo Bonzini    print line
62*6afeb397SPaolo Bonzini}' "$@"
63