xref: /Universal-ctags/misc/roundtrip (revision 9404b13c651ed9dcde38ec56cb9f91dd67e7e5fb)
16f0c79d1SMasatake YAMATO#!/bin/sh
26f0c79d1SMasatake YAMATO#
36f0c79d1SMasatake YAMATO#   Copyright (C) 2014 Masatake YAMATO
46f0c79d1SMasatake YAMATO#
56f0c79d1SMasatake YAMATO#   This program is free software; you can redistribute it and/or modify
66f0c79d1SMasatake YAMATO#   it under the terms of the GNU General Public License as published by
76f0c79d1SMasatake YAMATO#   the Free Software Foundation; either version 2 of the License, or
86f0c79d1SMasatake YAMATO#   (at your option) any later version.
96f0c79d1SMasatake YAMATO#
106f0c79d1SMasatake YAMATO#   This program is distributed in the hope that it will be useful,
116f0c79d1SMasatake YAMATO#   but WITHOUT ANY WARRANTY; without even the implied warranty of
126f0c79d1SMasatake YAMATO#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
136f0c79d1SMasatake YAMATO#   GNU General Public License for more details.
146f0c79d1SMasatake YAMATO#
156f0c79d1SMasatake YAMATO#   You should have received a copy of the GNU General Public License
166f0c79d1SMasatake YAMATO#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
176f0c79d1SMasatake YAMATO
18f4e04d57SColomban Wendlingset -e
19f4e04d57SColomban Wendling
2093a864b6SColomban Wendling# Avoid trouble with weird bytes on non-C locales
2193a864b6SColomban Wendlingexport LC_ALL=C
2293a864b6SColomban Wendling
236f0c79d1SMasatake YAMATOREADTAGS=${1:-./readtags}
246f0c79d1SMasatake YAMATOUNITS=${2:-./Units}
25*9404b13cSMasatake YAMATOshift 2
26*9404b13cSMasatake YAMATO
27*9404b13cSMasatake YAMATOMINITRIP=
28*9404b13cSMasatake YAMATOwhile [ $# -gt 0 ]; do
29*9404b13cSMasatake YAMATO    case $1 in
30*9404b13cSMasatake YAMATO	--minitrip)
31*9404b13cSMasatake YAMATO	    MINITRIP=minitrip
32*9404b13cSMasatake YAMATO	    ;;
33*9404b13cSMasatake YAMATO	*)
34*9404b13cSMasatake YAMATO	    echo "Unexpected argument: $1" 1>&2
35*9404b13cSMasatake YAMATO	    exit 1
36*9404b13cSMasatake YAMATO	    ;;
37*9404b13cSMasatake YAMATO    esac
38*9404b13cSMasatake YAMATO    shift
39*9404b13cSMasatake YAMATOdone
40*9404b13cSMasatake YAMATO
416f0c79d1SMasatake YAMATOs=0
426f0c79d1SMasatake YAMATO
436f0c79d1SMasatake YAMATOif ! [ -f "${READTAGS}" ]; then
446f0c79d1SMasatake YAMATO    echo "No such file: ${READTAGS}" 1>&2
456f0c79d1SMasatake YAMATO    exit 1
466f0c79d1SMasatake YAMATOfi
476f0c79d1SMasatake YAMATO
486f0c79d1SMasatake YAMATOif ! [ -x "${READTAGS}" ]; then
496f0c79d1SMasatake YAMATO    echo "Not an executable: ${READTAGS}" 1>&2
506f0c79d1SMasatake YAMATO    exit 1
516f0c79d1SMasatake YAMATOfi
526f0c79d1SMasatake YAMATO
536f0c79d1SMasatake YAMATOif ! [ -x "${UNITS}" ]; then
546f0c79d1SMasatake YAMATO    echo "Not such directory: ${UNITS}" 1>&2
556f0c79d1SMasatake YAMATO    exit 1
566f0c79d1SMasatake YAMATOfi
576f0c79d1SMasatake YAMATO
586f0c79d1SMasatake YAMATO
593527bb60SColomban Wendling# Expand CTags escape sequences (and keep the original, too)
603527bb60SColomban Wendling# See docs/format.rst
613527bb60SColomban WendlingexpandEscapeSequences()
623527bb60SColomban Wendling{
63b6155068SColomban Wendling    sed -e '
64b6155068SColomban Wendling# early out if there is no escape sequence (common case)
651fc21b12SColomban Wendling/\\/!b
663527bb60SColomban Wendling
67b6155068SColomban Wendling# loop until we handled all occurrences of \.
68b6155068SColomban Wendling# as it is not possible to do all replacements at once and we need not to
69b6155068SColomban Wendling# ever use the result of an replacement to perform another one, use two
70b6155068SColomban Wendling# reserved placeholders.
71b6155068SColomban Wendling:again
72b6155068SColomban Wendling    s/\\/__BACKSLASH__/
73b6155068SColomban Wendling    s/__BACKSLASH__\\/__LITBACKSLASH__/;	t again
74b6155068SColomban Wendling    s/__BACKSLASH__t/	/;			t again
75b6155068SColomban Wendling    s/__BACKSLASH__r/'"$(printf '\r')"'/;	t again
7609f5018dSColomban Wendling    s/__BACKSLASH__n/\
7709f5018dSColomban Wendling/;						t again
78b6155068SColomban Wendling    s/__BACKSLASH__a//;			t again
79b6155068SColomban Wendling    s/__BACKSLASH__b/'"$(printf '\b')"'/;	t again
80b6155068SColomban Wendling    s/__BACKSLASH__v//;			t again
81b6155068SColomban Wendling    s/__BACKSLASH__f//;			t again
82b6155068SColomban Wendling    s/__BACKSLASH__x01//;			t again
83b6155068SColomban Wendling    s/__BACKSLASH__x02//;			t again
84b6155068SColomban Wendling    s/__BACKSLASH__x03//;			t again
85b6155068SColomban Wendling    s/__BACKSLASH__x04//;			t again
86b6155068SColomban Wendling    s/__BACKSLASH__x05//;			t again
87b6155068SColomban Wendling    s/__BACKSLASH__x06//;			t again
88b6155068SColomban Wendling    s/__BACKSLASH__x07//;			t again
89b6155068SColomban Wendling    s/__BACKSLASH__x08//;			t again
90b6155068SColomban Wendling    s/__BACKSLASH__x09/	/;			t again
9109f5018dSColomban Wendling    s/__BACKSLASH__x0[aA]/\
9209f5018dSColomban Wendling/;						t again
93b6155068SColomban Wendling    s/__BACKSLASH__x0[bB]//;			t again
94b6155068SColomban Wendling    s/__BACKSLASH__x0[cC]//;			t again
95b6155068SColomban Wendling    s/__BACKSLASH__x0[dD]/'"$(printf '\r')"'/;	t again
96b6155068SColomban Wendling    s/__BACKSLASH__x0[eE]//;			t again
97b6155068SColomban Wendling    s/__BACKSLASH__x0[fF]//;			t again
98b6155068SColomban Wendling    s/__BACKSLASH__x10//;			t again
99b6155068SColomban Wendling    s/__BACKSLASH__x11//;			t again
100b6155068SColomban Wendling    s/__BACKSLASH__x12//;			t again
101b6155068SColomban Wendling    s/__BACKSLASH__x13//;			t again
102b6155068SColomban Wendling    s/__BACKSLASH__x14//;			t again
103b6155068SColomban Wendling    s/__BACKSLASH__x15//;			t again
104b6155068SColomban Wendling    s/__BACKSLASH__x16//;			t again
105b6155068SColomban Wendling    s/__BACKSLASH__x17//;			t again
106b6155068SColomban Wendling    s/__BACKSLASH__x18//;			t again
107b6155068SColomban Wendling    s/__BACKSLASH__x19//;			t again
108b6155068SColomban Wendling    s/__BACKSLASH__x1[aA]//;			t again
109b6155068SColomban Wendling    s/__BACKSLASH__x1[bB]//;			t again
110b6155068SColomban Wendling    s/__BACKSLASH__x1[cC]//;			t again
111b6155068SColomban Wendling    s/__BACKSLASH__x1[dD]//;			t again
112b6155068SColomban Wendling    s/__BACKSLASH__x1[eE]//;			t again
113b6155068SColomban Wendling    s/__BACKSLASH__x1[fF]//;			t again
114b6155068SColomban Wendling    s/__BACKSLASH__x21/!/;			t again
115b6155068SColomban Wendling    s/__BACKSLASH__x20/ /;			t again
116b6155068SColomban Wendling    s/__BACKSLASH__x7[fF]//;			t again
1171fc21b12SColomban Wendling    /\\/b again
1183527bb60SColomban Wendling
119b6155068SColomban Wendling# replace lonely "\"es
120b6155068SColomban Wendlings/__BACKSLASH__/\\/g
121b6155068SColomban Wendling# replace literal "\"es ("\\" from the input)
122b6155068SColomban Wendlings/__LITBACKSLASH__/\\/g
123b6155068SColomban Wendling'
1243527bb60SColomban Wendling}
1253527bb60SColomban Wendling
126f596ff1bSColomban Wendling# disable path expansion, because we don't need it and it's applied on the
127f596ff1bSColomban Wendling# result of the commands used to loop on, and we don't want that.
128f596ff1bSColomban Wendlingset -f
129f596ff1bSColomban Wendling# remove space from IFS as it's valid in tag names
130f596ff1bSColomban WendlingOLD_IFS="$IFS"
131f596ff1bSColomban WendlingIFS='
132f596ff1bSColomban Wendling'
133f596ff1bSColomban Wendling
134*9404b13cSMasatake YAMATOntagfiles=0
135*9404b13cSMasatake YAMATOntrips=0
136f4e04d57SColomban Wendlingtagfiles=$(find "$UNITS" -name expected.tags)
137f4e04d57SColomban Wendlingfor tags in $tagfiles; do
138*9404b13cSMasatake YAMATO    ntagfiles=$(expr $ntagfiles + 1)
139*9404b13cSMasatake YAMATO    dir=$(dirname "$tags")
140*9404b13cSMasatake YAMATO    if [ -n "$MINITRIP" -a ! -e "$dir/$MINITRIP" ]; then
141*9404b13cSMasatake YAMATO	continue
142*9404b13cSMasatake YAMATO    fi
143*9404b13cSMasatake YAMATO    ntrips=$(expr $ntrips + 1)
144*9404b13cSMasatake YAMATO
1458a91126fSMasatake YAMATO    tagnames=$(sed -e 's/^\([^	]*\)	.*/\1/' "$tags")
146f4e04d57SColomban Wendling    for name in $tagnames; do
147d3aa9289SColomban Wendling	# Yes, there is a reason for this craziness.  We need to properly
148d3aa9289SColomban Wendling	# handle embedded newlines (expanded from "\n"), including trailing
149d3aa9289SColomban Wendling	# ones the shell would strip automatically.  To work around this, we
150d3aa9289SColomban Wendling	# add a dummy character at the end to inhibit stripping, and then
151d3aa9289SColomban Wendling	# remove it, plus the extra newline, using variable substitutions.
152d3aa9289SColomban Wendling	# Note: we use "printf '%s\n'" instead of "echo" because Dash's "echo"
153d3aa9289SColomban Wendling	# unconditionally expands some sequences, like "\t" and alike.
154d3aa9289SColomban Wendling	t="$(printf '%s\n' "$name" | expandEscapeSequences; printf _)"
155d3aa9289SColomban Wendling	t="${t%
156d3aa9289SColomban Wendling_}"
1577cdd79a3SColomban Wendling	if [ 1 -gt $("${READTAGS}" -t "$tags" - "$t" | wc -l) ]; then
1587cdd79a3SColomban Wendling	    printf 'FAILED: "%s" -t "%s" - "%s"\n' "${READTAGS}" "$tags" "$t"
159d3aa9289SColomban Wendling	    printf '	The raw tag name was "%s"\n' "$name"
1606f0c79d1SMasatake YAMATO	    s=1
1616f0c79d1SMasatake YAMATO	fi
1626f0c79d1SMasatake YAMATO    done
1636f0c79d1SMasatake YAMATOdone
1646f0c79d1SMasatake YAMATO
165f596ff1bSColomban WendlingIFS="$OLD_IFS"
166f596ff1bSColomban Wendling
167*9404b13cSMasatake YAMATOnote=
168*9404b13cSMasatake YAMATOif [ -n "$MINITRIP" ]; then
169*9404b13cSMasatake YAMATO    note="[$MINITRIP]"
170*9404b13cSMasatake YAMATOfi
171*9404b13cSMasatake YAMATOprintf "%s/%s%s...%d\n" "$ntrips" "$ntagfiles" "$note" "$s"
172*9404b13cSMasatake YAMATO
1736f0c79d1SMasatake YAMATOexit $s
174