This is hio.c in view mode; [Download] [Up]
/* * hippoio.c - input/output routines for hippo package. * * Copyright (C) 1991 The Board of Trustees of The Leland Stanford * Junior University. All Rights Reserved. * * $Id: hio.c,v 5.0 1993/08/17 21:55:07 rensing Exp $ * * by Paul Rensing, Feb 28,1991 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "hippo.h" #include "hutil.h" #include "hxdrio.h" GLOB_QUAL const char hippoio_c_rcsid[] = "$Id: hio.c,v 5.0 1993/08/17 21:55:07 rensing Exp $"; static int constructRec( hippo_rec *rec, display dl[], ntuple ntl[] ); int h_write(const char *filenm, display dlist[], ntuple ntlist[] ) { int i; FILE *outfile; /* open the file */ if ( (outfile = fopen(filenm,"wb")) == NULL) { h_error("Could not open file"); return -1; } i = h_writeStream(outfile,dlist,ntlist); fclose(outfile); return i; } int h_writeStream(FILE *file, display dlist[], ntuple ntlist[] ) { XDR xdrs; int rc = 0; /* * open the XDR stream. */ xdrstdio_create(&xdrs, file, XDR_ENCODE); rc = h_writeXDR( &xdrs, dlist, ntlist ); /* * destroy the XDR stream */ xdr_destroy(&xdrs); return rc; } int h_writeMem(char *buf, int len, display dlist[], ntuple ntlist[] ) { XDR xdrs; int rc; /* * open the XDR stream. */ xdrmem_create(&xdrs, buf, len, XDR_ENCODE); rc = h_writeXDR(&xdrs, dlist, ntlist ); /* * destroy the XDR stream */ xdr_destroy(&xdrs); return rc; } int h_writeXDR(XDR * xdrs, display dlist[], ntuple ntlist[] ) { hippo_rec record; int rc = 0; int i; /* * construct the hippo_rec to pass to XDR */ if (constructRec( &record, dlist, ntlist ) != 0) { h_error("Error constructing hippo record."); return -1; } if (record.num_disp == 0 && record.num_nt == 0) return 0; /* * !!!!! displays have been modified, so don't crash now!! */ /* * write the record. */ if (!xdr_hippo_rec(xdrs, &record )) { rc = -1; h_error("Error writing XDR file"); } /* * undo changes to displays */ for (i=0; i<record.num_disp; i++) { if ((int)record.disp_list[i]->tuple == -1) record.disp_list[i]->tuple = NULL; else if (! record.disp_list[i]->flags.ntByReference) { record.disp_list[i]->tuple = record.nt_list[ (int) record.disp_list[i]->tuple ]; } } /* * free the lists in the record */ if (record.nt_list != NULL) free(record.nt_list); if (record.disp_list != NULL) free(record.disp_list); return rc; } static int constructRec(hippo_rec *rec, display dlist[], ntuple ntlist[] ) { int i, j; int num_nt; int inlist; rec->num_nt = 0; if (ntlist != NULL) while (ntlist[rec->num_nt] != NULL) rec->num_nt++; rec->num_disp = 0; if (dlist != NULL) while (dlist[rec->num_disp] != NULL) rec->num_disp++; /* * check that there is something to write. */ if (rec->num_disp == 0 && rec->num_nt == 0) return 0; rec->disp_list = NULL; if (rec->num_disp > 0 && (rec->disp_list = (display *) malloc( rec->num_disp * sizeof(display)) )==NULL) { h_error("Could not allocate memory for temporary display list"); return -1; } if ((rec->nt_list = (ntuple *) malloc((rec->num_disp+rec->num_nt) * sizeof(ntuple) ))==NULL) { h_error("Could not allocate memory for temporary ntuple array"); return -1; } /* * copy given list of n-tuples. Check for duplicates. */ num_nt = 0; for (i=0; i<rec->num_nt; i++) { inlist = 0; for (j=0; j<num_nt; j++) inlist |= (ntlist[i] == rec->nt_list[j]); if (!inlist) rec->nt_list[num_nt++] = ntlist[i]; } rec->num_nt = num_nt; /* * now, add any n-tuples not in list which are needed by displays. * compile list of disp->tuple to ntuple index. * disp->tuple == NULL --> -1. */ for (i=0; i<rec->num_disp; i++) { rec->disp_list[i] = dlist[i]; if (! rec->disp_list[i]->flags.ntByReference) { if (rec->disp_list[i]->tuple == NULL || rec->disp_list[i]->bins.flags.fixed) { rec->disp_list[i]->tuple = (ntuple) -1; } else { for (j=0; j<rec->num_nt; j++) { if (rec->disp_list[i]->tuple == rec->nt_list[j]) { rec->disp_list[i]->tuple = (ntuple) j; break; } } if (j >= rec->num_nt) { rec->nt_list[rec->num_nt] = rec->disp_list[i]->tuple; rec->disp_list[i]->tuple = (ntuple) rec->num_nt++; } } } } strncpy( rec->magic, MAGIC, 4); /* * don't use RCS ID directly because could not check in */ rec->s_version = STRUCT_VERSION+1; return 0; } int h_read(const char *filenm, display **dlist, ntuple **ntlist ) { int i; FILE *infile; /* open the file */ if ( (infile = fopen(filenm,"rb")) == NULL) { h_error("Could not open input file"); return -1; } i = h_readStream(infile,dlist,ntlist); fclose(infile); return i; } int h_readStream(FILE *file, display **dlist, ntuple **ntlist ) { XDR xdrs; int rc; /* * open the XDR stream. */ xdrstdio_create(&xdrs, file, XDR_DECODE); rc = h_readXDR(&xdrs, dlist, ntlist ); /* * destroy the XDR stream */ xdr_destroy(&xdrs); return rc; } int h_readMem(char *buf, int len, display **dlist, ntuple **ntlist ) { XDR xdrs; int rc; /* * open the XDR stream. */ xdrmem_create(&xdrs, buf, len, XDR_DECODE); rc = h_readXDR(&xdrs, dlist, ntlist ); /* * destroy the XDR stream */ xdr_destroy(&xdrs); return rc; } int h_readXDR(XDR *xdrs, display **dlist, ntuple **ntlist ) { hippo_rec record; int i,j; func_id p; memset( &record, 0, sizeof(hippo_rec) ); /* * read the record. */ if (!xdr_hippo_rec(xdrs, &record )) { h_error("Error reading XDR file"); return -1; } /* * allocate output records. */ if ((*ntlist=(ntuple *) malloc( (record.num_nt+1) * sizeof(ntuple)))==NULL) { h_error("Could not allocate memory for ntuple array"); return -1; } if ((*dlist=(display *) malloc( (record.num_disp+1) * sizeof(display)))==NULL) { h_error("Could not allocate memory for display array"); return -1; } /* * copy lists and undo changes to displays. */ for (i=0; i<record.num_disp; i++) { (*dlist)[i] = record.disp_list[i]; if ( !(*dlist)[i]->flags.ntByReference ) { j = (int) (*dlist)[i]->tuple; if ( j < 0 || j >= record.num_nt ) { (*dlist)[i]->tuple = NULL; } else { (*dlist)[i]->tuple = record.nt_list[j]; } } /* * resolve function references. */ for (p=(*dlist)[i]->nt_cut; p!=NULL; p=p->next ) if( (p->funcPtr = (int (*)())h_fNameSrch(p->name)) == NULL) h_error("Cut function name is not in registry"); for (p=(*dlist)[i]->bin_func; p!=NULL; p=p->next ) if( (p->funcPtr = (int (*)())h_fNameSrch(p->name)) == NULL) h_error("Cut function name is not in registry"); for (p=(*dlist)[i]->plot_func; p!=NULL; p=p->next ) if( (p->funcPtr = (int (*)())h_fNameSrch(p->name)) == NULL) h_error("Cut function name is not in registry"); } (*dlist)[record.num_disp] = NULL; for (i=0; i<record.num_nt; i++) { (*ntlist)[i] = record.nt_list[i]; } (*ntlist)[record.num_nt] = NULL; /* * free the lists in the record */ if (record.nt_list != NULL) free(record.nt_list); if (record.disp_list != NULL) free(record.disp_list); if (record.s_version != NULL) free(record.s_version); return 0; } int h_isHippoFile( const char *filename ) { FILE *file; char mag[5]; if ( (file = fopen(filename, "rb")) == NULL ) return 0; /* return FALSE if can't open file */ fread(mag, sizeof(char), 4, file ); mag[4] = '\0'; /* just in case */ fclose(file); return strncmp( mag, MAGIC, strlen(MAGIC) ) == 0; } /* * Special function to write out the tuple which corresponds with * what is being plotted by a particular display, ie. with the cuts applied. */ int h_writeNtForDisp( char *filename, display disp ) { ntuple ntlist[2]; ntuple dnt = h_getNtuple( disp ); func_id cutlist = disp->nt_cut; int i, fSize = 0, n; float *f = NULL; ntlist[0] = h_new( h_getNtDim(dnt) ); if (ntlist[0] == NULL) { h_error("Could not create new ntuple"); return -1; } h_setNtTitle(ntlist[0], h_getNtTitle(dnt) ); for (i=0; i<h_getNtDim(dnt); i++) h_setNtLabel(ntlist[0], i, h_getNtLabel(dnt,i) ); n = h_getNtNdata(dnt); for (i = 0; i < n; i++ ) { if (doCuts(dnt->data, i, cutlist)) continue; f = h_getNtData( dnt, i, f, &fSize ); h_arrayFill( ntlist[0], f ); } ntlist[1] = NULL; i = h_write(filename, NULL, ntlist ); h_freeNt( ntlist[0] ); free(f); return i; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.