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