/* IO.c */
#include "../Coords.h"
static const char *suffixb = ".coordsb" ;
static const char *suffixf = ".coordsf" ;
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------
purpose -- to read in an Coords object from a file
input --
fn -- filename, must be *.coordsb or *.coordsf
return value -- 1 if success, 0 if failure
created -- 95dec19, cca
---------------------------------------------------
*/
int
Coords_readFromFile (
Coords *coords,
char *fn
) {
FILE *fp ;
int fnlength, rc, sulength ;
/*
---------------
check the input
---------------
*/
if ( coords == NULL || fn == NULL ) {
fprintf(stderr,
"\n error in Coords_readFromFile(%p,%s), file %s, line %d"
"\n bad input\n", coords, fn, __FILE__, __LINE__) ;
return(0) ;
}
/*
-------------
read the file
-------------
*/
fnlength = strlen(fn) ;
sulength = strlen(suffixb) ;
if ( fnlength > sulength ) {
if ( strcmp(&fn[fnlength-sulength], suffixb) == 0 ) {
if ( (fp = fopen(fn, "rb")) == NULL ) {
fprintf(stderr, "\n error in Coords_readFromFile(%p,%s)"
"\n unable to open file %s", coords, fn, fn) ;
rc = 0 ;
} else {
rc = Coords_readFromBinaryFile(coords, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "r")) == NULL ) {
fprintf(stderr, "\n error in Coords_readFromFile(%p,%s)"
"\n unable to open file %s", coords, fn, fn) ;
rc = 0 ;
} else {
rc = Coords_readFromFormattedFile(coords, fp) ;
fclose(fp) ;
}
} else {
fprintf(stderr, "\n error in Coords_readFromFile(%p,%s)"
"\n bad Coords file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
coords, fn, fn, suffixb, suffixf) ;
rc = 0 ;
}
} else {
fprintf(stderr, "\n error in Coords_readFromFile(%p,%s)"
"\n bad Coords file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
coords, fn, fn, suffixb, suffixf) ;
rc = 0 ;
}
return(rc) ; }
/*--------------------------------------------------------------------*/
/*
---------------------------------------------------------
purpose -- to read an Coords object from a formatted file
return value -- 1 if success, 0 if failure
created -- 95dec19, cca
---------------------------------------------------------
*/
int
Coords_readFromFormattedFile (
Coords *coords,
FILE *fp
) {
int rc, size ;
int itemp[3] ;
/*
---------------
check the input
---------------
*/
if ( coords == NULL || fp == NULL ) {
fprintf(stderr, "\n error in Coords_readFromFormattedFile(%p,%p)"
"\n bad input\n", coords, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
Coords_clearData(coords) ;
/*
---------------------------------------
read in the three scalar parameters
type, # of dimensions, # of coordinates
---------------------------------------
*/
if ( (rc = IVfscanf(fp, 3, itemp)) != 3 ) {
fprintf(stderr, "\n error in Coords_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n", coords, fp, rc, 3) ;
return(0) ;
}
/*
---------------------
initialize the object
---------------------
*/
Coords_init(coords, itemp[0], itemp[1], itemp[2]) ;
/*
--------------------------
read in the coors[] vector
--------------------------
*/
size = itemp[1]*itemp[2] ;
if ( (rc = FVfscanf(fp, size, coords->coors)) != size ) {
fprintf(stderr, "\n error in Coords_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n", coords, fp, rc, size) ;
return(0) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------
purpose -- to read an Coords object from a binary file
return value -- 1 if success, 0 if failure
created -- 95dec19, cca
------------------------------------------------------
*/
int
Coords_readFromBinaryFile (
Coords *coords,
FILE *fp
) {
int rc, size ;
int itemp[3] ;
/*
---------------
check the input
---------------
*/
if ( coords == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in Coords_readFromBinaryFile(%p,%p)"
"\n bad input\n", coords, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
Coords_clearData(coords) ;
/*
---------------------------------------
read in the three scalar parameters
type, # of dimensions, # of coordinates
---------------------------------------
*/
if ( (rc = fread((void *) itemp, sizeof(int), 3, fp)) != 3 ) {
fprintf(stderr, "\n error in Coords_readFromBinaryFile(%p,%p)"
"\n itemp(3) : %d items of %d read\n", coords, fp, rc, 3) ;
return(0) ;
}
/*
---------------------
initialize the object
---------------------
*/
Coords_init(coords, itemp[0], itemp[1], itemp[2]) ;
/*
--------------------------
read in the coors[] vector
--------------------------
*/
size = itemp[1]*itemp[2] ;
if ( (rc = fread((void *) coords->coors, sizeof(float), size, fp))
!= size ) {
fprintf(stderr, "\n error in Coords_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n", coords, fp, rc, size) ;
return(0) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------------
purpose -- to write an Coords object to a file
input --
fn -- filename
*.coordsb -- binary
*.coordsf -- formatted
anything else -- for human eye
return value -- 1 if success, 0 otherwise
created -- 95dec19, cca
----------------------------------------------
*/
int
Coords_writeToFile (
Coords *coords,
char *fn
) {
FILE *fp ;
int fnlength, rc, sulength ;
/*
---------------
check the input
---------------
*/
if ( coords == NULL || fn == NULL ) {
fprintf(stderr, "\n fatal error in Coords_writeToFile(%p,%s)"
"\n bad input\n", coords, fn) ;
}
/*
------------------
write out the file
------------------
*/
fnlength = strlen(fn) ;
sulength = strlen(suffixb) ;
if ( fnlength > sulength ) {
if ( strcmp(&fn[fnlength-sulength], suffixb) == 0 ) {
if ( (fp = fopen(fn, "wb")) == NULL ) {
fprintf(stderr, "\n error in Coords_writeToFile(%p,%s)"
"\n unable to open file %s", coords, fn, fn) ;
rc = 0 ;
} else {
rc = Coords_writeToBinaryFile(coords, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "w")) == NULL ) {
fprintf(stderr, "\n error in Coords_writeToFile(%p,%s)"
"\n unable to open file %s", coords, fn, fn) ;
rc = 0 ;
} else {
rc = Coords_writeToFormattedFile(coords, fp) ;
fclose(fp) ;
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in Coords_writeToFile(%p,%s)"
"\n unable to open file %s", coords, fn, fn) ;
rc = 0 ;
} else {
rc = Coords_writeForHumanEye(coords, fp) ;
fclose(fp) ;
}
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in Coords_writeToFile(%p,%s)"
"\n unable to open file %s", coords, fn, fn) ;
rc = 0 ;
} else {
rc = Coords_writeForHumanEye(coords, fp) ;
fclose(fp) ;
}
}
return(rc) ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------------
purpose -- to write an Coords object to a formatted file
return value -- 1 if success, 0 otherwise
created -- 95dec19, cca
--------------------------------------------------------
*/
int
Coords_writeToFormattedFile (
Coords *coords,
FILE *fp
) {
int rc, size ;
/*
---------------
check the input
---------------
*/
if ( coords == NULL || fp == NULL
|| (size = coords->ndim * coords->ncoor) <= 0 ) {
fprintf(stderr, "\n fatal error in Coords_writeToFormattedFile(%p,%p)"
"\n bad input\n", coords, fp) ;
exit(-1) ;
}
/*
-------------------------------------
write out the three scalar parameters
-------------------------------------
*/
rc = fprintf(fp, "\n %d %d %d",
coords->type, coords->ndim, coords->ncoor) ;
if ( rc < 0 ) {
fprintf(stderr,
"\n fatal error in Coords_writeToFormattedFile(%p,%p)"
"\n rc = %d, return from first fprintf\n", coords, fp, rc) ;
return(0) ;
}
/*
--------------------------------
write out the coordinates vector
--------------------------------
*/
FVfprintf(fp, size, coords->coors) ;
return(1) ; }
/*--------------------------------------------------------------------*/
/*
-----------------------------------------------------
purpose -- to write an Coords object to a binary file
return value -- 1 if success, 0 otherwise
created -- 95dec19, cca
-----------------------------------------------------
*/
int
Coords_writeToBinaryFile (
Coords *coords,
FILE *fp
) {
int rc, size ;
int itemp[3] ;
/*
---------------
check the input
---------------
*/
if ( coords == NULL || fp == NULL
|| (size = coords->ndim * coords->ncoor) <= 0 ) {
fprintf(stderr, "\n fatal error in Coords_writeToBinaryFile(%p,%p)"
"\n bad input\n", coords, fp) ;
exit(-1) ;
}
itemp[0] = coords->type ;
itemp[1] = coords->ndim ;
itemp[2] = coords->ncoor ;
rc = fwrite((void *) itemp, sizeof(int), 3, fp) ;
if ( rc != 3 ) {
fprintf(stderr, "\n error in Coords_writeToBinaryFile(%p,%p)"
"\n %d of %d scalar items written\n", coords, fp, rc, 3) ;
return(0) ;
}
rc = fwrite((void *) coords->coors, sizeof(float), size, fp) ;
if ( rc != size ) {
fprintf(stderr, "\n error in Coords_writeToBinaryFile(%p,%p)"
"\n coords->coors, %d of %d items written\n",
coords, fp, rc, size) ;
return(0) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------------------
purpose -- to write an Coords object for a human eye
return value -- 1 if success, 0 otherwise
created -- 95dec19, cca
----------------------------------------------------
*/
int
Coords_writeForHumanEye (
Coords *coords,
FILE *fp
) {
int icoor, idim, rc ;
if ( coords == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in Coords_writeForHumanEye(%p,%p)"
"\n bad input\n", coords, fp) ;
exit(-1) ;
}
if ( (rc = Coords_writeStats(coords, fp)) == 0 ) {
fprintf(stderr, "\n fatal error in Coords_writeForHumanEye(%p,%p)"
"\n rc = %d, return from Coords_writeStats(%p,%p)\n",
coords, fp, rc, coords, fp) ;
return(0) ;
}
for ( icoor = 0 ; icoor < coords->ncoor ; icoor++ ) {
fprintf(fp, "\n %6d", icoor) ;
for ( idim = 1 ; idim <= coords->ndim ; idim++ ) {
fprintf(fp, " %12.4g", Coords_value(coords, idim, icoor)) ;
}
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------
purpose -- to write out the statistics for the Coords object
return value -- 1 if success, 0 otherwise
created -- 95dec19, cca
------------------------------------------------------------
*/
int
Coords_writeStats (
Coords *coords,
FILE *fp
) {
int rc ;
/*
---------------
check the input
---------------
*/
if ( coords == NULL || fp == NULL ) {
fprintf(stderr, "\n error in Coords_writeStats(%p,%p)"
"\n bad input\n", coords, fp) ;
exit(-1) ;
}
rc = fprintf(fp, "\n Coords : coordinates object :") ;
if ( rc < 0 ) { goto IO_error ; }
rc = fprintf(fp, "\n type %d", coords->type) ;
if ( rc < 0 ) { goto IO_error ; }
switch ( coords->type ) {
case 1 : rc = fprintf(fp, ", storage by tuples") ; break ;
case 2 : rc = fprintf(fp, ", storage by vectors") ; break ;
}
if ( rc < 0 ) { goto IO_error ; }
rc = fprintf(fp,
"\n %d dimensions, %d coordinates, occupies %d bytes",
coords->ndim, coords->ncoor, Coords_sizeOf(coords)) ;
if ( rc < 0 ) { goto IO_error ; }
return(1) ;
IO_error :
fprintf(stderr, "\n fatal error in Coords_writeStats(%p,%p)"
"\n rc = %d, return from fprintf\n", coords, fp, rc) ;
return(0) ;
}
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1