/* IO.c */
#include "../Tree.h"
static const char *suffixb = ".treeb" ;
static const char *suffixf = ".treef" ;
/*--------------------------------------------------------------------*/
/*
------------------------------------------------
purpose -- to read in an Tree object from a file
input --
fn -- filename, must be *.treeb or *.treef
return value -- 1 if success, 0 if failure
created -- 95nov15, cca
------------------------------------------------
*/
int
Tree_readFromFile (
Tree *tree,
char *fn
) {
FILE *fp ;
int fnlength, rc, sulength ;
/*
---------------
check the input
---------------
*/
if ( tree == NULL || fn == NULL ) {
fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
"\n bad input\n", tree, fn) ;
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 Tree_readFromFile(%p,%s)"
"\n unable to open file %s", tree, fn, fn) ;
rc = 0 ;
} else {
rc = Tree_readFromBinaryFile(tree, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "r")) == NULL ) {
fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
"\n unable to open file %s", tree, fn, fn) ;
rc = 0 ;
} else {
rc = Tree_readFromFormattedFile(tree, fp) ;
fclose(fp) ;
}
} else {
fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
"\n bad Tree file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
tree, fn, fn, suffixb, suffixf) ;
rc = 0 ;
}
} else {
fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
"\n bad Tree file name %s,"
"\n must end in %s (binary) or %s (formatted)\n",
tree, fn, fn, suffixb, suffixf) ;
rc = 0 ;
}
return(rc) ; }
/*--------------------------------------------------------------------*/
/*
-------------------------------------------------------
purpose -- to read an Tree object from a formatted file
return value -- 1 if success, 0 if failure
created -- 95nov15, cca
-------------------------------------------------------
*/
int
Tree_readFromFormattedFile (
Tree *tree,
FILE *fp
) {
int rc ;
int itemp[2] ;
/*
---------------
check the input
---------------
*/
if ( tree == NULL || fp == NULL ) {
fprintf(stderr, "\n error in Tree_readFromFormattedFile(%p,%p)"
"\n bad input\n", tree, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
Tree_clearData(tree) ;
/*
---------------------------------
read in the two scalar parameters
number of nodes and the root
---------------------------------
*/
if ( (rc = IVfscanf(fp, 2, itemp)) != 2 ) {
fprintf(stderr, "\n error in Tree_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n", tree, fp, rc, 2) ;
return(0) ;
}
/*
---------------------
initialize the object
---------------------
*/
Tree_init1(tree, itemp[0]) ;
tree->root = itemp[1] ;
/*
-----------------------
now read in the indices
-----------------------
*/
if ( (rc = IVfscanf(fp, tree->n, tree->par)) != tree->n ) {
fprintf(stderr, "\n par: error in Tree_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
if ( (rc = IVfscanf(fp, tree->n, tree->fch)) != tree->n ) {
fprintf(stderr, "\n fch: error in Tree_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
if ( (rc = IVfscanf(fp, tree->n, tree->sib)) != tree->n ) {
fprintf(stderr, "\n sib: error in Tree_readFromFormattedFile(%p,%p)"
"\n %d items of %d read\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------------------
purpose -- to read an Tree object from a binary file
return value -- 1 if success, 0 if failure
created -- 95nov15, cca
----------------------------------------------------
*/
int
Tree_readFromBinaryFile (
Tree *tree,
FILE *fp
) {
int rc ;
int itemp[2] ;
/*
---------------
check the input
---------------
*/
if ( tree == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in Tree_readFromBinaryFile(%p,%p)"
"\n bad input\n", tree, fp) ;
return(0) ;
}
/*
---------------------
clear the data fields
---------------------
*/
Tree_clearData(tree) ;
/*
---------------------------------
read in the two scalar parameters
number of nodes and the root
---------------------------------
*/
if ( (rc = fread((void *) itemp, sizeof(int), 2, fp)) != 2 ) {
fprintf(stderr, "\n error in Tree_readFromBinaryFile(%p,%p)"
"\n itemp(2) : %d items of %d read\n", tree, fp, rc, 2) ;
return(0) ;
}
/*
---------------------
initialize the object
---------------------
*/
Tree_init1(tree, itemp[0]) ;
tree->root = itemp[1] ;
/*
-------------------
read in the vectors
-------------------
*/
if ( (rc = fread((void *) tree->par, sizeof(int), tree->n, fp))
!= tree->n ) {
fprintf(stderr, "\n par : error in Tree_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
if ( (rc = fread((void *) tree->fch, sizeof(int), tree->n, fp))
!= tree->n ) {
fprintf(stderr, "\n fch : error in Tree_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
if ( (rc = fread((void *) tree->sib, sizeof(int), tree->n, fp))
!= tree->n ) {
fprintf(stderr, "\n sib : error in Tree_readFromBinaryFile(%p,%p)"
"\n %d items of %d read\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------------
purpose -- to write an Tree object to a file
input --
fn -- filename
*.treeb -- binary
*.treef -- formatted
anything else -- for human eye
return value -- 1 if success, 0 otherwise
created -- 95nov15, cca
--------------------------------------------
*/
int
Tree_writeToFile (
Tree *tree,
char *fn
) {
FILE *fp ;
int fnlength, rc, sulength ;
/*
---------------
check the input
---------------
*/
if ( tree == NULL || fn == NULL ) {
fprintf(stderr, "\n fatal error in Tree_writeToFile(%p,%s)"
"\n bad input\n", tree, 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 Tree_writeToFile(%p,%s)"
"\n unable to open file %s", tree, fn, fn) ;
rc = 0 ;
} else {
rc = Tree_writeToBinaryFile(tree, fp) ;
fclose(fp) ;
}
} else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
if ( (fp = fopen(fn, "w")) == NULL ) {
fprintf(stderr, "\n error in Tree_writeToFile(%p,%s)"
"\n unable to open file %s", tree, fn, fn) ;
rc = 0 ;
} else {
rc = Tree_writeToFormattedFile(tree, fp) ;
fclose(fp) ;
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in Tree_writeToFile(%p,%s)"
"\n unable to open file %s", tree, fn, fn) ;
rc = 0 ;
} else {
rc = Tree_writeForHumanEye(tree, fp) ;
fclose(fp) ;
}
}
} else {
if ( (fp = fopen(fn, "a")) == NULL ) {
fprintf(stderr, "\n error in Tree_writeToFile(%p,%s)"
"\n unable to open file %s", tree, fn, fn) ;
rc = 0 ;
} else {
rc = Tree_writeForHumanEye(tree, fp) ;
fclose(fp) ;
}
}
return(rc) ; }
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------
purpose -- to write an Tree object to a formatted file
return value -- 1 if success, 0 otherwise
created -- 95nov15, cca
------------------------------------------------------
*/
int
Tree_writeToFormattedFile (
Tree *tree,
FILE *fp
) {
int ierr, rc ;
/*
---------------
check the input
---------------
*/
if ( tree == NULL || fp == NULL || tree->n <= 0 ) {
fprintf(stderr, "\n fatal error in Tree_writeToFormattedFile(%p,%p)"
"\n bad input\n", tree, fp) ;
exit(-1) ;
}
/*
-------------------------------------
write out the two scalar parameters
-------------------------------------
*/
rc = fprintf(fp, "\n %d %d", tree->n, tree->root) ;
if ( rc < 0 ) {
fprintf(stderr, "\n fatal error in Tree_writeToFormattedFile(%p,%p)"
"\n rc = %d, return from first fprintf\n", tree, fp, rc) ;
return(0) ;
}
/*
---------------------
write out the vectors
---------------------
*/
IVfp80(fp, tree->n, tree->par, 80, &ierr) ;
IVfp80(fp, tree->n, tree->fch, 80, &ierr) ;
IVfp80(fp, tree->n, tree->sib, 80, &ierr) ;
return(1) ; }
/*--------------------------------------------------------------------*/
/*
---------------------------------------------------
purpose -- to write an Tree object to a binary file
return value -- 1 if success, 0 otherwise
created -- 95nov15, cca
---------------------------------------------------
*/
int
Tree_writeToBinaryFile (
Tree *tree,
FILE *fp
) {
int rc ;
int itemp[2] ;
/*
---------------
check the input
---------------
*/
if ( tree == NULL || fp == NULL || tree->n <= 0 ) {
fprintf(stderr, "\n fatal error in Tree_writeToBinaryFile(%p,%p)"
"\n bad input\n", tree, fp) ;
exit(-1) ;
}
itemp[0] = tree->n ;
itemp[1] = tree->root ;
rc = fwrite((void *) itemp, sizeof(int), 2, fp) ;
if ( rc != 2 ) {
fprintf(stderr, "\n error in Tree_writeToBinaryFile(%p,%p)"
"\n %d of %d scalar items written\n", tree, fp, rc, 2) ;
return(0) ;
}
rc = fwrite((void *) tree->par, sizeof(int), tree->n, fp) ;
if ( rc != tree->n ) {
fprintf(stderr, "\n error in Tree_writeToBinaryFile(%p,%p)"
"\n tree->par, %d of %d items written\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
rc = fwrite((void *) tree->fch, sizeof(int), tree->n, fp) ;
if ( rc != tree->n ) {
fprintf(stderr, "\n error in Tree_writeToBinaryFile(%p,%p)"
"\n tree->fch, %d of %d items written\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
rc = fwrite((void *) tree->sib, sizeof(int), tree->n, fp) ;
if ( rc != tree->n ) {
fprintf(stderr, "\n error in Tree_writeToBinaryFile(%p,%p)"
"\n tree->sib, %d of %d items written\n",
tree, fp, rc, tree->n) ;
return(0) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
--------------------------------------------------
purpose -- to write an Tree object for a human eye
return value -- 1 if success, 0 otherwise
created -- 95nov15, cca
--------------------------------------------------
*/
int
Tree_writeForHumanEye (
Tree *tree,
FILE *fp
) {
int rc, v ;
if ( tree == NULL || fp == NULL ) {
fprintf(stderr, "\n fatal error in Tree_writeForHumanEye(%p,%p)"
"\n bad input\n", tree, fp) ;
exit(-1) ;
}
if ( (rc = Tree_writeStats(tree, fp)) == 0 ) {
fprintf(stderr, "\n fatal error in Tree_writeForHumanEye(%p,%p)"
"\n rc = %d, return from Tree_writeStats(%p,%p)\n",
tree, fp, rc, tree, fp) ;
return(0) ;
}
fprintf(fp, "\n vertex parent fchild sibling") ;
for ( v = 0 ; v < tree->n ; v++ ) {
fprintf(fp, "\n %5d %9d %9d %9d :",
v, tree->par[v], tree->fch[v], tree->sib[v]) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------------------------------
purpose -- to write out the statistics for the Tree object
return value -- 1 if success, 0 otherwise
created -- 95nov15, cca
----------------------------------------------------------
*/
int
Tree_writeStats (
Tree *tree,
FILE *fp
) {
int rc ;
/*
---------------
check the input
---------------
*/
if ( tree == NULL || fp == NULL ) {
fprintf(stderr, "\n error in Tree_writeStats(%p,%p)"
"\n bad input\n", tree, fp) ;
exit(-1) ;
}
rc = fprintf(fp,
"\n Tree : tree object, %d vertices, root = %d, takes %d bytes",
tree->n, tree->root, Tree_sizeOf(tree)) ;
if ( rc < 0 ) {
fprintf(stderr, "\n fatal error in Tree_writeStats(%p,%p)"
"\n rc = %d, return from fprintf\n", tree, fp, rc) ;
return(0) ;
}
return(1) ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1