summaryrefslogtreecommitdiffstats
path: root/gettext-tools
diff options
context:
space:
mode:
authorDaiki Ueno <ueno@gnu.org>2014-03-24 18:43:01 +0900
committerDaiki Ueno <ueno@gnu.org>2014-03-25 17:05:41 +0900
commit90c76fda268779b80c2fa969b8efddbb4aa5da1e (patch)
tree35736c9950945b19fad8244a89907d20d29c2b5b /gettext-tools
parent0c94b1c6d7a118b64e50644242cd498b60bfa518 (diff)
downloadexternal_gettext-90c76fda268779b80c2fa969b8efddbb4aa5da1e.zip
external_gettext-90c76fda268779b80c2fa969b8efddbb4aa5da1e.tar.gz
external_gettext-90c76fda268779b80c2fa969b8efddbb4aa5da1e.tar.bz2
Extend --add-location option to suppress line number output
The --add-location option of msgattrib, msgcat, msgcomm, msgconv, msgen, msgfilter, msggrep, msgmerge, msguniq, and xgettext commands now takes an optional argument 'never', 'full', or 'file', to control the format of "#: ..." comments. The default catalog reader changed to always remember file positions so the line number part can be suppressed in output phase rather than input phase.
Diffstat (limited to 'gettext-tools')
-rw-r--r--gettext-tools/doc/ChangeLog14
-rw-r--r--gettext-tools/doc/msgattrib.texi8
-rw-r--r--gettext-tools/doc/msgcat.texi8
-rw-r--r--gettext-tools/doc/msgcomm.texi8
-rw-r--r--gettext-tools/doc/msgconv.texi9
-rw-r--r--gettext-tools/doc/msgen.texi9
-rw-r--r--gettext-tools/doc/msgfilter.texi9
-rw-r--r--gettext-tools/doc/msggrep.texi9
-rw-r--r--gettext-tools/doc/msgmerge.texi9
-rw-r--r--gettext-tools/doc/msguniq.texi8
-rw-r--r--gettext-tools/doc/xgettext.texi8
-rw-r--r--gettext-tools/src/ChangeLog42
-rw-r--r--gettext-tools/src/msgattrib.c15
-rw-r--r--gettext-tools/src/msgcat.c15
-rw-r--r--gettext-tools/src/msgcomm.c15
-rw-r--r--gettext-tools/src/msgconv.c21
-rw-r--r--gettext-tools/src/msgen.c24
-rw-r--r--gettext-tools/src/msgfilter.c21
-rw-r--r--gettext-tools/src/msgfmt.c4
-rw-r--r--gettext-tools/src/msggrep.c21
-rw-r--r--gettext-tools/src/msgmerge.c21
-rw-r--r--gettext-tools/src/msguniq.c15
-rw-r--r--gettext-tools/src/read-catalog.c69
-rw-r--r--gettext-tools/src/read-catalog.h8
-rw-r--r--gettext-tools/src/write-po.c86
-rw-r--r--gettext-tools/src/write-po.h13
-rw-r--r--gettext-tools/src/x-po.c1
-rw-r--r--gettext-tools/src/xgettext.c18
-rw-r--r--gettext-tools/tests/ChangeLog15
-rw-r--r--gettext-tools/tests/Makefile.am20
-rwxr-xr-xgettext-tools/tests/msgattrib-1898
-rwxr-xr-xgettext-tools/tests/msgcat-1966
-rwxr-xr-xgettext-tools/tests/msgcomm-2837
-rwxr-xr-xgettext-tools/tests/msgconv-743
-rwxr-xr-xgettext-tools/tests/msgen-468
-rwxr-xr-xgettext-tools/tests/msgfilter-5169
-rwxr-xr-xgettext-tools/tests/msggrep-11189
-rwxr-xr-xgettext-tools/tests/msgmerge-2569
-rwxr-xr-xgettext-tools/tests/msguniq-730
-rwxr-xr-xgettext-tools/tests/xgettext-1036
40 files changed, 1187 insertions, 161 deletions
diff --git a/gettext-tools/doc/ChangeLog b/gettext-tools/doc/ChangeLog
index beadd9c..fe21c4e 100644
--- a/gettext-tools/doc/ChangeLog
+++ b/gettext-tools/doc/ChangeLog
@@ -1,3 +1,17 @@
+2014-03-25 Daiki Ueno <ueno@gnu.org>
+
+ * msgattrib.texi: Document the optional argument of
+ --add-location.
+ * msgcat.texi: Likewise.
+ * msgcomm.texi: Likewise.
+ * msgconv.texi: Likewise.
+ * msgen.texi: Likewise.
+ * msgfilter.texi: Likewise.
+ * msggrep.texi: Likewise.
+ * msgmerge.texi: Likewise.
+ * msguniq.texi: Likewise.
+ * xgettext.texi: Likewise.
+
2014-03-15 Daiki Ueno <ueno@gnu.org>
* FAQ.html: Point to bug-gettext@gnu.org rather than
diff --git a/gettext-tools/doc/msgattrib.texi b/gettext-tools/doc/msgattrib.texi
index 0f2749b..998b8b0 100644
--- a/gettext-tools/doc/msgattrib.texi
+++ b/gettext-tools/doc/msgattrib.texi
@@ -214,11 +214,17 @@ Write the .po file using indented style.
Do not write @samp{#: @var{filename}:@var{line}} lines.
@item -n
-@itemx --add-location
+@itemx --add-location=@var{type}
@opindex -n@r{, @code{msgattrib} option}
@opindex --add-location@r{, @code{msgattrib} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msgattrib} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/msgcat.texi b/gettext-tools/doc/msgcat.texi
index 5b6b095..7c15050 100644
--- a/gettext-tools/doc/msgcat.texi
+++ b/gettext-tools/doc/msgcat.texi
@@ -147,11 +147,17 @@ Write the .po file using indented style.
Do not write @samp{#: @var{filename}:@var{line}} lines.
@item -n
-@itemx --add-location
+@itemx --add-location=@var{type}
@opindex -n@r{, @code{msgcat} option}
@opindex --add-location@r{, @code{msgcat} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msgcat} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/msgcomm.texi b/gettext-tools/doc/msgcomm.texi
index 29ef820..ae7c927 100644
--- a/gettext-tools/doc/msgcomm.texi
+++ b/gettext-tools/doc/msgcomm.texi
@@ -128,11 +128,17 @@ Write the .po file using indented style.
Do not write @samp{#: @var{filename}:@var{line}} lines.
@item -n
-@itemx --add-location
+@itemx --add-location=@var{type}
@opindex -n@r{, @code{msgcomm} option}
@opindex --add-location@r{, @code{msgcomm} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msgcomm} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/msgconv.texi b/gettext-tools/doc/msgconv.texi
index 6e58fd2..805a76f 100644
--- a/gettext-tools/doc/msgconv.texi
+++ b/gettext-tools/doc/msgconv.texi
@@ -100,10 +100,17 @@ Write the .po file using indented style.
@opindex --no-location@r{, @code{msgconv} option}
Do not write @samp{#: @var{filename}:@var{line}} lines.
-@item --add-location
+@item -n
+@itemx --add-location=@var{type}
@opindex --add-location@r{, @code{msgconv} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msgconv} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/msgen.texi b/gettext-tools/doc/msgen.texi
index 82f210d..3f61fa4 100644
--- a/gettext-tools/doc/msgen.texi
+++ b/gettext-tools/doc/msgen.texi
@@ -100,10 +100,17 @@ Write the .po file using indented style.
@opindex --no-location@r{, @code{msgen} option}
Do not write @samp{#: @var{filename}:@var{line}} lines.
-@item --add-location
+@item -n
+@itemx --add-location=@var{type}
@opindex --add-location@r{, @code{msgen} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msgen} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/msgfilter.texi b/gettext-tools/doc/msgfilter.texi
index 05c3fb8..73ea7c8 100644
--- a/gettext-tools/doc/msgfilter.texi
+++ b/gettext-tools/doc/msgfilter.texi
@@ -172,10 +172,17 @@ filtering like any other message.
@opindex --no-location@r{, @code{msgfilter} option}
Do not write @samp{#: @var{filename}:@var{line}} lines.
-@item --add-location
+@item -n
+@itemx --add-location=@var{type}
@opindex --add-location@r{, @code{msgfilter} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msgfilter} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/msggrep.texi b/gettext-tools/doc/msggrep.texi
index 31bc815..229b924 100644
--- a/gettext-tools/doc/msggrep.texi
+++ b/gettext-tools/doc/msggrep.texi
@@ -200,10 +200,17 @@ Write the .po file using indented style.
@opindex --no-location@r{, @code{msggrep} option}
Do not write @samp{#: @var{filename}:@var{line}} lines.
-@item --add-location
+@item -n
+@itemx --add-location=@var{type}
@opindex --add-location@r{, @code{msggrep} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msggrep} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/msgmerge.texi b/gettext-tools/doc/msgmerge.texi
index 3ecf024..ad76f0e 100644
--- a/gettext-tools/doc/msgmerge.texi
+++ b/gettext-tools/doc/msgmerge.texi
@@ -188,10 +188,17 @@ Write the .po file using indented style.
@opindex --no-location@r{, @code{msgmerge} option}
Do not write @samp{#: @var{filename}:@var{line}} lines.
-@item --add-location
+@item -n
+@itemx --add-location=@var{type}
@opindex --add-location@r{, @code{msgmerge} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msgmerge} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/msguniq.texi b/gettext-tools/doc/msguniq.texi
index 120a8fe..4bb6ffd 100644
--- a/gettext-tools/doc/msguniq.texi
+++ b/gettext-tools/doc/msguniq.texi
@@ -125,11 +125,17 @@ Write the .po file using indented style.
Do not write @samp{#: @var{filename}:@var{line}} lines.
@item -n
-@itemx --add-location
+@itemx --add-location=@var{type}
@opindex -n@r{, @code{msguniq} option}
@opindex --add-location@r{, @code{msguniq} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{msguniq} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/doc/xgettext.texi b/gettext-tools/doc/xgettext.texi
index 1089e9c..c8adc27 100644
--- a/gettext-tools/doc/xgettext.texi
+++ b/gettext-tools/doc/xgettext.texi
@@ -395,11 +395,17 @@ this option makes it harder for technically skilled translators to understand
each message's context.
@item -n
-@itemx --add-location
+@itemx --add-location=@var{type}
@opindex -n@r{, @code{xgettext} option}
@opindex --add-location@r{, @code{xgettext} option}
Generate @samp{#: @var{filename}:@var{line}} lines (default).
+The optional @var{type} can be either @samp{full}, @samp{file}, or
+@samp{never}. If it is not given or @samp{full}, it generates the
+lines with both file name and line number. If it is @samp{file}, the
+line number part is omitted. If it is @samp{never}, it completely
+suppresses the lines (same as @code{--no-location}).
+
@item --strict
@opindex --strict@r{, @code{xgettext} option}
Write out a strict Uniforum conforming PO file. Note that this
diff --git a/gettext-tools/src/ChangeLog b/gettext-tools/src/ChangeLog
index 06a59bd..8db3725 100644
--- a/gettext-tools/src/ChangeLog
+++ b/gettext-tools/src/ChangeLog
@@ -1,3 +1,45 @@
+2014-03-25 Daiki Ueno <ueno@gnu.org>
+
+ Extend --add-location option to suppress line number output
+ The --add-location option of msgattrib, msgcat, msgcomm, msgconv,
+ msgen, msgfilter, msggrep, msgmerge, msguniq, and xgettext
+ commands now got new semantics. It takes an optional argument
+ 'never', 'full', or 'file', to control the format of "#: ..."
+ comments.
+ The default catalog reader changed to always remember file
+ positions so the line number part can be suppressed in output
+ phase rather than input phase.
+ Feature requested in:
+ <https://lists.gnu.org/archive/html/bug-gettext/2013-08/msg00039.html>.
+ * read-catalog.h (line_comment): Abolish.
+ (DEFAULT_CATALOG_READER_TY): Remove handle_filepos_comments field.
+ * read-catalog.c (line_comment): Abolish.
+ (default_destructor, default_copy_comment_state)
+ (default_reset_comment_state, default_comment_filepos): Always
+ remember filepos.
+ (default_parse_brief, read_catalog_stream): Adjust to the change.
+ * write-po.h (enum filepos_comment_type): New enum.
+ (message_print_style_filepos): New function declaration.
+ (handle_filepos_comment_option): New function declaration.
+ * write-po.c (message_print_style_filepos): New function
+ (handle_filepos_comment_option): New function.
+ (message_print_comment_filepos): Uniquify mp->filepos elements
+ ignoring line number if filepos_comment_type is
+ filepos_comment_file.
+ * msgfmt.c: Adjust to the change.
+ * msgattrib.c (long_options, main): Allow --add-location option to
+ take an optional format specifier.
+ * msgcat.c (long_options, main): Likewise.
+ * msgcomm.c (long_options, main): Likewise.
+ * msguniq.c (long_options, main): Likewise.
+ * xgettext.c (long_options, main): Likewise.
+ * msgconv.c (long_options, main): Likewise; add a new option -n as
+ an alias of --add-location.
+ * msgen.c (long_options, main): Likewise.
+ * msgfilter.c (long_options, main): Likewise.
+ * msggrep.c (long_options, main): Likewise.
+ * msgmerge.c (long_options, main): Likewise.
+
2014-03-12 Daiki Ueno <ueno@gnu.org>
xgettext: Fix infloop on loading Glade files with non-DL expat
diff --git a/gettext-tools/src/msgattrib.c b/gettext-tools/src/msgattrib.c
index 7732315..01b6f97 100644
--- a/gettext-tools/src/msgattrib.c
+++ b/gettext-tools/src/msgattrib.c
@@ -80,7 +80,7 @@ static int to_change;
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "clear-fuzzy", no_argument, NULL, CHAR_MAX + 8 },
{ "clear-obsolete", no_argument, NULL, CHAR_MAX + 10 },
{ "clear-previous", no_argument, NULL, CHAR_MAX + 18 },
@@ -94,7 +94,7 @@ static const struct option long_options[] =
{ "indent", no_argument, NULL, 'i' },
{ "no-escape", no_argument, NULL, 'e' },
{ "no-fuzzy", no_argument, NULL, CHAR_MAX + 3 },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 22 },
{ "no-obsolete", no_argument, NULL, CHAR_MAX + 5 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 13 },
{ "obsolete", no_argument, NULL, CHAR_MAX + 12 },
@@ -207,7 +207,8 @@ main (int argc, char **argv)
break;
case 'n':
- line_comment = 1;
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
break;
case 'o':
@@ -331,6 +332,10 @@ main (int argc, char **argv)
to_change |= ADD_PREV;
break;
+ case CHAR_MAX + 22: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
/* NOTREACHED */
@@ -367,10 +372,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
}
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
diff --git a/gettext-tools/src/msgcat.c b/gettext-tools/src/msgcat.c
index 7c36730..0cc432c 100644
--- a/gettext-tools/src/msgcat.c
+++ b/gettext-tools/src/msgcat.c
@@ -62,7 +62,7 @@ static const char *to_code;
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "color", optional_argument, NULL, CHAR_MAX + 5 },
{ "directory", required_argument, NULL, 'D' },
{ "escape", no_argument, NULL, 'E' },
@@ -72,7 +72,7 @@ static const struct option long_options[] =
{ "indent", no_argument, NULL, 'i' },
{ "lang", required_argument, NULL, CHAR_MAX + 7 },
{ "no-escape", no_argument, NULL, 'e' },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 8 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 2 },
{ "output-file", required_argument, NULL, 'o' },
{ "properties-input", no_argument, NULL, 'P' },
@@ -202,7 +202,8 @@ main (int argc, char **argv)
break;
case 'n':
- line_comment = 1;
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
break;
case 'o':
@@ -276,6 +277,10 @@ main (int argc, char **argv)
catalogname = optarg;
break;
+ case CHAR_MAX + 8: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
/* NOTREACHED */
@@ -307,10 +312,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
}
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
diff --git a/gettext-tools/src/msgcomm.c b/gettext-tools/src/msgcomm.c
index e965dba..daddf2b 100644
--- a/gettext-tools/src/msgcomm.c
+++ b/gettext-tools/src/msgcomm.c
@@ -63,7 +63,7 @@ static const char *to_code;
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "color", optional_argument, NULL, CHAR_MAX + 5 },
{ "directory", required_argument, NULL, 'D' },
{ "escape", no_argument, NULL, 'E' },
@@ -72,7 +72,7 @@ static const struct option long_options[] =
{ "help", no_argument, NULL, 'h' },
{ "indent", no_argument, NULL, 'i' },
{ "no-escape", no_argument, NULL, 'e' },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 7 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 2 },
{ "omit-header", no_argument, NULL, CHAR_MAX + 1 },
{ "output", required_argument, NULL, 'o' }, /* for backward compatibility */
@@ -197,7 +197,8 @@ main (int argc, char *argv[])
break;
case 'n':
- line_comment = 1;
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
break;
case 'o':
@@ -267,6 +268,10 @@ main (int argc, char *argv[])
handle_style_option (optarg);
break;
+ case CHAR_MAX + 7: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
/* NOTREACHED */
@@ -292,10 +297,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
usage (EXIT_SUCCESS);
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
diff --git a/gettext-tools/src/msgconv.c b/gettext-tools/src/msgconv.c
index af1361a..5c9f7ea 100644
--- a/gettext-tools/src/msgconv.c
+++ b/gettext-tools/src/msgconv.c
@@ -60,7 +60,7 @@ static const char *to_code;
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "color", optional_argument, NULL, CHAR_MAX + 4 },
{ "directory", required_argument, NULL, 'D' },
{ "escape", no_argument, NULL, 'E' },
@@ -68,7 +68,7 @@ static const struct option long_options[] =
{ "help", no_argument, NULL, 'h' },
{ "indent", no_argument, NULL, 'i' },
{ "no-escape", no_argument, NULL, 'e' },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 6 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 1 },
{ "output-file", required_argument, NULL, 'o' },
{ "properties-input", no_argument, NULL, 'P' },
@@ -131,7 +131,7 @@ main (int argc, char **argv)
output_file = NULL;
input_file = NULL;
- while ((opt = getopt_long (argc, argv, "D:eEFhio:pPst:Vw:", long_options,
+ while ((opt = getopt_long (argc, argv, "D:eEFhin:o:pPst:Vw:", long_options,
NULL))
!= EOF)
switch (opt)
@@ -163,6 +163,11 @@ main (int argc, char **argv)
message_print_style_indent ();
break;
+ case 'n':
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
+ break;
+
case 'o':
output_file = optarg;
break;
@@ -222,6 +227,10 @@ main (int argc, char **argv)
handle_style_option (optarg);
break;
+ case CHAR_MAX + 6: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
break;
@@ -258,10 +267,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
}
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
@@ -360,7 +365,7 @@ Output details:\n"));
printf (_("\
--no-location suppress '#: filename:line' lines\n"));
printf (_("\
- --add-location preserve '#: filename:line' lines (default)\n"));
+ -n, --add-location preserve '#: filename:line' lines (default)\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
diff --git a/gettext-tools/src/msgen.c b/gettext-tools/src/msgen.c
index 2ec3d5e..e33c61a 100644
--- a/gettext-tools/src/msgen.c
+++ b/gettext-tools/src/msgen.c
@@ -57,7 +57,7 @@ static int force_po;
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "color", optional_argument, NULL, CHAR_MAX + 5 },
{ "directory", required_argument, NULL, 'D' },
{ "escape", no_argument, NULL, 'E' },
@@ -66,7 +66,7 @@ static const struct option long_options[] =
{ "indent", no_argument, NULL, 'i' },
{ "lang", required_argument, NULL, CHAR_MAX + 4 },
{ "no-escape", no_argument, NULL, 'e' },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 7 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 1 },
{ "output-file", required_argument, NULL, 'o' },
{ "properties-input", no_argument, NULL, 'P' },
@@ -128,8 +128,9 @@ main (int argc, char **argv)
do_version = false;
output_file = NULL;
- while ((opt = getopt_long (argc, argv, "D:eEFhio:pPsVw:", long_options, NULL))
- != EOF)
+ while ((opt = getopt_long (argc, argv,
+ "D:eEFhin:o:pPsVw:",
+ long_options, NULL)) != EOF)
switch (opt)
{
case '\0': /* Long option. */
@@ -159,6 +160,11 @@ main (int argc, char **argv)
message_print_style_indent ();
break;
+ case 'n':
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
+ break;
+
case 'o':
output_file = optarg;
break;
@@ -218,6 +224,10 @@ main (int argc, char **argv)
handle_style_option (optarg);
break;
+ case CHAR_MAX + 7: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
break;
@@ -255,10 +265,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
}
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
@@ -355,7 +361,7 @@ Output details:\n"));
printf (_("\
--no-location suppress '#: filename:line' lines\n"));
printf (_("\
- --add-location preserve '#: filename:line' lines (default)\n"));
+ -n, --add-location preserve '#: filename:line' lines (default)\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
diff --git a/gettext-tools/src/msgfilter.c b/gettext-tools/src/msgfilter.c
index c414140..b92eef0 100644
--- a/gettext-tools/src/msgfilter.c
+++ b/gettext-tools/src/msgfilter.c
@@ -87,7 +87,7 @@ static void (*filter) (const char *str, size_t len, char **resultp, size_t *leng
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "color", optional_argument, NULL, CHAR_MAX + 6 },
{ "directory", required_argument, NULL, 'D' },
{ "escape", no_argument, NULL, 'E' },
@@ -97,7 +97,7 @@ static const struct option long_options[] =
{ "input", required_argument, NULL, 'i' },
{ "keep-header", no_argument, &keep_header, 1 },
{ "no-escape", no_argument, NULL, CHAR_MAX + 2 },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 8 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 3 },
{ "output-file", required_argument, NULL, 'o' },
{ "properties-input", no_argument, NULL, 'P' },
@@ -164,7 +164,7 @@ main (int argc, char **argv)
/* The '+' in the options string causes option parsing to terminate when
the first non-option, i.e. the subprogram name, is encountered. */
- while ((opt = getopt_long (argc, argv, "+D:EFhi:o:pPsVw:", long_options,
+ while ((opt = getopt_long (argc, argv, "+D:EFhi:n:o:pPsVw:", long_options,
NULL))
!= EOF)
switch (opt)
@@ -197,6 +197,11 @@ main (int argc, char **argv)
input_file = optarg;
break;
+ case 'n':
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
+ break;
+
case 'o':
output_file = optarg;
break;
@@ -260,6 +265,10 @@ main (int argc, char **argv)
handle_style_option (optarg);
break;
+ case CHAR_MAX + 8: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
break;
@@ -290,10 +299,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
sub_name = argv[optind];
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
@@ -456,7 +461,7 @@ Output details:\n"));
printf (_("\
--no-location suppress '#: filename:line' lines\n"));
printf (_("\
- --add-location preserve '#: filename:line' lines (default)\n"));
+ -n, --add-location preserve '#: filename:line' lines (default)\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
diff --git a/gettext-tools/src/msgfmt.c b/gettext-tools/src/msgfmt.c
index 4da999a..e51319d 100644
--- a/gettext-tools/src/msgfmt.c
+++ b/gettext-tools/src/msgfmt.c
@@ -846,8 +846,7 @@ is_nonobsolete (const message_ty *mp)
default_catalog_reader_ty. Its particularities are:
- The header entry check is performed on-the-fly.
- Comments are not stored, they are discarded right away.
- (This is achieved by setting handle_comments = false and
- handle_filepos_comments = false.)
+ (This is achieved by setting handle_comments = false.)
- The multi-domain handling is adapted to our domain_list.
*/
@@ -1107,7 +1106,6 @@ read_catalog_file_msgfmt (char *filename, catalog_input_format_ty input_syntax)
pop = default_catalog_reader_alloc (&msgfmt_methods);
pop->handle_comments = false;
- pop->handle_filepos_comments = false;
pop->allow_domain_directives = true;
pop->allow_duplicates = false;
pop->allow_duplicates_if_same_msgstr = false;
diff --git a/gettext-tools/src/msggrep.c b/gettext-tools/src/msggrep.c
index 3b12e93..73ccb94 100644
--- a/gettext-tools/src/msggrep.c
+++ b/gettext-tools/src/msggrep.c
@@ -91,7 +91,7 @@ static struct grep_task grep_task[5];
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "color", optional_argument, NULL, CHAR_MAX + 9 },
{ "comment", no_argument, NULL, 'C' },
{ "directory", required_argument, NULL, 'D' },
@@ -111,7 +111,7 @@ static const struct option long_options[] =
{ "msgid", no_argument, NULL, 'K' },
{ "msgstr", no_argument, NULL, 'T' },
{ "no-escape", no_argument, NULL, CHAR_MAX + 3 },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 11 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 6 },
{ "output-file", required_argument, NULL, 'o' },
{ "properties-input", no_argument, NULL, 'P' },
@@ -196,7 +196,7 @@ main (int argc, char **argv)
gt->case_insensitive = false;
}
- while ((opt = getopt_long (argc, argv, "CD:e:Ef:FhiJKM:N:o:pPTvVw:X",
+ while ((opt = getopt_long (argc, argv, "CD:e:Ef:FhiJKM:n:N:o:pPTvVw:X",
long_options, NULL))
!= EOF)
switch (opt)
@@ -310,6 +310,11 @@ error while reading \"%s\""), optarg);
string_list_append (domain_names, optarg);
break;
+ case 'n':
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
+ break;
+
case 'N':
string_list_append (location_files, optarg);
break;
@@ -397,6 +402,10 @@ error while reading \"%s\""), optarg);
handle_style_option (optarg);
break;
+ case CHAR_MAX + 11: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
break;
@@ -433,10 +442,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
}
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
@@ -603,7 +608,7 @@ Output details:\n"));
printf (_("\
--no-location suppress '#: filename:line' lines\n"));
printf (_("\
- --add-location preserve '#: filename:line' lines (default)\n"));
+ -n, --add-location preserve '#: filename:line' lines (default)\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
diff --git a/gettext-tools/src/msgmerge.c b/gettext-tools/src/msgmerge.c
index 3f96d3e..7c7add9 100644
--- a/gettext-tools/src/msgmerge.c
+++ b/gettext-tools/src/msgmerge.c
@@ -107,7 +107,7 @@ static const char *backup_suffix_string;
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "backup", required_argument, NULL, CHAR_MAX + 1 },
{ "color", optional_argument, NULL, CHAR_MAX + 9 },
{ "compendium", required_argument, NULL, 'C', },
@@ -120,7 +120,7 @@ static const struct option long_options[] =
{ "multi-domain", no_argument, NULL, 'm' },
{ "no-escape", no_argument, NULL, 'e' },
{ "no-fuzzy-matching", no_argument, NULL, 'N' },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 11 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 4 },
{ "output-file", required_argument, NULL, 'o' },
{ "previous", no_argument, NULL, CHAR_MAX + 7 },
@@ -204,7 +204,7 @@ main (int argc, char **argv)
do_version = false;
output_file = NULL;
- while ((opt = getopt_long (argc, argv, "C:D:eEFhimNo:pPqsUvVw:",
+ while ((opt = getopt_long (argc, argv, "C:D:eEFhimn:No:pPqsUvVw:",
long_options, NULL))
!= EOF)
switch (opt)
@@ -244,6 +244,11 @@ main (int argc, char **argv)
multi_domain_mode = true;
break;
+ case 'n':
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
+ break;
+
case 'N':
use_fuzzy_matching = false;
break;
@@ -331,6 +336,10 @@ main (int argc, char **argv)
handle_style_option (optarg);
break;
+ case CHAR_MAX + 11: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
break;
@@ -392,10 +401,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
}
}
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
@@ -581,7 +586,7 @@ Output details:\n"));
printf (_("\
--no-location suppress '#: filename:line' lines\n"));
printf (_("\
- --add-location preserve '#: filename:line' lines (default)\n"));
+ -n, --add-location preserve '#: filename:line' lines (default)\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
diff --git a/gettext-tools/src/msguniq.c b/gettext-tools/src/msguniq.c
index 9f1add6..24f4c31 100644
--- a/gettext-tools/src/msguniq.c
+++ b/gettext-tools/src/msguniq.c
@@ -60,7 +60,7 @@ static const char *to_code;
/* Long options. */
static const struct option long_options[] =
{
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "color", optional_argument, NULL, CHAR_MAX + 5 },
{ "directory", required_argument, NULL, 'D' },
{ "escape", no_argument, NULL, 'E' },
@@ -68,7 +68,7 @@ static const struct option long_options[] =
{ "help", no_argument, NULL, 'h' },
{ "indent", no_argument, NULL, 'i' },
{ "no-escape", no_argument, NULL, 'e' },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 7 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 2 },
{ "output-file", required_argument, NULL, 'o' },
{ "properties-input", no_argument, NULL, 'P' },
@@ -175,7 +175,8 @@ main (int argc, char **argv)
break;
case 'n':
- line_comment = 1;
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
break;
case 'o':
@@ -246,6 +247,10 @@ main (int argc, char **argv)
handle_style_option (optarg);
break;
+ case CHAR_MAX + 7: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
/* NOTREACHED */
@@ -282,10 +287,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
}
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
diff --git a/gettext-tools/src/read-catalog.c b/gettext-tools/src/read-catalog.c
index 51e96e8..4642249 100644
--- a/gettext-tools/src/read-catalog.c
+++ b/gettext-tools/src/read-catalog.c
@@ -112,6 +112,7 @@ void
default_destructor (abstract_catalog_reader_ty *that)
{
default_catalog_reader_ty *this = (default_catalog_reader_ty *) that;
+ size_t j;
/* Do not free this->mdlp and this->mlp. */
if (this->handle_comments)
@@ -121,24 +122,19 @@ default_destructor (abstract_catalog_reader_ty *that)
if (this->comment_dot != NULL)
string_list_free (this->comment_dot);
}
- if (this->handle_filepos_comments)
- {
- size_t j;
- for (j = 0; j < this->filepos_count; ++j)
- free (this->filepos[j].file_name);
- if (this->filepos != NULL)
- free (this->filepos);
- }
+ for (j = 0; j < this->filepos_count; ++j)
+ free (this->filepos[j].file_name);
+ if (this->filepos != NULL)
+ free (this->filepos);
}
void
default_parse_brief (abstract_catalog_reader_ty *that)
{
- /* We need to parse comments, because even if this->handle_comments and
- this->handle_filepos_comments are false, we need to know which messages
- are fuzzy. */
+ /* We need to parse comments, because even if this->handle_comments
+ is false, we need to know which messages are fuzzy. */
po_lex_pass_comments (true);
}
@@ -164,15 +160,12 @@ default_copy_comment_state (default_catalog_reader_ty *this, message_ty *mp)
for (j = 0; j < this->comment_dot->nitems; ++j)
message_comment_dot_append (mp, this->comment_dot->item[j]);
}
- if (this->handle_filepos_comments)
+ for (j = 0; j < this->filepos_count; ++j)
{
- for (j = 0; j < this->filepos_count; ++j)
- {
- lex_pos_ty *pp;
+ lex_pos_ty *pp;
- pp = &this->filepos[j];
- message_comment_filepos (mp, pp->file_name, pp->line_number);
- }
+ pp = &this->filepos[j];
+ message_comment_filepos (mp, pp->file_name, pp->line_number);
}
mp->is_fuzzy = this->is_fuzzy;
for (i = 0; i < NFORMATS; i++)
@@ -200,15 +193,12 @@ default_reset_comment_state (default_catalog_reader_ty *this)
this->comment_dot = NULL;
}
}
- if (this->handle_filepos_comments)
- {
- for (j = 0; j < this->filepos_count; ++j)
- free (this->filepos[j].file_name);
- if (this->filepos != NULL)
- free (this->filepos);
- this->filepos_count = 0;
- this->filepos = NULL;
- }
+ for (j = 0; j < this->filepos_count; ++j)
+ free (this->filepos[j].file_name);
+ if (this->filepos != NULL)
+ free (this->filepos);
+ this->filepos_count = 0;
+ this->filepos = NULL;
this->is_fuzzy = false;
for (i = 0; i < NFORMATS; i++)
this->is_format[i] = undecided;
@@ -291,18 +281,14 @@ default_comment_filepos (abstract_catalog_reader_ty *that,
const char *name, size_t line)
{
default_catalog_reader_ty *this = (default_catalog_reader_ty *) that;
-
- if (this->handle_filepos_comments)
- {
- size_t nbytes;
- lex_pos_ty *pp;
-
- nbytes = (this->filepos_count + 1) * sizeof (this->filepos[0]);
- this->filepos = xrealloc (this->filepos, nbytes);
- pp = &this->filepos[this->filepos_count++];
- pp->file_name = xstrdup (name);
- pp->line_number = line;
- }
+ size_t nbytes;
+ lex_pos_ty *pp;
+
+ nbytes = (this->filepos_count + 1) * sizeof (this->filepos[0]);
+ this->filepos = xrealloc (this->filepos, nbytes);
+ pp = &this->filepos[this->filepos_count++];
+ pp->file_name = xstrdup (name);
+ pp->line_number = line;
}
@@ -458,10 +444,6 @@ default_catalog_reader_alloc (default_catalog_reader_class_ty *method_table)
/* Exported functions. */
-/* If nonzero, remember comments for file name and line number for each
- msgid, if present in the reference input. Defaults to true. */
-int line_comment = 1;
-
/* If false, duplicate msgids in the same domain and file generate an error.
If true, such msgids are allowed; the caller should treat them
appropriately. Defaults to false. */
@@ -478,7 +460,6 @@ read_catalog_stream (FILE *fp, const char *real_filename,
pop = default_catalog_reader_alloc (&default_methods);
pop->handle_comments = true;
- pop->handle_filepos_comments = (line_comment != 0);
pop->allow_domain_directives = true;
pop->allow_duplicates = allow_duplicates;
pop->allow_duplicates_if_same_msgstr = false;
diff --git a/gettext-tools/src/read-catalog.h b/gettext-tools/src/read-catalog.h
index 8b77014..f567d78 100644
--- a/gettext-tools/src/read-catalog.h
+++ b/gettext-tools/src/read-catalog.h
@@ -77,10 +77,6 @@ struct default_catalog_reader_class_ty
/* If true, pay attention to comments and filepos comments. */ \
bool handle_comments; \
\
- /* If true, remember comments for file name and line number for each \
- msgid, if present in the reference input. */ \
- bool handle_filepos_comments; \
- \
/* If false, domain directives lead to an error messsage. */ \
bool allow_domain_directives; \
\
@@ -167,10 +163,6 @@ extern default_catalog_reader_ty *
default_catalog_reader_alloc (default_catalog_reader_class_ty *method_table);
-/* If nonzero, remember comments for file name and line number for each
- msgid, if present in the reference input. Defaults to true. */
-extern DLL_VARIABLE int line_comment;
-
/* If false, duplicate msgids in the same domain and file generate an error.
If true, such msgids are allowed; the caller should treat them
appropriately. Defaults to false. */
diff --git a/gettext-tools/src/write-po.c b/gettext-tools/src/write-po.c
index 8cfd7c4..1534a3b 100644
--- a/gettext-tools/src/write-po.c
+++ b/gettext-tools/src/write-po.c
@@ -306,21 +306,57 @@ message_print_comment_dot (const message_ty *mp, ostream_t stream)
/* Output mp->filepos as a set of comment lines. */
+static enum filepos_comment_type filepos_comment_type = filepos_comment_full;
+
void
message_print_comment_filepos (const message_ty *mp, ostream_t stream,
bool uniforum, size_t page_width)
{
- if (mp->filepos_count != 0)
+ if (filepos_comment_type != filepos_comment_none
+ && mp->filepos_count != 0)
{
+ size_t filepos_count;
+ lex_pos_ty *filepos;
+
begin_css_class (stream, class_reference_comment);
+ if (filepos_comment_type == filepos_comment_file)
+ {
+ size_t i;
+
+ filepos_count = 0;
+ filepos = XNMALLOC (mp->filepos_count, lex_pos_ty);
+
+ for (i = 0; i < mp->filepos_count; ++i)
+ {
+ lex_pos_ty *pp = &mp->filepos[i];
+ size_t j;
+
+ for (j = 0; j < filepos_count; j++)
+ if (strcmp (filepos[j].file_name, pp->file_name) == 0)
+ break;
+
+ if (j == filepos_count)
+ {
+ filepos[filepos_count].file_name = pp->file_name;
+ filepos[filepos_count].line_number = (size_t)-1;
+ filepos_count++;
+ }
+ }
+ }
+ else
+ {
+ filepos = mp->filepos;
+ filepos_count = mp->filepos_count;
+ }
+
if (uniforum)
{
size_t j;
- for (j = 0; j < mp->filepos_count; ++j)
+ for (j = 0; j < filepos_count; ++j)
{
- lex_pos_ty *pp = &mp->filepos[j];
+ lex_pos_ty *pp = &filepos[j];
const char *cp = pp->file_name;
char *str;
@@ -345,19 +381,21 @@ message_print_comment_filepos (const message_ty *mp, ostream_t stream,
ostream_write_str (stream, "#:");
column = 2;
- for (j = 0; j < mp->filepos_count; ++j)
+ for (j = 0; j < filepos_count; ++j)
{
lex_pos_ty *pp;
char buffer[21];
const char *cp;
size_t len;
- pp = &mp->filepos[j];
+ pp = &filepos[j];
cp = pp->file_name;
while (cp[0] == '.' && cp[1] == '/')
cp += 2;
- /* Some xgettext input formats, like RST, lack line numbers. */
- if (pp->line_number == (size_t)(-1))
+ if (filepos_comment_type == filepos_comment_file
+ /* Some xgettext input formats, like RST, lack line
+ numbers. */
+ || pp->line_number == (size_t)(-1))
buffer[0] = '\0';
else
sprintf (buffer, ":%ld", (long) pp->line_number);
@@ -377,6 +415,9 @@ message_print_comment_filepos (const message_ty *mp, ostream_t stream,
ostream_write_str (stream, "\n");
}
+ if (filepos != mp->filepos)
+ free (filepos);
+
end_css_class (stream, class_reference_comment);
}
}
@@ -505,6 +546,37 @@ message_print_style_escape (bool flag)
escape = flag;
}
+void
+message_print_style_filepos (enum filepos_comment_type type)
+{
+ filepos_comment_type = type;
+}
+
+
+/* --add-location argument handling. Return an error indicator. */
+bool
+handle_filepos_comment_option (const char *option)
+{
+ if (option != NULL)
+ {
+ if (strcmp (option, "never") == 0 || strcmp (option, "no") == 0)
+ message_print_style_filepos (filepos_comment_none);
+ else if (strcmp (option, "full") == 0 || strcmp (option, "yes") == 0)
+ message_print_style_filepos (filepos_comment_full);
+ else if (strcmp (option, "file") == 0)
+ message_print_style_filepos (filepos_comment_file);
+ else
+ {
+ fprintf (stderr, "invalid --add-location argument: %s\n", option);
+ return true;
+ }
+ }
+ else
+ /* --add-location is equivalent to --add-location=full. */
+ message_print_style_filepos (filepos_comment_full);
+ return false;
+}
+
/* =============== msgdomain_list_print_po() and subroutines. =============== */
diff --git a/gettext-tools/src/write-po.h b/gettext-tools/src/write-po.h
index 01875a5..9a243bf 100644
--- a/gettext-tools/src/write-po.h
+++ b/gettext-tools/src/write-po.h
@@ -30,6 +30,13 @@ extern "C" {
#endif
+enum filepos_comment_type
+ {
+ filepos_comment_none,
+ filepos_comment_full,
+ filepos_comment_file
+ };
+
/* These functions are used to output a #, flags line. */
extern const char *
make_format_description_string (enum is_format is_format,
@@ -61,6 +68,12 @@ extern void
message_print_style_uniforum (void);
extern void
message_print_style_escape (bool flag);
+extern void
+ message_print_style_filepos (enum filepos_comment_type type);
+
+/* --add-location argument handling. Return an error indicator. */
+extern bool handle_filepos_comment_option (const char *option);
+
/* Describes a PO file in .po syntax. */
extern DLL_VARIABLE const struct catalog_output_format output_format_po;
diff --git a/gettext-tools/src/x-po.c b/gettext-tools/src/x-po.c
index aecf595..89824e2 100644
--- a/gettext-tools/src/x-po.c
+++ b/gettext-tools/src/x-po.c
@@ -155,7 +155,6 @@ extract (FILE *fp,
pop = default_catalog_reader_alloc (&extract_methods);
pop->handle_comments = true;
- pop->handle_filepos_comments = (line_comment != 0);
pop->allow_domain_directives = false;
pop->allow_duplicates = false;
pop->allow_duplicates_if_same_msgstr = true;
diff --git a/gettext-tools/src/xgettext.c b/gettext-tools/src/xgettext.c
index 8e89a33..8f14b93 100644
--- a/gettext-tools/src/xgettext.c
+++ b/gettext-tools/src/xgettext.c
@@ -199,7 +199,7 @@ iconv_t xgettext_current_source_iconv;
static const struct option long_options[] =
{
{ "add-comments", optional_argument, NULL, 'c' },
- { "add-location", no_argument, &line_comment, 1 },
+ { "add-location", optional_argument, NULL, 'n' },
{ "boost", no_argument, NULL, CHAR_MAX + 11 },
{ "c++", no_argument, NULL, 'C' },
{ "color", optional_argument, NULL, CHAR_MAX + 14 },
@@ -225,7 +225,7 @@ static const struct option long_options[] =
{ "msgstr-prefix", optional_argument, NULL, 'm' },
{ "msgstr-suffix", optional_argument, NULL, 'M' },
{ "no-escape", no_argument, NULL, 'e' },
- { "no-location", no_argument, &line_comment, 0 },
+ { "no-location", no_argument, NULL, CHAR_MAX + 16 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 4 },
{ "omit-header", no_argument, &xgettext_omit_header, 1 },
{ "output", required_argument, NULL, 'o' },
@@ -473,7 +473,8 @@ main (int argc, char *argv[])
break;
case 'n':
- line_comment = 1;
+ if (handle_filepos_comment_option (optarg))
+ usage (EXIT_FAILURE);
break;
case 'o':
@@ -587,6 +588,10 @@ main (int argc, char *argv[])
handle_style_option (optarg);
break;
+ case CHAR_MAX + 16: /* --no-location */
+ message_print_style_filepos (filepos_comment_none);
+ break;
+
default:
usage (EXIT_FAILURE);
/* NOTREACHED */
@@ -612,10 +617,6 @@ There is NO WARRANTY, to the extent permitted by law.\n\
usage (EXIT_SUCCESS);
/* Verify selected options. */
- if (!line_comment && sort_by_filepos)
- error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
- "--no-location", "--sort-by-file");
-
if (sort_by_msgid && sort_by_filepos)
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
@@ -2474,8 +2475,7 @@ meta information, not the empty string.\n")));
warn_format_string (is_format, mp->msgid, pos, "msgid");
/* Remember where we saw this msgid. */
- if (line_comment)
- message_comment_filepos (mp, pos->file_name, pos->line_number);
+ message_comment_filepos (mp, pos->file_name, pos->line_number);
/* Tell the lexer to reset its comment buffer, so that the next
message gets the correct comments. */
diff --git a/gettext-tools/tests/ChangeLog b/gettext-tools/tests/ChangeLog
index 85fe091..1ecaf8f 100644
--- a/gettext-tools/tests/ChangeLog
+++ b/gettext-tools/tests/ChangeLog
@@ -1,3 +1,18 @@
+2014-03-25 Daiki Ueno <ueno@gnu.org>
+
+ Add tests for --add-location=file option.
+ * msgattrib-18: New file.
+ * msgcat-19: New file.
+ * msgcomm-28: New file.
+ * msgconv-7: New file.
+ * msgen-4: New file.
+ * msgfilter-5: New file.
+ * msggrep-11: New file.
+ * msgmerge-25: New file.
+ * msguniq-7: New file.
+ * xgettext-10: New file.
+ * Makefile.am (TESTS): Add new tests
+
2014-03-11 Daiki Ueno <ueno@gnu.org>
* Makefile.am (EXTRA_DIST): Add init.cfg, which is no longer
diff --git a/gettext-tools/tests/Makefile.am b/gettext-tools/tests/Makefile.am
index e90bec4..39f5612 100644
--- a/gettext-tools/tests/Makefile.am
+++ b/gettext-tools/tests/Makefile.am
@@ -25,11 +25,11 @@ TESTS = gettext-1 gettext-2 gettext-3 gettext-4 gettext-5 gettext-6 gettext-7 \
msgattrib-1 msgattrib-2 msgattrib-3 msgattrib-4 msgattrib-5 \
msgattrib-6 msgattrib-7 msgattrib-8 msgattrib-9 msgattrib-10 \
msgattrib-11 msgattrib-12 msgattrib-13 msgattrib-14 msgattrib-15 \
- msgattrib-16 msgattrib-17 \
+ msgattrib-16 msgattrib-17 msgattrib-18 \
msgattrib-properties-1 \
msgcat-1 msgcat-2 msgcat-3 msgcat-4 msgcat-5 msgcat-6 msgcat-7 \
msgcat-8 msgcat-9 msgcat-10 msgcat-11 msgcat-12 msgcat-13 msgcat-14 \
- msgcat-15 msgcat-16 msgcat-17 msgcat-18 \
+ msgcat-15 msgcat-16 msgcat-17 msgcat-18 msgcat-19 \
msgcat-properties-1 msgcat-properties-2 \
msgcat-stringtable-1 \
msgcmp-1 msgcmp-2 msgcmp-3 msgcmp-4 \
@@ -37,11 +37,11 @@ TESTS = gettext-1 gettext-2 gettext-3 gettext-4 gettext-5 gettext-6 gettext-7 \
msgcomm-8 msgcomm-9 msgcomm-10 msgcomm-11 msgcomm-12 msgcomm-13 \
msgcomm-14 msgcomm-15 msgcomm-16 msgcomm-17 msgcomm-18 msgcomm-19 \
msgcomm-20 msgcomm-21 msgcomm-22 msgcomm-23 msgcomm-24 msgcomm-25 \
- msgcomm-26 msgcomm-27 \
- msgconv-1 msgconv-2 msgconv-3 msgconv-4 msgconv-5 msgconv-6 \
- msgen-1 msgen-2 msgen-3 \
+ msgcomm-26 msgcomm-27 msgcomm-28 \
+ msgconv-1 msgconv-2 msgconv-3 msgconv-4 msgconv-5 msgconv-6 msgconv-7 \
+ msgen-1 msgen-2 msgen-3 msgen-4 \
msgexec-1 msgexec-2 msgexec-3 msgexec-4 \
- msgfilter-1 msgfilter-2 msgfilter-3 msgfilter-4 \
+ msgfilter-1 msgfilter-2 msgfilter-3 msgfilter-4 msgfilter-5 \
msgfilter-sr-latin-1 \
msgfmt-1 msgfmt-2 msgfmt-3 msgfmt-4 msgfmt-5 msgfmt-6 msgfmt-7 \
msgfmt-8 msgfmt-9 msgfmt-10 msgfmt-11 msgfmt-12 msgfmt-13 msgfmt-14 \
@@ -49,13 +49,13 @@ TESTS = gettext-1 gettext-2 gettext-3 gettext-4 gettext-5 gettext-6 gettext-7 \
msgfmt-properties-1 \
msgfmt-qt-1 msgfmt-qt-2 \
msggrep-1 msggrep-2 msggrep-3 msggrep-4 msggrep-5 msggrep-6 msggrep-7 \
- msggrep-8 msggrep-9 msggrep-10 \
+ msggrep-8 msggrep-9 msggrep-10 msggrep-11 \
msginit-1 msginit-2 \
msgmerge-1 msgmerge-2 msgmerge-3 msgmerge-4 msgmerge-5 msgmerge-6 \
msgmerge-7 msgmerge-8 msgmerge-9 msgmerge-10 msgmerge-11 msgmerge-12 \
msgmerge-13 msgmerge-14 msgmerge-15 msgmerge-16 msgmerge-17 \
msgmerge-18 msgmerge-19 msgmerge-20 msgmerge-21 msgmerge-22 \
- msgmerge-23 msgmerge-24 \
+ msgmerge-23 msgmerge-24 msgmerge-25 \
msgmerge-compendium-1 msgmerge-compendium-2 msgmerge-compendium-3 \
msgmerge-compendium-4 msgmerge-compendium-5 msgmerge-compendium-6 \
msgmerge-properties-1 msgmerge-properties-2 \
@@ -66,10 +66,10 @@ TESTS = gettext-1 gettext-2 gettext-3 gettext-4 gettext-5 gettext-6 gettext-7 \
msgunfmt-java-1 \
msgunfmt-properties-1 \
msgunfmt-tcl-1 \
- msguniq-1 msguniq-2 msguniq-3 msguniq-4 msguniq-5 msguniq-6 \
+ msguniq-1 msguniq-2 msguniq-3 msguniq-4 msguniq-5 msguniq-6 msguniq-7 \
recode-sr-latin-1 recode-sr-latin-2 \
xgettext-1 xgettext-2 xgettext-3 xgettext-4 xgettext-5 xgettext-6 \
- xgettext-7 xgettext-8 xgettext-9 \
+ xgettext-7 xgettext-8 xgettext-9 xgettext-10 \
xgettext-awk-1 xgettext-awk-2 \
xgettext-c-1 xgettext-c-2 xgettext-c-3 xgettext-c-4 xgettext-c-5 \
xgettext-c-6 xgettext-c-7 xgettext-c-8 xgettext-c-9 xgettext-c-10 \
diff --git a/gettext-tools/tests/msgattrib-18 b/gettext-tools/tests/msgattrib-18
new file mode 100755
index 0000000..68be0f2
--- /dev/null
+++ b/gettext-tools/tests/msgattrib-18
@@ -0,0 +1,98 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<\EOF > ma-test18.po
+# HEADER.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Bonnie Tyler\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: married-men:4
+#, fuzzy
+msgid "The world is full of married men"
+msgstr "So viele verheiratete Männer"
+
+#: married-men:5
+msgid "with wives who never understand"
+msgstr "und ihre Frauen verstehen sie nicht"
+
+#: married-men:6
+msgid "They're looking for someone to share"
+msgstr ""
+
+# schwer zu übersetzen...
+#: married-men:7
+msgid "the excitement of a love affair"
+msgstr ""
+
+#: married-men:8
+msgid "Just as soon as they find you"
+msgstr ""
+
+#: married-men:9
+msgid "They warn you and darn you"
+msgstr ""
+
+#~ msgid "You fly on the wings of romance"
+#~ msgstr "Die Flügel der frischen Liebe heben dich zum Himmel"
+
+#, fuzzy
+#~ msgid "In the eyes of the world"
+#~ msgstr "Für die anderen"
+
+# Etwas freie Übersetzung.
+#~ msgid "You're just another crazy girl"
+#~ msgstr "bist du bloß ein verrücktes dummes Ding"
+
+#~ msgid "Who loves a married man"
+#~ msgstr "das einen verheirateten Mann liebt"
+EOF
+
+: ${MSGATTRIB=msgattrib}
+${MSGATTRIB} --translated --add-location=file -o ma-test18.tmp ma-test18.po \
+ || exit 1
+LC_ALL=C tr -d '\r' < ma-test18.tmp > ma-test18.out || exit 1
+
+cat <<\EOF > ma-test18.ok
+# HEADER.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Bonnie Tyler\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: married-men
+#, fuzzy
+msgid "The world is full of married men"
+msgstr "So viele verheiratete Männer"
+
+#: married-men
+msgid "with wives who never understand"
+msgstr "und ihre Frauen verstehen sie nicht"
+
+#~ msgid "You fly on the wings of romance"
+#~ msgstr "Die Flügel der frischen Liebe heben dich zum Himmel"
+
+#, fuzzy
+#~ msgid "In the eyes of the world"
+#~ msgstr "Für die anderen"
+
+# Etwas freie Übersetzung.
+#~ msgid "You're just another crazy girl"
+#~ msgstr "bist du bloß ein verrücktes dummes Ding"
+
+#~ msgid "Who loves a married man"
+#~ msgstr "das einen verheirateten Mann liebt"
+EOF
+
+: ${DIFF=diff}
+${DIFF} ma-test18.ok ma-test18.out
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/msgcat-19 b/gettext-tools/tests/msgcat-19
new file mode 100755
index 0000000..4dd2a40
--- /dev/null
+++ b/gettext-tools/tests/msgcat-19
@@ -0,0 +1,66 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<EOF > mcat-test19.in1
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU one 1.2.3\n"
+"POT-Creation-Date: 2000-12-11 20:49+0100\n"
+"PO-Revision-Date: 2000-03-18 15:25+01:00\n"
+"Last-Translator: Karl Eichwalder <ke@suse.de>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: first.c:123
+msgid "1"
+msgstr "eins"
+EOF
+
+cat <<EOF > mcat-test19.in2
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU one 1.2.3\n"
+"POT-Creation-Date: 2000-12-11 20:49+0100\n"
+"PO-Revision-Date: 2000-03-18 15:25+01:00\n"
+"Last-Translator: Karl Eichwalder <ke@suse.de>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: hunt.c:759
+msgid "1"
+msgstr "eins"
+EOF
+
+: ${MSGCAT=msgcat}
+${MSGCAT} --add-location=file \
+ -o mcat-test19.tmp mcat-test19.in1 mcat-test19.in2 || exit 1
+LC_ALL=C tr -d '\r' < mcat-test19.tmp > mcat-test19.out || exit 1
+
+cat << EOF > mcat-test19.ok
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU one 1.2.3\n"
+"POT-Creation-Date: 2000-12-11 20:49+0100\n"
+"PO-Revision-Date: 2000-03-18 15:25+01:00\n"
+"Last-Translator: Karl Eichwalder <ke@suse.de>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: first.c hunt.c
+msgid "1"
+msgstr "eins"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mcat-test19.ok mcat-test19.out
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/msgcomm-28 b/gettext-tools/tests/msgcomm-28
new file mode 100755
index 0000000..665ab0a
--- /dev/null
+++ b/gettext-tools/tests/msgcomm-28
@@ -0,0 +1,37 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<EOF > mcomm-test28.in1
+#: first.c:123
+msgid "1"
+msgstr "1x"
+EOF
+
+cat <<EOF > mcomm-test28.in2
+#: hunt.c:759
+msgid "2"
+msgstr "2x"
+EOF
+
+: ${MSGCOMM=msgcomm}
+${MSGCOMM} --add-location=file --more-than=0 \
+ -o mcomm-test28.tmp mcomm-test28.in1 mcomm-test28.in2 || exit 1
+LC_ALL=C tr -d '\r' < mcomm-test28.tmp > mcomm-test28.out || exit 1
+
+cat << EOF > mcomm-test28.ok
+#: first.c
+msgid "1"
+msgstr "1x"
+
+#: hunt.c
+msgid "2"
+msgstr "2x"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mcomm-test28.ok mcomm-test28.out
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/msgconv-7 b/gettext-tools/tests/msgconv-7
new file mode 100755
index 0000000..2d1fa65
--- /dev/null
+++ b/gettext-tools/tests/msgconv-7
@@ -0,0 +1,43 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<\EOF > mco-test7.po
+# Chinese translation for GNU gettext messages.
+#
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=big5\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/msgcmp.c:155 src/msgmerge.c:273
+msgid "exactly 2 input files required"
+msgstr "¦¹¥\¯à»Ý­n«ê¦n«ü©w¨â­Ó¿é¤JÀÉ"
+EOF
+
+: ${MSGCONV=msgconv}
+${MSGCONV} --add-location=file --to-code=UTF-8 \
+ -o mco-test7.out mco-test7.po || exit 1
+
+cat <<\EOF > mco-test7.ok
+# Chinese translation for GNU gettext messages.
+#
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/msgcmp.c src/msgmerge.c
+msgid "exactly 2 input files required"
+msgstr "此功能需è¦æ°å¥½æŒ‡å®šå…©å€‹è¼¸å…¥æª”"
+EOF
+
+: ${DIFF=diff}
+# Redirect stdout, so as not to fill the user's screen with non-ASCII bytes.
+${DIFF} mco-test7.ok mco-test7.out >/dev/null
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/msgen-4 b/gettext-tools/tests/msgen-4
new file mode 100755
index 0000000..6dddf5d
--- /dev/null
+++ b/gettext-tools/tests/msgen-4
@@ -0,0 +1,68 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<EOF > men-test1.po
+# HEADER.
+#
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: foo:1
+msgid "height must be positive"
+msgstr ""
+
+#: foo:2
+msgid "color cannot be transparent"
+msgstr "colour cannot be transparent"
+
+#: bar:3
+msgid "width must be positive"
+msgstr ""
+
+#: baz:4
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] ""
+msgstr[1] ""
+EOF
+
+: ${MSGEN=msgen}
+${MSGEN} --add-location=file -o men-test1.tmp men-test1.po || exit 1
+LC_ALL=C tr -d '\r' < men-test1.tmp > men-test1.out || exit 1
+
+cat <<EOF > men-test1.ok
+# HEADER.
+#
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: foo
+msgid "height must be positive"
+msgstr "height must be positive"
+
+#: foo
+msgid "color cannot be transparent"
+msgstr "colour cannot be transparent"
+
+#: bar
+msgid "width must be positive"
+msgstr "width must be positive"
+
+#: baz
+msgid "%d error"
+msgid_plural "%d errors"
+msgstr[0] "%d error"
+msgstr[1] "%d errors"
+EOF
+
+: ${DIFF=diff}
+${DIFF} men-test1.ok men-test1.out
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/msgfilter-5 b/gettext-tools/tests/msgfilter-5
new file mode 100755
index 0000000..0a8da6f
--- /dev/null
+++ b/gettext-tools/tests/msgfilter-5
@@ -0,0 +1,169 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+# Some fold programs (like SunOS4 and FreeBSD) don't have an option to wrap at
+# spaces.
+echo abc | fold -b -s -w 20 >/dev/null 2>&1 || {
+ echo "Skipping test: fold program not POSIX compliant"
+ exit 77
+}
+
+# Some fold programs (like NetBSD 5.0) remove trailing spaces when wrapping.
+echo ab cd | fold -b -s -w 3 | grep ' ' >/dev/null || {
+ echo "Skipping test: fold program trims trailing spaces"
+ exit 77
+}
+
+# Some fold programs (like HP-UX) insert a newline at the end, if the last
+# line was not terminated with a newline and the -s option was given.
+foldoutputcount=`echo $ac_n "abc$ac_c" | fold -b -s -w 20 | wc -c`
+foldoutputcount=`echo "$foldoutputcount" | sed -e 's/[ ]//g'`
+test "$foldoutputcount" = 3 || {
+ echo "Skipping test: fold program inserts extra newline"
+ exit 77
+}
+
+cat <<\EOF > mfi-test5.po
+# HEADER.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Bonnie Tyler\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: married-men:4
+#, fuzzy
+msgid "The world is full of married men"
+msgstr "So viele verheiratete Männer"
+
+#: married-men:5
+msgid "with wives who never understand"
+msgstr "und ihre Frauen verstehen sie nicht"
+
+#: married-men:6
+msgid "They're looking for someone to share"
+msgstr ""
+
+# schwer zu übersetzen...
+#: married-men:7
+msgid "the excitement of a love affair"
+msgstr ""
+
+#: married-men:8
+msgid "Just as soon as they find you"
+msgstr ""
+
+#: married-men:9
+msgid "They warn you and darn you"
+msgstr ""
+
+#~ msgid "You fly on the wings of romance"
+#~ msgstr "Die Flügel der frischen Liebe heben dich zum Himmel"
+
+#, fuzzy
+#~ msgid "In the eyes of the world"
+#~ msgstr "Für die anderen"
+
+# Etwas freie Übersetzung.
+#~ msgid "You're just another crazy girl"
+#~ msgstr "bist du bloß ein verrücktes dummes Ding"
+
+#~ msgid "Who loves a married man"
+#~ msgstr "das einen verheirateten Mann liebt"
+EOF
+
+: ${MSGFILTER=msgfilter}
+LC_ALL=C ${MSGFILTER} --add-location=file -i mfi-test5.po -o mfi-test5.out \
+ fold -b -s -w 20 >mfi-test5.err 2>&1
+result=$?
+cat mfi-test5.err | grep -v 'warning: Locale charset' | grep -v '^ '
+test $result = 0 || { exit 1; }
+
+cat <<\EOF > mfi-test5.ok
+# HEADER.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Bonnie Tyler\n"
+"Content-Type: \n"
+"text/plain; \n"
+"charset=ISO-8859-1\n"
+"Content-Transfer-Enc\n"
+"oding: 8bit\n"
+
+#: married-men
+#, fuzzy
+msgid "The world is full of married men"
+msgstr ""
+"So viele \n"
+"verheiratete Männer"
+
+#: married-men
+msgid "with wives who never understand"
+msgstr ""
+"und ihre Frauen \n"
+"verstehen sie nicht"
+
+#: married-men
+msgid "They're looking for someone to share"
+msgstr ""
+
+# schwer zu übersetzen...
+#: married-men
+msgid "the excitement of a love affair"
+msgstr ""
+
+#: married-men
+msgid "Just as soon as they find you"
+msgstr ""
+
+#: married-men
+msgid "They warn you and darn you"
+msgstr ""
+
+#~ msgid "You fly on the wings of romance"
+#~ msgstr ""
+#~ "Die Flügel der \n"
+#~ "frischen Liebe \n"
+#~ "heben dich zum \n"
+#~ "Himmel"
+
+#, fuzzy
+#~ msgid "In the eyes of the world"
+#~ msgstr "Für die anderen"
+
+# Etwas freie Übersetzung.
+#~ msgid "You're just another crazy girl"
+#~ msgstr ""
+#~ "bist du bloß ein \n"
+#~ "verrücktes dummes \n"
+#~ "Ding"
+
+#~ msgid "Who loves a married man"
+#~ msgstr ""
+#~ "das einen \n"
+#~ "verheirateten Mann \n"
+#~ "liebt"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mfi-test5.ok mfi-test5.out
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/msggrep-11 b/gettext-tools/tests/msggrep-11
new file mode 100755
index 0000000..bf77675
--- /dev/null
+++ b/gettext-tools/tests/msggrep-11
@@ -0,0 +1,189 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<\EOF > mg-test11.po
+# German translations for GNU gettext package.
+# Copyright (C) 1995, 1996, 1997, 2001 Free Software Foundation, Inc.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU gettext 0.11-pre1\n"
+"POT-Creation-Date: 2001-12-08 20:33+0100\n"
+"PO-Revision-Date: 2001-11-04 12:25+0100\n"
+"Last-Translator: Karl Eichwalder <ke@suse.de>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: argmatch.c:141
+#, c-format
+msgid "invalid argument `%s' for `%s'"
+msgstr "ungültiges Argument »%s« für »%s«"
+
+#: argmatch.c:142
+#, c-format
+msgid "ambiguous argument `%s' for `%s'"
+msgstr "mehrdeutiges Argument »%s« für »%s«"
+
+#: argmatch.c:162
+msgid "Valid arguments are:"
+msgstr "Gültige Argumente sind:"
+
+#: copy-file.c:60
+#, c-format
+msgid "error while opening \"%s\" for reading"
+msgstr "Öffnen der Datei »%s« zum Lesen fehlgeschlagen"
+
+#: copy-file.c:67
+#, c-format
+msgid "cannot open backup file \"%s\" for writing"
+msgstr "Öffnen der Sicherungsdatei »%s« zum Schreiben fehlgeschlagen"
+
+#: copy-file.c:80
+#, c-format
+msgid "error reading \"%s\""
+msgstr "Fehler beim Lesen von »%s«"
+
+#: copy-file.c:86 copy-file.c:90
+#, c-format
+msgid "error writing \"%s\""
+msgstr "Fehler beim Schreiben von »%s«"
+
+#: copy-file.c:92
+#, c-format
+msgid "error after reading \"%s\""
+msgstr "Fehler nach dem Lesen von »%s«"
+
+#: error.c:115
+msgid "Unknown system error"
+msgstr "Unbekannter Systemfehler"
+
+#: execute.c:170 execute.c:205 pipe-bidi.c:156 pipe-bidi.c:191 pipe-in.c:169
+#: pipe-in.c:205 pipe-out.c:169 pipe-out.c:205 wait-process.c:136
+#, c-format
+msgid "%s subprocess failed"
+msgstr "Subprozess %s fehlgeschlagen"
+
+#: getopt.c:691
+#, c-format
+msgid "%s: option `%s' is ambiguous\n"
+msgstr "%s: Option »%s« ist mehrdeutig\n"
+
+#: getopt.c:716
+#, c-format
+msgid "%s: option `--%s' doesn't allow an argument\n"
+msgstr "%s: Option »--%s« erwartet kein Argument\n"
+
+#: getopt.c:721
+#, c-format
+msgid "%s: option `%c%s' doesn't allow an argument\n"
+msgstr "%s: Option »%c%s« erwartet kein Argument\n"
+
+#: getopt.c:739 getopt.c:912
+#, c-format
+msgid "%s: option `%s' requires an argument\n"
+msgstr "%s: Option »%s« erwartet ein Argument\n"
+
+#: getopt.c:768
+#, c-format
+msgid "%s: unrecognized option `--%s'\n"
+msgstr "%s: unbekannte Option »--%s«\n"
+
+#: getopt.c:772
+#, c-format
+msgid "%s: unrecognized option `%c%s'\n"
+msgstr "%s: unbekannte Option »%c%s«\n"
+
+#: getopt.c:798
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: unzulässige Option -- %c\n"
+
+#: getopt.c:801
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: ungültige Option -- %c\n"
+
+#: getopt.c:831 getopt.c:961
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: Option erwartet ein Argument -- %c\n"
+
+#: getopt.c:878
+#, c-format
+msgid "%s: option `-W %s' is ambiguous\n"
+msgstr "%s: Option »-W %s« ist mehrdeutig\n"
+
+#: getopt.c:896
+#, c-format
+msgid "%s: option `-W %s' doesn't allow an argument\n"
+msgstr "%s: Option »-W %s« erwartet kein Argument\n"
+
+#: javacomp.c:465
+msgid "Java compiler not found, try installing gcj or set $JAVAC"
+msgstr ""
+"Java-Compiler nicht gefunden; bitte »gcj« installieren oder $JAVAC setzen"
+
+#: javaexec.c:404
+msgid "Java virtual machine not found, try installing gij or set $JAVA"
+msgstr ""
+"Virtuelle Java-Maschine nicht gefunden; bitte »gcj« installieren oder\n"
+"$JAVA setzen"
+
+#: obstack.c:474 xerror.c:75 xmalloc.c:56
+msgid "memory exhausted"
+msgstr "virtueller Speicher erschöpft"
+
+#: pipe-bidi.c:119 pipe-bidi.c:121 pipe-in.c:136 pipe-out.c:136
+msgid "cannot create pipe"
+msgstr "Es ist nicht möglich, eine Pipe zu erzeugen"
+
+#: wait-process.c:117
+#, c-format
+msgid "%s subprocess"
+msgstr "Subprozess %s"
+
+#: wait-process.c:129
+#, c-format
+msgid "%s subprocess got fatal signal"
+msgstr "Subprozess %s hat ein fatales Signal erhalten"
+EOF
+
+: ${MSGGREP=msggrep}
+${MSGGREP} --add-location=file -N pipe-bidi.c -o mg-test11.tmp mg-test11.po \
+ || exit 1
+LC_ALL=C tr -d '\r' < mg-test11.tmp > mg-test11.out || exit 1
+
+cat <<\EOF > mg-test11.ok
+# German translations for GNU gettext package.
+# Copyright (C) 1995, 1996, 1997, 2001 Free Software Foundation, Inc.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU gettext 0.11-pre1\n"
+"POT-Creation-Date: 2001-12-08 20:33+0100\n"
+"PO-Revision-Date: 2001-11-04 12:25+0100\n"
+"Last-Translator: Karl Eichwalder <ke@suse.de>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: execute.c pipe-bidi.c pipe-in.c pipe-out.c wait-process.c
+#, c-format
+msgid "%s subprocess failed"
+msgstr "Subprozess %s fehlgeschlagen"
+
+#: pipe-bidi.c pipe-in.c pipe-out.c
+msgid "cannot create pipe"
+msgstr "Es ist nicht möglich, eine Pipe zu erzeugen"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mg-test11.ok mg-test11.out
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/msgmerge-25 b/gettext-tools/tests/msgmerge-25
new file mode 100755
index 0000000..d0f2d2c
--- /dev/null
+++ b/gettext-tools/tests/msgmerge-25
@@ -0,0 +1,69 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<EOF > mm-test25.in1
+# first
+#. this should be discarded
+msgid "1"
+msgstr "1x"
+# second
+#: bogus:1
+msgid "2"
+msgstr "this is a really long msgstr "
+ "used to test the wrapping to "
+ "make sure it works after all "
+ "what is a test for if not to test things?"
+# third
+msgid "3"
+msgstr "3z"
+EOF
+
+cat <<EOF > mm-test25.in2
+#. this is the first
+#: snark.c:345
+msgid "1"
+msgstr ""
+#. this is the second
+#: hunt.c:759
+msgid "2"
+msgstr ""
+#. this is the third
+#: boojum.c:300
+msgid "3"
+msgstr ""
+EOF
+
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} --add-location=file -q -o mm-test25.tmp mm-test25.in1 mm-test25.in2 \
+ || exit 1
+LC_ALL=C tr -d '\r' < mm-test25.tmp > mm-test25.out || exit 1
+
+cat << EOF > mm-test25.ok
+# first
+#. this is the first
+#: snark.c
+msgid "1"
+msgstr "1x"
+
+# second
+#. this is the second
+#: hunt.c
+msgid "2"
+msgstr ""
+"this is a really long msgstr used to test the wrapping to make sure it works "
+"after all what is a test for if not to test things?"
+
+# third
+#. this is the third
+#: boojum.c
+msgid "3"
+msgstr "3z"
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test25.ok mm-test25.out
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/msguniq-7 b/gettext-tools/tests/msguniq-7
new file mode 100755
index 0000000..5cae2e9
--- /dev/null
+++ b/gettext-tools/tests/msguniq-7
@@ -0,0 +1,30 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<\EOF > msguniq-7.in
+#: foo:1
+msgid "foo"
+msgstr ""
+
+#: bar:1
+msgid "foo"
+msgstr ""
+EOF
+
+: ${MSGUNIQ-msguniq}
+${MSGUNIQ} --add-location=file -o msguniq-7.tmp msguniq-7.in || exit 1
+LC_ALL=C tr -d '\r' < msguniq-7.tmp > msguniq-7.out || exit 1
+
+cat <<\EOF > msguniq-7.ok
+#: foo bar
+msgid "foo"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} msguniq-7.ok msguniq-7.out
+result=$?
+
+exit $result
diff --git a/gettext-tools/tests/xgettext-10 b/gettext-tools/tests/xgettext-10
new file mode 100755
index 0000000..632a4ee
--- /dev/null
+++ b/gettext-tools/tests/xgettext-10
@@ -0,0 +1,36 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test --add-location=file option.
+
+cat <<\EOF > xg-test10a.c
+gettext ("foo");
+EOF
+
+cat <<\EOF > xg-test10b.c
+gettext ("foo");
+gettext ("bar");
+EOF
+
+: ${XGETTEXT=xgettext}
+${XGETTEXT} --add-location=file --omit-header xg-test10a.c xg-test10b.c \
+ -o xg-test10.out >xg-test10.err 2>&1
+result=$?
+cat xg-test10.err | grep -v 'warning: Charset' | grep -v '^ '
+test $result = 0 || { exit 1; }
+
+cat <<\EOF > xg-test10.ok
+#: xg-test10a.c xg-test10b.c
+msgid "foo"
+msgstr ""
+
+#: xg-test10b.c
+msgid "bar"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-test10.ok xg-test10.out
+result=$?
+
+exit $result