generarxml/src/getline.c

148 líneas
3.4 KiB
C

#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