1 /******************************************************************************
2 *
3 *  NSSDC/CDF                                    INTERNAL interface to CDF.
4 *
5 *  Version 2.8b, 8-Mar-97, Hughes STX.
6 *
7 *  Modification history:
8 *
9 *   V1.0  22-Jan-91, R Kulkarni		Original version (for CDF V2.0).
10 *		     J Love
11 *   V2.0   6-Jun-91, J Love             Renamed (was cdfcore.c). Modified for
12 *                                       V2.1 style INTERNAL interface (and
13 *                                       fixes to CDF V2.0 distribution).  Also
14 *                                       renamed some symbols for clarity.
15 *   V2.1  24-Jun-91, J Love             Fixed PUT_,VAR_INITIALRECS.  Stripped
16 *                                       trailing blanks off of CDF names.
17 *                                       Allow variable data type to be changed
18 *                                       if "equivalent".  Added CDF_EPOCH as
19 *                                       a data type.
20 *   V2.2   8-Aug-91, J Love             Don't use #elif (for SGi port) and
21 *                                       added support for Cray/UNICOS.
22 *                                       INTERNAL i/f function renamed 'CDFlib'.
23 *                                       Different numbers of CACHE buffers for
24 *                                       different file types (VIO).  Modified
25 *                                       hyper access (and fixed part of it).
26 *                                       Changed attribute entry access.  Check
27 *                                       for supported encoding when opening a
28 *                                       CDF.
29 *   V2.3  20-May-92, J Love             Changed for IBM-PC port (split into
30 *                                       smaller source files, etc.).  Made
31 *                                       shareable.
32 *   V2.4  21-Aug-92, J Love             CDF V2.3 (shareable/NeXT/zVar).
33 *   V2.5  19-Jan-94, J Love             CDF V2.4.
34 *   V2.6  15-Dec-94, J Love             CDF V2.5.
35 *   V2.6a 24-Feb-95, J Love		Solaris 2.3 IDL i/f.
36 *   V2.7  19-Jul-95, J Love		Virtual memory (Microsoft C 7.00).
37 *   V2.7a 22-Sep-95, J Love		Changed virtual memory control.
38 *   V2.8  19-Aug-96, J Love		CDF V2.6.
39 *   V2.8a 14-Feb-97, J Love		Fixed `va_arg' usage.
40 *   V2.8b  8-Mar-97, J Love		Windows NT for MS Visual C++ 4 on an
41 *					IBM PC.
42 *
43 ******************************************************************************/
44 
45 #define CDFLIB
46 #include "cdflib.h"
47 #include "cdflib64.h"
48 
49 #if defined(BUILDINGforIDL)
50 #define CUR Cur
51 #else
52 static struct CurStruct Cur = { RESERVED_CDFID, RESERVED_CDFSTATUS };
53 #define CUR &Cur
54 #endif
55 
56 #if defined(MICROSOFTC_700) && INCLUDEvMEMORY
57 static Logical first = TRUE;
58 #endif
59 
60 static Logical second = TRUE;
61 
62 /******************************************************************************
63 * CDFlib.
64 ******************************************************************************/
65 
66 #if defined(STDARG)
67 #if defined(BUILDINGforIDL)
CDFlib(struct CurStruct * Cur,long requiredFnc,...)68 VISIBLE_PREFIX CDFstatus CDFlib (struct CurStruct *Cur, long requiredFnc, ...)
69 #else
70 VISIBLE_PREFIX CDFstatus CDFlib (long requiredFnc, ...)
71 #endif
72 #else
73 VISIBLE_PREFIX CDFstatus CDFlib (va_alist)
74 va_dcl
75 #endif
76 {
77   CDFstatus pStatus = CDF_OK;
78   struct VAstruct Va;
79 #if defined(BUILDINGforIDL)
80 #if defined(VARARGS)
81   struct CurStruct *Cur;
82 #endif
83 #endif
84   /****************************************************************************
85   * Process variable length argument list.
86   ****************************************************************************/
87 #if defined(STDARG)
88   va_start (Va.ap, requiredFnc);
89   Va.fnc = requiredFnc;
90 #else
91   VA_START (Va.ap);
92 #if defined(BUILDINGforIDL)
93   Cur = va_arg (Va.ap, struct CurStruct *);
94 #endif
95   Va.fnc = va_arg (Va.ap, long);
96 #endif
97   /****************************************************************************
98   * Initialize virtual memory parameters for Microsoft C 7.00.
99   ****************************************************************************/
100 #if defined(MICROSOFTC_700) && INCLUDEvMEMORY
101   if (first) {
102     char *vsize = getenv("CDF_VSIZE");
103     if (vsize != NULL) {
104       long nBytes;
105       if (sscanf(vsize,"%ld",&nBytes) == 1) {
106         switch (nBytes) {
107 	  case 0:
108 	    useVmem = FALSE;
109 	    break;
110 	  case DEFAULT_vMEMSIZE:
111 	    useVmem = TRUE;
112 	    vMemSize = DEFAULT_vMEMSIZE;
113 	    break;
114 	  default:
115 	    useVmem = FALSE;	/* Until the mystery is solved... */
116 	    vMemSize = nBytes;
117         }
118         if (useVmem) {
119 	  char *vmask = getenv("CDF_VMASK");
120 	  if (vmask != NULL) {
121 	    uInt tMask = 0;
122 	    if (strstr(vmask,"EMS") != NULL ||
123 	        strstr(vmask,"ems") != NULL) tMask |= _VM_EMS;
124 	    if (strstr(vmask,"XMS") != NULL ||
125 	        strstr(vmask,"xms") != NULL) tMask |= _VM_XMS;
126 	    if (strstr(vmask,"DISK") != NULL ||
127 	        strstr(vmask,"disk") != NULL) tMask |= _VM_DISK;
128 	    if (tMask != 0) vMemMask = tMask;
129           }
130         }
131       }
132     }
133     first = FALSE;
134   }
135 #endif
136 
137   /****************************************************************************
138   * Scan list of arguments.
139   ****************************************************************************/
140   while (Va.fnc != NULL_) {
141     switch (Va.fnc) {
142       case CREATE_:
143         for (;;) {
144 	   Va.item = va_arg (Va.ap, long);
145 	   if (second) {
146 	     if (CDFgetFileBackwardEnvVar() == 1) {
147 		 CDFsetFileBackward2 (BACKWARDFILEon);
148 	     }
149 	     second = FALSE;
150 	   }
151            if (Va.item == CDF_ && CDFgetFileBackward() == 1) {
152              if (!sX(CDFcre(&Va,CUR),&pStatus)) return pStatus;
153            } else if (Va.item == CDF_ && CDFgetFileBackward() == 0) {
154              if (!sX(CDFcre64(&Va,CUR),&pStatus)) return pStatus;
155 	   } else {
156              if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
157                if (!sX(CDFcre(&Va,CUR),&pStatus)) return pStatus;
158              } else {
159                if (!sX(CDFcre64(&Va,CUR),&pStatus)) return pStatus;
160              }
161            }
162 	   if (Va.fnc == Va.item) break;
163         }
164         break;
165       case OPEN_:
166         for (;;) {
167 	   Va.item = va_arg (Va.ap, long);
168 	   if (!sX(CDFope(&Va,CUR),&pStatus)) return pStatus;
169 	   if (Va.fnc == Va.item) break;
170         }
171         break;
172       case DELETE_:
173         for (;;) {
174 	   Va.item = va_arg (Va.ap, long);
175 	   if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
176 	     if (!sX(CDFdel(&Va,CUR),&pStatus)) return pStatus;
177 	   } else {
178 	     if (!sX(CDFdel64(&Va,CUR),&pStatus)) return pStatus;
179 	   }
180 	   if (Va.fnc == Va.item) break;
181         }
182         break;
183       case CLOSE_:
184         for (;;) {
185 	   Va.item = va_arg (Va.ap, long);
186 	   if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
187 	     if (!sX(CDFclo(&Va,CUR),&pStatus)) return pStatus;
188 	   } else {
189 	     if (!sX(CDFclo64(&Va,CUR),&pStatus)) return pStatus;
190 	   }
191 	   if (Va.fnc == Va.item) break;
192         }
193         break;
194       case SELECT_:
195         for (;;) {
196 	   Va.item = va_arg (Va.ap, long);
197 	   if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
198 	     if (!sX(CDFsel(&Va,CUR),&pStatus)) return pStatus;
199 	   } else {
200 	     if (!sX(CDFsel64(&Va,CUR),&pStatus)) return pStatus;
201 	   }
202 	   if (Va.fnc == Va.item) break;
203         }
204         break;
205       case CONFIRM_:
206         for (;;) {
207 	   Va.item = va_arg (Va.ap, long);
208 	   if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
209 	     if (!sX(CDFcon(&Va,CUR),&pStatus)) return pStatus;
210 	   } else {
211 	     if (!sX(CDFcon64(&Va,CUR),&pStatus)) return pStatus;
212 	   }
213 	   if (Va.fnc == Va.item) break;
214         }
215         break;
216       case GET_:
217         for (;;) {
218 	   Va.item = va_arg (Va.ap, long);
219            if (Va.item == CDF_INFO_) {
220              if (!sX(CDFget64(&Va,CUR),&pStatus)) return pStatus;
221            } else if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
222 	     if (!sX(CDFget(&Va,CUR),&pStatus)) return pStatus;
223 	   } else {
224 	     if (!sX(CDFget64(&Va,CUR),&pStatus)) return pStatus;
225 	   }
226 	   if (Va.fnc == Va.item) break;
227         }
228         break;
229       case PUT_:
230         for (;;) {
231 	   Va.item = va_arg (Va.ap, long);
232 	   if (*CUR.cdf != NULL && !isLFS(*CUR.cdf)) {
233 	     if (!sX(CDFput1(&Va,CUR),&pStatus)) return pStatus;
234 	   } else {
235 	     if (!sX(CDFput1_64(&Va,CUR),&pStatus)) return pStatus;
236 	   }
237 	   if (Va.fnc == Va.item) break;
238         }
239         break;
240 
241       case SAVE_:
242         for (;;) {
243            Va.item = va_arg (Va.ap, long);
244            if (!sX(CDFsav(&Va,CUR),&pStatus)) return pStatus;
245            if (Va.fnc == Va.item) break;
246         }
247         break;
248 
249       default: {
250         va_end (Va.ap);
251         return BAD_FNC_OR_ITEM;
252       }
253     }
254   }
255   va_end (Va.ap);
256   return pStatus;
257 }
258 
259