parent
e06f7355cd
commit
9488ad1bd6
@ -0,0 +1,147 @@
|
||||
#ifdef __MINGW32__
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "getline.h"
|
||||
|
||||
size_t getline(char **lineptr, size_t *n, FILE *stream) {
|
||||
int ch;
|
||||
size_t chars = 0;
|
||||
char *line = *lineptr;
|
||||
|
||||
/* why even call this if you don't have a stream to read? */
|
||||
if (stream == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
ch = fgetc(stream);
|
||||
if (ch == EOF) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (line == NULL) {
|
||||
if (*n == 0) {
|
||||
line = (char *) calloc(GET_LINE_MAX_MEM, sizeof(char));
|
||||
*n = GET_LINE_MAX_MEM;
|
||||
}
|
||||
else {
|
||||
line = (char *) calloc(*n, sizeof(char));
|
||||
}
|
||||
|
||||
/* out of memory */
|
||||
if (line == NULL) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
free(line);
|
||||
*n = GET_LINE_MAX_MEM;
|
||||
line = (char *) calloc(GET_LINE_MAX_MEM, sizeof(char));
|
||||
}
|
||||
|
||||
while(ch != EOF) {
|
||||
if (chars == *n) {
|
||||
/* not enough memory for more chars, add more */
|
||||
*n = *n + GET_LINE_MAX_MEM;
|
||||
line = (char *) realloc(line, *n * sizeof(char));
|
||||
}
|
||||
if (ch == '\n') {
|
||||
if (chars == *n - 1) {
|
||||
/* add space for the null terminator */
|
||||
*n = *n + 1;
|
||||
line = (char *) realloc(line, *n * sizeof(char));
|
||||
}
|
||||
line[chars] = '\n';
|
||||
line[chars + 1] = '\0';
|
||||
break;
|
||||
}
|
||||
line[chars] = ch;
|
||||
ch = fgetc(stream);
|
||||
chars++;
|
||||
}
|
||||
if (ch == EOF) {
|
||||
if (chars == *n) {
|
||||
/* add space for the null terminator */
|
||||
*n = *n + 1;
|
||||
line = (char *) realloc(line, *n * sizeof(char));
|
||||
}
|
||||
line[chars] = '\0';
|
||||
}
|
||||
|
||||
*lineptr = line;
|
||||
|
||||
return chars + 1;
|
||||
}
|
||||
|
||||
size_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream) {
|
||||
int ch;
|
||||
size_t chars = 0;
|
||||
char *line = *lineptr;
|
||||
|
||||
/* why even call this if you don't have a stream to read? */
|
||||
if (stream == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
ch = fgetc(stream);
|
||||
if (ch == EOF) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (line == NULL) {
|
||||
if (*n == 0) {
|
||||
line = (char *) calloc(GET_LINE_MAX_MEM, sizeof(char));
|
||||
*n = GET_LINE_MAX_MEM;
|
||||
}
|
||||
else {
|
||||
line = (char *) calloc(*n, sizeof(char));
|
||||
}
|
||||
|
||||
/* out of memory */
|
||||
if (line == NULL) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
free(line);
|
||||
*n = GET_LINE_MAX_MEM;
|
||||
line = (char *) calloc(GET_LINE_MAX_MEM, sizeof(char));
|
||||
}
|
||||
|
||||
while(ch != EOF) {
|
||||
if (chars == *n) {
|
||||
/* not enough memory for more chars, add more */
|
||||
*n = *n + GET_LINE_MAX_MEM;
|
||||
line = (char *) realloc(line, *n * sizeof(char));
|
||||
}
|
||||
if (ch == '\n') {
|
||||
if (chars == *n - 1) {
|
||||
/* add space for the null terminator */
|
||||
*n = *n + 1;
|
||||
line = (char *) realloc(line, *n * sizeof(char));
|
||||
}
|
||||
line[chars] = delim;
|
||||
line[chars + 1] = '\0';
|
||||
break;
|
||||
}
|
||||
line[chars] = ch;
|
||||
ch = fgetc(stream);
|
||||
chars++;
|
||||
}
|
||||
if (ch == EOF) {
|
||||
if (chars == *n) {
|
||||
/* add space for the null terminator */
|
||||
*n = *n + 1;
|
||||
line = (char *) realloc(line, *n * sizeof(char));
|
||||
}
|
||||
line[chars] = '\0';
|
||||
}
|
||||
|
||||
if (chars < *n) {
|
||||
line = (char *) realloc(line, chars + 2 * sizeof(char));
|
||||
}
|
||||
|
||||
*lineptr = line;
|
||||
|
||||
return chars + 1;
|
||||
}
|
||||
#endif
|
@ -0,0 +1,6 @@
|
||||
#ifdef __MINGW32__
|
||||
#define GET_LINE_MAX_MEM 128
|
||||
|
||||
size_t getline(char **lineptr, size_t *n, FILE *stream);
|
||||
size_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
|
||||
#endif
|
Loading…
Reference in new issue