ReactOS 0.4.16-dev-2613-g9533ad7
fc.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS FC Command
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Comparing files
5 * COPYRIGHT: Copyright 2021 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "fc.h"
9
10#ifdef __REACTOS__
11#include <conutils.h>
12#else
13#include "conutils_noros.h"
14#endif
15#include <strsafe.h>
16#include <shlwapi.h>
17
19{
21 return FCRET_IDENTICAL;
22}
23
25{
26 ConResPrintf(StdOut, IDS_DIFFERENT, file0, file1);
27 return FCRET_DIFFERENT;
28}
29
31{
32 ConResPrintf(StdOut, IDS_LONGER_THAN, file0, file1);
33 return FCRET_DIFFERENT;
34}
35
37{
39 return FCRET_INVALID;
40}
41
43{
45 return FCRET_INVALID;
46}
47
49{
51 return FCRET_INVALID;
52}
53
55{
57 return FCRET_DIFFERENT;
58}
59
61{
62 ConPrintf(StdOut, L"***** %ls\n", file);
63}
64
66{
67 ConPuts(StdOut, L"*****\n\n");
68}
69
71{
72 ConPuts(StdOut, L"...\n");
73}
74
75VOID PrintLineW(const FILECOMPARE *pFC, DWORD lineno, LPCWSTR psz)
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}
82VOID PrintLineA(const FILECOMPARE *pFC, DWORD lineno, LPCSTR psz)
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}
89
91{
94 {
96 }
97 return hFile;
98}
99
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}
208
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}
280
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}
311
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}
330
331/* Is it L"." or L".."? */
332#define IS_DOTS(pch) \
333 ((*(pch) == L'.') && (((pch)[1] == 0) || (((pch)[1] == L'.') && ((pch)[2] == 0))))
334#define HasWildcard(filename) \
335 ((wcschr((filename), L'*') != NULL) || (wcschr((filename), L'?') != NULL))
336
338{
340 return (pch && *pch == L'*' && pch[1] == L'.' && !HasWildcard(&pch[2]));
341}
342
343static FCRET FileCompareOneSideWild(const FILECOMPARE *pFC, BOOL bWildRight)
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}
389
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}
445
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}
512
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}
548
549int wmain(int argc, WCHAR **argv)
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}
635
636#ifndef __REACTOS__
637int main(int argc, char **argv)
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}
645#endif
static const struct optioninfo * find1(const char **optp, const struct optioninfo *table, comparer_type *comparer)
Definition: adh-opts.c:306
#define IDS_USAGE
Definition: resource.h:3
#define IDS_COMPARING
Definition: resource.h:7
static FCRET FileCompare(FILECOMPARE *pFC)
Definition: fc.c:312
VOID PrintCaption(LPCWSTR file)
Definition: fc.c:60
FCRET NoDifference(VOID)
Definition: fc.c:18
VOID PrintDots(VOID)
Definition: fc.c:70
HANDLE DoOpenFileForInput(LPCWSTR file)
Definition: fc.c:90
static BOOL IsBinaryExt(LPCWSTR filename)
Definition: fc.c:281
static FCRET TextFileCompare(FILECOMPARE *pFC)
Definition: fc.c:209
static BOOL IsTitleWild(LPCWSTR filename)
Definition: fc.c:337
static FCRET BinaryFileCompare(FILECOMPARE *pFC)
Definition: fc.c:100
VOID PrintLineA(const FILECOMPARE *pFC, DWORD lineno, LPCSTR psz)
Definition: fc.c:82
#define IS_DOTS(pch)
Definition: fc.c:332
VOID PrintLineW(const FILECOMPARE *pFC, DWORD lineno, LPCWSTR psz)
Definition: fc.c:75
VOID PrintEndOfDiff(VOID)
Definition: fc.c:65
static FCRET FileCompareBothWild(const FILECOMPARE *pFC)
Definition: fc.c:446
#define HasWildcard(filename)
Definition: fc.c:334
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
static FCRET FileCompareOneSideWild(const FILECOMPARE *pFC, BOOL bWildRight)
Definition: fc.c:343
FCRET ResyncFailed(VOID)
Definition: fc.c:54
FCRET InvalidSwitch(VOID)
Definition: fc.c:48
static FCRET WildcardFileCompare(FILECOMPARE *pFC)
Definition: fc.c:513
static FCRET FileCompareWildTitle(const FILECOMPARE *pFC)
Definition: fc.c:390
#define IDS_RESYNC_FAILED
Definition: resource.h:15
#define IDS_CANNOT_OPEN
Definition: resource.h:10
#define IDS_OUT_OF_MEMORY
Definition: resource.h:7
#define IDS_LONGER_THAN
Definition: resource.h:5
#define IDS_DIFFERENT
Definition: resource.h:13
#define IDS_NEEDS_FILES
Definition: resource.h:11
#define IDS_CANNOT_READ
Definition: resource.h:8
#define IDS_NO_DIFFERENCE
Definition: resource.h:4
#define IDS_INVALID_SWITCH
Definition: resource.h:9
void quit(int argc, const char *argv[])
Definition: cmds.c:1606
PFOR_CONTEXT fc
Definition: for.c:57
void ConPuts(FILE *fp, LPCWSTR psz)
Definition: conutils_noros.h:8
#define ConInitStdStreams()
Definition: conutils_noros.h:5
void ConPrintf(FILE *fp, LPCWSTR psz,...)
#define StdOut
Definition: conutils_noros.h:6
void ConResPrintf(FILE *fp, UINT nID,...)
#define StdErr
Definition: conutils_noros.h:7
void ConResPuts(FILE *fp, UINT nID)
static TAGID TAGID find
Definition: db.cpp:156
#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 wcsrchr
Definition: compat.h:16
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define FILE_MAP_READ
Definition: compat.h:776
#define GetFileSizeEx
Definition: compat.h:757
#define MapViewOfFile
Definition: compat.h:745
#define FILE_SHARE_READ
Definition: compat.h:136
static const WCHAR *const ext[]
Definition: module.c:53
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
void WINAPI PathRemoveExtensionW(WCHAR *path)
Definition: path.c:1946
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
Definition: path.c:1701
BOOL WINAPI PathRemoveFileSpecW(WCHAR *path)
Definition: path.c:1145
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
Definition: path.c:1274
LPWSTR WINAPI GetCommandLineW(void)
Definition: process.c:1338
MonoAssembly int argc
Definition: metahost.c:107
_ACRTIMP __msvcrt_ulong __cdecl wcstoul(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2912
_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
int main()
Definition: test.c:6
#define FLAG_L
Definition: fc.h:52
FCRET TextCompareW(FILECOMPARE *pFC, HANDLE *phMapping0, const LARGE_INTEGER *pcb0, HANDLE *phMapping1, const LARGE_INTEGER *pcb1)
FCRET
Definition: fc.h:24
@ FCRET_IDENTICAL
Definition: fc.h:26
@ FCRET_INVALID
Definition: fc.h:25
@ FCRET_CANT_FIND
Definition: fc.h:28
@ FCRET_DIFFERENT
Definition: fc.h:27
#define FLAG_T
Definition: fc.h:56
#define FLAG_B
Definition: fc.h:50
#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_U
Definition: fc.h:57
#define FLAG_N
Definition: fc.h:54
#define FLAG_LBn
Definition: fc.h:53
#define FLAG_C
Definition: fc.h:51
#define MAX_VIEW_SIZE
Definition: fc.h:96
#define FLAG_HELP
Definition: fc.h:60
FCRET TextCompareA(FILECOMPARE *pFC, HANDLE *phMapping0, const LARGE_INTEGER *pcb0, HANDLE *phMapping1, const LARGE_INTEGER *pcb1)
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
@ OutOfMemory
Definition: gdiplustypes.h:29
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
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
const char * filename
Definition: ioapi.h:137
#define pch(ap)
Definition: match.c:418
LPCWSTR szPath
Definition: env.c:37
#define min(a, b)
Definition: monoChain.cc:55
#define argv
Definition: mplay32.c:18
_In_ HANDLE hFile
Definition: mswsock.h:90
#define DWORD
Definition: nt_native.h:44
#define MAXDWORD
#define PathAddExtensionW
Definition: pathcch.h:306
#define PathAppendW
Definition: pathcch.h:310
short WCHAR
Definition: pedump.c:58
int wmain()
#define iswdigit(_c)
Definition: ctype.h:667
#define towupper(c)
Definition: wctype.h:99
LPWSTR *WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int *numargs)
Definition: shell32_main.c:79
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
Definition: fc.h:63
DWORD dwFlags
Definition: fc.h:64
LPCWSTR file[2]
Definition: fc.h:67
_Field_z_ WCHAR cFileName[MAX_PATH]
Definition: minwinbase.h:291
Definition: fci.c:127
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
int32_t INT
Definition: typedefs.h:58
uint16_t * PWCHAR
Definition: typedefs.h:56
LONGLONG QuadPart
Definition: typedefs.h:114
ULONG LowPart
Definition: typedefs.h:106