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 #pragma once 8 #include <stdlib.h> 9 #include <string.h> 10 #include <ctype.h> 11 #ifdef __REACTOS__ 12 #include <windef.h> 13 #include <winbase.h> 14 #include <winuser.h> 15 #include <winnls.h> 16 #else 17 #include <windows.h> 18 #endif 19 #include <wine/list.h> 20 #include "resource.h" 21 22 // See also: https://stackoverflow.com/questions/33125766/compare-files-with-a-cmd 23 typedef enum FCRET // return code of FC command 24 { 25 FCRET_INVALID = -1, 26 FCRET_IDENTICAL = 0, 27 FCRET_DIFFERENT = 1, 28 FCRET_CANT_FIND = 2, 29 FCRET_NO_MORE_DATA = 3 // (extension) 30 } FCRET; 31 32 typedef struct NODE_W 33 { 34 struct list entry; 35 LPWSTR pszLine; 36 LPWSTR pszComp; // compressed 37 DWORD lineno; 38 DWORD hash; 39 } NODE_W; 40 typedef struct NODE_A 41 { 42 struct list entry; 43 LPSTR pszLine; 44 LPSTR pszComp; // compressed 45 DWORD lineno; 46 DWORD hash; 47 } NODE_A; 48 49 #define FLAG_A (1 << 0) // abbreviation 50 #define FLAG_B (1 << 1) // binary 51 #define FLAG_C (1 << 2) // ignore cases 52 #define FLAG_L (1 << 3) // ASCII mode 53 #define FLAG_LBn (1 << 4) // line buffers 54 #define FLAG_N (1 << 5) // show line numbers 55 #define FLAG_OFFLINE (1 << 6) // ??? 56 #define FLAG_T (1 << 7) // prevent fc from converting tabs to spaces 57 #define FLAG_U (1 << 8) // Unicode 58 #define FLAG_W (1 << 9) // compress white space 59 #define FLAG_nnnn (1 << 10) // ??? 60 #define FLAG_HELP (1 << 11) // show usage 61 62 typedef struct FILECOMPARE 63 { 64 DWORD dwFlags; // FLAG_... 65 INT n; // # of line buffers 66 INT nnnn; // retry count before resynch 67 LPCWSTR file[2]; 68 struct list list[2]; 69 } FILECOMPARE; 70 71 // text.h 72 FCRET TextCompareW(FILECOMPARE *pFC, 73 HANDLE *phMapping0, const LARGE_INTEGER *pcb0, 74 HANDLE *phMapping1, const LARGE_INTEGER *pcb1); 75 FCRET TextCompareA(FILECOMPARE *pFC, 76 HANDLE *phMapping0, const LARGE_INTEGER *pcb0, 77 HANDLE *phMapping1, const LARGE_INTEGER *pcb1); 78 // fc.c 79 VOID PrintLineW(const FILECOMPARE *pFC, DWORD lineno, LPCWSTR psz); 80 VOID PrintLineA(const FILECOMPARE *pFC, DWORD lineno, LPCSTR psz); 81 VOID PrintCaption(LPCWSTR file); 82 VOID PrintEndOfDiff(VOID); 83 VOID PrintDots(VOID); 84 FCRET NoDifference(VOID); 85 FCRET Different(LPCWSTR file0, LPCWSTR file1); 86 FCRET LongerThan(LPCWSTR file0, LPCWSTR file1); 87 FCRET OutOfMemory(VOID); 88 FCRET CannotRead(LPCWSTR file); 89 FCRET InvalidSwitch(VOID); 90 FCRET ResyncFailed(VOID); 91 HANDLE DoOpenFileForInput(LPCWSTR file); 92 93 #ifdef _WIN64 94 #define MAX_VIEW_SIZE (256 * 1024 * 1024) // 256 MB 95 #else 96 #define MAX_VIEW_SIZE (64 * 1024 * 1024) // 64 MB 97 #endif 98