Take the whole input to one single string (or explode the memory of your box)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EXIERR(n,str) fprintf(stderr, str "\n");exit n
void *
xrealloc (void *ptr, size_t size)
{
void *value = realloc (ptr, size);
if (value == 0)
EXIERR(-1, "Can't xrealloc");
return value;
}
char *
readinput (void)
{
char *str, buf[10];
int nbytes;
str = NULL;
nbytes = read(0, buf, 10);
if (nbytes == -1)
EXIERR(-1, "Error while trying to read from input");
str = xrealloc (str, nbytes);
strncpy (str, buf, nbytes);
if (nbytes < 10) {
/* chop the new line char */
str[nbytes - 1] = 0;
return str;
}
while ((nbytes = read (0, buf, 10)) > 0) {
str = xrealloc (str,
(strlen (str) + nbytes ));
strncat (str, buf, nbytes);
}
if (nbytes == -1)
EXIERR(-1, "Error while trying to read from input");
/*
* the last char is a new line
* chop it
*/
str[ strlen (str) -1 ] = 0;
return str;
}
int
main (void)
{
char *str;
str = readinput();
puts (str);
free (str);
return 0;
}
The algorithm is:
read from input
put the bytes in buf
allocate first nbytes to str
copy buf to str
if nbytes < 10
end str with 0
return str
else
read from input
put the bytes in buf
allocate more nbytes to str
concatenate buf in str
if there is no more input
end str with 0
return str
cheers (:
It's me again editing...
Some times this program crashes when the sorce file is passed as input.. like
$ ./a.out < source_file.c
raises a two free() error