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