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 NFC normalization of
6   Unicode names encoded with UTF-8.
7
8   $Id: tst_norm.c 2792 2014-10-27 06:02:59Z wkliao $
9*/
10#include <config.h>
11#include <stdlib.h>
12#include <stdio.h>
13#include <string.h>
14#include <netcdf.h>
15#ifdef USE_PARALLEL
16#include <netcdf_par.h>
17#endif
18#include <nc_tests.h>
19#include "err_macros.h"
20
21/* The data file we will create. */
22#define FILE7_NAME "tst_norm.nc"
23#define UNITS "units"
24#define NDIMS 1
25#define NX 18
26
27int
28main(int argc, char **argv)
29{
30   int nciddimidvarid;
31   int dimids[NDIMS];
32
33   /* unnormalized UTF-8 encoding for Unicode 8-character "Hello" in Greek: */
34   unsigned char uname_utf8[] = {
35       0x41,               /* LATIN CAPITAL LETTER A */
36       0xCC, 0x80, /* COMBINING GRAVE ACCENT */
37       0x41,               /* LATIN CAPITAL LETTER A */
38       0xCC, 0x81, /* COMBINING ACUTE ACCENT */
39       0x41,               /* LATIN CAPITAL LETTER A */
40       0xCC, 0x82, /* COMBINING CIRCUMFLEX ACCENT */
41       0x41,               /* LATIN CAPITAL LETTER A */
42       0xCC, 0x83, /* COMBINING TILDE */
43       0x41,               /* LATIN CAPITAL LETTER A */
44       0xCC, 0x88, /* COMBINING DIAERESIS */
45       0x41,               /* LATIN CAPITAL LETTER A */
46       0xCC, 0x8A, /* COMBINING RING ABOVE */
47       0x43, /* LATIN CAPITAL LETTER C */
48       0xCC, 0xA7, /* COMBINING CEDILLA */
49       0x45, /* LATIN CAPITAL LETTER E */
50       0xCC, 0x80, /* COMBINING GRAVE ACCENT */
51       0x45, /* LATIN CAPITAL LETTER E */
52       0xCC, 0x81, /* COMBINING ACUTE ACCENT */
53       0x45, /* LATIN CAPITAL LETTER E */
54       0xCC, 0x82, /* COMBINING CIRCUMFLEX ACCENT */
55       0x45, /* LATIN CAPITAL LETTER E */
56       0xCC, 0x88, /* COMBINING DIAERESIS */
57       0x49, /* LATIN CAPITAL LETTER I */
58       0xCC, 0x80, /* COMBINING GRAVE ACCENT */
59       0x49, /* LATIN CAPITAL LETTER I */
60       0xCC, 0x81, /* COMBINING ACUTE ACCENT */
61       0x49, /* LATIN CAPITAL LETTER I */
62       0xCC, 0x82, /* COMBINING CIRCUMFLEX ACCENT */
63       0x49, /* LATIN CAPITAL LETTER I */
64       0xCC, 0x88, /* COMBINING DIAERESIS */
65       0x4E, /* LATIN CAPITAL LETTER N */
66       0xCC, 0x83, /* COMBINING TILDE */
67       0x00
68   };
69
70   /* NFC normalized UTF-8 encoding for same Unicode string: */
71   unsigned char nname_utf8[] = {
72       0xC3, 0x80,         /* LATIN CAPITAL LETTER A WITH GRAVE */
73       0xC3, 0x81,         /* LATIN CAPITAL LETTER A WITH ACUTE */
74       0xC3, 0x82,         /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
75       0xC3, 0x83,         /* LATIN CAPITAL LETTER A WITH TILDE */
76       0xC3, 0x84, /* LATIN CAPITAL LETTER A WITH DIAERESIS */
77       0xC3, 0x85, /* LATIN CAPITAL LETTER A WITH RING ABOVE */
78       0xC3, 0x87, /* LATIN CAPITAL LETTER C WITH CEDILLA */
79       0xC3, 0x88, /* LATIN CAPITAL LETTER E WITH GRAVE */
80       0xC3, 0x89, /* LATIN CAPITAL LETTER E WITH ACUTE */
81       0xC3, 0x8A, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
82       0xC3, 0x8B, /* LATIN CAPITAL LETTER E WITH DIAERESIS */
83       0xC3, 0x8C, /* LATIN CAPITAL LETTER I WITH GRAVE */
84       0xC3, 0x8D, /* LATIN CAPITAL LETTER I WITH ACUTE */
85       0xC3, 0x8E, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
86       0xC3, 0x8F, /* LATIN CAPITAL LETTER I WITH DIAERESIS */
87       0xC3, 0x91,         /* LATIN CAPITAL LETTER N WITH TILDE */
88       0x00
89   };
90
91/* Unnormalized name used for dimension, variable, and attribute value */
92#define UNAME ((char *) uname_utf8)
93#define UNAMELEN (sizeof uname_utf8)
94/* Normalized name */
95#define NNAME ((char *) nname_utf8)
96#define NNAMELEN (sizeof nname_utf8)
97
98   char name_in[UNAMELEN + 1], strings_in[UNAMELEN + 1];
99   nc_type att_type;
100   size_t att_len;
101   int res;
102   int dimid_invarid_inattnum_in;
103   int attvals[] = {42};
104#define ATTNUM ((sizeof attvals)/(sizeof attvals[0]))
105
106#ifdef TEST_PNETCDF
107MPI_Init(&argc, &argv);
108#endif
109   printf("\n*** testing UTF-8 normalization...");
110#ifdef TEST_PNETCDF
111   if((res = nc_create_par(FILE7_NAMENC_CLOBBER|NC_PNETCDFMPI_COMM_WORLDMPI_INFO_NULL,&ncid)))
112#else
113   if((res = nc_create(FILE7_NAMENC_CLOBBER, &ncid)))
114#endif
115       ERR;
116
117   /* Define dimension with unnormalized Unicode UTF-8 encoded name */
118   if ((res = nc_def_dim(ncidUNAMENX, &dimid)))
119       ERR;
120   dimids[0] = dimid;
121
122   /* Define variable with same name */
123   if ((res = nc_def_var(ncidUNAMENC_CHARNDIMSdimids, &varid)))
124       ERR;
125
126   /* Create string attribute with same value */
127   if ((res = nc_put_att_text(ncidvaridUNITSUNAMELENUNAME)))
128       ERR;
129
130   /* Create int attribute with same name */
131   if ((res = nc_put_att_int(ncidvaridUNAMENC_INTATTNUMattvals)))
132       ERR;
133
134   /* Try to create dimension and variable with NFC-normalized
135    * version of same name.  These should fail, as unnormalized name
136    * should have been normalized in library, so these are attempts to
137    * create duplicate netCDF objects. */
138   if ((res = nc_def_dim(ncidNNAMENX, &dimid)) != NC_ENAMEINUSE)
139       ERR;
140
141   if ((res = nc_def_var(ncidNNAMENC_CHARNDIMSdimids, &varid)) != NC_ENAMEINUSE)
142       ERR;
143   if ((res = nc_enddef(ncid)))
144       ERR;
145
146   /* Write string data, UTF-8 encoded, to the file */
147   if ((res = nc_put_var_text(ncidvaridUNAME)))
148       ERR;
149   if ((res = nc_close(ncid)))
150       ERR;
151
152   /* Check it out. */
153#ifdef TEST_PNETCDF
154   if ((res = nc_open_par(FILE7_NAMENC_NOWRITE|NC_PNETCDFMPI_COMM_WORLD,MPI_INFO_NULL, &ncid)))
155#else
156   if ((res = nc_open(FILE7_NAMENC_NOWRITE, &ncid)))
157#endif
158       ERR;
159   if ((res = nc_inq_varid(ncidUNAME, &varid)))
160       ERR;
161   if ((res = nc_inq_varname(ncidvaridname_in)))
162       ERR;
163   if ((res = strncmp(NNAMEname_inNNAMELEN)))
164       ERR;
165   if ((res = nc_inq_varid(ncidNNAME, &varid_in)) || varid != varid_in)
166       ERR;
167   if ((res = nc_inq_dimid(ncidUNAME, &dimid_in)) || dimid != dimid_in)
168       ERR;
169   if ((res = nc_inq_dimid(ncidNNAME, &dimid_in)) || dimid != dimid_in)
170       ERR;
171   if ((res = nc_inq_att(ncidvaridUNITS, &att_type, &att_len)))
172       ERR;
173   if ((att_type != NC_CHAR || att_len != UNAMELEN))
174       ERR;
175   if ((res = nc_get_att_text(ncidvaridUNITSstrings_in)))
176       ERR;
177   strings_in[UNAMELEN] = '\0';
178   if ((res = strncmp(UNAMEstrings_inUNAMELEN)))
179       ERR;
180   if ((res = nc_inq_attid(ncidvaridUNAME, &attnum_in)) || ATTNUM != attnum_in)
181       ERR;
182   if ((res = nc_inq_attid(ncidvaridNNAME, &attnum_in)) || ATTNUM != attnum_in)
183       ERR;
184   if ((res = nc_close(ncid)))
185       ERR;
186
187   SUMMARIZE_ERR;
188#ifdef TEST_PNETCDF
189   MPI_Finalize();
190#endif
191   FINAL_RESULTS;
192   return 0;
193}


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