pkgsrc-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc/mk/tools Refactor msgfmt.sh script to conditionally st...
details: https://anonhg.NetBSD.org/pkgsrc/rev/a81e0374770c
branches: trunk
changeset: 556360:a81e0374770c
user: joerg <joerg%pkgsrc.org@localhost>
date: Fri Mar 20 16:13:02 2009 +0000
description:
Refactor msgfmt.sh script to conditionally strip the msgid_plural for
old NetBSD versions and to strip msgctx if requested by the package.
This allows to replace the use of msgfmtstrip in various packages by
setting MSGFMT_STRIP_MSGCTX.
diffstat:
mk/tools/gettext.mk | 31 +++-
mk/tools/msgfmt-msgctxt.awk | 19 ++
mk/tools/msgfmt-msgid_plural.awk | 262 +++++++++++++++++++++++++++++++++++++
mk/tools/msgfmt.sh | 271 +-------------------------------------
4 files changed, 315 insertions(+), 268 deletions(-)
diffs (truncated from 645 to 300 lines):
diff -r c3907f29f992 -r a81e0374770c mk/tools/gettext.mk
--- a/mk/tools/gettext.mk Fri Mar 20 16:06:31 2009 +0000
+++ b/mk/tools/gettext.mk Fri Mar 20 16:13:02 2009 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: gettext.mk,v 1.8 2007/06/15 17:11:33 joerg Exp $
+# $NetBSD: gettext.mk,v 1.9 2009/03/20 16:13:02 joerg Exp $
#
# Copyright (c) 2006 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -59,6 +59,9 @@
. if defined(TOOLS_PLATFORM.msgfmt) && !empty(TOOLS_PLATFORM.msgfmt)
_TOOLS_USE_PKGSRC.msgfmt?= no
#
+# MSGFMT_STRIP_MSGID_PLURAL: Yes for msgfmt < 0.10.36
+# MSGFMT_STRIP_MSGCTX: To be set by packages
+#
# Determine if the platform-supplied msgfmt is new enough to support
# the msgid_plural statement. We need at least 0.10.36 for GNU msgfmt.
#
@@ -68,14 +71,23 @@
. if !defined(_TOOLS_USE_MSGFMT_SH)
_TOOLS_VERSION.msgfmt!= ${TOOLS_PLATFORM.msgfmt} --version | \
${AWK} '{ print $$4; exit }'
-_TOOLS_USE_MSGFMT_SH!= \
+. if !defined(MSGFMT_STRIP_MSGID_PLURAL)
+MSGFMT_STRIP_MSGID_PLURAL!= \
if ${PKG_ADMIN} pmatch "gettext>0.10.35" \
gettext-${_TOOLS_VERSION.msgfmt:Q}; then \
${ECHO} no; \
else \
${ECHO} yes; \
fi
+. endif
. endif
+MSGFMT_STRIP_MSGID_PLURAL?= no
+MSGFMT_STRIP_MSGCTX?= no
+.if ${MSGFMT_STRIP_MSGID_PLURAL} == "yes" || ${MSGFMT_STRIP_MSGCTX} == "yes"
+_TOOLS_USE_MSGFMT_SH= yes
+.else
+_TOOLS_USE_MSGFMT_SH= no
+.endif
MAKEVARS+= _TOOLS_USE_MSGFMT_SH
. else
_TOOLS_USE_PKGSRC.msgfmt= yes
@@ -91,18 +103,21 @@
_TOOLS_USE_PKGSRC.msgfmt= yes
. endif
-. if !empty(_TOOLS_USE_PKGSRC.msgfmt:M[yY][eE][sS])
-TOOLS_CREATE+= msgfmt
-TOOLS_DEPENDS.msgfmt?= ${_TOOLS_DEP.gettext-tools}:../../devel/gettext-tools
-TOOLS_FIND_PREFIX+= TOOLS_PREFIX.msgfmt=${TOOLS_DEPENDS.msgfmt:C/:.*//}
-TOOLS_PATH.msgfmt= ${TOOLS_PREFIX.msgfmt}/bin/msgfmt
-. elif defined(_TOOLS_USE_MSGFMT_SH) && \
+. if defined(_TOOLS_USE_MSGFMT_SH) && \
!empty(_TOOLS_USE_MSGFMT_SH:M[yY][eE][sS])
USE_TOOLS+= awk sh
TOOLS_PATH.msgfmt= ${PKGSRCDIR}/mk/tools/msgfmt.sh
TOOLS_SCRIPT.msgfmt= AWK=${TOOLS_AWK:Q} CAT=${TOOLS_CAT:Q} \
MSGFMT=${TOOLS_PLATFORM.msgfmt:Q} \
+ PKGSRCDIR=${PKGSRCDIR:Q} \
+ MSGFMT_STRIP_MSGID_PLURAL=${MSGFMT_STRIP_MSGID_PLURAL} \
+ MSGFMT_STRIP_MSGCTX=${MSGFMT_STRIP_MSGCTX} \
${TOOLS_SH} ${TOOLS_PATH.msgfmt} "$$@"
+. elif !empty(_TOOLS_USE_PKGSRC.msgfmt:M[yY][eE][sS])
+TOOLS_CREATE+= msgfmt
+TOOLS_DEPENDS.msgfmt?= ${_TOOLS_DEP.gettext-tools}:../../devel/gettext-tools
+TOOLS_FIND_PREFIX+= TOOLS_PREFIX.msgfmt=${TOOLS_DEPENDS.msgfmt:C/:.*//}
+TOOLS_PATH.msgfmt= ${TOOLS_PREFIX.msgfmt}/bin/msgfmt
. endif
. endif
.endif
diff -r c3907f29f992 -r a81e0374770c mk/tools/msgfmt-msgctxt.awk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mk/tools/msgfmt-msgctxt.awk Fri Mar 20 16:13:02 2009 +0000
@@ -0,0 +1,19 @@
+# $NetBSD: msgfmt-msgctxt.awk,v 1.1 2009/03/20 16:13:02 joerg Exp $
+#
+# Simple awk script to strip out .po entries with "msgctxt" or "#~|", so the
+# resultant file can be handled by the msgfmt 0.14.x.
+{
+if (/^$/) { entry_end(); }
+else if ($1 == "msgctxt" || $2 == "msgctxt") { skip = 1; }
+else if ($1 == "#~|") { skip = 1; }
+else { entry = entry $0 "\n" }
+}
+
+END { entry_end(); }
+
+function entry_end() {
+ if (!skip)
+ print entry;
+ entry = "";
+ skip = 0;
+}
diff -r c3907f29f992 -r a81e0374770c mk/tools/msgfmt-msgid_plural.awk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mk/tools/msgfmt-msgid_plural.awk Fri Mar 20 16:13:02 2009 +0000
@@ -0,0 +1,262 @@
+# $NetBSD: msgfmt-msgid_plural.awk,v 1.1 2009/03/20 16:13:02 joerg Exp $
+#
+# Strip msgid_plural which is not understood by msgfmt before 0.10.36.
+#
+
+#
+# strip_bad_ctrl_sequences(string)
+# If we see \c, where c is anything but a legal character as
+# defined by msgfmt-0.10.35, then replace the backslash with a
+# '?'. Yes, this is a hack, but it works around a bug in the
+# way that older msgfmt mis-identifies some "control" sequences.
+#
+function strip_bad_ctrl_sequences(string, left, right) {
+ left = ""
+ right = string
+ while (match(right, /\\/) > 0) {
+ if (substr(right, RSTART + 1, 1) ~ /[bfnrtxX0-7"\\]/) {
+ left = left substr(right, 1, RSTART + 1)
+ right = substr(right, RSTART + 2)
+ } else {
+ left = left substr(right, 1, RSTART - 1) "?"
+ right = substr(right, RSTART + 1)
+ }
+ }
+ return left right
+}
+
+BEGIN {
+ EMPTY = "^$"
+ SPACE = "[ ]*"
+ KEYWORD_SEP = "([ ]+|[ ]*\"|$)"
+ OBSOLETE = "#~ "
+ OBSOLETE_RE = "^(#~[ ]+)?[ ]*"
+ OBSOLETE_RE_MATCH = "^#~[ ]+"
+ MSG_CONTINUATION_RE = OBSOLETE_RE "\""
+
+ result = getline
+ if (result < 1) exit result
+
+ s = 0
+ p = 0
+ obsolete = ""
+
+ while (result == 1) {
+
+ # Buffer any "msgid" statements into the singular array.
+ # Strip all trailing empty strings that have no effect on
+ # the output.
+ #
+ MSGID_RE = OBSOLETE_RE "msgid"
+ if ($0 ~ MSGID_RE KEYWORD_SEP) {
+ obsolete = ""
+ if ($0 ~ OBSOLETE_RE_MATCH) obsolete = OBSOLETE
+ sub(MSGID_RE SPACE, "");
+ s = 0
+ if ($0 ~ EMPTY) $0 = "\"\""
+ $0 = strip_bad_ctrl_sequences($0)
+ singular[s++] = $0
+ while (result = getline) {
+ if ($0 ~ OBSOLETE_RE "$") continue
+ if ($0 !~ MSG_CONTINUATION_RE) break
+ sub(OBSOLETE_RE , "")
+ $0 = strip_bad_ctrl_sequences($0)
+ singular[s++] = $0
+ }
+ if (result < 0) break
+ while ((s > 1) && (singular[s-1] ~ /^""$/)) s--
+ continue
+ }
+
+ # Buffer any "msgid_plural" statements into the plural
+ # array. Strip all trailing empty strings that have no
+ # effect on the output.
+ #
+ MSGID_PLURAL_RE = OBSOLETE_RE "msgid_plural"
+ if ($0 ~ MSGID_PLURAL_RE KEYWORD_SEP) {
+ obsolete = ""
+ if ($0 ~ OBSOLETE_RE_MATCH) obsolete = OBSOLETE
+ sub(MSGID_PLURAL_RE SPACE, "");
+ p = 0
+ if ($0 ~ EMPTY) $0 = "\"\""
+ $0 = strip_bad_ctrl_sequences($0)
+ plural[p++] = $0
+ while (result = getline) {
+ if ($0 ~ OBSOLETE_RE "$") continue
+ if ($0 !~ MSG_CONTINUATION_RE) break
+ sub(OBSOLETE_RE, "")
+ $0 = strip_bad_ctrl_sequences($0)
+ plural[p++] = $0
+ }
+ if (result < 0) break
+ while ((p > 1) && (plural[p-1] ~ /^""$/)) p--
+ continue
+ }
+
+ # If we see "msgstr", then we are outputting the
+ # translation of a singular form of a message, so dump
+ # the contents of the singular array and output the
+ # "msgstr" translation. Strip all trailing empty strings
+ # that have no effect on the output, and handle "\n"
+ # pickiness between msgid and msgstr.
+ #
+ MSGSTR_RE = OBSOLETE_RE "msgstr"
+ if ($0 ~ MSGSTR_RE KEYWORD_SEP) {
+ if (s > 0) {
+ print obsolete "msgid " singular[0]
+ for (i = 1; i < s; i++)
+ print obsolete singular[i]
+ }
+ if ($0 ~ OBSOLETE_RE_MATCH) obsolete = OBSOLETE
+ sub(MSGSTR_RE SPACE, "")
+ t = 0
+ if ($0 ~ EMPTY) $0 = "\"\""
+ $0 = strip_bad_ctrl_sequences($0)
+ translation[t++] = $0
+ while (result = getline) {
+ if ($0 !~ MSG_CONTINUATION_RE) break
+ sub(OBSOLETE_RE, "")
+ $0 = strip_bad_ctrl_sequences($0)
+ translation[t++] = $0
+ }
+ if (result < 0) break
+ while ((t > 1) && (translation[t-1] ~ /^""$/)) t--
+ if ((singular[s-1] ~ /\\n"$/) &&
+ (translation[t-1] !~ /\\n"$/)) {
+ if (translation[t-1] !~ /""/)
+ sub("\"$", "\\n\"", translation[t-1])
+ }
+ if (t > 0) {
+ print obsolete "msgstr " translation[0]
+ for (i = 1; i < t; i++)
+ print obsolete translation[i]
+ }
+ continue
+ }
+
+ # If we see "msgstr[0]", then we are outputting the
+ # translation of a singular form of a message, so dump
+ # the contents of the singular array and output the
+ # "msgstr[0]" translation. Strip all trailing empty
+ # strings that have no effect on the output, and handle
+ # "\n" pickiness between msgid and msgstr.
+ #
+ MSGSTR0_RE = OBSOLETE_RE "msgstr[[]0[]]"
+ if ($0 ~ MSGSTR0_RE KEYWORD_SEP) {
+ if (s > 0) {
+ print obsolete "msgid " singular[0]
+ for (i = 1; i < s; i++)
+ print obsolete singular[i]
+ }
+ if ($0 ~ OBSOLETE_RE_MATCH) obsolete = OBSOLETE
+ sub(MSGSTR0_RE SPACE, "");
+ t = 0
+ if ($0 ~ EMPTY) $0 = "\"\""
+ $0 = strip_bad_ctrl_sequences($0)
+ translation[t++] = $0
+ while (result = getline) {
+ if ($0 !~ MSG_CONTINUATION_RE) break
+ sub(OBSOLETE_RE, "")
+ $0 = strip_bad_ctrl_sequences($0)
+ translation[t++] = $0
+ }
+ if (result < 0) break
+ while ((t > 1) && (translation[t-1] ~ /^""$/)) t--
+ if ((singular[s-1] ~ /\\n"$/) &&
+ (translation[t-1] !~ /\\n"$/)) {
+ if (translation[t-1] !~ /""/)
+ sub("\"$", "\\n\"", translation[t-1])
+ }
+ if (t > 0) {
+ print obsolete "msgstr " translation[0]
+ for (i = 1; i < t; i++)
+ print obsolete translation[i]
+ }
+ continue
+ }
+
+ # If we see "msgstr[1]", then we are outputting the
+ # translation of a plural form of a message, so dump
+ # the contents of the plural array and output the
+ # "msgstr[1]" translation. Strip all trailing empty
+ # strings that have no effect on the output, and handle
+ # "\n" pickiness between msgid and msgstr.
+ #
+ MSGSTR1_RE = OBSOLETE_RE "msgstr[[]1[]]"
+ if ($0 ~ MSGSTR1_RE KEYWORD_SEP) {
+ #
+ # Check if the singular and plural arrays are equal.
+ # If they are, then we do not need to output an
+ # additional plural translation at all since the
+ # "singular" form is already correct.
+ #
+ equal = 0
+ if (s == p) {
+ equal = 1;
+ for (i = 0; i < s; i++) {
+ if (singular[i] != plural[i]) {
+ equal = 0; break
+ }
+ }
+ }
Home |
Main Index |
Thread Index |
Old Index