[ROSAPPS]: Merge the two existing CATs into one and improve it (see r66942, r66989 and r66990).

svn path=/trunk/; revision=68198
This commit is contained in:
Hermès Bélusca-Maïto 2015-06-19 22:38:34 +00:00
parent 501e32913a
commit 1509a6fe36
8 changed files with 133 additions and 86 deletions

View file

@ -1,4 +1,5 @@
add_subdirectory(appwiz)
add_subdirectory(cat)
add_subdirectory(tee)
add_subdirectory(touch)
add_subdirectory(uptime)

View file

@ -1,5 +1,5 @@
add_executable(cat cat.c)
set_module_type(cat win32cui)
add_importlibs(cat ntdll user32 msvcrt kernel32)
add_importlibs(cat msvcrt kernel32)
add_cd_file(TARGET cat DESTINATION reactos/bin FOR all)

View file

@ -0,0 +1,131 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS conCATenation tool
* FILE: cmdutils/cat/cat.c
* PURPOSE: Concatenates STDIN or an arbitrary number of files to STDOUT
* PROGRAMMERS: David Welch
* Semyon Novikov (tappak)
* Hermès Bélusca - Maïto
*/
#include <stdio.h>
#ifdef _WIN32
#include <string.h> // Required for _stricmp()
#include <fcntl.h> // Required for _setmode flags
#include <io.h> // Required for _setmode()
#else
#include <strings.h> // Required for strcasecmp()
#define O_TEXT 0x4000
#define O_BINARY 0x8000
#define _setmode(fd, mode) // This function is useless in *nix world
#define _stricmp strcasecmp
#endif
#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
void help(void)
{
fprintf(stdout,
"\n"
"ReactOS File Concatenation Tool\n"
"\n"
"Usage: cat [options] [file [...]]\n"
"options - Currently ignored\n");
}
int main(int argc, char* argv[])
{
int i;
FILE* in;
unsigned char buff[512];
size_t cnt, readcnt;
if (argc >= 2)
{
if (_stricmp(argv[1], "-h" ) == 0 ||
_stricmp(argv[1], "--help") == 0 ||
_stricmp(argv[1], "/?" ) == 0 ||
_stricmp(argv[1], "/help" ) == 0)
{
help();
return 0;
}
}
/* Set STDOUT to binary */
_setmode(_fileno(stdout), O_BINARY);
/* Special case where we run 'cat' without any argument: we use STDIN */
if (argc <= 1)
{
unsigned int ch;
/* Set STDIN to binary */
_setmode(_fileno(stdin), O_BINARY);
#if 0 // Version using feof()
ch = fgetc(stdin);
while (!feof(stdin))
{
putchar(ch);
ch = fgetc(stdin);
}
#else
while ((ch = fgetc(stdin)) != EOF)
{
putchar(ch);
}
#endif
return 0;
}
/* We have files: read them and output them to STDOUT */
for (i = 1; i < argc; i++)
{
/* Open the file in binary read mode */
in = fopen(argv[i], "rb");
if (in == NULL)
{
fprintf(stderr, "Failed to open file '%s'\n", argv[i]);
return -1;
}
/* Dump the file to STDOUT */
cnt = 0; readcnt = 0;
while (readcnt == cnt)
{
/* Read data from the input file */
cnt = ARRAYSIZE(buff);
readcnt = fread(&buff, sizeof(buff[0]), cnt, in);
if (readcnt != cnt)
{
/*
* The real number of read bytes differs from the number of bytes
* we wanted to read, so either a reading error occurred, or EOF
* was reached while reading. Bail out if it is a reading error.
*/
if (!feof(in))
{
fprintf(stderr, "Error while reading file '%s'\n", argv[i]);
fclose(in);
return -1;
}
}
/* Nothing to be read anymore, so we can gracefully break */
if (readcnt == 0) break;
/* Write data to STDOUT */
fwrite(&buff, sizeof(buff[0]), readcnt, stdout);
}
/* Finally close the file */
fclose(in);
}
return 0;
}
/* EOF */

View file

@ -11,6 +11,5 @@ add_subdirectory(regexpl)
add_subdirectory(rosddt)
add_subdirectory(screenshot)
add_subdirectory(systeminfo)
add_subdirectory(tcat)
add_subdirectory(tlist)
add_subdirectory(utils)

View file

@ -1,5 +0,0 @@
add_executable(tcat cat.c)
set_module_type(tcat win32cui)
add_importlibs(tcat user32 msvcrt kernel32 ntdll)
add_cd_file(TARGET tcat DESTINATION reactos/system32 FOR all)

View file

@ -1,52 +0,0 @@
/*
* FILE : cat.c
* NATIVE NAME: tcat "tappak's cat" :)
* AUTHOR : Semyon Novikov (tappak)
* PROJECT : ReactOS Operating System
* DESCRIPTION: file concatenation tool
* DATE : 2004-01-21
* LICENSE : GPL
*/
#include <stdio.h>
#include <string.h>
#define F_O_ERR "can not open file"
void help(void)
{
puts("File concatenation tool");
puts("Usage: cat [file]");
}
int main(int argc, char *argv[])
{
FILE *srcf;
char *keys[]={"--help","/help"};
int i=0,ret=0;
switch(argc)
{
case 1:puts("Usage: cat [file]");break;
case 2:
if ((!strcmp(argv[1],keys[0]))||(!strcmp(argv[1],keys[1])))
help();
else
{
if((srcf=fopen(argv[1],"r"))!=NULL)
{
while(i!=EOF)
{ i=fgetc(srcf);
putchar(i);
}
fclose(srcf);
}
else
{
printf("%s %s %s\n",argv[0],F_O_ERR,argv[1]);
ret=-1;
}
}
break;
}
return ret;
}

View file

@ -1,5 +1,4 @@
add_subdirectory(binpatch)
add_subdirectory(cat)
add_subdirectory(driver)
add_subdirectory(infinst)
add_subdirectory(nts2w32err)

View file

@ -1,26 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int i;
FILE* in;
char ch;
for (i=1; i<argc; i++)
{
in = fopen(argv[i],"r");
if (in == NULL)
{
printf("Failed to open file %s\n", argv[i]);
return(0);
}
while ((ch = fgetc(in)) != EOF)
{
putchar(ch);
}
fclose(in);
}
return 0;
}