[FIND] Rewrite of the find utility. (#1553)

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.
This commit is contained in:
Paweł Cholewa 2019-05-05 00:39:14 +02:00 committed by Hermès Bélusca-Maïto
parent 9a6eb70ff9
commit 1bd330cd81
No known key found for this signature in database
GPG Key ID: 3B2539C65E7B93D0
27 changed files with 407 additions and 350 deletions

View 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)

View File

@ -1,256 +1,263 @@
/* 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
#define FIND_LINE_BUFFER_SIZE 4096
/* This function prints out all lines containing a substring. There are some
* conditions that may be passed to the function.
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];
WCHAR szLineBuffer[FIND_LINE_BUFFER_SIZE];
LONG lLineCount = 0;
LONG lLineNumber = 0;
BOOL bSubstringFound;
int iReturnValue = 1;
/* Convert to upper if needed */
if (ignore_case)
if (szFilePath != NULL)
{
length = strlen (sz);
for (i = 0; i < length; i++)
sz[i] = toupper (sz[i]);
}
/* Convert the filename to uppercase (for formatting) */
CharUpperW(szFilePath);
/* Scan the file until EOF */
while (fgets (temp_str, MAX_STR, p) != NULL)
{
/* Remove the trailing newline */
length = strlen (temp_str);
if (temp_str[length-1] == '\n')
{
temp_str[length-1] = '\0';
}
/* Print the file's header */
ConPrintf(StdOut, L"\n---------- %s", szFilePath);
/* Increment number of lines */
line_number++;
strcpy (this_line, temp_str);
/* Convert to upper if needed */
if (ignore_case)
{
for (i = 0; i < length; i++)
{
temp_str[i] = toupper (temp_str[i]);
}
}
/* Locate the substring */
/* strstr() returns a pointer to the first occurrence in the
string of the substring */
c = strstr (temp_str, sz);
if ( ((invert_search) ? (c == NULL) : (c != NULL)) )
{
if (!count_lines)
{
if (number_output)
printf ("%ld:", line_number);
/* Print the line of text */
puts (this_line);
}
total_lines++;
} /* long if */
} /* while fgets */
if (count_lines)
{
/* Just show num. lines that contain the string */
printf ("%ld\n", total_lines);
}
/* 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);
}
/* Show usage */
void
usage (void)
{
WCHAR wszUsage[4096];
char oemUsage[4096];
LoadStringW (GetModuleHandleW (NULL), IDS_USAGE, wszUsage, sizeof(wszUsage) / sizeof(wszUsage[0]));
CharToOemW (wszUsage, oemUsage);
fputs (oemUsage, stdout);
}
/* Main program */
int
main (int argc, char **argv)
{
char *opt, *needle = NULL;
int ret = 0;
WCHAR wszMessage[4096];
char oemMessage[4096];
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 */
FILE *pfile; /* file pointer */
int hfind; /* search handle */
struct _finddata_t finddata; /* _findfirst, filenext block */
/* Scan the command line */
while ((--argc) && (needle == NULL))
{
if (*(opt = *++argv) == '/')
if (bCountLines)
{
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;
}
ConPrintf(StdOut, L": ");
}
else
else
{
/* Get the string */
if (needle == NULL)
{
/* Assign the string to find */
needle = *argv;
}
}
ConPrintf(StdOut, L"\n");
}
}
/* Check for search string */
if (needle == NULL)
/* Loop through every line in the file */
while (fgetws(szLineBuffer, sizeof(szLineBuffer), pStream) != NULL)
{
/* No string? */
usage ();
exit (1);
}
lLineCount++;
/* Scan the files for the string */
if (argc == 0)
{
ret = find_str (needle, stdin, invert_search, count_lines,
number_output, ignore_case);
}
while (--argc >= 0)
{
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
if (bIgnoreCase)
{
/* repeat find next file to match the filemask */
do
bSubstringFound = StrStrIW(szLineBuffer, szSearchedString) != NULL;
}
else
{
bSubstringFound = StrStrW(szLineBuffer, szSearchedString) != NULL;
}
/* Check if this line can be counted */
if (bSubstringFound != bInvertSearch)
{
iReturnValue = 0;
if (bCountLines)
{
/* 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);
lLineNumber++;
}
else
{
/* Display the line on the screen */
if (bDisplayLineNumbers)
{
ConPrintf(StdOut, L"[%ld]", lLineCount);
}
}
while (_findnext(hfind, &finddata) > 0);
ConPrintf(StdOut, L"%s", szLineBuffer);
}
}
_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 (bCountLines)
{
/* 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 iReturnValue;
}
int wmain(int argc, WCHAR* argv[])
{
int i;
int iReturnValue = 2;
int iSearchedStringIndex = -1;
BOOL bFoundFileParameter = FALSE;
HANDLE hFindFileHandle;
WIN32_FIND_DATAW FindData;
FILE* pOpenedFile;
ConInitStdStreams();
if (argc == 1)
{
/* If no argument were provided by the user, display program usage and exit */
ConResPuts(StdOut, IDS_USAGE);
return 0;
}
/* Parse the command line arguments */
for (i = 1; i < argc; i++)
{
/* Check if this argument contains a switch */
if (lstrlenW(argv[i]) == 2 && argv[i][0] == L'/')
{
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 if (lstrlenW(argv[i]) > 2 && argv[i][0] == L'/')
{
/* 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;
}
}
}
if (iSearchedStringIndex == -1)
{
/* User didn't provide the string to search for, display program usage and exit */
ConResPuts(StdOut, IDS_USAGE);
return 2;
}
if (bFoundFileParameter)
{
/* After the command line arguments were parsed, iterate through them again to get the filenames */
for (i = 1; i < argc; i++)
{
/* 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)
{
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;
}
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;
}

View 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
#endif

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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