Files
reactos/reactos/tools/rline.c
T
Thomas Bluemel 1c3867a641 Patch by Jonathon Wilson:
fix most of ReactOS to build with -Wall -Werror by default

svn path=/trunk/; revision=6645
2003-11-14 17:13:36 +00:00

137 lines
2.3 KiB
C
Executable File

/*
* Copy a text file with end-of-line character transformation (EOL)
*
* Usage: rline input-file output-file
*/
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* convert_path(char* origpath)
{
char* newpath;
int i;
newpath = strdup(origpath);
i = 0;
while (newpath[i] != 0)
{
#ifdef UNIX_PATHS
if (newpath[i] == '\\')
{
newpath[i] = '/';
}
#else
#ifdef DOS_PATHS
if (newpath[i] == '/')
{
newpath[i] = '\\';
}
#endif
#endif
i++;
}
return(newpath);
}
int
fsize (FILE * f)
{
struct stat st;
int fh = fileno (f);
if (fh < 0 || fstat (fh, &st) < 0)
return -1;
return (int) st.st_size;
}
int main(int argc, char* argv[])
{
char* path1;
char* path2;
FILE* in;
FILE* out;
char* in_buf;
int in_size;
int in_ptr;
int linelen;
int n_in;
int n_out;
char eol_buf[2];
/* Terminate the line with windows EOL characters (CRLF) */
eol_buf[0] = '\r';
eol_buf[1] = '\n';
if (argc != 3)
{
fprintf(stderr, "Wrong argument count\n");
exit(1);
}
path1 = convert_path(argv[1]);
path2 = convert_path(argv[2]);
in = fopen(path1, "rb");
if (in == NULL)
{
perror("Cannot open input file");
exit(1);
}
in_size = fsize(in);
in_buf = malloc(in_size);
if (in_buf == NULL)
{
perror("Not enough free memory");
fclose(in);
exit(1);
}
out = fopen(path2, "wb");
if (out == NULL)
{
perror("Cannot open output file");
fclose(in);
exit(1);
}
/* Read it all in */
n_in = fread(in_buf, 1, in_size, in);
in_ptr = 0;
while (in_ptr < in_size)
{
linelen = 0;
while ((in_ptr + linelen < in_size) && (in_buf[in_ptr + linelen] != '\r') && (in_buf[in_ptr + linelen] != '\n'))
{
linelen++;
}
if (linelen > 0)
{
n_out = fwrite(&in_buf[in_ptr], 1, linelen, out);
in_ptr += linelen;
}
/* Terminate the line */
n_out = fwrite(&eol_buf[0], 1, sizeof(eol_buf), out);
if ((in_ptr < in_size) && (in_buf[in_ptr] == '\r'))
{
in_ptr++;
}
if ((in_ptr < in_size) && (in_buf[in_ptr] == '\n'))
{
in_ptr++;
}
}
free(in_buf);
fclose(in);
exit(0);
}