lavf/avio_internal: add ffio_write_lines for line ending normalization
This commit is contained in:
		
							parent
							
								
									3be80ce299
								
							
						
					
					
						commit
						98eeef44aa
					
				@ -156,6 +156,17 @@ unsigned int ffio_read_leb(AVIOContext *s);
 | 
			
		||||
 | 
			
		||||
void ffio_write_leb(AVIOContext *s, unsigned val);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Write a sequence of text lines, converting line endings.
 | 
			
		||||
 * All input line endings (LF, CRLF, CR) are converted to the configured line ending.
 | 
			
		||||
 * @param s The AVIOContext to write to
 | 
			
		||||
 * @param buf The buffer to write
 | 
			
		||||
 * @param size The size of the buffer, or <0 to use the full length of a null-terminated string
 | 
			
		||||
 * @param ending The line ending sequence to convert to, or NULL for \n
 | 
			
		||||
 */
 | 
			
		||||
void ffio_write_lines(AVIOContext *s, const unsigned char *buf, int size,
 | 
			
		||||
                      const unsigned char *ending);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Read size bytes from AVIOContext into buf.
 | 
			
		||||
 * Check that exactly size bytes have been read.
 | 
			
		||||
 | 
			
		||||
@ -1004,6 +1004,37 @@ void ffio_write_leb(AVIOContext *s, unsigned val)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ffio_write_lines(AVIOContext *s, const unsigned char *buf, int size,
 | 
			
		||||
                      const unsigned char *ending)
 | 
			
		||||
{
 | 
			
		||||
    int ending_len = ending ? strlen(ending) : 1;
 | 
			
		||||
    if (!ending)
 | 
			
		||||
        ending = "\n";
 | 
			
		||||
    if (size < 0)
 | 
			
		||||
        size = strlen(buf);
 | 
			
		||||
 | 
			
		||||
    while (size > 0) {
 | 
			
		||||
        size_t len = 0;
 | 
			
		||||
        char last = 0;
 | 
			
		||||
        for (; len < size; len++) {
 | 
			
		||||
            last = buf[len];
 | 
			
		||||
            if (last == '\r' || last == '\n')
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        avio_write(s, buf, len);
 | 
			
		||||
        avio_write(s, ending, ending_len);
 | 
			
		||||
 | 
			
		||||
        buf += len + 1;
 | 
			
		||||
        size -= len + 1;
 | 
			
		||||
 | 
			
		||||
        if (size > 0 && last == '\r' && buf[0] == '\n') {
 | 
			
		||||
            buf++;
 | 
			
		||||
            size--;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ffio_fdopen(AVIOContext **s, URLContext *h)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t *buffer = NULL;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user