/* * find next grib header * * file = what do you think? * pos = initial position to start looking at ( = 0 for 1st call) * returns with position of next grib header (units=bytes) * len_grib = length of the grib record (bytes) * buffer[buf_len] = buffer for reading/writing * * returns (char *) to start of GRIB header+PDS * NULL if not found * * adapted from SKGB (Mark Iredell) * * v1.1 9/94 Wesley Ebisuzaki * v1.2 3/96 Wesley Ebisuzaki handles short records at end of file * v1.3 8/96 Wesley Ebisuzaki increase NTRY from 3 to 100 for the folks * at Automation decided a 21 byte WMO bulletin header wasn't long * enough and decided to go to an 8K header. * v1.4 11/10/2001 D. Haalman, looks at entire file, does not try * to read past EOF */ #include #include #include #include "grib.h" #ifndef min #define min(a,b) ((a) < (b) ? (a) : (b)) #endif #define NTRY 100 /* #define LEN_HEADER_PDS (28+42+100) */ #define LEN_HEADER_PDS (28+8) unsigned char *seek_grib(FILE *file, long *pos, long *len_grib, unsigned char *buffer, unsigned int buf_len) { int i, j, len; j = 1; clearerr(file); while ( !feof(file) ) { if (fseek(file, *pos, SEEK_SET) == -1) break; i = fread(buffer, sizeof (unsigned char), buf_len, file); if (ferror(file)) break; len = i - LEN_HEADER_PDS; for (i = 0; i < len; i++) { if (buffer[i] == 'G' && buffer[i+1] == 'R' && buffer[i+2] == 'I' && buffer[i+3] == 'B' && buffer[i+7] == 1) { *pos = i + *pos; *len_grib = (buffer[i+4] << 16) + (buffer[i+5] << 8) + buffer[i+6]; return (buffer+i); } } if (j++ == NTRY) { fprintf(stderr,"found unidentified data \n"); /* break; // stop seeking after NTRY records */ } *pos = *pos + (buf_len - LEN_HEADER_PDS); } *len_grib = 0; return (unsigned char *) NULL; }