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

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

# This program 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.

# This program 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 GNU CC; 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

nl='
'

set -e

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

pwd=`pwd`
kopt=$pwd/$T/keyword-options
emsg=$pwd/$T/emsgids.c
posr=$pwd/$T/po-sources

# 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 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
    }

    if (n == 1) { keyword = name }
    else        { keyword = name ":" n }

    if (! keyword_seen[keyword]++) {
	print "--keyword=" keyword > kopt
    }
}

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 == "%") return

	bracket_index = index(line, "}")
	if (bracket_index == 0) return

	msgid = substr(line, 1, bracket_index - 1)
	if (index(msgid, "%") != 0) return

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

	line = substr(line, bracket_index + 1)
    }
}

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
}'
)

# 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 \
	  --language=c -o po/$package.pot
