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