ReactOS 0.4.16-dev-2646-g1219156
fc.c File Reference
#include "fc.h"
#include "conutils_noros.h"
#include <strsafe.h>
#include <shlwapi.h>
Include dependency graph for fc.c:

Go to the source code of this file.

Macros

#define IS_DOTS(pch)    ((*(pch) == L'.') && (((pch)[1] == 0) || (((pch)[1] == L'.') && ((pch)[2] == 0))))
 
#define HasWildcard(filename)    ((wcschr((filename), L'*') != NULL) || (wcschr((filename), L'?') != NULL))
 

Functions

FCRET NoDifference (VOID)
 
FCRET Different (LPCWSTR file0, LPCWSTR file1)
 
FCRET LongerThan (LPCWSTR file0, LPCWSTR file1)
 
FCRET OutOfMemory (VOID)
 
FCRET CannotRead (LPCWSTR file)
 
FCRET InvalidSwitch (VOID)
 
FCRET ResyncFailed (VOID)
 
VOID PrintCaption (LPCWSTR file)
 
VOID PrintEndOfDiff (VOID)
 
VOID PrintDots (VOID)
 
VOID PrintLineW (const FILECOMPARE *pFC, DWORD lineno, LPCWSTR psz)
 
VOID PrintLineA (const FILECOMPARE *pFC, DWORD lineno, LPCSTR psz)
 
HANDLE DoOpenFileForInput (LPCWSTR file)
 
static FCRET BinaryFileCompare (FILECOMPARE *pFC)
 
static FCRET TextFileCompare (FILECOMPARE *pFC)
 
static BOOL IsBinaryExt (LPCWSTR filename)
 
static FCRET FileCompare (FILECOMPARE *pFC)
 
static BOOL IsTitleWild (LPCWSTR filename)
 
static FCRET FileCompareOneSideWild (const FILECOMPARE *pFC, BOOL bWildRight)
 
static FCRET FileCompareWildTitle (const FILECOMPARE *pFC)
 
static FCRET FileCompareBothWild (const FILECOMPARE *pFC)
 
static FCRET WildcardFileCompare (FILECOMPARE *pFC)
 
int wmain (int argc, WCHAR **argv)
 
main

Program entry point

Parameters
ArgCount
Arguments
Returns
EXIT_SUCCESS on success, EXIT_FAILURE on failure
int main (int argc, char **argv)
 

Macro Definition Documentation

◆ HasWildcard

#define HasWildcard (   filename)     ((wcschr((filename), L'*') != NULL) || (wcschr((filename), L'?') != NULL))

Definition at line 334 of file fc.c.

◆ IS_DOTS

#define IS_DOTS (   pch)     ((*(pch) == L'.') && (((pch)[1] == 0) || (((pch)[1] == L'.') && ((pch)[2] == 0))))

Definition at line 332 of file fc.c.

Function Documentation

◆ BinaryFileCompare()

static FCRET BinaryFileCompare ( FILECOMPARE pFC)
static

Definition at line 100 of file fc.c.

101{
102 FCRET ret;
103 HANDLE hFile0, hFile1, hMapping0 = NULL, hMapping1 = NULL;
104 LPBYTE pb0 = NULL, pb1 = NULL;
105 LARGE_INTEGER ib, cb0, cb1, cbCommon;
106 DWORD cbView, ibView;
107 BOOL fDifferent = FALSE;
108
109 hFile0 = DoOpenFileForInput(pFC->file[0]);
110 if (hFile0 == INVALID_HANDLE_VALUE)
111 return FCRET_CANT_FIND;
112 hFile1 = DoOpenFileForInput(pFC->file[1]);
113 if (hFile1 == INVALID_HANDLE_VALUE)
114 {
115 CloseHandle(hFile0);
116 return FCRET_CANT_FIND;
117 }
118
119 do
120 {
121 if (_wcsicmp(pFC->file[0], pFC->file[1]) == 0)
122 {
123 ret = NoDifference();
124 break;
125 }
126 if (!GetFileSizeEx(hFile0, &cb0))
127 {
128 ret = CannotRead(pFC->file[0]);
129 break;
130 }
131 if (!GetFileSizeEx(hFile1, &cb1))
132 {
133 ret = CannotRead(pFC->file[1]);
134 break;
135 }
136 cbCommon.QuadPart = min(cb0.QuadPart, cb1.QuadPart);
137 if (cbCommon.QuadPart > 0)
138 {
139 hMapping0 = CreateFileMappingW(hFile0, NULL, PAGE_READONLY,
140 cb0.HighPart, cb0.LowPart, NULL);
141 if (hMapping0 == NULL)
142 {
143 ret = CannotRead(pFC->file[0]);
144 break;
145 }
146 hMapping1 = CreateFileMappingW(hFile1, NULL, PAGE_READONLY,
147 cb1.HighPart, cb1.LowPart, NULL);
148 if (hMapping1 == NULL)
149 {
150 ret = CannotRead(pFC->file[1]);
151 break;
152 }
153
155 for (ib.QuadPart = 0; ib.QuadPart < cbCommon.QuadPart; )
156 {
157 cbView = (DWORD)min(cbCommon.QuadPart - ib.QuadPart, MAX_VIEW_SIZE);
158 pb0 = MapViewOfFile(hMapping0, FILE_MAP_READ, ib.HighPart, ib.LowPart, cbView);
159 pb1 = MapViewOfFile(hMapping1, FILE_MAP_READ, ib.HighPart, ib.LowPart, cbView);
160 if (!pb0 || !pb1)
161 {
162 ret = OutOfMemory();
163 break;
164 }
165 for (ibView = 0; ibView < cbView; ++ib.QuadPart, ++ibView)
166 {
167 if (pb0[ibView] == pb1[ibView])
168 continue;
169
170 fDifferent = TRUE;
171 if (cbCommon.QuadPart > MAXDWORD)
172 {
173 ConPrintf(StdOut, L"%016I64X: %02X %02X\n", ib.QuadPart,
174 pb0[ibView], pb1[ibView]);
175 }
176 else
177 {
178 ConPrintf(StdOut, L"%08lX: %02X %02X\n", ib.LowPart,
179 pb0[ibView], pb1[ibView]);
180 }
181 }
182 UnmapViewOfFile(pb0);
183 UnmapViewOfFile(pb1);
184 pb0 = pb1 = NULL;
185 }
186 if (ret != FCRET_IDENTICAL)
187 break;
188 }
189
190 if (cb0.QuadPart < cb1.QuadPart)
191 ret = LongerThan(pFC->file[1], pFC->file[0]);
192 else if (cb0.QuadPart > cb1.QuadPart)
193 ret = LongerThan(pFC->file[0], pFC->file[1]);
194 else if (fDifferent)
195 ret = Different(pFC->file[0], pFC->file[1]);
196 else
197 ret = NoDifference();
198 } while (0);
199
200 UnmapViewOfFile(pb0);
201 UnmapViewOfFile(pb1);
202 CloseHandle(hMapping0);
203 CloseHandle(hMapping1);
204 CloseHandle(hFile0);
205 CloseHandle(hFile1);
206 return ret;
207}
FCRET NoDifference(VOID)
Definition: fc.c:18
HANDLE DoOpenFileForInput(LPCWSTR file)
Definition: fc.c:90
FCRET Different(LPCWSTR file0, LPCWSTR file1)
Definition: fc.c:24
FCRET CannotRead(LPCWSTR file)
Definition: fc.c:42
FCRET LongerThan(LPCWSTR file0, LPCWSTR file1)
Definition: fc.c:30
void ConPrintf(FILE *fp, LPCWSTR psz,...)
#define StdOut
Definition: conutils_noros.h:6
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define FILE_MAP_READ
Definition: compat.h:776
#define GetFileSizeEx
Definition: compat.h:757
#define MapViewOfFile
Definition: compat.h:745
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:159
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
FCRET
Definition: fc.h:24
@ FCRET_IDENTICAL
Definition: fc.h:26
@ FCRET_CANT_FIND
Definition: fc.h:28
#define MAX_VIEW_SIZE
Definition: fc.h:96
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
@ OutOfMemory
Definition: gdiplustypes.h:29
#define min(a, b)
Definition: monoChain.cc:55
#define DWORD
Definition: nt_native.h:44
#define MAXDWORD
LPCWSTR file[2]
Definition: fc.h:67
unsigned char * LPBYTE
Definition: typedefs.h:53
LONGLONG QuadPart
Definition: typedefs.h:114
ULONG LowPart
Definition: typedefs.h:106

Referenced by FileCompare().

◆ CannotRead()

FCRET CannotRead ( LPCWSTR  file)

Definition at line 42 of file fc.c.

43{
45 return FCRET_INVALID;
46}
#define IDS_CANNOT_READ
Definition: resource.h:8
void ConResPrintf(FILE *fp, UINT nID,...)
#define StdErr
Definition: conutils_noros.h:7
@ FCRET_INVALID
Definition: fc.h:25
Definition: fci.c:127

Referenced by BinaryFileCompare(), and TextFileCompare().

◆ Different()

FCRET Different ( LPCWSTR  file0,
LPCWSTR  file1 
)

Definition at line 24 of file fc.c.

25{
26 ConResPrintf(StdOut, IDS_DIFFERENT, file0, file1);
27 return FCRET_DIFFERENT;
28}
#define IDS_DIFFERENT
Definition: resource.h:13
@ FCRET_DIFFERENT
Definition: fc.h:27

Referenced by BinaryFileCompare(), and Finalize().

◆ DoOpenFileForInput()

HANDLE DoOpenFileForInput ( LPCWSTR  file)

Definition at line 90 of file fc.c.

91{
94 {
96 }
97 return hFile;
98}
#define IDS_CANNOT_OPEN
Definition: resource.h:10
#define OPEN_EXISTING
Definition: compat.h:775
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define FILE_SHARE_READ
Definition: compat.h:136
_In_ HANDLE hFile
Definition: mswsock.h:90

Referenced by BinaryFileCompare(), and TextFileCompare().

◆ FileCompare()

static FCRET FileCompare ( FILECOMPARE pFC)
static

Definition at line 312 of file fc.c.

313{
314 FCRET ret;
315 ConResPrintf(StdOut, IDS_COMPARING, pFC->file[0], pFC->file[1]);
316
317 if (!(pFC->dwFlags & FLAG_L) &&
318 ((pFC->dwFlags & FLAG_B) || IsBinaryExt(pFC->file[0]) || IsBinaryExt(pFC->file[1])))
319 {
320 ret = BinaryFileCompare(pFC);
321 }
322 else
323 {
324 ret = TextFileCompare(pFC);
325 }
326
327 ConPuts(StdOut, L"\n");
328 return ret;
329}
#define IDS_COMPARING
Definition: resource.h:7
static BOOL IsBinaryExt(LPCWSTR filename)
Definition: fc.c:281
static FCRET TextFileCompare(FILECOMPARE *pFC)
Definition: fc.c:209
static FCRET BinaryFileCompare(FILECOMPARE *pFC)
Definition: fc.c:100
void ConPuts(FILE *fp, LPCWSTR psz)
Definition: conutils_noros.h:8
#define FLAG_L
Definition: fc.h:52
#define FLAG_B
Definition: fc.h:50
DWORD dwFlags
Definition: fc.h:64

Referenced by FileCompareBothWild(), FileCompareOneSideWild(), FileCompareWildTitle(), and WildcardFileCompare().

◆ FileCompareBothWild()

static FCRET FileCompareBothWild ( const FILECOMPARE pFC)
static

Definition at line 446 of file fc.c.

447{
449 WIN32_FIND_DATAW find0, find1;
450 HANDLE hFind0, hFind1;
451 WCHAR szPath0[MAX_PATH], szPath1[MAX_PATH];
453
454 hFind0 = FindFirstFileW(pFC->file[0], &find0);
455 if (hFind0 == INVALID_HANDLE_VALUE)
456 {
458 ConPuts(StdOut, L"\n");
459 return FCRET_CANT_FIND;
460 }
461 hFind1 = FindFirstFileW(pFC->file[1], &find1);
462 if (hFind1 == INVALID_HANDLE_VALUE)
463 {
464 CloseHandle(hFind0);
466 ConPuts(StdOut, L"\n");
467 return FCRET_CANT_FIND;
468 }
469 StringCbCopyW(szPath0, sizeof(szPath0), pFC->file[0]);
470 StringCbCopyW(szPath1, sizeof(szPath1), pFC->file[1]);
471
472 fc = *pFC;
473 fc.file[0] = szPath0;
474 fc.file[1] = szPath1;
475 do
476 {
477 while (IS_DOTS(find0.cFileName))
478 {
479 if (!FindNextFileW(hFind0, &find0))
480 goto quit;
481 }
482 while (IS_DOTS(find1.cFileName))
483 {
484 if (!FindNextFileW(hFind1, &find1))
485 goto quit;
486 }
487
488 // replace file title
489 PathRemoveFileSpecW(szPath0);
490 PathRemoveFileSpecW(szPath1);
491 PathAppendW(szPath0, find0.cFileName);
492 PathAppendW(szPath1, find1.cFileName);
493
494 switch (FileCompare(&fc))
495 {
496 case FCRET_IDENTICAL:
497 break;
498 case FCRET_DIFFERENT:
499 if (ret != FCRET_INVALID)
501 break;
502 default:
504 break;
505 }
506 } while (FindNextFileW(hFind0, &find0) && FindNextFileW(hFind1, &find1));
507quit:
508 CloseHandle(hFind0);
509 CloseHandle(hFind1);
510 return ret;
511}
static const struct optioninfo * find1(const char **optp, const struct optioninfo *table, comparer_type *comparer)
Definition: adh-opts.c:306
static FCRET FileCompare(FILECOMPARE *pFC)
Definition: fc.c:312
#define IS_DOTS(pch)
Definition: fc.c:332
void quit(int argc, const char *argv[])
Definition: cmds.c:1606
PFOR_CONTEXT fc
Definition: for.c:57
#define MAX_PATH
Definition: compat.h:34
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
BOOL WINAPI PathRemoveFileSpecW(WCHAR *path)
Definition: path.c:1145
#define PathAppendW
Definition: pathcch.h:310
short WCHAR
Definition: pedump.c:58
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
Definition: fc.h:63
_Field_z_ WCHAR cFileName[MAX_PATH]
Definition: minwinbase.h:291

Referenced by WildcardFileCompare().

◆ FileCompareOneSideWild()

static FCRET FileCompareOneSideWild ( const FILECOMPARE pFC,
BOOL  bWildRight 
)
static

Definition at line 343 of file fc.c.

344{
347 HANDLE hFind;
350
351 hFind = FindFirstFileW(pFC->file[bWildRight], &find);
352 if (hFind == INVALID_HANDLE_VALUE)
353 {
354 ConResPrintf(StdErr, IDS_CANNOT_OPEN, pFC->file[bWildRight]);
355 ConPuts(StdOut, L"\n");
356 return FCRET_CANT_FIND;
357 }
358 StringCbCopyW(szPath, sizeof(szPath), pFC->file[bWildRight]);
359
360 fc = *pFC;
361 fc.file[!bWildRight] = pFC->file[!bWildRight];
362 fc.file[bWildRight] = szPath;
363 do
364 {
365 if (IS_DOTS(find.cFileName))
366 continue;
367
368 // replace file title
370 PathAppendW(szPath, find.cFileName);
371
372 switch (FileCompare(&fc))
373 {
374 case FCRET_IDENTICAL:
375 break;
376 case FCRET_DIFFERENT:
377 if (ret != FCRET_INVALID)
379 break;
380 default:
382 break;
383 }
384 } while (FindNextFileW(hFind, &find));
385
386 FindClose(hFind);
387 return ret;
388}
static TAGID TAGID find
Definition: db.cpp:156
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
LPCWSTR szPath
Definition: env.c:37

Referenced by WildcardFileCompare().

◆ FileCompareWildTitle()

static FCRET FileCompareWildTitle ( const FILECOMPARE pFC)
static

Definition at line 390 of file fc.c.

391{
394 HANDLE hFind;
395 WCHAR szPath0[MAX_PATH], szPath1[MAX_PATH];
397 LPWSTR pch;
398
399 hFind = FindFirstFileW(pFC->file[0], &find);
400 if (hFind == INVALID_HANDLE_VALUE)
401 {
403 ConPuts(StdOut, L"\n");
404 return FCRET_CANT_FIND;
405 }
406 StringCbCopyW(szPath0, sizeof(szPath0), pFC->file[0]);
407 StringCbCopyW(szPath1, sizeof(szPath1), pFC->file[1]);
408 pch = PathFindExtensionW(pFC->file[1]);
409
410 fc = *pFC;
411 fc.file[0] = szPath0;
412 fc.file[1] = szPath1;
413 do
414 {
415 if (IS_DOTS(find.cFileName))
416 continue;
417
418 // replace file title
419 PathRemoveFileSpecW(szPath0);
420 PathRemoveFileSpecW(szPath1);
421 PathAppendW(szPath0, find.cFileName);
422 PathAppendW(szPath1, find.cFileName);
423
424 // replace dot extension
425 PathRemoveExtensionW(szPath1);
426 PathAddExtensionW(szPath1, pch);
427
428 switch (FileCompare(&fc))
429 {
430 case FCRET_IDENTICAL:
431 break;
432 case FCRET_DIFFERENT:
433 if (ret != FCRET_INVALID)
435 break;
436 default:
438 break;
439 }
440 } while (FindNextFileW(hFind, &find));
441
442 FindClose(hFind);
443 return ret;
444}
void WINAPI PathRemoveExtensionW(WCHAR *path)
Definition: path.c:1946
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
Definition: path.c:1274
#define pch(ap)
Definition: match.c:418
#define PathAddExtensionW
Definition: pathcch.h:306
uint16_t * LPWSTR
Definition: typedefs.h:56

Referenced by WildcardFileCompare().

◆ InvalidSwitch()

FCRET InvalidSwitch ( VOID  )

Definition at line 48 of file fc.c.

49{
51 return FCRET_INVALID;
52}
#define IDS_INVALID_SWITCH
Definition: resource.h:9
void ConResPuts(FILE *fp, UINT nID)

Referenced by wmain().

◆ IsBinaryExt()

static BOOL IsBinaryExt ( LPCWSTR  filename)
static

Definition at line 281 of file fc.c.

282{
283 // Don't change this array. This is by design.
284 // See also: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/fc
285 static const LPCWSTR s_exts[] = { L"EXE", L"COM", L"SYS", L"OBJ", L"LIB", L"BIN" };
286 size_t iext;
287 LPCWSTR pch, ext, pch0 = wcsrchr(filename, L'\\'), pch1 = wcsrchr(filename, L'/');
288 if (!pch0 && !pch1)
289 pch = filename;
290 else if (!pch0 && pch1)
291 pch = pch1;
292 else if (pch0 && !pch1)
293 pch = pch0;
294 else if (pch0 < pch1)
295 pch = pch1;
296 else
297 pch = pch0;
298
299 ext = wcsrchr(pch, L'.');
300 if (ext)
301 {
302 ++ext;
303 for (iext = 0; iext < _countof(s_exts); ++iext)
304 {
305 if (_wcsicmp(ext, s_exts[iext]) == 0)
306 return TRUE;
307 }
308 }
309 return FALSE;
310}
#define wcsrchr
Definition: compat.h:16
static const WCHAR *const ext[]
Definition: module.c:53
const char * filename
Definition: ioapi.h:137
#define _countof(array)
Definition: sndvol32.h:70
const uint16_t * LPCWSTR
Definition: typedefs.h:57

Referenced by FileCompare().

◆ IsTitleWild()

static BOOL IsTitleWild ( LPCWSTR  filename)
inlinestatic

Definition at line 337 of file fc.c.

338{
340 return (pch && *pch == L'*' && pch[1] == L'.' && !HasWildcard(&pch[2]));
341}
#define HasWildcard(filename)
Definition: fc.c:334
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
Definition: path.c:1701

Referenced by WildcardFileCompare().

◆ LongerThan()

FCRET LongerThan ( LPCWSTR  file0,
LPCWSTR  file1 
)

Definition at line 30 of file fc.c.

31{
32 ConResPrintf(StdOut, IDS_LONGER_THAN, file0, file1);
33 return FCRET_DIFFERENT;
34}
#define IDS_LONGER_THAN
Definition: resource.h:5

Referenced by BinaryFileCompare().

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 637 of file fc.c.

638{
639 INT my_argc;
640 LPWSTR *my_argv = CommandLineToArgvW(GetCommandLineW(), &my_argc);
641 INT ret = wmain(my_argc, my_argv);
642 LocalFree(my_argv);
643 return ret;
644}
LPWSTR WINAPI GetCommandLineW(void)
Definition: process.c:1338
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
int wmain()
LPWSTR *WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int *numargs)
Definition: shell32_main.c:79
int32_t INT
Definition: typedefs.h:58

◆ NoDifference()

FCRET NoDifference ( VOID  )

Definition at line 18 of file fc.c.

19{
21 return FCRET_IDENTICAL;
22}
#define IDS_NO_DIFFERENCE
Definition: resource.h:4

Referenced by BinaryFileCompare(), Finalize(), and TextFileCompare().

◆ OutOfMemory()

FCRET OutOfMemory ( VOID  )

Definition at line 36 of file fc.c.

37{
39 return FCRET_INVALID;
40}
#define IDS_OUT_OF_MEMORY
Definition: resource.h:7

◆ PrintCaption()

VOID PrintCaption ( LPCWSTR  file)

Definition at line 60 of file fc.c.

61{
62 ConPrintf(StdOut, L"***** %ls\n", file);
63}

Referenced by ShowDiff().

◆ PrintDots()

VOID PrintDots ( VOID  )

Definition at line 70 of file fc.c.

71{
72 ConPuts(StdOut, L"...\n");
73}

Referenced by ShowDiff().

◆ PrintEndOfDiff()

VOID PrintEndOfDiff ( VOID  )

Definition at line 65 of file fc.c.

66{
67 ConPuts(StdOut, L"*****\n\n");
68}

Referenced by Finalize(), and TextCompare().

◆ PrintLineA()

VOID PrintLineA ( const FILECOMPARE pFC,
DWORD  lineno,
LPCSTR  psz 
)

Definition at line 82 of file fc.c.

83{
84 if (pFC->dwFlags & FLAG_N)
85 ConPrintf(StdOut, L"%5d: %hs\n", lineno, psz);
86 else
87 ConPrintf(StdOut, L"%hs\n", psz);
88}
#define FLAG_N
Definition: fc.h:54

◆ PrintLineW()

VOID PrintLineW ( const FILECOMPARE pFC,
DWORD  lineno,
LPCWSTR  psz 
)

Definition at line 75 of file fc.c.

76{
77 if (pFC->dwFlags & FLAG_N)
78 ConPrintf(StdOut, L"%5d: %ls\n", lineno, psz);
79 else
80 ConPrintf(StdOut, L"%ls\n", psz);
81}

◆ ResyncFailed()

FCRET ResyncFailed ( VOID  )

Definition at line 54 of file fc.c.

55{
57 return FCRET_DIFFERENT;
58}
#define IDS_RESYNC_FAILED
Definition: resource.h:15

Referenced by TextCompare().

◆ TextFileCompare()

static FCRET TextFileCompare ( FILECOMPARE pFC)
static

Definition at line 209 of file fc.c.

210{
211 FCRET ret;
212 HANDLE hFile0, hFile1, hMapping0 = NULL, hMapping1 = NULL;
213 LARGE_INTEGER cb0, cb1;
214 BOOL fUnicode = !!(pFC->dwFlags & FLAG_U);
215
216 hFile0 = DoOpenFileForInput(pFC->file[0]);
217 if (hFile0 == INVALID_HANDLE_VALUE)
218 return FCRET_CANT_FIND;
219 hFile1 = DoOpenFileForInput(pFC->file[1]);
220 if (hFile1 == INVALID_HANDLE_VALUE)
221 {
222 CloseHandle(hFile0);
223 return FCRET_CANT_FIND;
224 }
225
226 do
227 {
228 if (_wcsicmp(pFC->file[0], pFC->file[1]) == 0)
229 {
230 ret = NoDifference();
231 break;
232 }
233 if (!GetFileSizeEx(hFile0, &cb0))
234 {
235 ret = CannotRead(pFC->file[0]);
236 break;
237 }
238 if (!GetFileSizeEx(hFile1, &cb1))
239 {
240 ret = CannotRead(pFC->file[1]);
241 break;
242 }
243 if (cb0.QuadPart == 0 && cb1.QuadPart == 0)
244 {
245 ret = NoDifference();
246 break;
247 }
248 if (cb0.QuadPart > 0)
249 {
250 hMapping0 = CreateFileMappingW(hFile0, NULL, PAGE_READONLY,
251 cb0.HighPart, cb0.LowPart, NULL);
252 if (hMapping0 == NULL)
253 {
254 ret = CannotRead(pFC->file[0]);
255 break;
256 }
257 }
258 if (cb1.QuadPart > 0)
259 {
260 hMapping1 = CreateFileMappingW(hFile1, NULL, PAGE_READONLY,
261 cb1.HighPart, cb1.LowPart, NULL);
262 if (hMapping1 == NULL)
263 {
264 ret = CannotRead(pFC->file[1]);
265 break;
266 }
267 }
268 if (fUnicode)
269 ret = TextCompareW(pFC, &hMapping0, &cb0, &hMapping1, &cb1);
270 else
271 ret = TextCompareA(pFC, &hMapping0, &cb0, &hMapping1, &cb1);
272 } while (0);
273
274 CloseHandle(hMapping0);
275 CloseHandle(hMapping1);
276 CloseHandle(hFile0);
277 CloseHandle(hFile1);
278 return ret;
279}
FCRET TextCompareW(FILECOMPARE *pFC, HANDLE *phMapping0, const LARGE_INTEGER *pcb0, HANDLE *phMapping1, const LARGE_INTEGER *pcb1)
#define FLAG_U
Definition: fc.h:57
FCRET TextCompareA(FILECOMPARE *pFC, HANDLE *phMapping0, const LARGE_INTEGER *pcb0, HANDLE *phMapping1, const LARGE_INTEGER *pcb1)

Referenced by FileCompare().

◆ WildcardFileCompare()

static FCRET WildcardFileCompare ( FILECOMPARE pFC)
static

Definition at line 513 of file fc.c.

514{
515 BOOL fWild0, fWild1;
516
517 if (pFC->dwFlags & FLAG_HELP)
518 {
520 return FCRET_INVALID;
521 }
522
523 if (!pFC->file[0] || !pFC->file[1])
524 {
526 return FCRET_INVALID;
527 }
528
529 fWild0 = HasWildcard(pFC->file[0]);
530 fWild1 = HasWildcard(pFC->file[1]);
531 if (fWild0 && fWild1)
532 {
533 if (IsTitleWild(pFC->file[0]) && IsTitleWild(pFC->file[1]))
534 return FileCompareWildTitle(pFC);
535 else
536 return FileCompareBothWild(pFC);
537 }
538 else if (fWild0)
539 {
540 return FileCompareOneSideWild(pFC, FALSE);
541 }
542 else if (fWild1)
543 {
544 return FileCompareOneSideWild(pFC, TRUE);
545 }
546 return FileCompare(pFC);
547}
#define IDS_USAGE
Definition: resource.h:3
static BOOL IsTitleWild(LPCWSTR filename)
Definition: fc.c:337
static FCRET FileCompareBothWild(const FILECOMPARE *pFC)
Definition: fc.c:446
static FCRET FileCompareOneSideWild(const FILECOMPARE *pFC, BOOL bWildRight)
Definition: fc.c:343
static FCRET FileCompareWildTitle(const FILECOMPARE *pFC)
Definition: fc.c:390
#define IDS_NEEDS_FILES
Definition: resource.h:11
#define FLAG_HELP
Definition: fc.h:60

Referenced by wmain().

◆ wmain()

int wmain ( int  argc,
WCHAR **  argv 
)

Definition at line 549 of file fc.c.

550{
551 FILECOMPARE fc = { .dwFlags = 0, .n = 100, .nnnn = 2 };
552 PWCHAR endptr;
553 INT i;
554
555 /* Initialize the Console Standard Streams */
557
558 for (i = 1; i < argc; ++i)
559 {
560 if (argv[i][0] != L'/')
561 {
562 if (!fc.file[0])
563 fc.file[0] = argv[i];
564 else if (!fc.file[1])
565 fc.file[1] = argv[i];
566 else
567 return InvalidSwitch();
568 continue;
569 }
570 switch (towupper(argv[i][1]))
571 {
572 case L'A':
573 fc.dwFlags |= FLAG_A;
574 break;
575 case L'B':
576 fc.dwFlags |= FLAG_B;
577 break;
578 case L'C':
579 fc.dwFlags |= FLAG_C;
580 break;
581 case L'L':
582 if (_wcsicmp(argv[i], L"/L") == 0)
583 {
584 fc.dwFlags |= FLAG_L;
585 }
586 else if (towupper(argv[i][2]) == L'B')
587 {
588 if (iswdigit(argv[i][3]))
589 {
590 fc.dwFlags |= FLAG_LBn;
591 fc.n = wcstoul(&argv[i][3], &endptr, 10);
592 if (endptr == NULL || *endptr != 0)
593 return InvalidSwitch();
594 }
595 else
596 {
597 return InvalidSwitch();
598 }
599 }
600 break;
601 case L'N':
602 fc.dwFlags |= FLAG_N;
603 break;
604 case L'O':
605 if (_wcsicmp(argv[i], L"/OFF") == 0 || _wcsicmp(argv[i], L"/OFFLINE") == 0)
606 {
607 fc.dwFlags |= FLAG_OFFLINE;
608 }
609 break;
610 case L'T':
611 fc.dwFlags |= FLAG_T;
612 break;
613 case L'U':
614 fc.dwFlags |= FLAG_U;
615 break;
616 case L'W':
617 fc.dwFlags |= FLAG_W;
618 break;
619 case L'0': case L'1': case L'2': case L'3': case L'4':
620 case L'5': case L'6': case L'7': case L'8': case L'9':
621 fc.nnnn = wcstoul(&argv[i][1], &endptr, 10);
622 if (endptr == NULL || *endptr != 0)
623 return InvalidSwitch();
624 fc.dwFlags |= FLAG_nnnn;
625 break;
626 case L'?':
627 fc.dwFlags |= FLAG_HELP;
628 break;
629 default:
630 return InvalidSwitch();
631 }
632 }
633 return WildcardFileCompare(&fc);
634}
FCRET InvalidSwitch(VOID)
Definition: fc.c:48
static FCRET WildcardFileCompare(FILECOMPARE *pFC)
Definition: fc.c:513
#define ConInitStdStreams()
Definition: conutils_noros.h:5
MonoAssembly int argc
Definition: metahost.c:107
_ACRTIMP __msvcrt_ulong __cdecl wcstoul(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2912
#define FLAG_T
Definition: fc.h:56
#define FLAG_W
Definition: fc.h:58
#define FLAG_A
Definition: fc.h:49
#define FLAG_nnnn
Definition: fc.h:59
#define FLAG_OFFLINE
Definition: fc.h:55
#define FLAG_LBn
Definition: fc.h:53
#define FLAG_C
Definition: fc.h:51
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define argv
Definition: mplay32.c:18
#define iswdigit(_c)
Definition: ctype.h:667
#define towupper(c)
Definition: wctype.h:99
uint16_t * PWCHAR
Definition: typedefs.h:56