#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include "nb_header.h"
Go to the source code of this file.
Defines | |
#define | STRING 0 |
#define | INTEGER 1 |
#define | FLOAT 2 |
Functions | |
int | InputType () |
void | WrongType () |
void | RemoveBlanks () |
MARNB_HEADER | GetmarNBHeader (FILE *) |
MARNB_HEADER | SetmarNBHeader (void) |
int | PutmarNBHeader (int, MARNB_HEADER) |
#define FLOAT 2 |
Definition at line 29 of file nb_header.c.
Referenced by GetmarNBHeader().
#define INTEGER 1 |
Definition at line 28 of file nb_header.c.
Referenced by GetmarNBHeader().
#define STRING 0 |
Definition at line 27 of file nb_header.c.
MARNB_HEADER GetmarNBHeader | ( | FILE * | fp | ) |
Definition at line 49 of file nb_header.c.
References buf, MARNB_HEADER::byteorder, MARNB_HEADER::cutoff, MARNB_HEADER::date, FLOAT, MARNB_HEADER::fpos, MARNB_HEADER::gain, i, InputType(), INTEGER, j, MAX_NBMODE, MARNB_HEADER::mode, MARNB_HEADER::nbs, MARNB_HEADER::phioff, MARNB_HEADER::pixel_height, MARNB_HEADER::pixel_length, MARNB_HEADER::pixels, MARNB_HEADER::program, RemoveBlanks(), MARNB_HEADER::roff, MARNB_HEADER::scale, MARNB_HEADER::scanner, SetmarNBHeader(), MARNB_HEADER::size, MARNB_HEADER::skip, str, MARNB_HEADER::subpixels, MARNB_HEADER::tot_pixels, MARNB_HEADER::version, WrongType(), MARNB_HEADER::x, and MARNB_HEADER::y.
Referenced by MarXF::mar_start_scan_readout().
{ MARNB_HEADER h; int i,j, itmp, size,fpos, ntok=0; char str[64], buf[128], *key, *token[20]; /* * Set defaults */ h = SetmarNBHeader(); if( fp == NULL ) return( h ); fseek( fp, 0, SEEK_SET ); if ( fread( &h.byteorder, sizeof(int), 1, fp ) < 1 ) { return( h ); } fgets( buf, 60, fp ); fpos = 64; /* First ASCII line (bytes 128 to 192 contains: mar research */ /* Ignore it... */ fseek( fp, 192, SEEK_SET ); fpos = 192; /* * Read input lines */ while( fgets(buf,64,fp)!= NULL){ /* Always add 64 bytes to current filemarker after 1 read */ fpos += 64; fseek( fp, fpos, SEEK_SET ); /* Keyword: END OF HEADER*/ if(strstr(buf,"END OF HEADER") ) break; else if(strstr(buf,"REMARK") ) continue; /* */ if ( strlen(buf) < 2 ) continue; /* Scip comment lines */ if( buf[0] == '#' || buf[0]=='!' ) continue; /* Tokenize input string */ /* ntok = number of items on input line - 1 (key) */ ntok = -1; for(i=0;i<64;i++) { /* Convert TAB to SPACE */ if( buf[i] == '\t') buf[i] = ' '; if( buf[i] == '\f') buf[i] = ' '; if( buf[i] == '\n') buf[i] = '\0'; if( buf[i] == '\r') buf[i] = '\0'; if( buf[i] == '\0') break; } for(i=0;i<strlen(buf);i++) { if( buf[i] == ' ' ) continue; ntok++; for (j=i;j<strlen(buf);j++) if( buf[j] == ' ') break; i=j; } if (strlen(buf) < 3 ) continue; key = strtok( buf, " "); /* Convert keyword to uppercase */ for ( i=0; i<strlen(key); i++ ) if ( isalnum( key[i] ) ) key[i] = toupper( key[i] ); for(i=0;i<ntok;i++) { token[i] = strtok( NULL, " "); strcpy( str, token[i] ); for ( j=0; j<strlen( str ); j++ ) if ( isalnum( str[j] ) ) str[j] = toupper( str[j] ); strcpy( token[i] , str ); RemoveBlanks( token[i] ); } /* Keyword: PROGRAM */ if(!strncmp(key,"PROG",4) && ntok >= 2 ) { strcpy( h.program, token[0] ); strcpy( h.version, token[2] ); } /* Keyword: SCALE */ else if(!strncmp(key,"SCAL",4) && ntok >= 0 ) if ( InputType( token[0] ) >= INTEGER ) h.scale = atof( token[0] ); else WrongType( FLOAT, key, token[0] ); /* Keyword: PHIOFF */ else if(!strncmp(key,"PHI",3) && ntok >= 0 ) if ( InputType( token[0] ) >= INTEGER ) h.phioff = atof( token[0] ); else WrongType( FLOAT, key, token[0] ); /* Keyword: CUTOFF */ else if(!strncmp(key,"CUT",3) && ntok >= 0 ) if ( InputType( token[0] ) >= INTEGER ) h.cutoff = atof( token[0] ); else WrongType( FLOAT, key, token[0] ); /* Keyword: GAIN */ else if(!strncmp(key,"GAIN",4) && ntok >= 0 ) if ( InputType( token[0] ) >= INTEGER ) h.gain = atof( token[0] ); else WrongType( FLOAT, key, token[0] ); else if(!strncmp(key,"PIXE",4) && ntok >= 0 ) { for(i=0;i<ntok;i++) { if ( strstr( token[i], "LEN" ) ) { i++; if ( InputType( token[i] ) >= INTEGER ) { h.pixel_length = atof( token[i] ); } else WrongType( FLOAT, key, token[i] ); } else if ( strstr( token[i], "HEI" ) ) { i++; if ( InputType( token[i] ) >= INTEGER ) { h.pixel_height= atof( token[i] ); } else WrongType( FLOAT, key, token[i] ); } else if ( strstr( token[i], "SUB" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) { h.subpixels = atoi( token[i] ); } else WrongType( INTEGER, key, token[i] ); } } } /* Keyword: SCANNER */ else if(!strncmp(key,"SCAN",4) && ntok >= 0 ) if ( InputType( token[0] ) == INTEGER ) h.scanner = atoi( token[0] ); else WrongType( INTEGER, key, token[0] ); /* Keyword: DATE */ else if(!strncmp(key,"DATE",4) && ntok >= 0 ) { for ( i=0; i<strlen( buf ); i++ ) if ( buf[i] == ' ' ) break; for ( j=i; j<strlen( buf ); j++ ) if ( buf[j] != ' ' ) break; strcpy( h.date, buf+j ); } /* Keyword: MODE */ else if(!strncmp(key,"MODE",4) && ntok >= 0 ) { if ( InputType( token[0] ) != INTEGER ) WrongType( INTEGER, key, token[0] ); else { size = atoi( token[0] ); for ( j=0, i=0; i<MAX_NBMODE; i++ ) { if ( h.size[i] == 0 && h.mode <= MAX_NBMODE ) { h.size[h.mode] = size; j = h.mode; h.mode++; break; } else if ( h.size[i] == size ) { j = i; break; } } for ( i=1; i<ntok; i++ ) { if ( strstr( token[i], "POS" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) h.fpos[j] = atoi( token[i] ); else WrongType( INTEGER, key, token[i] ); } else if ( strstr( token[i], "PIX" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) h.pixels[j] = atoi( token[i] ); else WrongType( INTEGER, key, token[i] ); } else if ( strstr( token[i], "X" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) h.x[j] = atoi( token[i] ); else WrongType( INTEGER, key, token[i] ); } else if ( strstr( token[i], "Y" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) h.y[j] = atoi( token[i] ); else WrongType( INTEGER, key, token[i] ); } else if ( strstr( token[i], "SK" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) h.skip[j] = atoi( token[i] ); else WrongType( INTEGER, key, token[i] ); } else if ( strstr( token[i], "RO" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) h.roff[j] = atoi( token[i] ); else WrongType( INTEGER, key, token[i] ); } } } } /* Keyword: NUMBER */ else if(!strncmp(key,"NUMB",3) && ntok >= 1 ) { for(i=0;i<ntok;i++) { if ( strstr( token[i], "PIX" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) { h.tot_pixels = atoi( token[i] ); } else WrongType( INTEGER, key, token[i] ); } else if ( strstr( token[i], "NEI" ) ) { i++; if ( InputType( token[i] ) == INTEGER ) { h.nbs = atoi( token[i] ); } else WrongType( INTEGER, key, token[i] ); } } } } /* End of while loop */ /* * End of input lines (while loop) */ fseek( fp, 4096, SEEK_SET ); return( h ); }
int InputType | ( | ) |
int PutmarNBHeader | ( | int | fd, |
MARNB_HEADER | h | ||
) |
Definition at line 365 of file nb_header.c.
References MARNB_HEADER::cutoff, MARNB_HEADER::date, MARNB_HEADER::fpos, MARNB_HEADER::gain, i, j, MAX_NBMODE, MARNB_HEADER::nbs, MARNB_HEADER::phioff, MARNB_HEADER::pixel_height, MARNB_HEADER::pixel_length, MARNB_HEADER::pixels, MARNB_HEADER::program, MARNB_HEADER::roff, MARNB_HEADER::scale, MARNB_HEADER::scanner, MARNB_HEADER::size, MARNB_HEADER::skip, str, MARNB_HEADER::subpixels, MARNB_HEADER::tot_pixels, MARNB_HEADER::version, MARNB_HEADER::x, and MARNB_HEADER::y.
{ int i,j,k=0; int io; int byte_order=1234; time_t clock; char str[128]; char c=' '; if ( fd < 0 )return(0); time( &clock ); sprintf( h.date, "%s", (char *)ctime( &clock )); lseek( fd, 0, SEEK_SET ); /* First 4 bytes: integer with 1234 */ io = write( fd, &byte_order, sizeof(int)); while( lseek( fd, 0, SEEK_CUR ) < 128) { i = write( fd, &c, 1); if ( i< 1) break; io += i; } lseek( fd, 128, SEEK_SET ); sprintf( str, "mar research NEIGHBOUR CODE"); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "PROGRAM %s Version %s\n",h.program,h.version); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "DATE %s",h.date); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "SCANNER %d\n",h.scanner); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "PIXEL LENGTH %1.0f HEIGHT %1.0f SUBPIXELS %d\n",h.pixel_length,h.pixel_height,h.subpixels); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "PHIOFF %1.3f\n",h.phioff); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "CUTOFF %1.3f\n",h.cutoff); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "SCALE %1.3f\n",h.scale); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "GAIN %1.3f\n",h.gain); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; sprintf( str, "NUMBER PIXELS %d NEIGHBOURS %d\n",h.tot_pixels,h.nbs); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; for ( j=0; j<MAX_NBMODE; j++ ) { /* printf("xxx MODE %4d X %4d Y %4d ROFF %4d SKIP %-d\n",h.size[j],h.x[j],h.y[j],h.roff[j],h.skip[j]); */ if ( h.size[j] == 0 ) continue; sprintf( str, "MODE %4d X %4d Y %4d ROFF %4d SKIP %-d\n",h.size[j],h.x[j],h.y[j],h.roff[j],h.skip[j]); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; } for ( j=0; j<MAX_NBMODE; j++ ) { if ( h.size[j] == 0 ) continue; sprintf( str, "MODE %4d PIX %-8d POS %-d\n",h.size[j],h.pixels[j],h.fpos[j]); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; } sprintf( str, "END OF HEADER\n"); for ( i=strlen(str); i<63; i++ ) str[i]=' '; str[63]='\n'; io += write( fd, str, 64); k++; /* */ while( lseek( fd, 0, SEEK_CUR ) < 4096) { i = write( fd, &c, 1); if ( i< 1) break; io += i; } if ( io<4096 ) { fprintf( stderr, "ERROR: only %d out of 4096 written into nb header!!!\n",io); return 0; } return 1; }
void RemoveBlanks | ( | ) |
MARNB_HEADER SetmarNBHeader | ( | void | ) |
Definition at line 325 of file nb_header.c.
References MARNB_HEADER::byteorder, MARNB_HEADER::cutoff, MARNB_HEADER::date, MARNB_HEADER::fpos, MARNB_HEADER::gain, i, MAX_NBMODE, MARNB_HEADER::mode, MARNB_HEADER::nbs, MARNB_HEADER::phioff, MARNB_HEADER::pixel_height, MARNB_HEADER::pixel_length, MARNB_HEADER::pixels, MARNB_HEADER::program, MARNB_HEADER::roff, MARNB_HEADER::scale, MARNB_HEADER::scanner, MARNB_HEADER::size, MARNB_HEADER::skip, MARNB_HEADER::subpixels, MARNB_HEADER::tot_pixels, MARNB_HEADER::version, MARNB_HEADER::x, and MARNB_HEADER::y.
Referenced by GetmarNBHeader().
{ MARNB_HEADER h; int i; h.byteorder = 1234; h.pixel_length = 150.0; h.pixel_height = 150.0; h.subpixels = 0; h.scanner = 25; h.scale = 65535.0; h.phioff = 0.0; h.cutoff = 0.0; h.gain = 1.0; h.mode = 0; h.tot_pixels = 0; h.nbs = 0; h.date[0] = '\0'; h.program[0] = '\0'; h.version[0] = '\0'; for ( i=0; i<MAX_NBMODE; i++ ) { h.x[i] = 0; h.y[i] = 0; h.size[i] = 0; h.fpos[i] = 0; h.pixels[i] = 0; h.roff[i] = 0; h.skip[i] = 0; } return( h ); }
void WrongType | ( | ) |