1 /*  IO.c  */
2 
3 #include "../Tree.h"
4 
5 static const char *suffixb = ".treeb" ;
6 static const char *suffixf = ".treef" ;
7 
8 /*--------------------------------------------------------------------*/
9 /*
10    ------------------------------------------------
11    purpose -- to read in an Tree object from a file
12 
13    input --
14 
15       fn -- filename, must be *.treeb or *.treef
16 
17    return value -- 1 if success, 0 if failure
18 
19    created -- 95nov15, cca
20    ------------------------------------------------
21 */
22 int
Tree_readFromFile(Tree * tree,char * fn)23 Tree_readFromFile (
24    Tree   *tree,
25    char   *fn
26 ) {
27 FILE   *fp ;
28 int    fnlength, rc, sulength ;
29 /*
30    ---------------
31    check the input
32    ---------------
33 */
34 if ( tree == NULL || fn == NULL ) {
35    fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
36            "\n bad input\n", tree, fn) ;
37    return(0) ;
38 }
39 /*
40    -------------
41    read the file
42    -------------
43 */
44 fnlength = strlen(fn) ;
45 sulength = strlen(suffixb) ;
46 if ( fnlength > sulength ) {
47    if ( strcmp(&fn[fnlength-sulength], suffixb) == 0 ) {
48       if ( (fp = fopen(fn, "rb")) == NULL ) {
49          fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
50                  "\n unable to open file %s", tree, fn, fn) ;
51          rc = 0 ;
52       } else {
53          rc = Tree_readFromBinaryFile(tree, fp) ;
54          fclose(fp) ;
55       }
56    } else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
57       if ( (fp = fopen(fn, "r")) == NULL ) {
58          fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
59                  "\n unable to open file %s", tree, fn, fn) ;
60          rc = 0 ;
61       } else {
62          rc = Tree_readFromFormattedFile(tree, fp) ;
63          fclose(fp) ;
64       }
65    } else {
66       fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
67               "\n bad Tree file name %s,"
68               "\n must end in %s (binary) or %s (formatted)\n",
69               tree, fn, fn, suffixb, suffixf) ;
70       rc = 0 ;
71    }
72 } else {
73    fprintf(stderr, "\n error in Tree_readFromFile(%p,%s)"
74        "\n bad Tree file name %s,"
75        "\n must end in %s (binary) or %s (formatted)\n",
76        tree, fn, fn, suffixb, suffixf) ;
77    rc = 0 ;
78 }
79 return(rc) ; }
80 
81 /*--------------------------------------------------------------------*/
82 /*
83    -------------------------------------------------------
84    purpose -- to read an Tree object from a formatted file
85 
86    return value -- 1 if success, 0 if failure
87 
88    created -- 95nov15, cca
89    -------------------------------------------------------
90 */
91 int
Tree_readFromFormattedFile(Tree * tree,FILE * fp)92 Tree_readFromFormattedFile (
93    Tree   *tree,
94    FILE   *fp
95 ) {
96 int   rc ;
97 int   itemp[2] ;
98 /*
99    ---------------
100    check the input
101    ---------------
102 */
103 if ( tree == NULL || fp == NULL ) {
104    fprintf(stderr, "\n error in Tree_readFromFormattedFile(%p,%p)"
105            "\n bad input\n", tree, fp) ;
106    return(0) ;
107 }
108 /*
109    ---------------------
110    clear the data fields
111    ---------------------
112 */
113 Tree_clearData(tree) ;
114 /*
115    ---------------------------------
116    read in the two scalar parameters
117    number of nodes and the root
118    ---------------------------------
119 */
120 if ( (rc = IVfscanf(fp, 2, itemp)) != 2 ) {
121    fprintf(stderr, "\n error in Tree_readFromFormattedFile(%p,%p)"
122            "\n %d items of %d read\n", tree, fp, rc, 2) ;
123    return(0) ;
124 }
125 /*
126    ---------------------
127    initialize the object
128    ---------------------
129 */
130 Tree_init1(tree, itemp[0]) ;
131 tree->root = itemp[1] ;
132 /*
133    -----------------------
134    now read in the indices
135    -----------------------
136 */
137 if ( (rc = IVfscanf(fp, tree->n, tree->par)) != tree->n ) {
138    fprintf(stderr, "\n par: error in Tree_readFromFormattedFile(%p,%p)"
139            "\n %d items of %d read\n",
140            tree, fp, rc, tree->n) ;
141    return(0) ;
142 }
143 if ( (rc = IVfscanf(fp, tree->n, tree->fch)) != tree->n ) {
144    fprintf(stderr, "\n fch: error in Tree_readFromFormattedFile(%p,%p)"
145            "\n %d items of %d read\n",
146            tree, fp, rc, tree->n) ;
147    return(0) ;
148 }
149 if ( (rc = IVfscanf(fp, tree->n, tree->sib)) != tree->n ) {
150    fprintf(stderr, "\n sib: error in Tree_readFromFormattedFile(%p,%p)"
151            "\n %d items of %d read\n",
152            tree, fp, rc, tree->n) ;
153    return(0) ;
154 }
155 
156 return(1) ; }
157 
158 /*--------------------------------------------------------------------*/
159 /*
160    ----------------------------------------------------
161    purpose -- to read an Tree object from a binary file
162 
163    return value -- 1 if success, 0  if failure
164 
165    created -- 95nov15, cca
166    ----------------------------------------------------
167 */
168 int
Tree_readFromBinaryFile(Tree * tree,FILE * fp)169 Tree_readFromBinaryFile (
170    Tree    *tree,
171    FILE   *fp
172 ) {
173 int   rc ;
174 int   itemp[2] ;
175 /*
176    ---------------
177    check the input
178    ---------------
179 */
180 if ( tree == NULL || fp == NULL ) {
181    fprintf(stderr, "\n fatal error in Tree_readFromBinaryFile(%p,%p)"
182            "\n bad input\n", tree, fp) ;
183    return(0) ;
184 }
185 /*
186    ---------------------
187    clear the data fields
188    ---------------------
189 */
190 Tree_clearData(tree) ;
191 /*
192    ---------------------------------
193    read in the two scalar parameters
194    number of nodes and the root
195    ---------------------------------
196 */
197 if ( (rc = fread((void *) itemp, sizeof(int), 2, fp)) != 2 ) {
198    fprintf(stderr, "\n error in Tree_readFromBinaryFile(%p,%p)"
199            "\n itemp(2) : %d items of %d read\n", tree, fp, rc, 2) ;
200    return(0) ;
201 }
202 /*
203    ---------------------
204    initialize the object
205    ---------------------
206 */
207 Tree_init1(tree, itemp[0]) ;
208 tree->root = itemp[1] ;
209 /*
210    -------------------
211    read in the vectors
212    -------------------
213 */
214 if ( (rc = fread((void *) tree->par, sizeof(int), tree->n, fp))
215      != tree->n ) {
216    fprintf(stderr, "\n par : error in Tree_readFromBinaryFile(%p,%p)"
217            "\n %d items of %d read\n",
218            tree, fp, rc, tree->n) ;
219    return(0) ;
220 }
221 if ( (rc = fread((void *) tree->fch, sizeof(int), tree->n, fp))
222      != tree->n ) {
223    fprintf(stderr, "\n fch : error in Tree_readFromBinaryFile(%p,%p)"
224            "\n %d items of %d read\n",
225            tree, fp, rc, tree->n) ;
226    return(0) ;
227 }
228 if ( (rc = fread((void *) tree->sib, sizeof(int), tree->n, fp))
229      != tree->n ) {
230    fprintf(stderr, "\n sib : error in Tree_readFromBinaryFile(%p,%p)"
231            "\n %d items of %d read\n",
232            tree, fp, rc, tree->n) ;
233    return(0) ;
234 }
235 return(1) ; }
236 
237 /*--------------------------------------------------------------------*/
238 /*
239    --------------------------------------------
240    purpose -- to write an Tree object to a file
241 
242    input --
243 
244       fn -- filename
245         *.treeb -- binary
246         *.treef -- formatted
247         anything else -- for human eye
248 
249    return value -- 1 if success, 0 otherwise
250 
251    created -- 95nov15, cca
252    --------------------------------------------
253 */
254 int
Tree_writeToFile(Tree * tree,char * fn)255 Tree_writeToFile (
256    Tree   *tree,
257    char   *fn
258 ) {
259 FILE   *fp ;
260 int    fnlength, rc, sulength ;
261 /*
262    ---------------
263    check the input
264    ---------------
265 */
266 if ( tree == NULL || fn == NULL ) {
267    fprintf(stderr, "\n fatal error in Tree_writeToFile(%p,%s)"
268     "\n bad input\n", tree, fn) ;
269 }
270 /*
271    ------------------
272    write out the file
273    ------------------
274 */
275 fnlength = strlen(fn) ;
276 sulength = strlen(suffixb) ;
277 if ( fnlength > sulength ) {
278    if ( strcmp(&fn[fnlength-sulength], suffixb) == 0 ) {
279       if ( (fp = fopen(fn, "wb")) == NULL ) {
280          fprintf(stderr, "\n error in Tree_writeToFile(%p,%s)"
281                  "\n unable to open file %s", tree, fn, fn) ;
282          rc = 0 ;
283       } else {
284          rc = Tree_writeToBinaryFile(tree, fp) ;
285          fclose(fp) ;
286       }
287    } else if ( strcmp(&fn[fnlength-sulength], suffixf) == 0 ) {
288       if ( (fp = fopen(fn, "w")) == NULL ) {
289          fprintf(stderr, "\n error in Tree_writeToFile(%p,%s)"
290                  "\n unable to open file %s", tree, fn, fn) ;
291          rc = 0 ;
292       } else {
293          rc = Tree_writeToFormattedFile(tree, fp) ;
294          fclose(fp) ;
295       }
296    } else {
297       if ( (fp = fopen(fn, "a")) == NULL ) {
298          fprintf(stderr, "\n error in Tree_writeToFile(%p,%s)"
299                  "\n unable to open file %s", tree, fn, fn) ;
300          rc = 0 ;
301       } else {
302          rc = Tree_writeForHumanEye(tree, fp) ;
303          fclose(fp) ;
304       }
305    }
306 } else {
307    if ( (fp = fopen(fn, "a")) == NULL ) {
308       fprintf(stderr, "\n error in Tree_writeToFile(%p,%s)"
309               "\n unable to open file %s", tree, fn, fn) ;
310       rc = 0 ;
311    } else {
312       rc = Tree_writeForHumanEye(tree, fp) ;
313       fclose(fp) ;
314    }
315 }
316 return(rc) ; }
317 
318 /*--------------------------------------------------------------------*/
319 /*
320    ------------------------------------------------------
321    purpose -- to write an Tree object to a formatted file
322 
323    return value -- 1 if success, 0 otherwise
324 
325    created -- 95nov15, cca
326    ------------------------------------------------------
327 */
328 int
Tree_writeToFormattedFile(Tree * tree,FILE * fp)329 Tree_writeToFormattedFile (
330    Tree   *tree,
331    FILE   *fp
332 ) {
333 int   ierr, rc ;
334 /*
335    ---------------
336    check the input
337    ---------------
338 */
339 if ( tree == NULL || fp == NULL || tree->n <= 0 ) {
340    fprintf(stderr, "\n fatal error in Tree_writeToFormattedFile(%p,%p)"
341            "\n bad input\n", tree, fp) ;
342    exit(-1) ;
343 }
344 /*
345    -------------------------------------
346    write out the two scalar parameters
347    -------------------------------------
348 */
349 rc = fprintf(fp, "\n %d %d", tree->n, tree->root) ;
350 if ( rc < 0 ) {
351    fprintf(stderr, "\n fatal error in Tree_writeToFormattedFile(%p,%p)"
352            "\n rc = %d, return from first fprintf\n", tree, fp, rc) ;
353    return(0) ;
354 }
355 /*
356    ---------------------
357    write out the vectors
358    ---------------------
359 */
360 IVfp80(fp, tree->n, tree->par, 80, &ierr) ;
361 IVfp80(fp, tree->n, tree->fch, 80, &ierr) ;
362 IVfp80(fp, tree->n, tree->sib, 80, &ierr) ;
363 
364 return(1) ; }
365 
366 /*--------------------------------------------------------------------*/
367 /*
368    ---------------------------------------------------
369    purpose -- to write an Tree object to a binary file
370 
371    return value -- 1 if success, 0 otherwise
372 
373    created -- 95nov15, cca
374    ---------------------------------------------------
375 */
376 int
Tree_writeToBinaryFile(Tree * tree,FILE * fp)377 Tree_writeToBinaryFile (
378    Tree    *tree,
379    FILE   *fp
380 ) {
381 int   rc ;
382 int   itemp[2] ;
383 /*
384    ---------------
385    check the input
386    ---------------
387 */
388 if ( tree == NULL || fp == NULL || tree->n <= 0 ) {
389    fprintf(stderr, "\n fatal error in Tree_writeToBinaryFile(%p,%p)"
390            "\n bad input\n", tree, fp) ;
391    exit(-1) ;
392 }
393 itemp[0] = tree->n    ;
394 itemp[1] = tree->root ;
395 rc = fwrite((void *) itemp, sizeof(int), 2, fp) ;
396 if ( rc != 2 ) {
397    fprintf(stderr, "\n error in Tree_writeToBinaryFile(%p,%p)"
398            "\n %d of %d scalar items written\n", tree, fp, rc, 2) ;
399    return(0) ;
400 }
401 rc = fwrite((void *) tree->par, sizeof(int), tree->n, fp) ;
402 if ( rc != tree->n ) {
403    fprintf(stderr, "\n error in Tree_writeToBinaryFile(%p,%p)"
404            "\n tree->par, %d of %d items written\n",
405            tree, fp, rc, tree->n) ;
406    return(0) ;
407 }
408 rc = fwrite((void *) tree->fch, sizeof(int), tree->n, fp) ;
409 if ( rc != tree->n ) {
410    fprintf(stderr, "\n error in Tree_writeToBinaryFile(%p,%p)"
411            "\n tree->fch, %d of %d items written\n",
412            tree, fp, rc, tree->n) ;
413    return(0) ;
414 }
415 rc = fwrite((void *) tree->sib, sizeof(int), tree->n, fp) ;
416 if ( rc != tree->n ) {
417    fprintf(stderr, "\n error in Tree_writeToBinaryFile(%p,%p)"
418            "\n tree->sib, %d of %d items written\n",
419            tree, fp, rc, tree->n) ;
420    return(0) ;
421 }
422 
423 return(1) ; }
424 
425 /*--------------------------------------------------------------------*/
426 /*
427    --------------------------------------------------
428    purpose -- to write an Tree object for a human eye
429 
430    return value -- 1 if success, 0 otherwise
431 
432    created -- 95nov15, cca
433    --------------------------------------------------
434 */
435 int
Tree_writeForHumanEye(Tree * tree,FILE * fp)436 Tree_writeForHumanEye (
437    Tree    *tree,
438    FILE   *fp
439 ) {
440 int   rc, v ;
441 
442 if ( tree == NULL || fp == NULL ) {
443    fprintf(stderr, "\n fatal error in Tree_writeForHumanEye(%p,%p)"
444            "\n bad input\n", tree, fp) ;
445    exit(-1) ;
446 }
447 if ( (rc = Tree_writeStats(tree, fp)) == 0 ) {
448    fprintf(stderr, "\n fatal error in Tree_writeForHumanEye(%p,%p)"
449            "\n rc = %d, return from Tree_writeStats(%p,%p)\n",
450            tree, fp, rc, tree, fp) ;
451    return(0) ;
452 }
453 fprintf(fp, "\n vertex   parent   fchild   sibling") ;
454 for ( v = 0 ; v < tree->n ; v++ ) {
455    fprintf(fp, "\n %5d %9d %9d %9d :",
456            v, tree->par[v], tree->fch[v], tree->sib[v]) ;
457 }
458 
459 return(1) ; }
460 
461 /*--------------------------------------------------------------------*/
462 /*
463    ----------------------------------------------------------
464    purpose -- to write out the statistics for the Tree object
465 
466    return value -- 1 if success, 0 otherwise
467 
468    created -- 95nov15, cca
469    ----------------------------------------------------------
470 */
471 int
Tree_writeStats(Tree * tree,FILE * fp)472 Tree_writeStats (
473    Tree    *tree,
474    FILE   *fp
475 ) {
476 int   rc ;
477 /*
478    ---------------
479    check the input
480    ---------------
481 */
482 if ( tree == NULL || fp == NULL ) {
483    fprintf(stderr, "\n error in Tree_writeStats(%p,%p)"
484            "\n bad input\n", tree, fp) ;
485    exit(-1) ;
486 }
487 rc = fprintf(fp,
488         "\n Tree : tree object, %d vertices, root = %d, takes %d bytes",
489         tree->n, tree->root, Tree_sizeOf(tree)) ;
490 if ( rc < 0 ) {
491    fprintf(stderr, "\n fatal error in Tree_writeStats(%p,%p)"
492            "\n rc = %d, return from fprintf\n", tree, fp, rc) ;
493    return(0) ;
494 }
495 return(1) ; }
496 
497 /*--------------------------------------------------------------------*/
498