try to support DOS ppm/csv files on linux

swap \r\n for \n in vips__fgetc()
This commit is contained in:
John Cupitt 2015-06-04 12:58:30 +01:00
parent ed57a3d53f
commit 5cb2239d7d
6 changed files with 48 additions and 28 deletions

View File

@ -8,6 +8,7 @@
- oops, base64 encode could pad by up to two zero bytes
- added VipsRefString as a thing that gi bindings can unpack
- support "with Vips.Image as ...:" in Python
- try to support DOS CSV and PPM files on linux
7/5/15 started 8.0.3
- dzsave and tif pyr write could fail for some image dimensions, thanks Jonas

15
TODO
View File

@ -1,21 +1,10 @@
- try:
http://i.publiclab.org/system/images/photos/000/006/146/original/NDVI_VGYRM-lut.txt
tab-separated, four columns
$ vips csvload ~/Desktop/NDVI_VGYRM-lut.txt x.v --skip 1
vips warning: csv2vips: error parsing number, line 2, column 1025
strange ... works without the --skip, though the first row is blank
- try:
$ vips copy y.v x.v --width 1 --bands 3
VipsRegion: images do not match in pixel size
copy will make 1xN or Nx1 M-band images into MxN oone-nband images, but it
won't go tyhe other way
copy will make 1xN or Nx1 M-band images into MxN one-band images, but it
won't go the other way

View File

@ -27,6 +27,9 @@
* - report positions for EOF/EOL errors
* 2/7/13
* - add matrix read/write
* 4/6/15
* - try to support DOS files under linux ... we have to look for \r\n
* linebreaks
*/
/*
@ -84,13 +87,13 @@ skip_line( FILE *fp )
/* Are we at a delayed EOF? See below.
*/
if( (ch = fgetc( fp )) == EOF )
if( (ch = vips__fgetc( fp )) == EOF )
return( 0 );
ungetc( ch, fp );
/* If we hit EOF and no \n, wait until the next call to report EOF.
*/
while( (ch = fgetc( fp )) != '\n' &&
while( (ch = vips__fgetc( fp )) != '\n' &&
ch != EOF )
;
@ -103,7 +106,7 @@ skip_white( FILE *fp, const char whitemap[256] )
int ch;
do {
ch = fgetc( fp );
ch = vips__fgetc( fp );
} while( ch != EOF &&
ch != '\n' &&
whitemap[ch] );
@ -119,12 +122,12 @@ skip_to_quote( FILE *fp )
int ch;
do {
ch = fgetc( fp );
ch = vips__fgetc( fp );
/* Ignore \" in strings.
*/
if( ch == '\\' )
ch = fgetc( fp );
ch = vips__fgetc( fp );
else if( ch == '"' )
break;
} while( ch != EOF &&
@ -141,7 +144,7 @@ skip_to_sep( FILE *fp, const char sepmap[256] )
int ch;
do {
ch = fgetc( fp );
ch = vips__fgetc( fp );
} while( ch != EOF &&
ch != '\n' &&
!sepmap[ch] );
@ -181,9 +184,9 @@ read_double( FILE *fp, const char whitemap[256], const char sepmap[256],
return( ch );
if( ch == '"' ) {
(void) fgetc( fp );
(void) vips__fgetc( fp );
(void) skip_to_quote( fp );
(void) fgetc( fp );
(void) vips__fgetc( fp );
}
else if( !sepmap[ch] &&
fscanf( fp, "%lf", out ) != 1 ) {
@ -207,7 +210,7 @@ read_double( FILE *fp, const char whitemap[256], const char sepmap[256],
*/
if( ch != EOF &&
sepmap[ch] )
(void) fgetc( fp );
(void) vips__fgetc( fp );
return( 0 );
}
@ -462,7 +465,7 @@ fetch_nonwhite( FILE *fp, const char whitemap[256], char *buf, int max )
int i;
for( i = 0; i < max - 1; i++ ) {
ch = fgetc( fp );
ch = vips__fgetc( fp );
if( ch == EOF || ch == '\n' || whitemap[ch] )
break;

View File

@ -31,6 +31,9 @@
* - rework as a set of fns ready to be called from a class
* 8/11/14
* - add 1 bit write
* 4/6/15
* - try to support DOS files under linux ... we have to look for \r\n
* linebreaks
*/
/*
@ -84,7 +87,7 @@
static void
skip_line( FILE *fp )
{
while( fgetc( fp ) != '\n' )
while( vips__fgetc( fp ) != '\n' )
;
}
@ -93,7 +96,7 @@ skip_white_space( FILE *fp )
{
int ch;
while( isspace( ch = fgetc( fp ) ) )
while( isspace( ch = vips__fgetc( fp ) ) )
;
ungetc( ch, fp );
@ -163,8 +166,8 @@ read_header( FILE *fp, VipsImage *out, int *bits, int *ascii, int *msb_first )
/* Read in the magic number.
*/
buf[0] = fgetc( fp );
buf[1] = fgetc( fp );
buf[0] = vips__fgetc( fp );
buf[1] = vips__fgetc( fp );
buf[2] = '\0';
for( index = 0; index < VIPS_NUMBER( magic_names ); index++ )
@ -220,7 +223,7 @@ read_header( FILE *fp, VipsImage *out, int *bits, int *ascii, int *msb_first )
* character before the data starts.
*/
if( !*ascii &&
!isspace( fgetc( fp ) ) ) {
!isspace( vips__fgetc( fp ) ) ) {
vips_error( "ppm2vips", "%s",
_( "not whitespace before start of binary data" ) );
return( -1 );

View File

@ -207,6 +207,7 @@ char *vips__file_read_name( const char *name, const char *fallback_dir,
size_t *length_out );
int vips__file_write( void *data, size_t size, size_t nmemb, FILE *stream );
int vips__get_bytes( const char *filename, unsigned char buf[], int len );
int vips__fgetc( FILE *fp );
GValue *vips__gvalue_ref_string_new( const char *text );
void vips__gslist_gvalue_free( GSList *list );

View File

@ -763,6 +763,29 @@ vips__get_bytes( const char *filename, unsigned char buf[], int len )
return( 1 );
}
/* We try to support stupid DOS files too. These have \r\n (13, 10) as line
* separators. Strategy: an fgetc() that swaps \r\n for \n.
*
* On Windows, stdio will automatically swap \r\n for \n, but on Linux we have
* to do this by hand.
*/
int
vips__fgetc( FILE *fp )
{
int ch;
ch = fgetc( fp );
if( ch == '\r' ) {
ch = fgetc( fp );
if( ch != '\n' ) {
ungetc( ch, fp );
ch = '\r';
}
}
return( ch );
}
/* Alloc/free a GValue.
*/
static GValue *