1/* This is part of the netCDF package.
2   Copyright 2006 University Corporation for Atmospheric Research/Unidata.
3   See COPYRIGHT file for conditions of use.
4
5   This is a very simple example which tests rejection of bad names for
6   netCDF data objects, including names with "/" character, trailing spaces,
7   leading special characters, and invalid UTF-8 strings.
8
9   $Id: tst_names.c 2792 2014-10-27 06:02:59Z wkliao $
10*/
11#include <config.h>
12#include <stdlib.h>
13#include <stdio.h>
14#include <string.h>
15#include <netcdf.h>
16#ifdef USE_PARALLEL
17#include <netcdf_par.h>
18#endif
19#include <nc_tests.h>
20#include "err_macros.h"
21
22/* The data file we will create. */
23#define FILE_NAME "tst_names.nc"
24#define NDIMS 1
25#define DIMLEN 1
26
27#define ERROR {printf("Error at line %d: %s\n",__LINE__,nc_strerror(res)); continue;}
28#define ERRORI {printf("Error at line %d (loop=%d): %s\n",__LINE__,i,nc_strerror(res)); continue;}
29
30int
31main(int argc, char **argv)
32{
33   char *valid[] = {
34       /* pressure in 23 languages */
35       "\xd8\xa7\xd9\x84\xd8\xb6\xd8\xba\xd8\xb7",
36       "\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8f\xd0\xb3\xd0\xb0\xd0\xbd\xd0\xb5",
37       "\xe5\x8e\x8b\xe5\x8a\x9b",
38       "\xe5\xa3\x93\xe5\x8a\x9b",
39       "pritisak",
40       "tlaku",
41       "pres",
42       "druk",
43       "pressure",
44       "paine",
45       "pression",
46       "Druck",
47       "\xcf\x80\xce\xaf\xce\xb5\xcf\x83\xce\xb7",
48       "\xe0\xa4\xa6\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb5",
49       "pressione",
50       "\xe5\x9c\xa7\xe5\x8a\x9b",
51       "\xec\x95\x95\xeb\xa0\xa5",
52       "press",
53       "ci\xc5\x9bnienie",
54       "Press\xc3\xa3o",
55       "presiune",
56       "\xd0\xb4\xd0\xb0\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5",
57       "presi\xc3\xb3n",
58       /* special characters in names, numeric characters at the start of names */
59       "has blank",
60       "has:colon",
61       "a",
62       "A",
63       "0leading_numeric_char",
64       "1",
65       "0x123"
66   };
67   char *notvalid[] = {
68       "-leading_special_char",
69       "trailing_space ",
70       "trailing_tab\t",
71       "trailing_newline\n",
72       "has_control_char_\a_in_name",
73       "has ascii_del_\x7f_in name",
74       /* Invalid UTF-8 of various sorts, thanks to Markus Kuhn */
75       "\xA0\xB0\xC0\xD0",
76       "xyz\x80",  /* unexpected continuation bytes */
77       "\x80xyz",
78       "xyz\xBF",
79       "\xBFxyz",
80       "\xC0xyz", /* lonely start characters */
81       "x\xC0yz",
82       "xy\xC0z",
83       "xyz\xC0",
84       "\xDFxyz",
85       "x\xDFyz",
86       "xy\xDFz",
87       "xyz\xDF",
88       "\xE0xyz",
89       "x\xE0yz",
90       "xy\xE0z",
91       "xyz\xE0",
92       "\xE0\xBFxy",
93       "x\xE0\xBFy",
94       "xy\xE0\xBF",
95       "\xEFxyz",
96       "x\xEFyz",
97       "xy\xEFz",
98       "xyz\xEF",
99       "\xEF\x80xy",
100       "x\xEF\x80y",
101       "xy\xEF\x80",
102       "\xF0xyz",
103       "x\xF0yz",
104       "xy\xF0z",
105       "xyz\xF0",
106       "\xF7xyz",
107       "x\xF7yz",
108       "xy\xF7z",
109       "xyz\xF7",
110       "\xF8xyz",
111       "x\xF8yz",
112       "xy\xF8z",
113       "xyz\xF8",
114       "\xFBxyz",
115       "x\xFByz",
116       "xy\xFBz",
117       "xyz\xFB",
118       "\xFCxyz",
119       "x\xFCyz",
120       "xy\xFCz",
121       "xyz\xFC",
122       "\xFDxyz",
123       "x\xFDyz",
124       "xy\xFDz",
125       "xyz\xFD",
126       "\xC0\xC0xy", /* last continuation byte missing */
127       "x\xC0\xC0y",
128       "xy\xC0\xC0",
129       "\xDF\xDFxy",
130       "x\xDF\xDFy",
131       "xy\xDF\xDF",
132       "\xE0\x80xy",
133       "x\xE0\x80y",
134       "xy\xE0\x80",
135       "\xEF\x80xy",
136       "x\xEF\x80y",
137       "xy\xEF\x80",
138       "\xF0\x80\x80x",
139       "x\xF0\x80\x80",
140       "\xF7\x80\x80x",
141       "x\xF7\x80\x80",
142       "\xF8\x80\x80\x80x",
143       "x\xF8\x80\x80\x80",
144       "\xFB\x80\x80\x80x",
145       "x\xFB\x80\x80\x80",
146       "\xFC\x80\x80\x80\x80x",
147       "x\xFC\x80\x80\x80\x80",
148       "\xFD\x80\x80\x80\x80x",
149       "x\xFD\x80\x80\x80\x80",
150       "\xFExyz", /* impossible bytes */
151       "x\xFEyz",
152       "xy\xFEz",
153       "xyz\xFE",
154       "\xFFxyz",
155       "x\xFFyz",
156       "xy\xFFz",
157       "xyz\xFF",
158       "\xC0\xAFxy", /* overlong sequences */
159       "x\xC0\xAFy",
160       "xy\xC0\xAF",
161       "\xE0\x80\xAFx",
162       "x\xE0\x80\xAF",
163       "\xF0\x80\x80\xAFx",
164       "x\xF0\x80\x80\xAF",
165       "\xF8\x80\x80\x80\xAFx",
166       "x\xF8\x80\x80\x80\xAF",
167       "\xFC\x80\x80\x80\x80\xAFx",
168       "x\xFC\x80\x80\x80\x80\xAF",
169       "\xC1\xBFxy",
170       "x\xC1\xBFy",
171       "xy\xC1\xBF",
172       "\xE0\x9F\xBFx",
173       "x\xE0\x9F\xBF",
174       "\xF0\x8F\xBF\xBFx",
175       "x\xF0\x8F\xBF\xBF",
176       "\xF8\x87\xBF\xBF\xBFx",
177       "x\xF8\x87\xBF\xBF\xBF",
178       "\xFC\x83\xBF\xBF\xBF\xBFx",
179       "x\xFC\x83\xBF\xBF\xBF\xBF",
180       "x\xC0\x80", /* overlong NULs */
181       "x\xE0\x80\x80",
182       "x\xF0\x80\x80\x80",
183       "x\xF8\x80\x80\x80\x80",
184       "x\xFC\x80\x80\x80\x80\x80",
185       /* single UTF-16 surrogates */
186       "x\xED\xA0\x80",
187       "x\xED\xAD\xBF",
188       "x\xED\xAE\x80",
189       "x\xED\xAF\xBF",
190       "x\xED\xB0\x80",
191       "x\xED\xBE\x80",
192       "x\xED\xBF\xBF",
193       "x\xED\xA0\x80\xED\xB0\x80", /* paired UTF-16 surrogates */
194       "x\xED\xA0\x80\xED\xBF\xBF",
195       "x\xED\xAD\xBF\xED\xB0\x80",
196       "x\xED\xAD\xBF\xED\xBF\xBF",
197       "x\xED\xAE\x80\xED\xB0\x80",
198       "x\xED\xAE\x80\xED\xBF\xBF",
199       "x\xED\xAF\xBF\xED\xB0\x80",
200       "x\xED\xAF\xBF\xED\xBF\xBF",
201       "x\xEF\xBF\xBE", /* other illegal code positions */
202       "x\xEF\xBF\xBF"
203   };
204   int ij;
205#define NUM_BAD (sizeof notvalid / sizeof notvalid[0])
206#define NUM_GOOD (sizeof valid / sizeof valid[0])
207   int nciddimidvaridres;
208   double attvals[] = {-2.0};
209   double attvals_in[1];
210#define NATTVALS (sizeof attvals / sizeof attvals[0])
211   char *attstring = "text";
212#define MAX_ATTSTRING_LEN 100
213   char attstr_in[MAX_ATTSTRING_LEN];
214   int dimids[NUM_GOOD];
215   int varids[NUM_GOOD];
216#if 0
217   int attnums[NUM_GOOD];
218#endif
219   char *testfile = FILE_NAME;
220   int formats[] = {
221       NC_FORMAT_CLASSIC
222       ,
223       NC_FORMAT_64BIT_OFFSET
224       ,
225       NC_FORMAT_CDF5
226#ifdef USE_NETCDF4
227       ,
228       NC_FORMAT_NETCDF4
229       ,
230       NC_FORMAT_NETCDF4_CLASSIC
231#endif /* USE_NETCDF4 */
232   };
233   int num_formats = (sizeof formats) / (sizeof formats[0]);
234   char *format_names[] = {
235       "classic", "64-bit offset", "64-bit data", "netCDF-4/HDF5", "netCDF-4 classic model"
236   };
237
238#ifdef TEST_PNETCDF
239   MPI_Init(&argc, &argv);
240#endif
241
242   printf("\n*** testing names with file %s...\n", testfile);
243   for (j = 0; j < num_formatsj++)
244   {
245       printf("*** switching to netCDF %s format...", format_names[j]);
246       nc_set_default_format(formats[j], NULL);
247#ifdef TEST_PNETCDF
248       if((res = nc_create_par(testfileNC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)))
249#else
250       if((res = nc_create(testfileNC_CLOBBER, &ncid)))
251#endif
252    ERROR
253
254       /* Define dimensions, variables, and attributes with various
255 * acceptable names */
256       for (i = 0; i < NUM_GOODi++) {
257    if ((res = nc_def_dim(ncidvalid[i], DIMLEN, &dimid)))
258        ERRORI
259
260    dimids[i] = dimid;
261    /* Define variable with same name */
262    if ((res = nc_def_var(ncidvalid[i], NC_FLOATNDIMS, &dimids[i],
263  &varid)))
264        ERRORI
265    varids[i] = varid;
266    /* Define variable and global attributes with same name and value */
267    if ((res = nc_put_att_text(ncidvaridvalid[i],
268       strlen(valid[i]), valid[i])))
269        ERRORI
270    if ((res = nc_put_att_double(ncidNC_GLOBALvalid[i], NC_DOUBLE,
271 NATTVALSattvals)))
272        ERRORI
273#if 0
274    attnums[i] = i;
275#endif
276       }
277
278       /* Try defining dimensions, variables, and attributes with various
279 * bad names and make sure these are rejected */
280       for (i = 0; i < NUM_BADi++) {
281    if ((res = nc_def_dim(ncidnotvalid[i], DIMLEN, &dimid))
282        != NC_EBADNAMEERRORI
283    if ((res = nc_def_var(ncidnotvalid[i], NC_FLOATNDIMSdimids,
284  &varid))
285        != NC_EBADNAMEERRORI
286    if ((res = nc_put_att_text(ncidvaridnotvalid[i],
287       strlen(attstring), attstring))
288        != NC_EBADNAMEERRORI
289    if ((res = nc_put_att_double(ncidNC_GLOBALnotvalid[i], NC_DOUBLE,
290 NATTVALSattvals))
291        != NC_EBADNAMEERRORI
292       }
293       if ((res = nc_enddef(ncid)))
294    ERROR
295       if ((res = nc_close(ncid)))
296    ERROR
297
298       /* Check it out, make sure all objects with good names were defined OK */
299#ifdef TEST_PNETCDF
300       if ((res = nc_open_par(testfileNC_NOWRITE|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL, &ncid)))
301#else
302       if ((res = nc_open(testfileNC_NOWRITE, &ncid)))
303#endif
304    ERROR
305       for (i = 0; i < NUM_GOODi++) {
306    size_t attlen;
307    if ((res = nc_inq_dimid(ncidvalid[i], &dimid)) ||
308        dimid != dimids[i])
309        ERRORI
310    if ((res = nc_inq_varid(ncidvalid[i], &varid)) ||
311        varid != varids[i])
312        ERRORI
313    res = nc_inq_attlen(ncidvaridvalid[i], &attlen);
314    if ((res = nc_get_att_text(ncidvaridvalid[i], attstr_in)))
315        ERRORI
316    attstr_in[attlen] = '\0';
317    if (strcmp(valid[i], attstr_in) != 0)
318        ERRORI
319    if ((res = nc_get_att_double(ncidNC_GLOBALvalid[i],
320 attvals_in))
321        || attvals[0] != attvals_in[0])
322        ERRORI
323       }
324       if ((res = nc_close(ncid)))
325    ERROR
326/*        (void) remove(testfile); */
327
328       SUMMARIZE_ERR;
329   }
330   FINAL_RESULTS;
331
332#ifdef TEST_PNETCDF
333   MPI_Finalize();
334#endif
335   return 0;
336}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed