#! /bin/sh
# Wrapper around gettext for programs using the msgid convention.
# Copyright 1998, 2001, 2002, 2003 Free Software Foundation, Inc.

# Written by Paul Eggert <eggert@twinsun.com>.
# Revised by Zack Weinberg <zackw@stanford.edu> for no-POTFILES operation.

# This file is part of GCC.

# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.

# GCC 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 General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING.  If not, write to
# the Free Software Foundation, 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.

# Always operate in the C locale.
LANG=C
LANGUAGE=C
LC_ALL=C
export LANG LANGUAGE LC_ALL

# Set AWK if environment has not already set it.
AWK=${AWK-awk}

# The arguments to this wrapper are: the program to execute, the
# name of the "package", and the path to the source directory.

if [ $# -ne 3 ]
then	echo "usage: $0 <xgettext> <package> <srcdir>"
	exit 1
fi

xgettext=$1
package=$2
srcdir=$3

case `$xgettext --version | sed -e 1q | sed -e 's/^\([^0-9]*\)//'` in
  0.14.[5-9]* | 0.14.[1-9][0-9]* | 0.1[5-9]* | 0.[2-9][0-9]* | [1-9].*) : ;;
  *) echo "$xgettext is too old.  GNU xgettext 0.14.5 is required"
     exit 1 ;;
esac

nl='
'

set -e

# Create temporary directory for scratch files.
T=exg$$.d
mkdir $T
trap "rm -r $T" 0

pwd=`${PWDCMD-pwd}`
kopt=$pwd/$T/keyword-options
kopt2=$pwd/$T/keyword2-options
emsg=$pwd/$T/emsgids.c
posr=$pwd/$T/po-sources
pottmp1=$pwd/$T/tmp1.pot
pottmp2=$pwd/$T/tmp2.pot
pottmp=$pwd/$T/tmp.pot

# Extra files to scan
extra_files=$pwd/options.c

# Locate files to scan, and generate the list.  All .c, .h, and .def files
# in $srcdir are examined, likewise $srcdir/config and $srcdir/config/*
# (directories).  Also, all subdirectories of $srcdir that contain a
# config-lang.in.  Exclusions come from $srcdir/po/EXCLUDE.
#
# Then generate keyword options for xgettext, by scanning for declarations
# of functions whose parameter names end in "msgid".
#
# Finally, generate a source file containing all %e strings from
# driver specs, so those can be translated too.
#
# All in one huge awk script.

echo "scanning for keywords and %e strings..." >&2

( cd $srcdir
  lang_subdirs=`echo */config-lang.in | sed -e 's|config-lang\.in||g'`
  { for dir in "" config/ config/*/ $lang_subdirs
    do  for glob in '*.c' '*.h' '*.def'
        do  eval echo $dir$glob
        done
    done;
    echo $extra_files;
  } | tr ' ' "$nl" | grep -v '\*' |
  $AWK -v excl=po/EXCLUDES -v posr=$posr -v kopt=$kopt -v kopt2=$kopt2 -v emsg=$emsg '
function keyword_option(line) {
    paren_index = index(line, "(")
    name = substr(line, 1, paren_index - 1)
    sub(/[^0-9A-Z_a-z]*$/, "", name)
    sub(/[	 ]+PARAMS/, "", name)
    sub(/[	 ]+VPARAMS/, "", name)
    sub(/.*[^0-9A-Z_a-z]/, "", name)

    args = substr(line, paren_index)
    sub(/msgid[,\)].*/, "", args)
    for (n = 1; sub(/^[^,]*,/, "", args); n++) {
	continue
    }
    format=""
    if (args ~ /g$/)
    	format="gcc-internal-format"
    else if (args ~ /c$/)
    	format="c-format"

    if (n == 1) { keyword = "--keyword=" name }
    else { keyword = "--keyword=" name ":" n }
    if (format) {
        keyword=keyword "\n--flag=" name ":" n ":" format
    }

    if (! keyword_seen[name]) {
	if (format == "gcc-internal-format")
		print keyword > kopt2
	else
		print keyword > kopt
    	keyword_seen[name] = keyword
    } else if (keyword_seen[name] != keyword) {
	printf("%s used incompatibly as both %s and %s\n",
	       name, keyword_seen[name], keyword)
	exit (1)
    }
}

function spec_error_string (line) {
    while ((percent_index = index(line, "%e")) != 0) {
	escape = substr(line, percent_index - 1, 1)
	line = substr(line, percent_index + 2)
	if (escape == "%") continue

	bracket_index = index(line, "}")
	quote_index = index(line, "\"")
	if (bracket_index == 0) return
	if (quote_index != 0 && bracket_index > quote_index) return

	msgid = substr(line, 1, bracket_index - 1)
	line = substr(line, bracket_index + 1)

	if (index(msgid, "%") != 0) continue

	printf("#line %d \"%s\"\n", lineno, file) > emsg
	printf("_(\"%s\")\n", msgid) > emsg

    }
}

BEGIN {
  while ((getline < excl) > 0) {
    if ($0 ~ /^#/ || $0 ~ /^[ 	]*$/)
      continue
    excludes[$1] = 1
  }
}

{ if (!($0 in excludes)) {
    print > posr
    files[NR] = $0
  }
}

END {
    for (f in files) {
	file = files[f]
	lineno = 1
	while (getline < file) {
	    if (/^(#[ 	]*define[ 	]*)?[A-Za-z_].*\(.*msgid[,\)]/) {
		keyword_option($0)
	    } else if (/%e/) {
		spec_error_string($0)
	    }
	    lineno++
	}
    }
    print emsg > posr
}'
) || exit

# Run the xgettext command, with temporary added as a file to scan.
echo "running xgettext..." >&2
$xgettext --default-domain=$package --directory=$srcdir \
	  --add-comments `cat $kopt` --files-from=$posr \
	  --copyright-holder="Free Software Foundation, Inc." \
	  --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \
	  --language=c -o $pottmp1
$xgettext --default-domain=$package --directory=$srcdir \
	  --add-comments --keyword= `cat $kopt2` --files-from=$posr \
	  --copyright-holder="Free Software Foundation, Inc." \
	  --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \
	  --language=GCC-source -o $pottmp2
$xgettext --default-domain=$package \
	  --add-comments $pottmp1 $pottmp2 \
	  --copyright-holder="Free Software Foundation, Inc." \
	  --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \
	  --language=PO -o $pottmp
# Remove local paths from .pot file.
sed "s:$srcdir/::g;s:$pwd/::g;" <$pottmp >po/$package.pot
