Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
/* 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;
}