From 800ecc9875f0a5c3b58f8d630b991aebf9369e0f Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Sun, 25 Sep 2005 20:46:28 +0000 Subject: [PATCH] Simple implementation of the MS comp utility (remembered to add the files this time :) ) svn path=/trunk/; revision=18069 --- rosapps/cmdutils/comp/comp.c | 181 +++++++++++++++++++++++++++++++++ rosapps/cmdutils/comp/comp.rc | 4 + rosapps/cmdutils/comp/comp.xml | 7 ++ 3 files changed, 192 insertions(+) create mode 100644 rosapps/cmdutils/comp/comp.c create mode 100644 rosapps/cmdutils/comp/comp.rc create mode 100644 rosapps/cmdutils/comp/comp.xml diff --git a/rosapps/cmdutils/comp/comp.c b/rosapps/cmdutils/comp/comp.c new file mode 100644 index 00000000000..507ac078f23 --- /dev/null +++ b/rosapps/cmdutils/comp/comp.c @@ -0,0 +1,181 @@ +/* + * ReactOS Win32 Applications + * Copyright (C) 2005 ReactOS Team + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS comp utility + * FILE: comp.c + * PURPOSE: Compares the contents of two files + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 25/09/05 Created + * + */ + + +#include +#include +#include +#include +#include + +#define STRBUF 1024 + +/* getline: read a line, return length */ +INT GetLine(char *line, FILE *in) +{ + if (fgets(line, STRBUF, in) == NULL) + return 0; + else + return strlen(line); +} + +/* print program usage */ +VOID Usage(VOID) +{ + _tprintf(_T("\nCompares the contents of two files or sets of files.\n\n" + "COMP [data1] [data2]\n\n" + " data1 Specifies location and name of first file to compare.\n" + " data2 Specifies location and name of second file to compare.\n")); +} + + +int _tmain (int argc, TCHAR *argv[]) +{ + INT i; + INT LineLen1, LineLen2; + FILE *fp1, *fp2; // file pointers + PTCHAR Line1 = (TCHAR *)malloc(STRBUF * sizeof(TCHAR)); + PTCHAR Line2 = (TCHAR *)malloc(STRBUF * sizeof(TCHAR)); + TCHAR File1[_MAX_PATH], // file paths + File2[_MAX_PATH]; + BOOL bMatch = TRUE, // files match + bAscii = FALSE, // /A switch + bLineNos = FALSE; // /L switch + + /* parse command line for options */ + for (i = 1; i < argc; i++) + { + if (argv[i][0] == '/') + { + --argc; + switch (argv[i][1]) { + case 'A': bAscii = TRUE; + _tprintf(_T("/a not Supported\n")); /*FIXME: needs adding */ + break; + case 'L': bLineNos = TRUE; + _tprintf(_T("/l not supported\n")); /*FIXME: needs adding */ + break; + case '?': Usage(); + return EXIT_SUCCESS; + default: + _tprintf(_T("Invalid switch - /%c\n"), argv[i][1]); + Usage(); + return EXIT_FAILURE; + } + } + } + + switch (argc) + { + case 1 : + _tprintf(_T("Name of first file to compare: ")); + fgets(File1, _MAX_PATH, stdin); + for (i=0; i<_MAX_PATH; i++) + { + if (File1[i] == '\n') + { + File1[i] = '\0'; + break; + } + } + + _tprintf(_T("Name of second file to compare: ")); + fgets(File2, _MAX_PATH, stdin); + for (i=0; i<_MAX_PATH; i++) + { + if (File2[i] == '\n') + { + File2[i] = '\0'; + break; + } + } + break; + case 2 : + _tcsncpy(File1, argv[1], _MAX_PATH); + _tprintf(_T("Name of second file to compare: ")); + fgets(File2, _MAX_PATH, stdin); + for (i=0; i<_MAX_PATH; i++) + { + if (File2[i] == '\n') + { + File2[i] = '\0'; + break; + } + } + break; + case 3 : + _tcsncpy(File1, argv[1], _MAX_PATH); + _tcsncpy(File2, argv[2], _MAX_PATH); + break; + default : + _tprintf(_T("Bad command line syntax\n")); + return EXIT_FAILURE; + break; + } + + + + if ((fp1 = fopen(File1, "r")) == NULL) + { + _tprintf(_T("Can't find/open file: %s\n"), File1); + return EXIT_FAILURE; + } + if ((fp2 = fopen(File2, "r")) == NULL) + { + _tprintf(_T("Can't find/open file: %s\n"), File2); + return EXIT_FAILURE; + } + + + _tprintf(_T("Comparing %s and %s...\n"), File1, File2); + + while ((LineLen1 = GetLine(Line1, fp1) != 0) && + (LineLen2 = GetLine(Line2, fp2) != 0)) + { + // LineCount++; + while ((*Line1 != '\0') && (*Line2 != '\0')) + { + if (*Line1 != *Line2) + { + bMatch = FALSE; + break; + } + Line1++, Line2++; + } + } + + bMatch ? _tprintf(_T("Files compare OK\n")) : _tprintf(_T("Files are different sizes.\n")); + + fclose(fp1); + fclose(fp2); + + + return EXIT_SUCCESS; +} +/* EOF */ diff --git a/rosapps/cmdutils/comp/comp.rc b/rosapps/cmdutils/comp/comp.rc new file mode 100644 index 00000000000..a8aa0342139 --- /dev/null +++ b/rosapps/cmdutils/comp/comp.rc @@ -0,0 +1,4 @@ +#define REACTOS_STR_FILE_DESCRIPTION "File Compare Utility\0" +#define REACTOS_STR_INTERNAL_NAME "comp\0" +#define REACTOS_STR_ORIGINAL_FILENAME "comp.exe\0" +#include diff --git a/rosapps/cmdutils/comp/comp.xml b/rosapps/cmdutils/comp/comp.xml new file mode 100644 index 00000000000..7e71f6be6ce --- /dev/null +++ b/rosapps/cmdutils/comp/comp.xml @@ -0,0 +1,7 @@ + + + kernel32 + comp.c + comp.rc + + -- 2.17.1