int GetNextLine(char *dest, int size_dest, PRFileDesc *stream) { char nextchar ='\0'; int done = 0; int i = 0; while(!done){ if( ( nextchar = my_fgetc(stream) ) != 0){ if( i < (size_dest - 1) ){ dest[i] = nextchar; i++; if(nextchar == '\n'){ /* end of line reached */ done = 1; } } else { /* no more room in buffer */ done = 1; } } else { /* error or end of file */ done = 1; } } dest[i] = '\0'; /* return size of string read */ return i; }
char * my_fgets(char *buffer, int maxBuffer, FILE *f) { int i; int cLast = '\0'; if (f == NULL || feof(f)) return NULL; for (i=0; i<maxBuffer; i++) { buffer[i] = my_fgetc(f); if (buffer[i] == '\0') return buffer; /* skip TeX comments */ while (buffer[i] == '%' && cLast != '\\' && buffer[i] != '\0') { do { buffer[i] = my_fgetc(f); } while (buffer[i] == '\0' || buffer[i] == '\n'); if (buffer[i] == '\0') return buffer; do { buffer[i] = my_fgetc(f); } while (buffer[i] == '\0' || buffer[i] == ' '); if (buffer[i] == '\0') return buffer; } if (buffer[i] == '\n') { if (cLast == '\\') buffer[i] = ' '; /* replace backslash-newline with backslash-space */ else break; } cLast = buffer[i]; } buffer[i] = '\0'; return buffer; }
/* Read an arbitrarily long line of text from STREAM into LINEBUFFER. * Consider lines to be terminated by DELIMITER. * Keep the delimiter. * Do not NUL-terminate; Therefore the stream can contain NUL bytes, and * the length (including the delimiter) is returned in linebuffer->length. * Return NULL when stream is empty or upon error. * Otherwise, return LINEBUFFER. */ struct LineBuffer *readlinebuffer(struct LineBuffer *linebuffer, MY_FILE *stream, char delimiter) { int c; char *buffer = linebuffer->buffer; char *p = linebuffer->buffer; char *end = buffer + linebuffer->size; if(my_feof(stream)) return NULL; do { c = my_fgetc(stream); if(c == EOF) { // Return NULL when stream is empty or upon error if(p == buffer || my_ferror(stream)) return NULL; // append DELIMITER if it's the last line of a file that ends in a character other than DELIMITER. if(p[-1] != delimiter) c = delimiter; } // Check if we need to allocate more space if(p == end) { size_t oldsize = linebuffer->size; linebuffer->size += BUFF_SIZE_INC; buffer = realloc(buffer, linebuffer->size); p = buffer + oldsize; linebuffer->buffer = buffer; end = buffer + linebuffer->size; } *p++ = c; } while(c != delimiter); linebuffer->length = p - buffer; return linebuffer; }