This is hxdrio.c in view mode; [Download] [Up]
/*
* hippoxdr.c - XDR routines for hippo I/O
*
* Copyright (C) 1991 The Board of Trustees of The Leland Stanford
* Junior University. All Rights Reserved.
*
* $Id: hxdrio.c,v 5.0 1993/08/17 21:57:00 rensing Exp $
*
* by Paul Rensing
*/
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include "hippo.h"
#include "hxdrio.h"
#include "hutil.h"
/*
* for machines which are naturally big-endian, IEEE floating point,
* define EASY_XDR so that the ntuple data array (which is the vast majority
* of a hippo file) is written out without checking for conversion.
*/
#if defined(_IBMR2) || (defined(NeXT)&& !defined(__LITTLE_ENDIAN__)) || defined(sun) || defined(sgi)
#define EASY_XDR
#endif
GLOB_QUAL const char hippoxdr_c_rcsid[] = "$Id: hxdrio.c,v 5.0 1993/08/17 21:57:00 rensing Exp $";
GLOB_QUAL const char hippostruct_h_rcsid[] = STRUCT_VERSION;
#define CURRENT_VER_NUM 40018
/* version number of data being read/written */
static int fileVersion = CURRENT_VER_NUM;
static bool_t xdr_mywrapstring(XDR *xdrs, char **string);
static bool_t xdr_mywrapstring(XDR *xdrs, char **string)
{
#ifndef __STDC__
static
#endif
char blank[]=" ";
char *pb = blank;
int rc;
if (xdrs->x_op == XDR_ENCODE && *string == NULL)
rc = xdr_wrapstring(xdrs,&pb);
else
rc = xdr_wrapstring(xdrs,string);
return rc;
}
bool_t xdr_floatarray(XDR *xdrs, caddr_t *objp, unsigned int *count,
unsigned int max)
{
#ifdef EASY_XDR
switch (xdrs->x_op)
{
case XDR_FREE:
return xdr_array(xdrs, objp, count, max, sizeof(float), xdr_float);
break;
case XDR_DECODE: /* ie. read */
if (! XDR_GETLONG(xdrs,(long *)count))
return FALSE;
if ( *objp == NULL && *count != 0 &&
(*objp = (char *) malloc(*count*sizeof(float))) == NULL)
return FALSE;
if (*count != 0)
return XDR_GETBYTES(xdrs,*objp,
(unsigned int) *count*sizeof(float));
break;
case XDR_ENCODE:
if (! XDR_PUTLONG(xdrs,(long *)count))
return FALSE;
if (*count > 0)
return XDR_PUTBYTES(xdrs,*objp,*count*sizeof(float));
break;
}
return 1;
#else
return xdr_array(xdrs, objp, count, max, sizeof(float), xdr_float);
#endif
}
bool_t xdr_rectangle(XDR *xdrs, rectangle *objp)
{
if (!xdr_float(xdrs, &objp->origin.x)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->origin.y)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->size.width)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->size.height)) {
return FALSE;
}
return TRUE;
}
bool_t xdr_func_id(XDR *xdrs, func_id *objp)
{
func_id *next=NULL;
bool_t more_data;
while (1)
{
more_data = (*objp != NULL);
if (!xdr_bool(xdrs, &more_data))
{
return FALSE;
}
if (!more_data) break;
if (xdrs->x_op == XDR_FREE)
next = &(*objp)->next;
if (!xdr_reference(xdrs, (caddr_t *)objp,
sizeof(func_id_t), xdr_func_id_t)) {
return FALSE;
}
objp = (xdrs->x_op == XDR_FREE) ?
next : &(*objp)->next;
}
*objp = NULL;
return TRUE;
}
bool_t xdr_func_id_t(XDR *xdrs, func_id_t *objp)
{
char *tmp;
/*
* bug on RS/6000: &objp->name is not allowed because it is not
* in memory
*/
tmp = objp->name;
if (!xdr_string(xdrs, &tmp, FUNCNAMELEN)) {
return FALSE;
}
/*
* don't bother with the function pointer. Reconstruct it later
* using the function name (objp->name).
*/
if (!xdr_array(xdrs, (char **)&objp->paramBlk,
(u_int *)&objp->blkSize, UINT_MAX,
sizeof(double), xdr_double)) {
return FALSE;
}
if (!xdr_enum(xdrs, (int *)&objp->lineStyle)) {
return FALSE;
}
return TRUE;
}
bool_t xdr_ntuple_t(XDR *xdrs, ntuple_t *objp)
{
unsigned int i, j;
if (!xdr_int(xdrs, &objp->ndim))
return FALSE;
if (!xdr_int(xdrs, &objp->rev))
return FALSE;
/*
* read in the data.
*/
if (xdrs->x_op == XDR_DECODE)
{
if ( (objp->data = (float **)malloc(objp->ndim * sizeof(float *)))
== NULL)
return FALSE;
}
if (fileVersion < 30009)
{
/* had better get here only for DECODE */
float *localData = NULL;
if (!xdr_floatarray(xdrs, (char **)&localData, &i, UINT_MAX))
return FALSE;
objp->memAlloc = i/objp->ndim; /* number of tuples */
objp->ndata = objp->memAlloc;
for (i=0; i<objp->ndim; i++)
{
objp->data[i] = (float *) malloc(objp->memAlloc*sizeof(float));
if (objp->data[i] == NULL) return FALSE;
}
for (i=0; i<objp->ndata; i++ )
for (j=0; j<objp->ndim; j++ )
objp->data[j][i] = localData[i*objp->ndim + j];
free(localData);
}
else
{
for (i=0; i<objp->ndim; i++)
{
if (xdrs->x_op == XDR_DECODE) objp->data[i] = NULL;
if (!xdr_floatarray(xdrs, (char **)&objp->data[i],
(unsigned int *)&objp->ndata, UINT_MAX))
return FALSE;
}
if (xdrs->x_op == XDR_DECODE) objp->memAlloc = objp->ndata;
if (xdrs->x_op == XDR_FREE)
free(objp->data);
}
/*
* handle labels, min/max, title
*/
if (!xdr_int(xdrs, &objp->extremeBad)) {
return FALSE;
}
if (!xdr_floatarray(xdrs, (char **)&objp->nlow, (u_int *)&objp->ndim,
UINT_MAX))
return FALSE;
if (!xdr_floatarray(xdrs, (char **)&objp->nhigh, (u_int *)&objp->ndim,
UINT_MAX))
return FALSE;
if (!xdr_mywrapstring(xdrs, (char **)&objp->title )) {
return FALSE;
}
if (xdrs->x_op == XDR_DECODE)
{
if ( (objp->label = (char **)malloc(objp->ndim * sizeof(char *)))
== NULL)
{
return FALSE;
}
}
for (i=0; i<objp->ndim; i++)
{
if (xdrs->x_op == XDR_DECODE) objp->label[i] = NULL;
if (!xdr_mywrapstring(xdrs, (char **)&objp->label[i] )) {
return FALSE;
}
}
if (xdrs->x_op == XDR_FREE)
free(objp->label);
return TRUE;
}
bool_t xdr_ntuple(XDR *xdrs, ntuple *objp)
{
if (!xdr_pointer(xdrs, (char **)objp, sizeof(ntuple_t), xdr_ntuple_t))
return FALSE;
return TRUE;
}
bool_t xdr_bins_t(XDR *xdrs, bins_t *objp)
{
{
char *p = (char *) &objp->flags;
u_int c = sizeof(objp->flags);
if (!xdr_bytes(xdrs, &p, &c, c))
return FALSE;
}
/*
* xAxis data
*/
if (!xdr_int(xdrs, &objp->xAxis.nBins)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->xAxis.low)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->xAxis.high)) {
return FALSE;
}
if (!xdr_vector(xdrs, (char *)objp->xAxis.moments, 3,
sizeof(float), xdr_float))
{
return FALSE;
}
/*
* yAxis data
*/
if (!xdr_int(xdrs, &objp->yAxis.nBins))
return FALSE;
if (!xdr_float(xdrs, &objp->yAxis.low))
return FALSE;
if (!xdr_float(xdrs, &objp->yAxis.high))
return FALSE;
if (!xdr_vector(xdrs, (char *)objp->yAxis.moments, 3,
sizeof(float), xdr_float))
return FALSE;
if (!xdr_int(xdrs, &objp->binAlloc))
return FALSE;
if (!xdr_int(xdrs, &objp->ndata))
return FALSE;
if (objp->flags.fixed || xdrs->x_op == XDR_FREE)
{
if (!xdr_floatarray(xdrs, (char **)&objp->data,
(u_int *)&objp->binAlloc, UINT_MAX))
return FALSE;
if (!xdr_floatarray(xdrs, (char **)&objp->variance,
(u_int *)&objp->binAlloc, UINT_MAX))
return FALSE;
}
else if (xdrs->x_op == XDR_DECODE)
{
objp->ndata = 0;
objp->data = NULL;
objp->variance = NULL;
objp->binAlloc = 0;
}
if (fileVersion < 30008)
{
int i,j;
int oldTot[3][3]; /* for reading pre 3.8 version */
if (!xdr_vector(xdrs, (char *)oldTot,
9, sizeof(int), xdr_int))
return FALSE;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
objp->totals[i][j] = oldTot[i][j];
}
else
{
if (!xdr_vector(xdrs, (char *)objp->totals,
9, sizeof(int), xdr_float))
return FALSE;
}
if (!xdr_float(xdrs, &objp->binMin))
return FALSE;
if (!xdr_float(xdrs, &objp->binMax))
return FALSE;
return TRUE;
}
bool_t xdr_axis_t(XDR *xdrs, axis_t *objp)
{
if (!xdr_float(xdrs, &objp->low)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->high)) {
return FALSE;
}
if (!xdr_mywrapstring(xdrs, (char **)&objp->label )) {
return FALSE;
}
{
char *p = (char *) &objp->flags;
u_int c = sizeof(objp->flags);
if (!xdr_bytes(xdrs, &p, &c, c))
return FALSE;
}
if (!xdr_float(xdrs, &objp->tickLength)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->scaleFontSize)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->firstTick)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->tickStep)) {
return FALSE;
}
if (!xdr_int(xdrs, &objp->numMinorTicks)) {
return FALSE;
}
return TRUE;
}
bool_t xdr_bind_strt_t(XDR *xdrs, bind_strt_t *objp)
{
if (!xdr_int(xdrs, &objp->x)) {
return FALSE;
}
if (!xdr_int(xdrs, &objp->y)) {
return FALSE;
}
if (!xdr_int(xdrs, &objp->z)) {
return FALSE;
}
if (!xdr_int(xdrs, &objp->weight)) {
return FALSE;
}
if (!xdr_int(xdrs, &objp->xerror)) {
return FALSE;
}
if (!xdr_int(xdrs, &objp->yerror)) {
return FALSE;
}
return TRUE;
}
bool_t xdr_3Dstruct(XDR * xdrs, display_t * objp)
{
if (!xdr_float(xdrs, &objp->theta))
return FALSE;
if (!xdr_float(xdrs, &objp->phi))
return FALSE;
if (!xdr_float(xdrs, &objp->dist))
return FALSE;
if (fileVersion >= 40018)
{
if (!xdr_int(xdrs, &objp->doCube))
return FALSE;
if (!xdr_int(xdrs, &objp->doWireFrame))
return FALSE;
if (!xdr_int(xdrs, &objp->doFill))
return FALSE;
if (!xdr_int(xdrs, &objp->doMesh))
return FALSE;
if (!xdr_int(xdrs, &objp->doScatter))
return FALSE;
if (!xdr_int(xdrs, &objp->doSpeedy))
return FALSE;
if (!xdr_vector(xdrs,(char *)objp->color, 5, sizeof(float),xdr_float))
return FALSE;
}
else
{
objp->doCube = 1;
objp->doSpeedy = 0;
if (objp->graphtype == THREEDSCATTER)
{
objp->doWireFrame = 0;
objp->doFill = 0;
objp->doMesh = 0;
objp->doScatter = 1;
}
else
{
objp->doWireFrame = 0;
objp->doFill = 0;
objp->doMesh = 1;
objp->doScatter = 0;
}
objp->color[0] = 0.6;
objp->color[0] = 0.2;
objp->color[0] = 0.0;
objp->color[0] = 0.4;
objp->color[0] = 0.9;
}
return TRUE;
}
bool_t xdr_display_t(XDR *xdrs, display_t *objp)
{
/*
* write the ntuple pointer as an integer. Integer is index into
* the list of ntuple in a record.
*/
if (!xdr_int(xdrs, (int *)&objp->tuple)) {
return FALSE;
}
if (!xdr_int(xdrs, &objp->nt_rev)) {
return FALSE;
}
if (!xdr_mywrapstring(xdrs, (char **)&objp->ntFile ))
{
return FALSE;
}
if (!xdr_int(xdrs, &objp->dim)) {
return FALSE;
}
if (!xdr_enum(xdrs, (int *)&objp->graphtype)) {
return FALSE;
}
if (!xdr_enum(xdrs, (int *)&objp->drawtype)) {
return FALSE;
}
{
char *p = (char *) &objp->flags;
u_int c = sizeof(objp->flags);
if (!xdr_bytes(xdrs, &p, &c, c))
return FALSE;
}
if (!xdr_mywrapstring(xdrs, (char **)&objp->title ))
{
return FALSE;
}
if (!xdr_bins_t(xdrs, &objp->bins))
{
return FALSE;
}
if (!xdr_axis_t(xdrs, &objp->xAxis)) {
return FALSE;
}
if (!xdr_axis_t(xdrs, &objp->yAxis)) {
return FALSE;
}
if (!xdr_axis_t(xdrs, &objp->zAxis)) {
return FALSE;
}
if (!xdr_enum(xdrs, (int *)&objp->plotSymbol)) {
return FALSE;
}
if (!xdr_float(xdrs, &objp->symbolSize)) {
return FALSE;
}
if (!xdr_enum(xdrs, (int *)&objp->lineStyle)) {
return FALSE;
}
if (!xdr_bind_strt_t(xdrs, &objp->binding)) {
return FALSE;
}
if (!xdr_rectangle(xdrs, &objp->drawRect)) {
return FALSE;
}
if (!xdr_rectangle(xdrs, &objp->marginRect)) {
return FALSE;
}
if (!xdr_func_id(xdrs, &objp->nt_cut)) {
return FALSE;
}
if (!xdr_func_id(xdrs, &objp->bin_func)) {
return FALSE;
}
if (!xdr_func_id(xdrs, &objp->plot_func)) {
return FALSE;
}
if (fileVersion > 40012)
{
if (!xdr_enum(xdrs, (int *)&objp->fSumLineStyle))
return FALSE;
}
if (!xdr_func_id(xdrs, &objp->binToColor)) {
return FALSE;
}
/*
* 3D data
*/
if (fileVersion > 40012 && !xdr_3Dstruct(xdrs, objp))
return FALSE;
return TRUE;
}
bool_t xdr_display(XDR *xdrs, display *objp)
{
if (!xdr_pointer(xdrs, (char **)objp, sizeof(display_t),
xdr_display_t)) {
return FALSE;
}
return TRUE;
}
bool_t xdr_hippo_rec(XDR *xdrs, hippo_rec *objp)
{
int l;
/*
* read/write the magic number. Pad (with NULL) or truncate to 4 bytes.
*/
switch (xdrs->x_op)
{
case XDR_DECODE: /* ie. read */
if (! XDR_GETBYTES(xdrs,objp->magic,4*sizeof(char)))
return FALSE;
break;
case XDR_ENCODE:
if (! XDR_PUTBYTES(xdrs,objp->magic,4*sizeof(char)))
return FALSE;
break;
case XDR_FREE:
break;
}
l = strlen(MAGIC);
if (l>4) l=4;
if (xdrs->x_op == XDR_DECODE && strncmp(objp->magic,MAGIC,l) != 0)
return FALSE;
/*
* read/write the structure version.
*
*/
if (!xdr_mywrapstring(xdrs, (char **)&objp->s_version ))
return FALSE;
/*
* check the version number.
*/
if (xdrs->x_op == XDR_DECODE)
{
int majorVer, minorVer;
int i = sscanf(objp->s_version,"%*s %*s %d.%d",&majorVer,&minorVer);
fileVersion = majorVer*10000 + minorVer;
if (i < 1) fileVersion = 30000;
if (fileVersion < 30005)
{
char msg[80];
sprintf(msg,"Old hippo file version: %s",objp->s_version);
h_error(msg);
h_error("No displays will be read");
}
}
else
fileVersion = CURRENT_VER_NUM;
/*
* ntuples
*/
if (!xdr_array(xdrs, (char **) &objp->nt_list,
(u_int *)&objp->num_nt, UINT_MAX,
sizeof(ntuple), xdr_ntuple ))
{
return FALSE;
}
/*
* displays
*/
if (fileVersion < 30005)
objp->num_disp = 0;
else
if (!xdr_array(xdrs, (char **)&objp->disp_list,
(u_int *)&objp->num_disp, UINT_MAX,
sizeof(display), xdr_display ))
{
return FALSE;
}
return TRUE;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.