1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright 1993, University Corporation for Atmospheric Research *
* See netcdf/COPYRIGHT file for copying and redistribution conditions. *
* *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF. The full HDF copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at *
* http://hdfgroup.org/products/hdf4/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* $Id: sharray.c 4963 2007-09-15 17:20:52Z bmribler $ */
#include "local_nc.h"
#include "alloc.h"
/* you may wish to tune this: big on a cray, small on a PC? */
#define NC_SHRT_BUFSIZ 8192
#define NC_NSHRTS_PER (NC_SHRT_BUFSIZ/2) /* number of netshorts the buffer holds */
/*
* internal function, bulk xdr of an even number of shorts, less than NC_NSHRTS_PER
*/
static
bool_t
NCxdr_shortsb(xdrs, sp, nshorts)
XDR *xdrs;
short *sp;
u_int nshorts ;
{
unsigned char buf[NC_SHRT_BUFSIZ] ;
unsigned char *cp ;
unsigned int nbytes = nshorts * 2;
/* assert(nshorts <= NC_NSHRTS_PER) ; */
/* assert(nshorts > 0) ; */
if(xdrs->x_op == XDR_ENCODE)
{
for(cp = buf ; cp < &buf[nbytes] ; sp++, cp += 2 )
{
*(cp +1) = *sp % 256 ;
*cp = (*sp >> 8) ;
}
}
if(!xdr_opaque(xdrs, (caddr_t)buf, nbytes))
return FALSE ;
if(xdrs->x_op == XDR_DECODE)
{
for(cp = buf ; cp < &buf[nbytes] ; sp++, cp += 2 )
{
*sp = ((*cp & 0x7f) << 8) + *(cp +1) ;
if(*cp & 0x80)
{
/* extern is neg */
*sp -= 0x8000 ;
}
}
}
return TRUE ;
}
/*
* Translate an array of cnt short integers at sp.
*/
bool_t
xdr_shorts(xdrs, sp, cnt)
XDR *xdrs;
short *sp;
u_int cnt ;
{
int odd ; /* 1 if cnt is odd, 0 otherwise */
if(cnt == 0)
return TRUE ; /* ? */
odd = cnt % 2 ;
if(odd)
cnt-- ;
/* cnt is even, odd is set if apropos */
while(cnt > NC_NSHRTS_PER)
{
if(!NCxdr_shortsb(xdrs, sp, NC_NSHRTS_PER))
return FALSE ;
/* else */
sp += NC_NSHRTS_PER ;
cnt -= NC_NSHRTS_PER ;
}
/* we know cnt <= NC_NSHRTS_PER at this point */
if(cnt != 0)
{
if(!NCxdr_shortsb(xdrs, sp, cnt))
return FALSE ;
/* else */
sp += cnt ;
cnt = 0 ;
}
if(odd)
if(!xdr_NCvshort(xdrs, 0, sp))
return FALSE ;
return TRUE ;
}
|