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