#include #include #include "hfh_hdr_def.h" /* fd is the file descriptor returned by open(... it is assumed that the file has already been opened for reading and the space for the header has been allocated */ int read_hfh_header(int fd, hfh_img_hdr *header) { int bytes; /* read each item individually (Sparc systems align double floating point) */ bytes = read(fd, (void *) header->image_label, (size_t) 64); bytes += read(fd, (void *) &header->revision_num, (size_t) 1); bytes += read(fd, (void *) &header->orient, (size_t) 1); bytes += read(fd, (void *) &header->file_flag, (size_t) 1); bytes += read(fd, (void *) &header->compress, (size_t) 1); bytes += read(fd, (void *) &header->bits_gray, (size_t) 2); bytes += read(fd, (void *) &header->bits_pixel, (size_t) 2); bytes += read(fd, (void *) &header->row, (size_t) 2); bytes += read(fd, (void *) &header->colm, (size_t) 2); bytes += read(fd, (void *) &header->max_value, (size_t) 2); bytes += read(fd, (void *) &header->min_value, (size_t) 2); bytes += read(fd, (void *) &header->xpix_size, (size_t) 4); bytes += read(fd, (void *) &header->ypix_size, (size_t) 4); bytes += read(fd, (void *) &header->zpix_size, (size_t) 4); bytes += read(fd, (void *) &header->sequence_value, (size_t) 4); bytes += read(fd, (void *) &header->pixel_data, (size_t) 4); bytes += read(fd, (void *) &header->d_max_value, (size_t) 8); bytes += read(fd, (void *) &header->d_min_value, (size_t) 8); bytes += read(fd, (void *) &header->byte_order, (size_t) 1); bytes += read(fd, (void *) &header->int_format, (size_t) 1); bytes += read(fd, (void *) &header->fp_format, (size_t) 1); bytes += read(fd, (void *) header->id, (size_t) 4); bytes += read(fd, (void *) &header->slices, (size_t) 2); /* should always be 0 */ bytes += read(fd, (void *) header->temp, (size_t) 3); /* add the following only if using the code and files on intel architecture */ #ifdef i386 swab((char *) &header->bits_gray, (char *) &header->bits_gray, (size_t) (6*sizeof(short))); swab((char *) &header->slices, (char *) &header->slices, (size_t) (1*sizeof(short))); swap_byte_and_word((long int *) &header->xpix_size); swap_byte_and_word((long int *) &header->ypix_size); swap_byte_and_word((long int *) &header->zpix_size); swap_byte_and_word((long int *) &header->sequence_value); swap_byte_and_word((long int *) &header->pixel_data); swab((char *) &header->d_max_value, (char *) &header->d_max_value, (size_t) (2*sizeof(double))); i386_sparc_double(&header->d_max_value); i386_sparc_double(&header->d_min_value); #endif /* return the # bytes successfully read */ return bytes; } /* fd is the file descriptor returned by open(... it is assumed that the file has already been opened for writing and the space for the header has been allocated */ int write_hfh_header(int fd, hfh_img_hdr *header) { int bytes; /* add the following only if using the code and files on intel architecture */ #ifdef i386 swab((char *) &header->bits_gray, (char *) &header->bits_gray, (size_t) (6*sizeof(short))); swab((char *) &header->slices, (char *) &header->slices, (size_t) (1*sizeof(short))); swap_byte_and_word((long int *) &header->xpix_size); swap_byte_and_word((long int *) &header->ypix_size); swap_byte_and_word((long int *) &header->zpix_size); swap_byte_and_word((long int *) &header->sequence_value); swap_byte_and_word((long int *) &header->pixel_data); swab((char *) &header->d_max_value, (char *) &header->d_max_value, (size_t) (2*sizeof(double))); i386_sparc_double(&header->d_max_value); i386_sparc_double(&header->d_min_value); #endif /* write each item individually to preserve 128-byte size (Sparc systems align double floating point) */ bytes = write(fd, (void *) header->image_label, (size_t) 64); bytes += write(fd, (void *) &header->revision_num, (size_t) 1); bytes += write(fd, (void *) &header->orient, (size_t) 1); bytes += write(fd, (void *) &header->file_flag, (size_t) 1); bytes += write(fd, (void *) &header->compress, (size_t) 1); bytes += write(fd, (void *) &header->bits_gray, (size_t) 2); bytes += write(fd, (void *) &header->bits_pixel, (size_t) 2); bytes += write(fd, (void *) &header->row, (size_t) 2); bytes += write(fd, (void *) &header->colm, (size_t) 2); bytes += write(fd, (void *) &header->max_value, (size_t) 2); bytes += write(fd, (void *) &header->min_value, (size_t) 2); bytes += write(fd, (void *) &header->xpix_size, (size_t) 4); bytes += write(fd, (void *) &header->ypix_size, (size_t) 4); bytes += write(fd, (void *) &header->zpix_size, (size_t) 4); bytes += write(fd, (void *) &header->sequence_value, (size_t) 4); bytes += write(fd, (void *) &header->pixel_data, (size_t) 4); bytes += write(fd, (void *) &header->d_max_value, (size_t) 8); bytes += write(fd, (void *) &header->d_min_value, (size_t) 8); bytes += write(fd, (void *) &header->byte_order, (size_t) 1); bytes += write(fd, (void *) &header->int_format, (size_t) 1); bytes += write(fd, (void *) &header->fp_format, (size_t) 1); bytes += write(fd, (void *) header->id, (size_t) 4); bytes += write(fd, (void *) &header->slices, (size_t) 2); /* should always be 0 */ bytes += write(fd, (void *) header->temp, (size_t) 3); /* return the # bytes successfully written */ return bytes; } void swap_byte_and_word(long int *value) { long int return_value, a, b; swab((char *) value, (char *) value, sizeof(long int)); a = 0x0000ffff & ((0xffff0000 & *value) >> 16); b = 0xffff0000 & ((0x0000ffff & *value) << 16); return_value = a | b; *value = return_value; } void i386_sparc_double(double *value) { short convert_value[4], temp_value[4]; memcpy((char *) temp_value, (char *) value, 8); convert_value[0] = temp_value[3]; convert_value[1] = temp_value[2]; convert_value[2] = temp_value[1]; convert_value[3] = temp_value[0]; memcpy((char *) value, (char *) convert_value, 8); }