rendered paste body#include <stdio.h>
#include <stdlib.h>
// Returns pointer to a line read from fp (excluding line-ending), returns NULL
// on error or if EOF is reached.
#define INITIAL_SIZE 1
#define INCREMENT 1
static char *read_line(FILE *fp)
{
int c, bufsize = INITIAL_SIZE, len = 0;
char *buffer = (char *) malloc(sizeof(char) * INITIAL_SIZE);
if (buffer == NULL)
return NULL;
while (1) {
c = fgetc(fp);
if (c == EOF) {
if (len == 0) {
// Reached end of line without actually reading anything, return NULL;
free(buffer);
return NULL;
}
break;
} else if (c == '\n') {
break;
} else if (c == '\r') { // Mac or Win line-ending
// Attempt to read optional \n (Win line-ending).
c = fgetc(fp);
if (c != '\n')
ungetc(c, fp);
break;
} else {
if (len > bufsize-1) {
// TODO: handle realloc returning NULL properly
bufsize += INCREMENT;
buffer = (char *) realloc(buffer, sizeof(char) * bufsize);
if (buffer == NULL) fprintf(stderr, "oh crap\n");
}
buffer[len] = c;
len++;
}
}
buffer[len] = '\0';
return buffer;
}
int main(int argc, char **argv)
{
FILE *file;
char *line;
if (argc < 2) {
printf("Add filename to read as commandline argument\n");
return 1;
}
if ( (file = fopen(argv[1], "rb")) == NULL ) {
fprintf(stderr, "Failed to open file.\n");
return 1;
}
while ((line = read_line(file)) != NULL) {
printf("line read: %s\n", line);
free(line);
}
return 0;
}