1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *get_next_line (FILE * stream)
{
char *line = NULL;
if (stream != NULL)
{
size_t size = 2;
line = malloc (sizeof *line * size);
if (line != NULL)
{
if (fgets (line, size, stream) != NULL)
{
int end = 0;
char *p;
while (!end && (p = strchr (line, '\n')) == NULL)
{
char *tmp = realloc (line, size * 2);
if (tmp != NULL)
{
end = fgets (tmp + size - 1, size + 1, stream) == NULL;
size *= 2;
line = tmp;
}
else
{
free (line), line = NULL;
end = 1;
}
}
if (!end)
{
*p = 0;
}
}
else
{
free (line), line = NULL;
}
}
}
return line;
}
#ifdef TEST
static int process (char const *fname)
{
int err = 0;
FILE *fp = fopen (fname, "r");
if (fp != NULL)
{
char *line;
while ((line = get_next_line (fp)) != NULL)
{
printf ("'%s'\n", line);
free (line);
}
}
else
{
perror (fname);
err = 1;
}
return err;
}
int main (void)
{
process ("main.c");
return 0;
}
#endif |
Partager