1 /******************************************************************************
2 *
3 * SPDF/CDF Sample program for operating attributes/entries in a CDF.
4 *
5 * Version 1.0, 09-Dec-05
6 *
7 * Modification history:
8 *
9 * V1.0 09-Dec-05, M Liu Original version (for CDF V3.1).
10 * A simple program to add and delete
11 * attributes/entries to and from a CDF.
12 * The global attributes apply to the CDF as a
13 * whole, variable attributes
14 * apply to variables, zVariables in this sample
15 * program. It also shows how to respecify and
16 * verify the specifications of the entries.
17 ******************************************************************************/
18
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22
23 #include "cdf.h"
24
25 #define EXIT_SUCCESS_ 0
26 #define EXIT_FAILURE_ 1
27
28 /******************************************************************************
29 * Macros/prototypes.
30 ******************************************************************************/
31
32 void QuitCDF PROTOARGs((char *where, CDFstatus status));
33
34 /******************************************************************************
35 * Main.
36 ******************************************************************************/
37
main()38 int main () {
39 CDFid id;
40 CDFstatus status;
41 static long dimSizes[1] = { 2 };
42 static long dimSizes1[2] = { 2, 3 };
43 static long dimSizes2[1] = { 5 };
44 static long var1DataType = { CDF_INT2 };
45 static long var2DataType = { CDF_CHAR };
46 static long var1NumElements = { 1 };
47 static long var2NumElements = { 8 };
48 long var1Num_out, var2Num_out;
49 static long var1RecVariance = { VARY };
50 static long var2RecVariance = { VARY };
51 static long var1DimVariances[2] = { VARY, VARY };
52 static long var2DimVariances[1] = { VARY };
53 static char var1Name[] = "VAR1a";
54 static char var2Name[] = "zVARa1";
55 long attrNum_out;
56 static long entryNum = { 2 };
57 long maxEntry_out;
58 static long attrScope = { GLOBAL_SCOPE };
59 static long attrScope2 = { VARIABLE_SCOPE };
60 static long attrScope3 = { VARIABLE_SCOPE };
61 long attrScope_out;
62 static long entryDataType = { CDF_INT2 };
63 static long entryDataTypeNew = { CDF_UINT2 };
64 long entryDataType_out;
65 static long entryNumElems = { 1 };
66 long entryNumElems_out;
67 static short entryValue = { 1 };
68 short entryValue_out;
69 long numAttrs_out;
70 int i;
71 static char attrName[] = "ATTR1";
72 static char attrName2[] = "ATTR2";
73 static char attrName3[] = "ATTR3";
74 static char new_attrName[] = "ATTR1a";
75 char attrName_out[CDF_ATTR_NAME_LEN256];
76 static char zEntryValue1 = { 4 };
77 char zEntryValueOut1;
78 static double zEntryValue2 = { 4.0 };
79 double zEntryValueOut2;
80 long maxGentry, numGentries,
81 maxZentry, numZentries, numGattrs, numVattrs;
82 long entryNumOut1, entryNumOut2, entryNumOut3;
83
84 /******************************************************************************
85 * Create CDF.
86 ******************************************************************************/
87 /* CDFsetFileBackwardFlag(BACKWARDFILEon); */
88 status = CDFlib (CREATE_, CDF_, "TEST", 0L, dimSizes, &id,
89 NULL_);
90
91 if (status < CDF_OK) {
92 if (status == CDF_EXISTS) {
93 status = CDFlib (OPEN_, CDF_, "TEST", &id,
94 NULL_);
95 if (status < CDF_OK) QuitCDF ("1.0", status);
96
97 status = CDFlib (DELETE_, CDF_,
98 NULL_);
99 if (status < CDF_OK) QuitCDF ("1.1", status);
100
101 status = CDFlib (CREATE_, CDF_, "TEST", 0L, dimSizes, &id,
102 NULL_);
103 if (status < CDF_OK) QuitCDF ("1.2", status);
104 }
105 else
106 QuitCDF ("1.3", status);
107 }
108
109 /******************************************************************************
110 * Create variables.
111 ******************************************************************************/
112
113 status = CDFlib (CREATE_, zVAR_, var1Name, var1DataType, var1NumElements,
114 2L, dimSizes1,
115 var1RecVariance, var1DimVariances,
116 &var1Num_out,
117 NULL_);
118 if (status < CDF_OK) QuitCDF ("2.0", status);
119
120 status = CDFlib (CREATE_, zVAR_, var2Name, var2DataType, var2NumElements,
121 1L, dimSizes2,
122 var2RecVariance, var2DimVariances,
123 &var2Num_out,
124 NULL_);
125 if (status < CDF_OK) QuitCDF ("2.1", status);
126
127 /******************************************************************************
128 * Create attributes.
129 ******************************************************************************/
130
131 status = CDFlib (CREATE_, ATTR_, attrName, attrScope, &attrNum_out,
132 ATTR_, attrName2, attrScope2, &attrNum_out,
133 ATTR_, attrName3, attrScope3, &attrNum_out,
134 NULL_);
135 if (status < CDF_OK) QuitCDF ("3.0", status);
136
137 /******************************************************************************
138 * Write to attributes.
139 ******************************************************************************/
140
141 status = CDFlib (SELECT_, ATTR_, 0L,
142 gENTRY_, entryNum,
143 PUT_, gENTRY_DATA_, entryDataType, entryNumElems,
144 &entryValue,
145 SELECT_, ATTR_, 1L,
146 zENTRY_NAME_, var1Name,
147 PUT_, zENTRY_DATA_, CDF_BYTE, 1L, &zEntryValue1,
148 SELECT_, ATTR_, 2L,
149 zENTRY_NAME_, var2Name,
150 PUT_, zENTRY_DATA_, CDF_REAL8, 1L, &zEntryValue2,
151 NULL_);
152 if (status < CDF_OK) QuitCDF ("4.0", status);
153
154 /******************************************************************************
155 * Confirm entry numbers.
156 ******************************************************************************/
157
158 status = CDFlib (SELECT_, ATTR_, 0L,
159 CONFIRM_, gENTRY_, &entryNumOut1,
160 SELECT_, ATTR_, 1L,
161 CONFIRM_, zENTRY_, &entryNumOut2,
162 SELECT_, ATTR_, 2L,
163 CONFIRM_, zENTRY_, &entryNumOut3,
164 NULL_);
165 if (status < CDF_OK) QuitCDF ("5.0", status);
166
167 if (entryNumOut1 != 2) QuitCDF ("5.1", status);
168 if (entryNumOut2 != 1) QuitCDF ("5.2", status);
169 if (entryNumOut3 != 1) QuitCDF ("5.3", status);
170
171 /******************************************************************************
172 * Read from attributes.
173 ******************************************************************************/
174
175 status = CDFlib (SELECT_, ATTR_, 0L,
176 gENTRY_, entryNum,
177 CONFIRM_, CURgENTRY_EXISTENCE_,
178 GET_, gENTRY_DATA_, &entryValue_out,
179 SELECT_, ATTR_, 1L,
180 zENTRY_, 0L,
181 CONFIRM_, CURzENTRY_EXISTENCE_,
182 GET_, zENTRY_DATA_, &zEntryValueOut1,
183 SELECT_, ATTR_, 2L,
184 zENTRY_, 1L,
185 CONFIRM_, CURzENTRY_EXISTENCE_,
186 GET_, zENTRY_DATA_, &zEntryValueOut2,
187 NULL_);
188 if (status < CDF_OK) QuitCDF ("6.0", status);
189
190 if (entryValue_out != entryValue) QuitCDF ("6.1", status);
191 if (zEntryValue1 != zEntryValueOut1) QuitCDF ("6.2", status);
192 if (zEntryValue2 != zEntryValueOut2) QuitCDF ("6.3", status);
193
194 /******************************************************************************
195 * Confirm existence of attributes/entries.
196 ******************************************************************************/
197
198 status = CDFlib (CONFIRM_, ATTR_EXISTENCE_, attrName3,
199 NULL_);
200 if (status < CDF_OK) QuitCDF ("7.0", status);
201
202 status = CDFlib (SELECT_, ATTR_, 0L,
203 CONFIRM_, gENTRY_EXISTENCE_, entryNum,
204 SELECT_, ATTR_, 1L,
205 CONFIRM_, zENTRY_EXISTENCE_, 0L,
206 SELECT_, ATTR_, 2L,
207 CONFIRM_, zENTRY_EXISTENCE_, 1L,
208 NULL_);
209 if (status < CDF_OK) QuitCDF ("7.1", status);
210
211 /******************************************************************************
212 * Inquire CDF.
213 ******************************************************************************/
214
215 status = CDFlib (GET_, CDF_NUMATTRS_, &numAttrs_out,
216 NULL_);
217 if (status < CDF_OK) QuitCDF ("8.0", status);
218
219 if (numAttrs_out != 3) QuitCDF ("8.1", status);
220
221 /******************************************************************************
222 * Rename attribute.
223 ******************************************************************************/
224
225 status = CDFlib (SELECT_, ATTR_NAME_, attrName,
226 PUT_, ATTR_NAME_, new_attrName,
227 NULL_);
228 if (status < CDF_OK) QuitCDF ("9.0", status);
229
230 /******************************************************************************
231 * Inquire attribute.
232 ******************************************************************************/
233
234 status = CDFlib (GET_, ATTR_NAME_, attrName_out,
235 ATTR_SCOPE_, &attrScope_out,
236 ATTR_MAXgENTRY_, &maxEntry_out,
237 CONFIRM_, ATTR_, &attrNum_out,
238 NULL_);
239 if (status < CDF_OK) QuitCDF ("10.0", status);
240
241 if (strcmp(attrName_out,new_attrName) != 0) QuitCDF ("10.1", status);
242 if (attrScope_out != attrScope) QuitCDF ("10.2", status);
243 if (maxEntry_out != entryNum) QuitCDF ("10.3", status);
244 if (attrNum_out != 0L) QuitCDF ("10.4", status);
245
246 /******************************************************************************
247 * Inquire attribute entries.
248 ******************************************************************************/
249
250 status = CDFlib (SELECT_, ATTR_, 0L,
251 gENTRY_, entryNum,
252 GET_, gENTRY_DATATYPE_, &entryDataType_out,
253 gENTRY_NUMELEMS_, &entryNumElems_out,
254 NULL_);
255 if (status < CDF_OK) QuitCDF ("11.0", status);
256
257 if (entryDataType_out != entryDataType) QuitCDF ("11.1", status);
258 if (entryNumElems_out != entryNumElems) QuitCDF ("11.2", status);
259
260 status = CDFlib (SELECT_, ATTR_, 1L,
261 zENTRY_, 0L,
262 GET_, zENTRY_DATATYPE_, &entryDataType_out,
263 zENTRY_NUMELEMS_, &entryNumElems_out,
264 NULL_);
265 if (status < CDF_OK) QuitCDF ("11.3", status);
266
267 if (entryDataType_out != CDF_BYTE) QuitCDF ("11.4", status);
268 if (entryNumElems_out != 1L) QuitCDF ("11.5", status);
269
270 status = CDFlib (SELECT_, ATTR_, 2L,
271 zENTRY_, 1L,
272 GET_, zENTRY_DATATYPE_, &entryDataType_out,
273 zENTRY_NUMELEMS_, &entryNumElems_out,
274 NULL_);
275 if (status < CDF_OK) QuitCDF ("11.6", status);
276
277 if (entryDataType_out != CDF_REAL8) QuitCDF ("11.7", status);
278 if (entryNumElems_out != 1L) QuitCDF ("11.8", status);
279
280 /******************************************************************************
281 * Inquire CDF.
282 ******************************************************************************/
283
284 status = CDFlib (SELECT_, ATTR_, 0L,
285 GET_, CDF_NUMgATTRS_, &numGattrs,
286 CDF_NUMvATTRS_, &numVattrs,
287 ATTR_MAXgENTRY_, &maxGentry,
288 ATTR_NUMgENTRIES_, &numGentries,
289 SELECT_, ATTR_, 1L,
290 GET_, ATTR_MAXzENTRY_, &maxZentry,
291 ATTR_NUMzENTRIES_, &numZentries,
292 NULL_);
293 if (status < CDF_OK) QuitCDF ("12.0", status);
294
295 if (numGattrs != 1) QuitCDF ("12.1", status);
296 if (numVattrs != 2) QuitCDF ("12.2", status);
297 if (maxGentry != entryNum) QuitCDF ("12.3", status);
298 if (numGentries != 1) QuitCDF ("12.4", status);
299 if (maxZentry != 0) QuitCDF ("12.5", status);
300 if (numZentries != 1) QuitCDF ("12.6", status);
301
302 /******************************************************************************
303 * Modify entries/attribute.
304 ******************************************************************************/
305
306 status = CDFlib (SELECT_, ATTR_, 0L,
307 gENTRY_, entryNum,
308 PUT_, gENTRY_DATASPEC_, entryDataTypeNew, entryNumElems,
309 SELECT_, ATTR_, 1L,
310 zENTRY_, 0L,
311 PUT_, zENTRY_DATASPEC_, CDF_UINT1, 1L,
312 SELECT_, ATTR_, 2L,
313 zENTRY_, 1L,
314 PUT_, zENTRY_DATASPEC_, CDF_EPOCH, 1L,
315 SELECT_, ATTR_, 0L,
316 PUT_, ATTR_SCOPE_, VARIABLE_SCOPE,
317 ATTR_SCOPE_, GLOBAL_SCOPE,
318 NULL_);
319 if (status < CDF_OK) QuitCDF ("13.0", status);
320
321 /******************************************************************************
322 * Delete entries/attribute/variables.
323 ******************************************************************************/
324
325 status = CDFlib (SELECT_, ATTR_, 0L,
326 gENTRY_, entryNum,
327 DELETE_, gENTRY_,
328 SELECT_, ATTR_, 1L,
329 zENTRY_, 0L,
330 DELETE_, zENTRY_,
331 SELECT_, ATTR_, 2L,
332 zENTRY_, 1L,
333 DELETE_, zENTRY_,
334 SELECT_, ATTR_, 0L,
335 DELETE_, ATTR_,
336 NULL_);
337 if (status < CDF_OK) QuitCDF ("14.0", status);
338
339 /******************************************************************************
340 * Close CDF.
341 ******************************************************************************/
342
343 status = CDFlib (CLOSE_, CDF_,
344 NULL_);
345 if (status < CDF_OK) QuitCDF ("15.0", status);
346
347 /******************************************************************************
348 * Successful completion.
349 ******************************************************************************/
350
351 return EXIT_SUCCESS_;
352 }
353
354
355 /******************************************************************************
356 * QuitCDF.
357 ******************************************************************************/
358
QuitCDF(where,status)359 void QuitCDF (where, status)
360 char *where;
361 CDFstatus status;
362 {
363 char text[CDF_STATUSTEXT_LEN+1];
364 printf ("Aborting at %s...\n", where);
365 if (status < CDF_OK) {
366 CDFlib (SELECT_, CDF_STATUS_, status,
367 GET_, STATUS_TEXT_, text,
368 NULL_);
369 printf ("%s\n", text);
370 }
371 CDFlib (CLOSE_, CDF_,
372 NULL_);
373 printf ("...test aborted.\n");
374 exit (EXIT_FAILURE_);
375 }
376