summaryrefslogtreecommitdiff
path: root/mk/tools/msgfmt.sh
diff options
context:
space:
mode:
authorjoerg <joerg@pkgsrc.org>2009-03-20 16:13:02 +0000
committerjoerg <joerg@pkgsrc.org>2009-03-20 16:13:02 +0000
commit5f72a77f4ad612097645f263b41438b105c52536 (patch)
tree95eca6c8a3b7faa4e3ae0cd6e71d69dcc4ac4041 /mk/tools/msgfmt.sh
parent543cd10f9f12274db7f2f2b714ad7fd9c4edaf73 (diff)
downloadpkgsrc-5f72a77f4ad612097645f263b41438b105c52536.tar.gz
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 (limited to 'mk/tools/msgfmt.sh')
-rwxr-xr-xmk/tools/msgfmt.sh271
1 files changed, 11 insertions, 260 deletions
diff --git a/mk/tools/msgfmt.sh b/mk/tools/msgfmt.sh
index 585736993b7..cf122d54b8c 100755
--- a/mk/tools/msgfmt.sh
+++ b/mk/tools/msgfmt.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# $NetBSD: msgfmt.sh,v 1.29 2007/09/25 10:32:17 hira Exp $
+# $NetBSD: msgfmt.sh,v 1.30 2009/03/20 16:13:02 joerg Exp $
#
# Copyright (c) 2006 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -158,262 +158,13 @@ if test "$pofile" != "-" -a ! -e "$pofile"; then
pofile="$popofile"
fi
-${CAT} $pofile | ${AWK} '
-#
-# 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
- }
- }
- }
- if (equal == 1) {
- while (result = getline) {
- if ($0 !~ MSG_CONTINUATION_RE) break
- }
- if (result < 0) break
- s = 0; p = 0
- continue
- }
-
- if (p > 0) {
- print obsolete "msgid " plural[0]
- for (i = 1; i < p; i++)
- print obsolete plural[i]
- }
- if ($0 ~ OBSOLETE_RE_MATCH) obsolete = OBSOLETE
- sub(MSGSTR1_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 ((plural[p-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
- }
-
- # We drop all other "msgstr[N]" translations since the
- # old format only supported a single translation per
- # plural form.
- #
- MSGSTRN_RE = OBSOLETE_RE "msgstr[[][0-9]+[]]"
- if ($0 ~ MSGSTRN_RE KEYWORD_SEP) {
- while (result = getline) {
- if ($0 !~ MSG_CONTINUATION_RE) break
- print $0
- }
- if (result < 0) break
- continue
- }
-
- # Pass everything else verbatim.
- print $0
- result = getline
- if (result < 0) break
- }
-}
-' | $debug | $cmd
+${CAT} $pofile | \
+if test "${MSGFMT_STRIP_MSGCTX}" = "yes"; then
+ ${AWK} -f ${PKGSRCDIR}/mk/tools/msgfmt-msgctx.awk
+else
+ ${CAT}
+fi | if test "$MSGFMT_STRIP_MSGID_PLURAL" = "yes"; then
+ ${AWK} -f ${PKGSRCDIR}/mk/tools/msgfmt-msgid_plural.awk
+else
+ ${CAT}
+fi | $debug | $cmd