tomwalters@0: /* tomwalters@0: saitonap.c SAI to NAP format conversion. tomwalters@0: ------------ tomwalters@0: tomwalters@0: Read a SAI header and a succession of frames. tomwalters@0: Write a NAP header, (created from the SAI header). tomwalters@0: Write each frame in NAP format. tomwalters@0: tomwalters@0: */ tomwalters@0: tomwalters@0: tomwalters@0: #include tomwalters@0: #include tomwalters@0: #include "header.h" tomwalters@0: #include "options.h" tomwalters@0: #include "units.h" tomwalters@0: #include "strmatch.h" tomwalters@0: tomwalters@0: char applic[] = "SAI to NAP format conversion. " ; tomwalters@0: tomwalters@0: static char *helpstr, *debugstr, *fstr, *headerstr ; tomwalters@0: tomwalters@0: static Options option[] = { tomwalters@0: { "help" , "off" , &helpstr , "help" , DEBUG }, tomwalters@0: { "debug" , "off" , &debugstr , "debugging switch" , DEBUG }, tomwalters@0: { "frame" , "min-max" , &fstr , "select frames inclusively" , VAL }, tomwalters@0: { "header" , "on" , &headerstr , "nap header" , VAL }, tomwalters@0: ( char * ) 0 } ; tomwalters@0: tomwalters@0: tomwalters@0: int frameheight, framewidth ; /* Sai parameters read from header */ tomwalters@0: int frames ; tomwalters@0: tomwalters@0: main(argc, argv) tomwalters@0: int argc ; tomwalters@0: char *argv[] ; tomwalters@0: { tomwalters@0: FILE *fp ; tomwalters@0: int i, framebytes, startbytes, frameshift; tomwalters@0: char *header, *napheader, *SaiHeader(); tomwalters@0: short *frame ; tomwalters@0: char *val1, *val2 ; tomwalters@0: int a,b ; tomwalters@0: tomwalters@0: fp = openopts( option,argc,argv ) ; tomwalters@0: if ( !isoff( helpstr ) ) tomwalters@0: helpopts( helpstr, argv[0], applic, option ) ; tomwalters@0: tomwalters@0: if ( (header = ReadHeader(fp)) == (char *) 0 ) { tomwalters@0: fprintf(stderr,"saitonap: header not found\n"); tomwalters@0: exit(1); tomwalters@0: } tomwalters@0: tomwalters@0: frameheight = HeaderInt( header, "frameheight" ); tomwalters@0: framewidth = HeaderInt( header, "framewidth" ); tomwalters@0: frames = HeaderInt( header, "frames" ); tomwalters@0: tomwalters@0: framebytes = frameheight * framewidth * sizeof(short) ; tomwalters@0: tomwalters@0: tomwalters@0: /* Get limits on specified number of frames */ tomwalters@0: tomwalters@0: if ( getvals( fstr, &val1, &val2, "-" ) == BADVAL ) { tomwalters@0: fprintf(stderr,"saitonap: bad frame selector [%s]\n", fstr ) ; tomwalters@0: exit( 1 ) ; tomwalters@0: } tomwalters@0: if ( ismin( val1 ) ) a = 1 ; tomwalters@0: else if ( ismax( val1 ) ) a = frames ; tomwalters@0: else a = atoi( val1 ) ; tomwalters@0: tomwalters@0: if ( isempty( val2 ) ) b = a ; tomwalters@0: else if ( ismin( val2 ) ) b = 1 ; tomwalters@0: else if ( ismax( val2 ) ) b = frames ; tomwalters@0: else b = atoi( val2 ) ; tomwalters@0: tomwalters@0: if (a<=0 || b>frames || a>b) { tomwalters@0: fprintf(stderr,"saitonap: bad frame specifier \n" ); tomwalters@0: exit(1); tomwalters@0: } tomwalters@0: tomwalters@0: tomwalters@0: /* Allocate space for framebytes of sai data */ tomwalters@0: tomwalters@0: if ( ( frame = (short *)malloc( framebytes )) == NULL ) { tomwalters@0: fprintf(stderr,"saitonap: malloc out of space\n"); tomwalters@0: exit(1); tomwalters@0: } tomwalters@0: tomwalters@0: if ( ison( headerstr ) ) tomwalters@0: napheader = SaiHeader(header) ; tomwalters@0: tomwalters@0: /* Read and write framebytes of i/p sai data */ tomwalters@0: tomwalters@0: for (i=1 ; i 0) tomwalters@0: for ( ; i<=b && fread( frame,framebytes,1,fp ) ; i++) tomwalters@0: writeframe( frame, napheader ) ; tomwalters@0: else tomwalters@0: while ( fread( frame,framebytes,1,fp ) ) tomwalters@0: writeframe( frame, napheader ) ; tomwalters@0: tomwalters@0: fclose(fp); tomwalters@0: fprintf(stderr,"saitonap done\n" ) ; tomwalters@0: tomwalters@0: } tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: /* Write a frame in nap format */ tomwalters@0: tomwalters@0: writeframe( frame, header ) tomwalters@0: short *frame ; tomwalters@0: char *header ; tomwalters@0: { tomwalters@0: int i, row, col; tomwalters@0: tomwalters@0: if ( ison( headerstr ) ) tomwalters@0: WriteHeader( header, stdout ) ; tomwalters@0: for ( col=0 ; col < framewidth ; col++ ) tomwalters@0: for ( row=0, i=col ; row < frameheight ; row++, i+=framewidth ) tomwalters@0: fwrite( &frame[i], sizeof(short), 1, stdout ); tomwalters@0: } tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: /* tomwalters@0: Copy the original sai header to a new nap header, changing in order: tomwalters@0: frames tomwalters@0: frameshift tomwalters@0: framewidth tomwalters@0: frameheight tomwalters@0: framebytes tomwalters@0: Then change applic name [gensai] to [gennap] in the Version string. tomwalters@0: Finally, update the new header_bytes, and return the new header. tomwalters@0: */ tomwalters@0: tomwalters@0: char *SaiHeader( SAIheader ) tomwalters@0: char *SAIheader ; tomwalters@0: { tomwalters@0: char *NAPheader; tomwalters@0: char *p0, *p1, *p2, *s, str[64]; tomwalters@0: tomwalters@0: NAPheader = (char *)malloc( strlen(SAIheader) + 64 ) ; tomwalters@0: tomwalters@0: p0 = NAPheader ; tomwalters@0: p1 = SAIheader ; tomwalters@0: tomwalters@0: tomwalters@0: /** copy up to frames **/ tomwalters@0: tomwalters@0: p2 = HeaderString( SAIheader , "frames" ) ; tomwalters@0: while( p1 < p2 ) tomwalters@0: *p0++ = *p1++ ; tomwalters@0: tomwalters@0: sprintf(str,"%d\n", framewidth); tomwalters@0: for (s = str ; *s != '\n' ; ) tomwalters@0: *p0++ = *s++; tomwalters@0: *p0++ = *s; tomwalters@0: while (*p1 != '\n') tomwalters@0: *p1++; tomwalters@0: *p1++; tomwalters@0: tomwalters@0: tomwalters@0: /** copy up to frameshift **/ tomwalters@0: tomwalters@0: p2 = HeaderString( SAIheader , "frameshift" ) ; tomwalters@0: while ( p1 < p2 ) tomwalters@0: *p0++ = *p1++ ; tomwalters@0: tomwalters@0: sprintf(str,"%d\n", 1 ); tomwalters@0: for (s = str ; *s != '\n' ; ) tomwalters@0: *p0++ = *s++; tomwalters@0: *p0++ = *s; tomwalters@0: while (*p1 != '\n') tomwalters@0: *p1++; tomwalters@0: *p1++; tomwalters@0: tomwalters@0: tomwalters@0: /** copy up to framewidth **/ tomwalters@0: tomwalters@0: p2 = HeaderString( SAIheader , "framewidth" ) ; tomwalters@0: while ( p1 < p2 ) tomwalters@0: *p0++ = *p1++ ; tomwalters@0: tomwalters@0: sprintf(str,"%d\n", 1 ); tomwalters@0: for (s = str ; *s != '\n' ; ) tomwalters@0: *p0++ = *s++; tomwalters@0: *p0++ = *s; tomwalters@0: while (*p1 != '\n') tomwalters@0: *p1++; tomwalters@0: *p1++; tomwalters@0: tomwalters@0: tomwalters@0: /** copy up to frameheight **/ tomwalters@0: tomwalters@0: p2 = HeaderString( SAIheader , "frameheight" ) ; tomwalters@0: while ( p1 < p2 ) tomwalters@0: *p0++ = *p1++ ; tomwalters@0: tomwalters@0: sprintf(str,"%d\n", frameheight); tomwalters@0: for (s = str ; *s != '\n' ; ) tomwalters@0: *p0++ = *s++; tomwalters@0: *p0++ = *s; tomwalters@0: while (*p1 != '\n') tomwalters@0: *p1++; tomwalters@0: *p1++; tomwalters@0: tomwalters@0: tomwalters@0: /** copy up to framebytes **/ tomwalters@0: tomwalters@0: p2 = HeaderString( SAIheader , "framebytes" ) ; tomwalters@0: while ( p1 < p2 ) tomwalters@0: *p0++ = *p1++ ; tomwalters@0: tomwalters@0: sprintf(str,"%d\n", frameheight * sizeof( short ) ); tomwalters@0: for (s = str ; *s != '\n' ; ) tomwalters@0: *p0++ = *s++; tomwalters@0: *p0++ = *s; tomwalters@0: while (*p1 != '\n') tomwalters@0: *p1++; tomwalters@0: *p1++; tomwalters@0: tomwalters@0: tomwalters@0: /** copy rest of header **/ tomwalters@0: tomwalters@0: p2 = HeaderString( SAIheader , "Version" ) ; tomwalters@0: while ( p1 < p2 ) tomwalters@0: *p0++ = *p1++ ; tomwalters@0: tomwalters@0: while (*p1 != ']') /* change applic name [gensai] to [gennap] */ tomwalters@0: *p0++ = *p1++ ; tomwalters@0: *(p0-3) = 'n' ; tomwalters@0: *(p0-2) = 'a' ; tomwalters@0: *(p0-1) = 'p' ; tomwalters@0: while (*p1 != '\n') tomwalters@0: *p0++ = *p1++ ; tomwalters@0: *p0++ = *p1++ ; tomwalters@0: tomwalters@0: tomwalters@0: /** update header_bytes **/ tomwalters@0: tomwalters@0: sprintf(str, "%0*d", 7, p0-NAPheader); tomwalters@0: p0 = HeaderString( NAPheader , "header_bytes" ) ; tomwalters@0: s = str; tomwalters@0: while(*p0 != '\n') tomwalters@0: *p0++ = *s++ ; tomwalters@0: tomwalters@0: tomwalters@0: return NAPheader; tomwalters@0: } tomwalters@0: