Listing 5 Small file I/O library for loading and saving images

/*
 * Listing 5 - fileio.c (libips.a)
 */

#include <stdio.h>
#include "ips_image.h"

int img_to_ips();
int img_to_ips_fp();
int ips_to_img();
int ips_to_img_fp();


int
img_to_ips(header, image, filename)
ips_header      *header;
ips_image       *image;
char            *filename;
{
       int     retval;
       FILE    *fp;
       
       
       if((fp = fopen(filename, "w")) == NULL) {
              perror("img_to_ips");
              return 0;
       }
       
       retval = img_to_ips_fp(header, image, fp);
       
       fclose(fp);
       
       return retval;
}

int
img_to_ips_fp(header, image, fp)
ips_header      *header;
ips_image       *image;
FILE            *fp;
{
       fwrite(header, sizeof(ips_header), 1, fp);
       fwrite(image->cmap, 1, sizeof(XColor) * header->cmap_count, fp);
       fwrite(image->data, 1, header->width * header->height, fp);
       
       return 1;
}


int
ips_to_img(header, image, filename)
ips_header      *header;
ips_image       *image;
char            *filename;
{
       int     retval;
       FILE    *fp;
       
       
       if((fp = fopen(filename, "r")) == NULL) {
              perror("ips_to_img");
              return 0;
       }
       
       retval = ips_to_img_fp(header, image, fp);
       
       fclose(fp);
       
       return retval;
}

int
ips_to_img_fp(header, image, fp)
ips_header      *header;
ips_image       *image;
FILE            *fp;
{
       fread(header, sizeof(ips_header), 1, fp);
       
       if(header->bpp != 8) {
              fprintf(stderr,
                     "ips_to_img_fp: data is not in 8 bit format.\n");
              return 0;
       }
       
       image->data = (unsigned char *)
              malloc(header->width * header->height);
       
       if(image->data == NULL) {
              perror("ips_to_img_fp");
              return 0;
       }
       
       fread(image->cmap, 1, sizeof(XColor) * header->cmap_count, fp);
       fread(image->data, 1, header->width * header->height, fp);
       
       return 1;
}
/* End of File */