/******************************************************************************
*
* NSSDC/CDF INTERNAL interface to CDF.
*
* Version 2.8b, 8-Mar-97, Hughes STX.
*
* Modification history:
*
* V1.0 22-Jan-91, R Kulkarni Original version (for CDF V2.0).
* J Love
* V2.0 6-Jun-91, J Love Renamed (was cdfcore.c). Modified for
* V2.1 style INTERNAL interface (and
* fixes to CDF V2.0 distribution). Also
* renamed some symbols for clarity.
* V2.1 24-Jun-91, J Love Fixed PUT_,VAR_INITIALRECS. Stripped
* trailing blanks off of CDF names.
* Allow variable data type to be changed
* if "equivalent". Added CDF_EPOCH as
* a data type.
* V2.2 8-Aug-91, J Love Don't use #elif (for SGi port) and
* added support for Cray/UNICOS.
* INTERNAL i/f function renamed 'CDFlib'.
* Different numbers of CACHE buffers for
* different file types (VIO). Modified
* hyper access (and fixed part of it).
* Changed attribute entry access. Check
* for supported encoding when opening a
* CDF.
* V2.3 20-May-92, J Love Changed for IBM-PC port (split into
* smaller source files, etc.). Made
* shareable.
* V2.4 21-Aug-92, J Love CDF V2.3 (shareable/NeXT/zVar).
* V2.5 19-Jan-94, J Love CDF V2.4.
* V2.6 15-Dec-94, J Love CDF V2.5.
* V2.6a 24-Feb-95, J Love Solaris 2.3 IDL i/f.
* V2.7 19-Jul-95, J Love Virtual memory (Microsoft C 7.00).
* V2.7a 22-Sep-95, J Love Changed virtual memory control.
* V2.8 19-Aug-96, J Love CDF V2.6.
* V2.8a 14-Feb-97, J Love Fixed `va_arg' usage.
* V2.8b 8-Mar-97, J Love Windows NT for MS Visual C++ 4 on an
* IBM PC.
*
******************************************************************************/
#define CDFLIB
#include "cdflib.h"
#include "cdflib64.h"
#if defined(BUILDINGforIDL)
#define CUR Cur
#else
static struct CurStruct Cur = { RESERVED_CDFID, RESERVED_CDFSTATUS };
#define CUR &Cur
#endif
#if defined(MICROSOFTC_700) && INCLUDEvMEMORY
static Logical first = TRUE;
#endif
static Logical second = TRUE;
/******************************************************************************
* CDFlib.
******************************************************************************/
#if defined(STDARG)
#if defined(BUILDINGforIDL)
VISIBLE_PREFIX CDFstatus CDFlib (struct CurStruct *Cur, long requiredFnc, ...)
#else
VISIBLE_PREFIX CDFstatus CDFlib (long requiredFnc, ...)
#endif
#else
VISIBLE_PREFIX CDFstatus CDFlib (va_alist)
va_dcl
#endif
{
CDFstatus pStatus = CDF_OK;
struct VAstruct Va;
#if defined(BUILDINGforIDL)
#if defined(VARARGS)
struct CurStruct *Cur;
#endif
#endif
/****************************************************************************
* Process variable length argument list.
****************************************************************************/
#if defined(STDARG)
va_start (Va.ap, requiredFnc);
Va.fnc = requiredFnc;
#else
VA_START (Va.ap);
#if defined(BUILDINGforIDL)
Cur = va_arg (Va.ap, struct CurStruct *);
#endif
Va.fnc = va_arg (Va.ap, long);
#endif
/****************************************************************************
* Initialize virtual memory parameters for Microsoft C 7.00.
****************************************************************************/
#if defined(MICROSOFTC_700) && INCLUDEvMEMORY
if (first) {
char *vsize = getenv("CDF_VSIZE");
if (vsize != NULL) {
long nBytes;
if (sscanf(vsize,"%ld",&nBytes) == 1) {
switch (nBytes) {
case 0:
useVmem = FALSE;
break;
case DEFAULT_vMEMSIZE:
useVmem = TRUE;
vMemSize = DEFAULT_vMEMSIZE;
break;
default:
useVmem = FALSE; /* Until the mystery is solved... */
vMemSize = nBytes;
}
if (useVmem) {
char *vmask = getenv("CDF_VMASK");
if (vmask != NULL) {
uInt tMask = 0;
if (strstr(vmask,"EMS") != NULL ||
strstr(vmask,"ems") != NULL) tMask |= _VM_EMS;
if (strstr(vmask,"XMS") != NULL ||
strstr(vmask,"xms") != NULL) tMask |= _VM_XMS;
if (strstr(vmask,"DISK") != NULL ||
strstr(vmask,"disk") != NULL) tMask |= _VM_DISK;
if (tMask != 0) vMemMask = tMask;
}
}
}
}
first = FALSE;
}
#endif
/****************************************************************************
* Scan list of arguments.
****************************************************************************/
while (Va.fnc != NULL_) {
switch (Va.fnc) {
case CREATE_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (second) {
if (CDFgetFileBackwardEnvVar() == 1) {
CDFsetFileBackward2 (BACKWARDFILEon);
}
second = FALSE;
}
if (Va.item == CDF_ && CDFgetFileBackward() == 1) {
if (!sX(CDFcre(&Va,CUR),&pStatus)) return pStatus;
} else if (Va.item == CDF_ && CDFgetFileBackward() == 0) {
if (!sX(CDFcre64(&Va,CUR),&pStatus)) return pStatus;
} else {
if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
if (!sX(CDFcre(&Va,CUR),&pStatus)) return pStatus;
} else {
if (!sX(CDFcre64(&Va,CUR),&pStatus)) return pStatus;
}
}
if (Va.fnc == Va.item) break;
}
break;
case OPEN_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (!sX(CDFope(&Va,CUR),&pStatus)) return pStatus;
if (Va.fnc == Va.item) break;
}
break;
case DELETE_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
if (!sX(CDFdel(&Va,CUR),&pStatus)) return pStatus;
} else {
if (!sX(CDFdel64(&Va,CUR),&pStatus)) return pStatus;
}
if (Va.fnc == Va.item) break;
}
break;
case CLOSE_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
if (!sX(CDFclo(&Va,CUR),&pStatus)) return pStatus;
} else {
if (!sX(CDFclo64(&Va,CUR),&pStatus)) return pStatus;
}
if (Va.fnc == Va.item) break;
}
break;
case SELECT_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
if (!sX(CDFsel(&Va,CUR),&pStatus)) return pStatus;
} else {
if (!sX(CDFsel64(&Va,CUR),&pStatus)) return pStatus;
}
if (Va.fnc == Va.item) break;
}
break;
case CONFIRM_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
if (!sX(CDFcon(&Va,CUR),&pStatus)) return pStatus;
} else {
if (!sX(CDFcon64(&Va,CUR),&pStatus)) return pStatus;
}
if (Va.fnc == Va.item) break;
}
break;
case GET_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (Va.item == CDF_INFO_) {
if (!sX(CDFget64(&Va,CUR),&pStatus)) return pStatus;
} else if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
if (!sX(CDFget(&Va,CUR),&pStatus)) return pStatus;
} else {
if (!sX(CDFget64(&Va,CUR),&pStatus)) return pStatus;
}
if (Va.fnc == Va.item) break;
}
break;
case PUT_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
if (!sX(CDFput1(&Va,CUR),&pStatus)) return pStatus;
} else {
if (!sX(CDFput1_64(&Va,CUR),&pStatus)) return pStatus;
}
if (Va.fnc == Va.item) break;
}
break;
case SAVE_:
for (;;) {
Va.item = va_arg (Va.ap, long);
if (!sX(CDFsav(&Va,CUR),&pStatus)) return pStatus;
if (Va.fnc == Va.item) break;
}
break;
default: {
va_end (Va.ap);
return BAD_FNC_OR_ITEM;
}
}
}
va_end (Va.ap);
return pStatus;
}
syntax highlighted by Code2HTML, v. 0.9.1