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 writes a netCDF file with
6   Unicode names encoded with UTF-8. It is the NETCDF3 equivalent
7   of tst_unicode.c
8
9   $Id: tst_utf8.c,v 1.10 2008/10/20 01:48:07 ed Exp $
10*/
11
12#include <config.h>
13#include <stdlib.h>
14#include <nc_tests.h>
15#include <err_macros.h>
16#include <netcdf.h>
17#include <string.h>
18
19/* The data file we will create. */
20#define FILE7_NAME "tst_utf8.nc"
21#define UNITS "units"
22#define NDIMS 1
23#define NX 18
24
25int
26main(int argc, char **argv)
27{
28   int nciddimidvarid;
29   int dimids[NDIMS];
30
31   /* (unnormalized) UTF-8 encoding for Unicode 8-character "Hello" in Greek */
32   unsigned char name_utf8[] = {
33       0xCE, 0x9A,   /* GREEK CAPITAL LETTER KAPPA  : 2-bytes utf8 */
34       0xCE, 0xB1,   /* GREEK SMALL LETTER LAMBDA   : 2-bytes utf8 */
35       0xCE, 0xBB,   /* GREEK SMALL LETTER ALPHA    : 2-bytes utf8 */
36       0xCE, 0xB7,   /* GREEK SMALL LETTER ETA      : 2-bytes utf8 */
37       0xCE, 0xBC,   /* GREEK SMALL LETTER MU       : 2-bytes utf8 */
38       0xE1, 0xBD, 0xB3,  /* GREEK SMALL LETTER EPSILON
39                             WITH TONOS                  : 3-bytes utf8 */
40       0xCF, 0x81,   /* GREEK SMALL LETTER RHO      : 2-bytes utf8 */
41       0xCE, 0xB1,   /* GREEK SMALL LETTER ALPHA    : 2-bytes utf8 */
42       0x00
43   };
44
45/* Name used for dimension, variable, and attribute value */
46#define UNAME ((char *) name_utf8)
47#define UNAMELEN (sizeof name_utf8)
48
49   char name_in[UNAMELEN + 1], strings_in[UNAMELEN + 1];
50   nc_type att_type;
51   size_t att_len;
52
53   printf("\n*** Testing UTF-8.\n");
54   printf("*** creating UTF-8 test file %s...", FILE7_NAME);
55  if (nc_create(FILE7_NAMENC_CLOBBER, &ncid))
56       ERR;
57
58   /* Define dimension with Unicode UTF-8 encoded name */
59   if (nc_def_dim(ncidUNAMENX, &dimid))
60       ERR;
61   dimids[0] = dimid;
62
63   /* Define variable with same name */
64   if (nc_def_var(ncidUNAMENC_CHARNDIMSdimids, &varid))
65       ERR;
66
67   /* Create string attribute with same value */
68   if (nc_put_att_text(ncidvaridUNITSUNAMELENUNAME))
69       ERR;
70
71   if (nc_enddef(ncid))
72       ERR;
73
74   /* Write string data, UTF-8 encoded, to the file */
75   if (nc_put_var_text(ncidvaridUNAME))
76       ERR;
77
78   if (nc_close(ncid))
79       ERR;
80
81   /* Check it out. */
82
83   /* Reopen the file. */
84   if (nc_open(FILE7_NAMENC_NOWRITE, &ncid))
85       ERR;
86   if (nc_inq_varid(ncidUNAME, &varid))
87       ERR;
88   if (nc_inq_varname(ncidvaridname_in))
89       ERR;
90   {
91       /* Note, name was normalized before storing, so retrieved name
92   won't match original unnormalized name.  Check that we get
93   normalized version, instead.  */
94
95       /* NFC normalized UTF-8 for Unicode 8-character "Hello" in Greek */
96       unsigned char norm_utf8[] = {
97    0xCE, 0x9A,   /* GREEK CAPITAL LETTER KAPPA  : 2-bytes utf8 */
98    0xCE, 0xB1,   /* GREEK SMALL LETTER LAMBDA   : 2-bytes utf8 */
99    0xCE, 0xBB,   /* GREEK SMALL LETTER ALPHA    : 2-bytes utf8 */
100    0xCE, 0xB7,   /* GREEK SMALL LETTER ETA      : 2-bytes utf8 */
101    0xCE, 0xBC,   /* GREEK SMALL LETTER MU       : 2-bytes utf8 */
102    0xCE, 0xAD,    /* GREEK SMALL LETTER EPSILON WITH TONOS
103                                  : 2-bytes utf8 */
104    0xCF, 0x81,   /* GREEK SMALL LETTER RHO      : 2-bytes utf8 */
105    0xCE, 0xB1,   /* GREEK SMALL LETTER ALPHA    : 2-bytes utf8 */
106    0x00
107       };
108#define NNAME ((char *) norm_utf8)
109#define NNAMELEN (sizeof norm_utf8)
110       if (strncmp(NNAMEname_inNNAMELEN))
111    ERR;
112   }
113   if (nc_inq_att(ncidvaridUNITS, &att_type, &att_len))
114       ERR;
115   if (att_type != NC_CHAR || att_len != UNAMELEN)
116       ERR;
117   /* We don't normalize data or attribute values, so get exactly what was put */
118   if (nc_get_att_text(ncidvaridUNITSstrings_in))
119       ERR;
120   strings_in[att_len] = '\0';
121   if (strncmp(UNAMEstrings_inUNAMELEN))
122       ERR;
123   if (nc_close(ncid))
124       ERR;
125
126   SUMMARIZE_ERR;
127   FINAL_RESULTS;
128}


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