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