]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
New options --only-file and --ignore-file.
authorBruno Haible <bruno@clisp.org>
Mon, 10 Feb 2003 21:05:35 +0000 (21:05 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 23 Jun 2009 10:08:57 +0000 (12:08 +0200)
NEWS
doc/ChangeLog
doc/msgattrib.texi
src/ChangeLog
src/msgattrib.c

diff --git a/NEWS b/NEWS
index 431685f37411a8e82f130f3f7b8d28fb7a77ab68..d2cacfbee46fdfbcbb8f42b8a47030196bda33b3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,9 @@ Version 0.11.6 - October 2002
 * msgmerge has a new option -N/--no-fuzzy-matching that inhibits the fuzzy
   search for untranslated messages.
 
+* msgattrib has new options --only-file and --ignore-file that cause the
+  specified attribute manipulation to apply to selected messages only.
+
 * Compatibility with automake-1.7.
 \f
 Version 0.11.5 - August 2002
index 3b49d27967a77edeb85f52ef638c62ac97a5b9b0..b5447e107ec66e1500c905561d67d049f2bbafe1 100644 (file)
@@ -1,3 +1,7 @@
+2003-01-24  Bruno Haible  <bruno@clisp.org>
+
+       * msgattrib.texi: Document options --only-file and --ignore-file.
+
 2003-01-23  Bruno Haible  <bruno@clisp.org>
 
        * msgmerge.texi: Document option -N/--no-fuzzy-matching.
index ce89de4ac3b4e5173a28748a02becf89c50c1212..7f7bb232dd67400e0146616733c2db5524485a0f 100644 (file)
@@ -74,7 +74,10 @@ Keep obsolete #~ messages, remove all other messages.
 
 @cindex modify message attrributes
 Attributes are modified after the message selection/removal has been
-performed.
+performed.  If the @samp{--only-file} or @samp{--ignore-file} option is
+specified, the attribute modification is applied only to those messages
+that are listed in the @var{only-file} and not listed in the
+@var{ignore-file}.
 
 @table @samp
 @item --set-fuzzy
@@ -93,6 +96,16 @@ Set all messages obsolete.
 @opindex --clear-obsolete@r{, @code{msgattrib} option}
 Set all messages non-obsolete.
 
+@item --only-file=@var{file}
+@opindex --only-file@r{, @code{msgattrib} option}
+Limit the attribute changes to entries that are listed in @var{file}.
+@var{file} should be a PO or POT file.
+
+@item --ignore-file=@var{file}
+@opindex --ignore-file@r{, @code{msgattrib} option}
+Limit the attribute changes to entries that are not listed in @var{file}.
+@var{file} should be a PO or POT file.
+
 @item --fuzzy
 @opindex --fuzzy@r{, @code{msgattrib} option}
 Synonym for @samp{--only-fuzzy --clear-fuzzy}: It keeps only the fuzzy
index a9275cb44d24ebecb86c407a5106400154f2c2a6..71c8c279f4309ca80fd5c377ab7306f340b8d857 100644 (file)
@@ -1,3 +1,11 @@
+2003-01-24  Bruno Haible  <bruno@clisp.org>
+
+       * msgattrib.c (long_options): Add --only-file and --ignore-file.
+       (main): Handle options --only-file and --ignore-file.
+       (usage): Document options --only-file and --ignore-file.
+       (process_message_list): Add arguments only_mdlp, ignore_mdlp.
+       (process_msgdomain_list): Likewise.
+
 2003-01-23  Bruno Haible  <bruno@clisp.org>
 
        * po-gram.h: Don't include <sys/types.h>.
index 37b59c011e4b4fb71d7a84aae2ee6cad5ccf1360..5e38b930ece65c6c5d588d278197988304ef1df2 100644 (file)
@@ -1,5 +1,5 @@
 /* Manipulates attributes of messages in translation catalogs.
-   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+   Copyright (C) 2001-2003 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software; you can redistribute it and/or modify
@@ -76,6 +76,7 @@ static const struct option long_options[] =
   { "force-po", no_argument, &force_po, 1 },
   { "fuzzy", no_argument, NULL, CHAR_MAX + 11 },
   { "help", no_argument, NULL, 'h' },
+  { "ignore-file", required_argument, NULL, CHAR_MAX + 15 },
   { "indent", no_argument, NULL, 'i' },
   { "no-escape", no_argument, NULL, 'e' },
   { "no-fuzzy", no_argument, NULL, CHAR_MAX + 3 },
@@ -83,6 +84,7 @@ static const struct option long_options[] =
   { "no-obsolete", no_argument, NULL, CHAR_MAX + 5 },
   { "no-wrap", no_argument, NULL, CHAR_MAX + 13 },
   { "obsolete", no_argument, NULL, CHAR_MAX + 12 },
+  { "only-file", required_argument, NULL, CHAR_MAX + 14 },
   { "only-fuzzy", no_argument, NULL, CHAR_MAX + 4 },
   { "only-obsolete", no_argument, NULL, CHAR_MAX + 6 },
   { "output-file", required_argument, NULL, 'o' },
@@ -105,7 +107,9 @@ static void usage (int status)
        __attribute__ ((noreturn))
 #endif
 ;
-static msgdomain_list_ty *process_msgdomain_list (msgdomain_list_ty *mdlp);
+static msgdomain_list_ty *process_msgdomain_list (msgdomain_list_ty *mdlp,
+                                                 msgdomain_list_ty *only_mdlp,
+                                               msgdomain_list_ty *ignore_mdlp);
 
 
 int
@@ -116,6 +120,10 @@ main (int argc, char **argv)
   bool do_version;
   char *output_file;
   const char *input_file;
+  const char *only_file;
+  const char *ignore_file;
+  msgdomain_list_ty *only_mdlp;
+  msgdomain_list_ty *ignore_mdlp;
   msgdomain_list_ty *result;
   bool sort_by_msgid = false;
   bool sort_by_filepos = false;
@@ -138,6 +146,8 @@ main (int argc, char **argv)
   do_version = false;
   output_file = NULL;
   input_file = NULL;
+  only_file = NULL;
+  ignore_file = NULL;
 
   while ((optchar = getopt_long (argc, argv, "D:eEFhino:sVw:", long_options,
                                 NULL)) != EOF)
@@ -254,6 +264,14 @@ main (int argc, char **argv)
        message_page_width_ignore ();
        break;
 
+      case CHAR_MAX + 14: /* --only-file */
+       only_file = optarg;
+       break;
+
+      case CHAR_MAX + 15: /* --ignore-file */
+       ignore_file = optarg;
+       break;
+
       default:
        usage (EXIT_FAILURE);
        /* NOTREACHED */
@@ -300,8 +318,12 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
   /* Read input file.  */
   result = read_po_file (input_file);
 
+  /* Read optional files that limit the extent of the attribute changes.  */
+  only_mdlp = (only_file != NULL ? read_po_file (only_file) : NULL);
+  ignore_mdlp = (ignore_file != NULL ? read_po_file (ignore_file) : NULL);
+
   /* Filter the messages and manipulate the attributes.  */
-  result = process_msgdomain_list (result);
+  result = process_msgdomain_list (result, only_mdlp, ignore_mdlp);
 
   /* Sorting the list of messages.  */
   if (sort_by_filepos)
@@ -375,6 +397,8 @@ Attribute manipulation:\n\
       --clear-fuzzy           set all messages non-'fuzzy'\n\
       --set-obsolete          set all messages obsolete\n\
       --clear-obsolete        set all messages non-obsolete\n\
+      --only-file=FILE.po     manipulate only entries listed in FILE.po\n\
+      --ignore-file=FILE.po   manipulate only entries not listed in FILE.po\n\
       --fuzzy                 synonym for --only-fuzzy --clear-fuzzy\n\
       --obsolete              synonym for --only-obsolete --clear-obsolete\n\
 "));
@@ -442,7 +466,8 @@ is_message_selected (const message_ty *mp)
 
 
 static void
-process_message_list (message_list_ty *mlp)
+process_message_list (message_list_ty *mlp,
+                     message_list_ty *only_mlp, message_list_ty *ignore_mlp)
 {
   /* Keep only the selected messages.  */
   message_list_remove_if_not (mlp, is_message_selected);
@@ -456,27 +481,49 @@ process_message_list (message_list_ty *mlp)
        {
          message_ty *mp = mlp->item[j];
 
-         if (to_change & SET_FUZZY)
-           mp->is_fuzzy = true;
-         if (to_change & RESET_FUZZY)
-           mp->is_fuzzy = false;
-         /* Always keep the header entry non-obsolete.  */
-         if ((to_change & SET_OBSOLETE) && (mp->msgid[0] != '\0'))
-           mp->obsolete = true;
-         if (to_change & RESET_OBSOLETE)
-           mp->obsolete = false;
+         /* Attribute changes only affect messages listed in --only-file
+            and not listed in --ignore-file.  */
+         if ((only_mlp
+              ? message_list_search (only_mlp, mp->msgid) != NULL
+              : true)
+             && (ignore_mlp
+                 ? message_list_search (ignore_mlp, mp->msgid) == NULL
+                 : true))
+           {
+             if (to_change & SET_FUZZY)
+               mp->is_fuzzy = true;
+             if (to_change & RESET_FUZZY)
+               mp->is_fuzzy = false;
+             /* Always keep the header entry non-obsolete.  */
+             if ((to_change & SET_OBSOLETE) && (mp->msgid[0] != '\0'))
+               mp->obsolete = true;
+             if (to_change & RESET_OBSOLETE)
+               mp->obsolete = false;
+           }
        }
     }
 }
 
 
 static msgdomain_list_ty *
-process_msgdomain_list (msgdomain_list_ty *mdlp)
+process_msgdomain_list (msgdomain_list_ty *mdlp,
+                       msgdomain_list_ty *only_mdlp,
+                       msgdomain_list_ty *ignore_mdlp)
 {
   size_t k;
 
   for (k = 0; k < mdlp->nitems; k++)
-    process_message_list (mdlp->item[k]->messages);
+    process_message_list (mdlp->item[k]->messages,
+                         only_mdlp
+                         ? msgdomain_list_sublist (only_mdlp,
+                                                   mdlp->item[k]->domain,
+                                                   true)
+                         : NULL,
+                         ignore_mdlp
+                         ? msgdomain_list_sublist (ignore_mdlp,
+                                                   mdlp->item[k]->domain,
+                                                   false)
+                         : NULL);
 
   return mdlp;
 }