[FIND] Rewrite of the find utility. (#1553)
authorPaweł Cholewa <DaMcpg@protonmail.com>
Sat, 4 May 2019 22:39:14 +0000 (00:39 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 14 May 2019 18:37:38 +0000 (20:37 +0200)
This commit contains a complete rewrite of find console utility.
The goal of it was to make the source code easier to maintain
and to add a missing feature (/offline switch).

Additional changes:
 * now the program operates on Unicode strings;
 * added conutils and shlwapi as program's libraries;
 * added IDS_INVALID_SWITCH string into resources;
 * modified IDS_USAGE string to include /offline switch
   description.

https://ss64.com/nt/find.html was used for reference.

27 files changed:
base/applications/cmdutils/find/CMakeLists.txt
base/applications/cmdutils/find/find.c
base/applications/cmdutils/find/find.rc
base/applications/cmdutils/find/lang/bg-BG.rc
base/applications/cmdutils/find/lang/ca-ES.rc
base/applications/cmdutils/find/lang/cs-CZ.rc
base/applications/cmdutils/find/lang/de-DE.rc
base/applications/cmdutils/find/lang/el-GR.rc
base/applications/cmdutils/find/lang/en-US.rc
base/applications/cmdutils/find/lang/es-ES.rc
base/applications/cmdutils/find/lang/et-EE.rc
base/applications/cmdutils/find/lang/fr-FR.rc
base/applications/cmdutils/find/lang/it-IT.rc
base/applications/cmdutils/find/lang/lt-LT.rc
base/applications/cmdutils/find/lang/no-NO.rc
base/applications/cmdutils/find/lang/pl-PL.rc
base/applications/cmdutils/find/lang/pt-BR.rc
base/applications/cmdutils/find/lang/ro-RO.rc
base/applications/cmdutils/find/lang/ru-RU.rc
base/applications/cmdutils/find/lang/sk-SK.rc
base/applications/cmdutils/find/lang/sq-AL.rc
base/applications/cmdutils/find/lang/sv-SE.rc
base/applications/cmdutils/find/lang/tr-TR.rc
base/applications/cmdutils/find/lang/uk-UA.rc
base/applications/cmdutils/find/lang/zh-CN.rc
base/applications/cmdutils/find/lang/zh-TW.rc
base/applications/cmdutils/find/resource.h

index 7431f5e..1df4d1b 100644 (file)
@@ -1,5 +1,8 @@
 
+include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/conutils)
+
 add_executable(find find.c find.rc)
-set_module_type(find win32cui)
-add_importlibs(find user32 msvcrt kernel32)
+set_module_type(find win32cui UNICODE)
+target_link_libraries(find conutils ${PSEH_LIB})
+add_importlibs(find user32 msvcrt kernel32 shlwapi)
 add_cd_file(TARGET find DESTINATION reactos/system32 FOR all)
index 7121f5f..66cb2ef 100644 (file)
-/* find.c */
-
-/* Copyright (C) 1994-2002, Jim Hall <jhall@freedos.org> */
-
-/* Adapted for ReactOS */
-
 /*
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License along
-   with this program; if not, write to the Free Software Foundation, Inc.,
-   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-
-/* This program locates a string in a text file and prints those lines
- * that contain the string.  Multiple files are clearly separated.
+ * PROJECT:     ReactOS Find Command
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Prints all lines of a file that contain a string.
+ * COPYRIGHT:   Copyright 1994-2002 Jim Hall (jhall@freedos.org)
+ *              Copyright 2019 Paweł Cholewa (DaMcpg@protonmail.com)
  */
 
+#include <windows.h>
 #include <stdio.h>
-#include <stdlib.h>
-//#include <string.h>
-//#include <ctype.h>
-
-#include <windef.h>
-#include <winbase.h>
-#include <winuser.h>
-
-//#include <io.h>
-#include <dos.h>
+#include <conutils.h>
+#include <shlwapi.h> /* StrStrW and StrStrIW */
 
 #include "resource.h"
 
-/* Symbol definition */
-#define MAX_STR 1024
-
-/* This function prints out all lines containing a substring.  There are some
- * conditions that may be passed to the function.
+#define FIND_LINE_BUFFER_SIZE 4096
+
+static BOOL bInvertSearch = FALSE;
+static BOOL bCountLines = FALSE;
+static BOOL bDisplayLineNumbers = FALSE;
+static BOOL bIgnoreCase = FALSE;
+static BOOL bDoNotSkipOfflineFiles = FALSE;
+
+/**
+ * @name FindString
+ * @implemented
+ * 
+ * Prints all lines of the stream that contain a string.
+ * 
+ * @param pStream
+ * Stream to read from.
+ * 
+ * @param szFilePath
+ * Filename to print in console. Can be NULL.
+ * 
+ * @param szSearchedString
+ * String to search for.
+ * 
+ * @return
+ * 0 if the string was found at least once, 1 otherwise.
  *
- * RETURN: If the string was found at least once, returns 1.
- * If the string was not found at all, returns 0.
  */
-int
-find_str (char *sz, FILE *p, int invert_search,
-          int count_lines, int number_output, int ignore_case)
+static int FindString(FILE* pStream, LPWSTR szFilePath, LPWSTR szSearchedString)
 {
-  int i, length;
-  long line_number = 0, total_lines = 0;
-  char *c, temp_str[MAX_STR], this_line[MAX_STR];
-
-  /* Convert to upper if needed */
-  if (ignore_case)
-    {
-      length = strlen (sz);
-      for (i = 0; i < length; i++)
-       sz[i] = toupper (sz[i]);
-    }
+    WCHAR szLineBuffer[FIND_LINE_BUFFER_SIZE];
+    LONG lLineCount = 0;
+    LONG lLineNumber = 0;
+    BOOL bSubstringFound;
+    int iReturnValue = 1;
 
-  /* Scan the file until EOF */
-  while (fgets (temp_str, MAX_STR, p) != NULL)
+    if (szFilePath != NULL)
     {
-      /* Remove the trailing newline */
-      length = strlen (temp_str);
-      if (temp_str[length-1] == '\n')
-       {
-         temp_str[length-1] = '\0';
-       }
+        /* Convert the filename to uppercase (for formatting) */
+        CharUpperW(szFilePath);
 
-      /* Increment number of lines */
-      line_number++;
-      strcpy (this_line, temp_str);
+        /* Print the file's header */
+        ConPrintf(StdOut, L"\n---------- %s", szFilePath);
 
-      /* Convert to upper if needed */
-      if (ignore_case)
-       {
-         for (i = 0; i < length; i++)
-           {
-             temp_str[i] = toupper (temp_str[i]);
-           }
-       }
-
-      /* Locate the substring */
+        if (bCountLines)
+        {
+            ConPrintf(StdOut, L": ");
+        }
+        else
+        {
+            ConPrintf(StdOut, L"\n");
+        }
+    }
 
-      /* strstr() returns a pointer to the first occurrence in the
-       string of the substring */
-      c = strstr (temp_str, sz);
+    /* Loop through every line in the file */
+    while (fgetws(szLineBuffer, sizeof(szLineBuffer), pStream) != NULL)
+    {
+        lLineCount++;
 
-      if ( ((invert_search) ? (c == NULL) : (c != NULL)) )
-       {
-         if (!count_lines)
-           {
-             if (number_output)
-               printf ("%ld:", line_number);
+        if (bIgnoreCase)
+        {
+            bSubstringFound = StrStrIW(szLineBuffer, szSearchedString) != NULL;
+        }
+        else
+        {
+            bSubstringFound = StrStrW(szLineBuffer, szSearchedString) != NULL;
+        }
+        
 
-             /* Print the line of text */
-             puts (this_line);
-           }
+        /* Check if this line can be counted */
+        if (bSubstringFound != bInvertSearch)
+        {
+            iReturnValue = 0;
 
-         total_lines++;
-       } /* long if */
-    } /* while fgets */
+            if (bCountLines)
+            {
+                lLineNumber++;
+            }
+            else
+            {
+                /* Display the line on the screen */
+                if (bDisplayLineNumbers)
+                {
+                    ConPrintf(StdOut, L"[%ld]", lLineCount);
+                }
+                ConPrintf(StdOut, L"%s", szLineBuffer);
+            }
+        }
+    }
 
-  if (count_lines)
+    if (bCountLines)
     {
-      /* Just show num. lines that contain the string */
-      printf ("%ld\n", total_lines);
+        /* Print the matching line count */
+        ConPrintf(StdOut, L"%ld\n", lLineNumber);
+    }
+    else if (szFilePath != NULL && iReturnValue == 0)
+    {
+        /* Print a newline for formatting */
+        ConPrintf(StdOut, L"\n");
     }
 
-
- /* RETURN: If the string was found at least once, returns 1.
-  * If the string was not found at all, returns 0.
-  */
-  return (total_lines > 0 ? 1 : 0);
+    return iReturnValue;
 }
 
-/* Show usage */
-void
-usage (void)
+int wmain(int argc, WCHAR* argv[])
 {
-  WCHAR wszUsage[4096];
-  char oemUsage[4096];
+    int i;
+    int iReturnValue = 2;
+    int iSearchedStringIndex = -1;
 
-  LoadStringW (GetModuleHandleW (NULL), IDS_USAGE, wszUsage, sizeof(wszUsage) / sizeof(wszUsage[0]));
-  CharToOemW (wszUsage, oemUsage);
-  fputs (oemUsage, stdout);
-}
+    BOOL bFoundFileParameter = FALSE;
 
+    HANDLE hFindFileHandle;
+    WIN32_FIND_DATAW FindData;
 
-/* Main program */
-int
-main (int argc, char **argv)
-{
-  char *opt, *needle = NULL;
-  int ret = 0;
-  WCHAR wszMessage[4096];
-  char oemMessage[4096];
+    FILE* pOpenedFile;
 
-  int invert_search = 0;               /* flag to invert the search */
-  int count_lines = 0;                 /* flag to whether/not count lines */
-  int number_output = 0;               /* flag to print line numbers */
-  int ignore_case = 0;                 /* flag to be case insensitive */
+    ConInitStdStreams();
 
-  FILE *pfile;                         /* file pointer */
-  int hfind;                           /* search handle */
-  struct _finddata_t finddata;         /* _findfirst, filenext block */
+    if (argc == 1)
+    {
+        /* If no argument were provided by the user, display program usage and exit */
+        ConResPuts(StdOut, IDS_USAGE);
+        return 0;
+    }
 
-  /* Scan the command line */
-  while ((--argc) && (needle == NULL))
+    /* Parse the command line arguments */
+    for (i = 1; i < argc; i++)
     {
-      if (*(opt = *++argv) == '/')
+        /* Check if this argument contains a switch */
+        if (lstrlenW(argv[i]) == 2 && argv[i][0] == L'/')
         {
-          switch (opt[1])
-           {
-             case 'c':
-             case 'C':         /* Count */
-               count_lines = 1;
-               break;
-
-             case 'i':
-             case 'I':         /* Ignore */
-               ignore_case = 1;
-               break;
-
-             case 'n':
-             case 'N':         /* Number */
-               number_output = 1;
-               break;
-
-             case 'v':
-             case 'V':         /* Not with */
-               invert_search = 1;
-               break;
-
-             default:
-               usage ();
-               exit (2);               /* syntax error .. return error 2 */
-               break;
-           }
+            switch (argv[i][1])
+            {
+                case L'?':
+                    ConResPuts(StdOut, IDS_USAGE);
+                    return 0;
+                case L'v':
+                case L'V':
+                    bInvertSearch = TRUE;
+                    break;
+                case L'c':
+                case L'C':
+                    bCountLines = TRUE;
+                    break;
+                case L'n':
+                case L'N':
+                    bDisplayLineNumbers = TRUE;
+                    break;
+                case L'i':
+                case L'I':
+                    bIgnoreCase = TRUE;
+                    break;
+                default:
+                    /* Report invalid switch error */
+                    ConResPuts(StdOut, IDS_INVALID_SWITCH);
+                    return 2;
+            }
         }
-      else
+        else if (lstrlenW(argv[i]) > 2 && argv[i][0] == L'/')
         {
-          /* Get the string */
-         if (needle == NULL)
-           {
-              /* Assign the string to find */
-              needle = *argv;
-           }
-       }
-    }
-
-  /* Check for search string */
-  if (needle == NULL)
-    {
-      /* No string? */
-      usage ();
-      exit (1);
+            /* Check if this parameter is /OFF or /OFFLINE */
+            if (lstrcmpiW(argv[i], L"/off") == 0 || lstrcmpiW(argv[i], L"/offline") == 0)
+            {
+                bDoNotSkipOfflineFiles = TRUE;
+            }
+            else
+            {
+                /* Report invalid switch error */
+                ConResPuts(StdOut, IDS_INVALID_SWITCH);
+                return 2;
+            }
+        }
+        else
+        {
+            if (iSearchedStringIndex == -1)
+            {
+                iSearchedStringIndex = i;
+            }
+            else
+            {
+                /* There's a file specified in the parameters, no need to read from stdin */
+                bFoundFileParameter = TRUE;
+            }
+        }
     }
 
-  /* Scan the files for the string */
-  if (argc == 0)
+    if (iSearchedStringIndex == -1)
     {
-      ret = find_str (needle, stdin, invert_search, count_lines,
-                      number_output, ignore_case);
+        /* User didn't provide the string to search for, display program usage and exit */
+        ConResPuts(StdOut, IDS_USAGE);
+        return 2;
     }
 
-  while (--argc >= 0)
+    if (bFoundFileParameter)
     {
-      hfind = _findfirst (*++argv, &finddata);
-      if (hfind < 0)
-       {
-         /* We were not able to find a file. Display a message and
-            set the exit status. */
-         LoadStringW (GetModuleHandleW (NULL), IDS_NO_SUCH_FILE, wszMessage, sizeof(wszMessage) / sizeof(wszMessage[0]));
-         CharToOemW (wszMessage, oemMessage);
-         fprintf (stderr, oemMessage, *argv);
-       }
-      else
+        /* After the command line arguments were parsed, iterate through them again to get the filenames */
+        for (i = 1; i < argc; i++)
         {
-          /* repeat find next file to match the filemask */
-         do
+            /* If the value is a switch or the searched string, continue */
+            if ((lstrlenW(argv[i]) > 0 && argv[i][0] == L'/') || i == iSearchedStringIndex)
+            {
+                continue;
+            }
+
+            hFindFileHandle = FindFirstFileW(argv[i], &FindData);
+            if (hFindFileHandle == INVALID_HANDLE_VALUE)
             {
-              /* We have found a file, so try to open it */
-             if ((pfile = fopen (finddata.name, "r")) != NULL)
-               {
-                 printf ("---------------- %s\n", finddata.name);
-                 ret = find_str (needle, pfile, invert_search, count_lines,
-                                 number_output, ignore_case);
-                 fclose (pfile);
-               }
-             else
-               {
-                 LoadStringW (GetModuleHandleW (NULL), IDS_CANNOT_OPEN, wszMessage, sizeof(wszMessage) / sizeof(wszMessage[0]));
-                 CharToOemW (wszMessage, oemMessage);
-                 fprintf (stderr, oemMessage,
-                          finddata.name);
+                ConResPrintf(StdOut, IDS_NO_SUCH_FILE, argv[i]);
+                continue;
+            }
+            
+            do
+            {
+                /* Check if the file contains offline attribute and should be skipped */
+                if ((FindData.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) && !bDoNotSkipOfflineFiles)
+                {
+                    continue;
+                }
+
+                pOpenedFile = _wfopen(FindData.cFileName, L"r");
+                if (pOpenedFile == NULL)
+                {
+                    ConResPrintf(StdOut, IDS_CANNOT_OPEN, FindData.cFileName);
+                    continue;
                 }
-           }
-          while (_findnext(hfind, &finddata) > 0);
-        }
-      _findclose(hfind);
-    } /* for each argv */
 
- /* RETURN: If the string was found at least once, returns 0.
-  * If the string was not found at all, returns 1.
-  * (Note that find_str.c returns the exact opposite values.)
-  */
-  exit ( (ret ? 0 : 1) );
+                if (FindString(pOpenedFile, FindData.cFileName, argv[iSearchedStringIndex]) == 0)
+                {
+                    iReturnValue = 0;
+                }
+                else if (iReturnValue != 0)
+                {
+                    iReturnValue = 1;
+                }
+
+                fclose(pOpenedFile);
+            } while (FindNextFileW(hFindFileHandle, &FindData));
+
+            FindClose(hFindFileHandle);
+        }
+    }
+    else
+    {
+        FindString(stdin, NULL, argv[iSearchedStringIndex]);
+    }
+    
+    return iReturnValue;
 }
index 92b8ae4..7123958 100644 (file)
@@ -2,9 +2,9 @@
 
 #include "resource.h"
 
-#define REACTOS_STR_FILE_DESCRIPTION  "ReactOS Find Command"
-#define REACTOS_STR_INTERNAL_NAME     "find"
-#define REACTOS_STR_ORIGINAL_FILENAME "find.exe"
+#define REACTOS_STR_FILE_DESCRIPTION    "ReactOS Find Command"
+#define REACTOS_STR_INTERNAL_NAME       "find"
+#define REACTOS_STR_ORIGINAL_FILENAME   "find.exe"
 #include <reactos/version.rc>
 
 /* UTF-8 */
@@ -77,4 +77,4 @@
 #endif
 #ifdef LANGUAGE_ZH_TW
     #include "lang/zh-TW.rc"
-#endif
\ No newline at end of file
+#endif
index 7f5950a..f473225 100644 (file)
@@ -2,12 +2,14 @@ LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
 
 STRINGTABLE
 BEGIN
-    IDS_USAGE "FIND: Извежда всички редове във файла, които съдържат указания низ..\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""низ"" [ файл... ]\n\
-    /C  Брои колко реда съдържат низа\n\
-    /I  Пренебрегва ГлАвНОсТта\n\
-    /N  Брой показани редове, като се започва от 1\n\
-    /V  Извеждане на редовете, НЕсъдържащи низа."
+    IDS_USAGE "FIND: Извежда всички редове във файла, които съдържат указания низ.\n\n\
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""низ"" [файл...]\n\
+  /V         Извеждане на редовете, НЕсъдържащи низа.\n\
+  /C         Брои колко реда съдържат низа.\n\
+  /N         Брой показани редове, като се започва от 1.\n\
+  /I         Пренебрегва ГлАвНОсТта.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Няма такъв файл\n"
     IDS_CANNOT_OPEN "FIND: %s: Отварянето на файла е невъзможно\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index ef2b62a..ddc84de 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Mostra totes les linies que continguin una determinada cadena de caràcters.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""Cadena de caràcters"" [ file... ]\n\
-    /C  Conta el numero de linies que contenen la cadena de caràcters\n\
-    /I  Ignora majúscules i minúscules\n\
-    /N  Numero de linies mostrades, començant per la primera\n\
-    /V  Mostra les linies que no contenen la cadena de caràcters"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""Cadena de caràcters"" [file...]\n\
+  /V         Mostra les linies que no contenen la cadena de caràcters.\n\
+  /C         Conta el numero de linies que contenen la cadena de caràcters.\n\
+  /N         Numero de linies mostrades, començant per la primera.\n\
+  /I         Ignora majúscules i minúscules.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: No he trobat el fitxer\n"
     IDS_CANNOT_OPEN "FIND: %s: No puc obrir el fitxer\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 9781890..3553fdb 100644 (file)
@@ -9,11 +9,13 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Zobrazí všechny řádky souboru obsahující hledaný řetězec.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""řetězec"" [ soubor... ]\n\
-    /C  Zobrazí počet řádků obsahující řetězec.\n\
-    /I  Ignoruje velikost písmen.\n\
-    /N  Čísluje zobrazené řádky, začíná od 1.\n\
-    /V  Zobrazí všechny řádky, které NEobsahují zadaný řetěžec."
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""řetězec"" [soubor...]\n\
+  /V         Zobrazí všechny řádky, které NEobsahují zadaný řetěžec.\n\
+  /C         Zobrazí počet řádků obsahující řetězec.\n\
+  /N         Čísluje zobrazené řádky, začíná od 1.\n\
+  /I         Ignoruje velikost písmen.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: Soubor %s nebyl nalezen.\n"
     IDS_CANNOT_OPEN "FIND: Soubor %s nelze otevřít!\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index de8d09e..44ca8d3 100644 (file)
@@ -3,12 +3,14 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "Sucht in einer Datei nach einer Zeichenfolge.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""Zeichenfolge""\n\
-     [[Laufwerk:][Pfad]Dateiname]]\n\
-    /C  Zeigt nur die Anzahl der die Zeichenfolge enthaltenen Zeilen an.\n\
-    /I  Ignoriert Groß-/Kleinbuchstaben bei der Suche.\n\
-    /N  Zeigt die Zeilen mit ihren Zeilennummern an.\n\
-    /V  Zeigt alle Zeilen an, die die Zeichenfolge NICHT enhalten."
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""Zeichenfolge""\n\
+     [[Laufwerk:][Pfad]Dateiname[ ...]]\n\
+  /V         Zeigt alle Zeilen an, die die Zeichenfolge NICHT enhalten.\n\
+  /C         Zeigt nur die Anzahl der die Zeichenfolge enthaltenen Zeilen an.\n\
+  /N         Zeigt die Zeilen mit ihren Zeilennummern an.\n\
+  /I         Ignoriert Groß-/Kleinbuchstaben bei der Suche.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "Datei %s nicht gefunden\n"
     IDS_CANNOT_OPEN "Datei %s kann nicht geöffnet werden.\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 9bc2131..8f700b6 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_GREEK, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Εκτυπώνει όλες τις γραμμές ενός αρχείου που περιέχουν ένα αλφαριθμητικό.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""αλφαριθμητικό"" [ αρχείο... ]\n\
-    /C  Μέτρηση γραμμών που περιέχουν το αλφαριθμητικό\n\
-    /I  Αγνόηση κεφαλαίων\n\
-    /N  Εμφάνιση αριθμών στις εμφανιζόμενες γραμμές, ξεκινώντας από το 1\n\
-    /V  Εκτύπωση γραμμών που δεν περιέχουν το αλφαριθμητικό"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""αλφαριθμητικό"" [αρχείο...]\n\
+  /V         Εκτύπωση γραμμών που δεν περιέχουν το αλφαριθμητικό.\n\
+  /C         Μέτρηση γραμμών που περιέχουν το αλφαριθμητικό.\n\
+  /N         Εμφάνιση αριθμών στις εμφανιζόμενες γραμμές, ξεκινώντας από το 1.\n\
+  /I         Αγνόηση κεφαλαίων.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Δεν υπάρχει αυτό το αρχείο\n"
     IDS_CANNOT_OPEN "FIND: %s: Δεν ήταν δυνατό το άνοιγμα του αρχείου\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index d78b026..06a00da 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Prints all lines of a file that contain a string.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""string"" [ file... ]\n\
-    /C  Count the number of lines that contain string\n\
-    /I  Ignore case\n\
-    /N  Number the displayed lines, starting at 1\n\
-    /V  Print lines that do not contain the string"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""string"" [file...]\n\
+  /V         Print lines that do not contain the string.\n\
+  /C         Count the number of lines that contain the string.\n\
+  /N         Number the displayed lines, starting at 1.\n\
+  /I         Ignore case.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: No such file\n"
     IDS_CANNOT_OPEN "FIND: %s: Cannot open file\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index ee65978..14b736d 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Imprime todas las líneas de un fichero que contiene una cadena.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""cadena"" [ fichero... ]\n\
-    /C  Cuenta el número de líneas que contienen la cadena de caracteres\n\
-    /I  Ignora mayúsculas y minúsculas\n\
-    /N  Numero de líneas a mostrar en pantalla, a partir de la primera\n\
-    /V  Muestra las líneas que no contienen la cadena de caracteres."
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""cadena"" [fichero...]\n\
+  /V         Muestra las líneas que no contienen la cadena de caracteres.\n\
+  /C         Cuenta el número de líneas que contienen la cadena de caracteres.\n\
+  /N         Numero de líneas a mostrar en pantalla, a partir de la primera.\n\
+  /I         Ignora mayúsculas y minúsculas.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: No se encontró el fichero\n"
     IDS_CANNOT_OPEN "FIND: %s: No se pudo abrir el fichero\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 6a6b28e..25cc068 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_ESTONIAN, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Trükib kõik read failist, mis sisaldavad stringi.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""string"" [ file... ]\n\
-    /C  Loenda arvuna stringi sisaldavaid ridu\n\
-    /I  Tõstutundetult\n\
-    /N  Nummerda kuvatud read alustades 1-st\n\
-    /V  Trüki read, mis ei sisalda stringi"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""string"" [file...]\n\
+  /V         Trüki read, mis ei sisalda stringi.\n\
+  /C         Loenda arvuna stringi sisaldavaid ridu.\n\
+  /N         Nummerda kuvatud read alustades 1-st.\n\
+  /I         Tõstutundetult.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Sellist faili ei leitud\n"
     IDS_CANNOT_OPEN "FIND: %s: Ei saa faili avada\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 4a47d1f..36329a4 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Affiche toutes les lignes d'un fichier qui contiennent un morceau de texte.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""texte"" [ fichier... ]\n\
-    /C  Compte le nombre de lignes qui contiennent le texte\n\
-    /I  Insensible à la casse\n\
-    /N  Numérote les lignes affichées en commençant à 1\n\
-    /V  Affiche les lignes qui ne contiennent pas le texte"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""texte"" [fichier...]\n\
+  /V         Affiche les lignes qui ne contiennent pas le texte.\n\
+  /C         Compte le nombre de lignes qui contiennent le texte.\n\
+  /N         Numérote les lignes affichées en commençant à 1.\n\
+  /I         Insensible à la casse.\n\
+  /OFF[LINE] Ne pas ignorer les fichiers ayant l'attribut hors-ligne."
     IDS_NO_SUCH_FILE "FIND: %s : fichier inexistant\n"
     IDS_CANNOT_OPEN "FIND: %s : impossible d'ouvrir le fichier\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 49d9b9d..ca1edaa 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Visualizza le linee di un file che contengono un stringa.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""stringa"" [ file... ]\n\
-    /C  Conta il numero di linee che contengono la stringa\n\
-    /I  Ignora maiuscole/minuscole\n\
-    /N  Numera le linee visualizzate a partire da 1\n\
-    /V  Visualizza le linee che non contengono la stringa"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""stringa"" [file...]\n\
+  /V         Visualizza le linee che non contengono la stringa.\n\
+  /C         Conta il numero di linee che contengono la stringa.\n\
+  /N         Numera le linee visualizzate a partire da 1.\n\
+  /I         Ignora maiuscole/minuscole.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: File non trovato\n"
     IDS_CANNOT_OPEN "FIND: %s: Impossibile aprire il file\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 4c9426f..2d95ccb 100644 (file)
@@ -12,11 +12,13 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Spausdina visas bylos eilutes, kuriose yra ieškomas tekstas.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""tekstas"" [ byla... ]\n\
-    /C  Skaičiuoti eilutes, kuriose yra ieškomas tekstas\n\
-    /I  Ignoruoti raidžių dydį\n\
-    /N  Numeruoti vaizduojamas eilutes, pradedant nuo 1\n\
-    /V  Spausdinti eilutes, kuriose nėra ieškomo teksto"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""tekstas"" [byla...]\n\
+  /V         Spausdinti eilutes, kuriose nėra ieškomo teksto.\n\
+  /C         Skaičiuoti eilutes, kuriose yra ieškomas tekstas.\n\
+  /N         Numeruoti vaizduojamas eilutes, pradedant nuo 1.\n\
+  /I         Ignoruoti raidžių dydį.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Tokios bylos nėra\n"
     IDS_CANNOT_OPEN "FIND: %s: Nepavyko atverti bylos\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index aabcb2b..8638bf5 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FINN: Skriv alle linjene for filen som inneholder en streng.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""streng"" [ fil... ]\n\
-    /C  Teller nummer av linjer som inneholder strenger\n\
-    /I  Ignorere sak\n\
-    /N  Nummer viste linjer, start med 1\n\
-    /V  Skriv linjer som ikke inneholder en streng"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""streng"" [fil...]\n\
+  /V         Skriv linjer som ikke inneholder en streng.\n\
+  /C         Teller nummer av linjer som inneholder strenger.\n\
+  /N         Nummer viste linjer, start med 1.\n\
+  /I         Ignorere sak.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FINN: %s: Ingen filer\n"
     IDS_CANNOT_OPEN "FINN: %s: Kan ikke åpne filen\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index bf10a5e..a108973 100644 (file)
@@ -11,11 +11,13 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Wyświetla wszystkie linie danego pliku, zawierające szukany ciąg znaków.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""ciąg znaków"" [ plik... ]\n\
-    /C  Oblicza w ilu liniach pojawił się szukany ciąg znaków\n\
-    /I  Ignoruje wielkość liter\n\
-    /N  Numeruje wyświetlane linie, zaczynając od 1\n\
-    /V  Wyświetla te linie, które nie zawierają szukanego ciągu znaków"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""ciąg znaków"" [plik...]\n\
+  /V         Wyświetla te linie, które nie zawierają szukanego ciągu znaków.\n\
+  /C         Oblicza w ilu liniach pojawił się szukany ciąg znaków.\n\
+  /N         Numeruje wyświetlane linie, zaczynając od 1.\n\
+  /I         Ignoruje wielkość liter.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Plik nie został znaleziony\n"
     IDS_CANNOT_OPEN "FIND: %s: Nie można otworzyć pliku\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index d59bf5c..5ae45b3 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Localiza uma seqüência de texto em um ou mais arquivos.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""seqüência"" [ arquivo... ]\n\
-    /C  Exibe apenas o número de linhas que contêm a seqüência.\n\
-    /I  Ignora maiúsculas/minúsculas ao localizar uma seqüência.\n\
-    /N  Exibe o número de cada linha, iniciando no 1.\n\
-    /V  Exibe todas as linhas que NÃO contêm a seqüência especificada."
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""seqüência"" [arquivo...]\n\
+  /V         Exibe todas as linhas que NÃO contêm a seqüência especificada.\n\
+  /C         Exibe apenas o número de linhas que contêm a seqüência.\n\
+  /N         Exibe o número de cada linha, iniciando no 1.\n\
+  /I         Ignora maiúsculas/minúsculas ao localizar uma seqüência.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Arquivo não encontrado\n"
     IDS_CANNOT_OPEN "FIND: %s: Não foi possível abrir o arquivo\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 5b35622..2a953f3 100644 (file)
@@ -11,11 +11,13 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Tipărește toate rândurile unui fișier ce conțin un șir.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""șir"" [ fișier... ]\n\
-    /C  Numără liniile ce conțin șirul.\n\
-    /I  Ignoră diferențele între majuscule și minuscule.\n\
-    /N  Numără rândurile afișate, începând cu 1.\n\
-    /V  Tipărește rândurile ce nu conțin șirul."
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""șir"" [fișier...]\n\
+  /V         Tipărește rândurile ce nu conțin șirul.\n\
+  /C         Numără liniile ce conțin șirul.\n\
+  /N         Numără rândurile afișate, începând cu 1.\n\
+  /I         Ignoră diferențele între majuscule și minuscule.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: Fișierul «%s» nu există!\n"
     IDS_CANNOT_OPEN "FIND: Fișierul «%s» nu poate fi deschis!\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 347e3d1..83061e8 100644 (file)
@@ -3,14 +3,16 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "Поиск текстовой строки в одном или нескольких файлах.\n\n\
-FIND [/V] [/C] [/N] [/I] ""строка"" [[диск:][путь]имя_файла[ ...]]\n\
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""строка"" [[диск:][путь]имя_файла[ ...]]\n\
   /V         Вывод всех строк, НЕ содержащих заданную строку.\n\
   /C         Вывод только общего числа строк, содержащих заданную строку.\n\
   /N         Вывод номеров отображаемых строк.\n\
   /I         Поиск без учета регистра символов.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set.\n\
   ""строка""   Искомая строка.\n\
   [диск:][путь]имя_файла\n\
              Один или несколько файлов, в которых выполняется поиск."
     IDS_NO_SUCH_FILE "FIND: %s: Файл не существует.\n"
     IDS_CANNOT_OPEN "FIND: %s: Невозможно открыть файл.\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 4354eac..c6825a5 100644 (file)
@@ -7,11 +7,13 @@ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Zobrazí všetky riadky súboru obsahujúce hľadaný reťazec.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""reťazec"" [ súbor... ]\n\
-    /C  Zobrazí počet riadkov, ktoré obsahujú reťazec.\n\
-    /I  Ignoruje veľkosť písmen.\n\
-    /N  Čísluje zobrazené riadky, začína od 1.\n\
-    /V  Zobrazí všetky riadky, ktoré neobsahujú hľadaný reťazec."
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""reťazec"" [súbor...]\n\
+  /V         Zobrazí všetky riadky, ktoré neobsahujú hľadaný reťazec.\n\
+  /C         Zobrazí počet riadkov, ktoré obsahujú reťazec.\n\
+  /N         Čísluje zobrazené riadky, začína od 1.\n\
+  /I         Ignoruje veľkosť písmen.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: Súbor %s sa nenašiel.\n"
     IDS_CANNOT_OPEN "FIND: Súbor %s sa nedá otvoriť.\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 0b1bc1a..6a010cc 100644 (file)
@@ -7,11 +7,13 @@ LANGUAGE LANG_ALBANIAN, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Printon të gjitha linjat e një skedari që përmbajnë një fije.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""fije"" [ file... ]\n\
-    /C  Numërimi i numerave e linjave që përmbajnë nje fije\n\
-    /I  Injorojnë çështjen\n\
-    /N  Shfaq numrin e linjave, duke filluar nga 1\n\
-    /V  Shfaq linjat e nuk permbajne nje fije"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""fije"" [file...]\n\
+  /V         Shfaq linjat e nuk permbajne nje fije.\n\
+  /C         Numërimi i numerave e linjave që përmbajnë nje fije.\n\
+  /N         Shfaq numrin e linjave, duke filluar nga 1.\n\
+  /I         Injorojnë çështjen.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Dokumenti nuk i gjet\n"
     IDS_CANNOT_OPEN "FIND: %s: E pamundur te hapet dokumenti\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 329a597..94d3c97 100644 (file)
@@ -3,11 +3,13 @@ LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Skriver ut alla rader i en fil som innehåller en sträng.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""sträng"" [ fil... ]\n\
-    /C  Räkna antalet rader som innehåller en strängen\n\
-    /I  Ignorera skiftläge\n\
-    /N  Antal visade rader, börjar på 1\n\
-    /V  Skriver ut rader som inte innehåller strängen"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""sträng"" [fil...]\n\
+  /V         Skriver ut rader som inte innehåller strängen.\n\
+  /C         Räkna antalet rader som innehåller en strängen.\n\
+  /N         Antal visade rader, börjar på 1.\n\
+  /I         Ignorera skiftläge.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Ingen sorts fil\n"
     IDS_CANNOT_OPEN "FIND: %s: Kan inte öppna filen\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index fd2c8a7..a97c457 100644 (file)
@@ -5,11 +5,13 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Bir dizgi içeren bir kütüğün tüm yataçlarını yazdırır.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""dizgi"" [ kütük... ]\n\
-    /C  Dizgi içeren yataç sayısını say\n\
-    /I  Büyük-küçük harfliği yok say\n\
-    /N  1'den başlayan, görüntülenen yataç sayısı\n\
-    /V  Dizgi içermeyen yataçları yazdır"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""dizgi"" [kütük...]\n\
+  /V         Dizgi içermeyen yataçları yazdır.\n\
+  /C         Dizgi içeren yataç sayısını say.\n\
+  /N         1'den başlayan, görüntülenen yataç sayısı.\n\
+  /I         Büyük-küçük harfliği yok say.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Böyle dosya yok\n"
     IDS_CANNOT_OPEN "FIND: %s: Kütük açılamıyor\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 82e5704..7e7643d 100644 (file)
@@ -11,11 +11,13 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: Виведення всіх рядків файлу, які містять рядок.\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""рядок"" [ файл... ]\n\
-    /C  Порахувати кількість рядків, які містять рядок\n\
-    /I  Не враховувати регістр символів\n\
-    /N  Нумерувати рядки, які відображаються (починаючи з 1)\n\
-    /V  Виведення рядків, які не містять заданий рядок"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""рядок"" [файл...]\n\
+  /V         Виведення рядків, які не містять заданий рядок.\n\
+  /C         Порахувати кількість рядків, які містять рядок.\n\
+  /N         Нумерувати рядки, які відображаються (починаючи з 1).\n\
+  /I         Не враховувати регістр символів.\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: Файл не існує\n"
     IDS_CANNOT_OPEN "FIND: %s: Неможливо відкрити файл\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 4e394e8..e3822f8 100644 (file)
@@ -5,11 +5,13 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: 输出某文件中包含指定字符串的所有行。\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""字符串"" [ 文件... ]\n\
-    /C  计算包含该字符串的行数\n\
-    /I  忽略大小写\n\
-    /N  从 1 开始为显示的行编号\n\
-    /V  输出不包含该指定字符串的行"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""字符串"" [文件...]\n\
+  /V         输出不包含该指定字符串的行。\n\
+  /C         计算包含该字符串的行数。\n\
+  /N         从 1 开始为显示的行编号。\n\
+  /I         忽略大小写。\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: 没有这个文件\n"
     IDS_CANNOT_OPEN "FIND: %s: 无法打开文件\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 55d618b..cd2c7b8 100644 (file)
@@ -5,11 +5,13 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
 STRINGTABLE
 BEGIN
     IDS_USAGE "FIND: 輸出某檔中包含指定字串的所有行。\n\n\
-  FIND [ /C ] [ /I ] [ /N ] [ /V ] ""字串"" [ 文件... ]\n\
-    /C  計算包含該字串的行數\n\
-    /I  忽略大小寫\n\
-    /N  從 1 開始為顯示的行編號\n\
-    /V  輸出不包含該指定字串的行"
+FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] ""字串"" [文件...]\n\
+  /V         輸出不包含該指定字串的行。\n\
+  /C         計算包含該字串的行數。\n\
+  /N         從 1 開始為顯示的行編號。\n\
+  /I         忽略大小寫。\n\
+  /OFF[LINE] Do not skip files that have the offline attribute set."
     IDS_NO_SUCH_FILE "FIND: %s: 沒有這個檔\n"
     IDS_CANNOT_OPEN "FIND: %s: 無法開啟檔\n"
+    IDS_INVALID_SWITCH "FIND: Invalid switch\n"
 END
index 99e8f2d..2dba86f 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 
-#define IDS_USAGE        1000
-#define IDS_NO_SUCH_FILE 1001
-#define IDS_CANNOT_OPEN  1002
+#define IDS_USAGE           1000
+#define IDS_NO_SUCH_FILE    1001
+#define IDS_CANNOT_OPEN     1002
+#define IDS_INVALID_SWITCH  1003