#! /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, 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, 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

# 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;
  } | 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 ~ /noc$/)
        format="no-c-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

echo "scanning option files..." >&2

( cd $srcdir; find . -name '*.opt' -print |
  $AWK '{
    file = $1
    lineno = 1
    field = 0
    while (getline < file) {
	if (/^[ \t]*(;|$)/ || !/^[^ \t]/) {
	    field = 0
	} else {
	    if (field == 2) {
		line = $0
		gsub(".*\t", "", line)
		printf("#line %d \"%s\"\n", lineno, file)
		printf("_(\"%s\")\n", line)
	    }
	    field++;
	}
	lineno++;
    }
  }') >> $emsg

# 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
