ncdf4a13/libsrc4/tst_atts.c

Go to the documentation of this file.
00001 /* This is part of the netCDF package.
00002    Copyright 2005 University Corporation for Atmospheric Research/Unidata
00003    See COPYRIGHT file for conditions of use.
00004 
00005    Test internal netcdf-4 file code. 
00006    $Id: tst_atts.c,v 1.20 2006/01/25 22:39:18 ed Exp $
00007 */
00008 
00009 #include <netcdf.h>
00010 #include <nc4internal.h>
00011 #include <nc_tests.h>
00012 #include <signal.h>
00013 
00014 #define FILE_NAME "tst_atts.nc"
00015 #define VAR1_NAME "Horace_Rumpole"
00016 #define VAR2_NAME "Claude_Erskine-Brown"
00017 #define VAR3_NAME "Phillida_Erskine-Brown_Q.C."
00018 #define DIM1_NAME "Old_Bailey_case_number"
00019 #define DIM1_LEN 10
00020 #define DIM2_NAME "occupancy_in_chambers"
00021 #define DIM2_LEN 15
00022 #define ATT_INT_NAME "Old_Bailey_Room_Numbers"
00023 #define ATT_DOUBLE_NAME "Equity_Court_Canteen_Charges"
00024 #define ATT_SHORT_NAME "Ecclesiastical_Court_Appearences"
00025 #define ATT_TEXT_NAME "Speech_to_Jury"
00026 #define ATT_TEXT_NAME2 "Speech_to_She_Who_Must_be_Obeyed"
00027 #define ATT_UCHAR_NAME "Number_of_current_briefs"
00028 #define ATT_SCHAR_NAME "Slate_totals_at_Pomeroys_Wine_Bar"
00029 #define ATT_USHORT_NAME "brief_no"
00030 #define ATT_UINT_NAME "Orders_from_SWMBO"
00031 #define ATT_INT64_NAME "judges_golf_score"
00032 #define ATT_UINT64_NAME "Number_of_drinks_in_career_to_date"
00033 
00034 /*
00035 #define ATT_USHORT_NAME "Chamber_Gas_Electric_and_Telephone_Bill_Share"
00036 */
00037 #define ATT_FLOAT_NAME "Average_Nanoseconds_for_Lose_Win_or_Appeal"
00038 #define ATT_LEN 3
00039 
00040 char speech[] = "Once more unto the breach, dear friends, once more;\n\
00041 Or close the wall up with our English dead.\n\
00042 In peace there's nothing so becomes a man\n\
00043 As modest stillness and humility:\n\
00044 But when the blast of war blows in our ears,\n\
00045 Then imitate the action of the tiger;\n\
00046 Stiffen the sinews, summon up the blood,\n\
00047 Disguise fair nature with hard-favour'd rage;\n\
00048 Then lend the eye a terrible aspect;\n\
00049 Let pry through the portage of the head\n\
00050 Like the brass cannon; let the brow o'erwhelm it\n\
00051 As fearfully as doth a galled rock\n\
00052 O'erhang and jutty his confounded base,\n\
00053 Swill'd with the wild and wasteful ocean.\n\
00054 Now set the teeth and stretch the nostril wide,\n\
00055 Hold hard the breath and bend up every spirit\n\
00056 To his full height. On, on, you noblest English.\n\
00057 Whose blood is fet from fathers of war-proof!\n\
00058 Fathers that, like so many Alexanders,\n\
00059 Have in these parts from morn till even fought\n\
00060 And sheathed their swords for lack of argument:\n\
00061 Dishonour not your mothers; now attest\n\
00062 That those whom you call'd fathers did beget you.\n\
00063 Be copy now to men of grosser blood,\n\
00064 And teach them how to war. And you, good yeoman,\n\
00065 Whose limbs were made in England, show us here\n\
00066 The mettle of your pasture; let us swear\n\
00067 That you are worth your breeding; which I doubt not;\n\
00068 For there is none of you so mean and base,\n\
00069 That hath not noble lustre in your eyes.\n\
00070 I see you stand like greyhounds in the slips,\n\
00071 Straining upon the start. The game's afoot:\n\
00072 Follow your spirit, and upon this charge\n\
00073 Cry 'God for Harry, England, and Saint George!'";
00074 
00075 int
00076 main(int argc, char **argv)
00077 {
00078    int ncid, varid, dimids[2];
00079    nc_type att_type;
00080    size_t att_len;
00081    int i, v;
00082 
00083    char *speech_in;
00084    signed char schar_in[ATT_LEN], schar_out[ATT_LEN] = {NC_MIN_BYTE, 1, NC_MAX_BYTE};
00085    unsigned char uchar_in[ATT_LEN], uchar_out[ATT_LEN] = {0, 128, NC_MAX_CHAR};
00086    short short_in[ATT_LEN], short_out[ATT_LEN] = {NC_MIN_SHORT, -128, NC_MAX_SHORT};
00087    /*int int_in[ATT_LEN], int_out[ATT_LEN] = {NC_MIN_INT, 128, NC_MAX_INT};*/
00088    int int_in[ATT_LEN], int_out[ATT_LEN] = {-100000, 128, 100000};
00089    float float_in[ATT_LEN], float_out[ATT_LEN] = {-.1, 9999.99, 100.001};
00090    double double_in[ATT_LEN], double_out[ATT_LEN] = {0.02, .1128, 1090.1};
00091    unsigned short ushort_in[ATT_LEN], ushort_out[ATT_LEN] = {0, 128, NC_MAX_USHORT};
00092    unsigned int uint_in[ATT_LEN], uint_out[ATT_LEN] = {0, 128, NC_MAX_UINT};
00093    unsigned long long uint64_in[ATT_LEN], uint64_out[ATT_LEN] = {0, 128, NC_MAX_UINT64};
00094    long long int64_in[ATT_LEN], int64_out[ATT_LEN] = {NC_MIN_INT64, 128, NC_MAX_INT64};
00095 
00096     (void) signal(SIGFPE, SIG_IGN);
00097 
00098    printf("\n*** Testing netcdf-4 attribute functions.\n");
00099    printf("*** testing simple global atts...");
00100       
00101    /*nc_set_log_level(3);*/
00102 
00103    /* Create a file with a global attribute of each type. */
00104    if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00105    if (nc_put_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;      
00106    if (nc_put_att_schar(ncid, NC_GLOBAL, ATT_SCHAR_NAME, NC_BYTE, ATT_LEN, schar_out)) ERR;      
00107    if (nc_put_att_uchar(ncid, NC_GLOBAL, ATT_UCHAR_NAME, NC_UBYTE, ATT_LEN, uchar_out)) ERR;
00108    if (nc_put_att_short(ncid, NC_GLOBAL, ATT_SHORT_NAME, NC_SHORT, ATT_LEN, short_out)) ERR;      
00109    if (nc_put_att_int(ncid, NC_GLOBAL, ATT_INT_NAME, NC_INT, ATT_LEN, int_out)) ERR;      
00110    if (nc_put_att_float(ncid, NC_GLOBAL, ATT_FLOAT_NAME, NC_FLOAT, ATT_LEN, float_out)) ERR;      
00111    if (nc_put_att_double(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, NC_DOUBLE, ATT_LEN, double_out)) ERR;      
00112    if (nc_put_att_ushort(ncid, NC_GLOBAL, ATT_USHORT_NAME, NC_USHORT, ATT_LEN, ushort_out)) ERR;      
00113    if (nc_put_att_uint(ncid, NC_GLOBAL, ATT_UINT_NAME, NC_UINT, ATT_LEN, uint_out)) ERR;      
00114    if (nc_put_att_longlong(ncid, NC_GLOBAL, ATT_INT64_NAME, NC_INT64, ATT_LEN, int64_out)) ERR;      
00115    if (nc_put_att_ulonglong(ncid, NC_GLOBAL, ATT_UINT64_NAME, NC_UINT64, ATT_LEN, uint64_out)) ERR;      
00116    if (nc_close(ncid)) ERR;
00117 
00118    /* Open the file and check attributes. */
00119    if (nc_open(FILE_NAME, 0, &ncid)) ERR;
00120    /* Check text. */
00121    if (nc_inq_att(ncid, NC_GLOBAL, ATT_TEXT_NAME, &att_type, &att_len))
00122       ERR;
00123    if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
00124    if (!(speech_in = malloc(att_len + 1))) ERR;
00125    if (nc_get_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, speech_in)) ERR;      
00126    if (strcmp(speech, speech_in)) ERR;
00127    free(speech_in);
00128    /* Check numeric values. */
00129    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_SCHAR_NAME, schar_in)) ERR;      
00130    for (i = 0; i < ATT_LEN; i++)
00131       if (schar_in[i] != schar_out[i]) ERR;
00132    if (nc_get_att_uchar(ncid, NC_GLOBAL, ATT_UCHAR_NAME, uchar_in)) ERR;      
00133    for (i = 0; i < ATT_LEN; i++)
00134       if (uchar_in[i] != uchar_out[i]) ERR;
00135    if (nc_get_att_short(ncid, NC_GLOBAL, ATT_SHORT_NAME, short_in)) ERR;      
00136    for (i = 0; i < ATT_LEN; i++)
00137       if (short_in[i] != short_out[i]) ERR;
00138    if (nc_get_att_int(ncid, NC_GLOBAL, ATT_INT_NAME, int_in)) ERR;      
00139    for (i = 0; i < ATT_LEN; i++)
00140       if (int_in[i] != int_out[i]) ERR;
00141    if (nc_get_att_float(ncid, NC_GLOBAL, ATT_FLOAT_NAME, float_in)) ERR;      
00142    for (i = 0; i < ATT_LEN; i++)
00143       if (float_in[i] != float_out[i]) ERR;
00144    if (nc_get_att_double(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, double_in)) ERR;      
00145    for (i = 0; i < ATT_LEN; i++)
00146       if (double_in[i] != double_out[i]) ERR;
00147    if (nc_get_att_ushort(ncid, NC_GLOBAL, ATT_USHORT_NAME, ushort_in)) ERR;      
00148    for (i = 0; i < ATT_LEN; i++)
00149       if (ushort_in[i] != ushort_out[i]) ERR;
00150    if (nc_get_att_uint(ncid, NC_GLOBAL, ATT_UINT_NAME, uint_in)) ERR;      
00151    for (i = 0; i < ATT_LEN; i++)
00152       if (uint_in[i] != uint_out[i]) ERR;
00153    if (nc_get_att_longlong(ncid, NC_GLOBAL, ATT_INT64_NAME, int64_in)) ERR;      
00154    for (i = 0; i < ATT_LEN; i++)
00155       if (int64_in[i] != int64_out[i]) ERR;
00156    if (nc_get_att_ulonglong(ncid, NC_GLOBAL, ATT_UINT64_NAME, uint64_in)) ERR;      
00157    for (i = 0; i < ATT_LEN; i++)
00158       if (uint64_in[i] != uint64_out[i]) ERR;
00159    if (nc_close(ncid)) ERR;
00160 
00161    SUMMARIZE_ERR;
00162    printf("*** testing attribute data type conversions...");
00163 
00164    /* Reopen the file and try different type conversions. */
00165    if (nc_open(FILE_NAME, 0, &ncid)) ERR;
00166 
00167    /* No text conversions are allowed, and people who try them shold
00168     * be locked up, away from decent folk! */
00169    if (nc_get_att_short(ncid, NC_GLOBAL, ATT_TEXT_NAME, short_in) != NC_ECHAR) ERR;
00170    if (nc_get_att_int(ncid, NC_GLOBAL, ATT_TEXT_NAME, int_in) != NC_ECHAR) ERR;
00171    if (nc_get_att_float(ncid, NC_GLOBAL, ATT_TEXT_NAME, float_in) != NC_ECHAR) ERR;
00172    if (nc_get_att_double(ncid, NC_GLOBAL, ATT_TEXT_NAME, double_in) != NC_ECHAR) ERR;
00173 /*   if (nc_get_att_ubyte(ncid, NC_GLOBAL, ATT_TEXT_NAME, uchar_in) != NC_ECHAR) ERR;*/
00174    if (nc_get_att_ushort(ncid, NC_GLOBAL, ATT_TEXT_NAME, ushort_in) != NC_ECHAR) ERR;
00175    if (nc_get_att_uint(ncid, NC_GLOBAL, ATT_TEXT_NAME, uint_in) != NC_ECHAR) ERR;
00176    if (nc_get_att_longlong(ncid, NC_GLOBAL, ATT_TEXT_NAME, int64_in) != NC_ECHAR) ERR;
00177    if (nc_get_att_ulonglong(ncid, NC_GLOBAL, ATT_TEXT_NAME, uint64_in) != NC_ECHAR) ERR;
00178 
00179    /* Read all atts (except text) as double. */
00180    if (nc_get_att_double(ncid, NC_GLOBAL, ATT_SCHAR_NAME, double_in)) ERR;      
00181    for (i = 0; i < ATT_LEN; i++)
00182       if (double_in[i] != schar_out[i]) ERR;
00183    if (nc_get_att_double(ncid, NC_GLOBAL, ATT_SHORT_NAME, double_in)) ERR;      
00184    for (i = 0; i < ATT_LEN; i++)
00185       if (double_in[i] != short_out[i]) ERR;
00186    if (nc_get_att_double(ncid, NC_GLOBAL, ATT_INT_NAME, double_in)) ERR;      
00187    for (i = 0; i < ATT_LEN; i++)
00188       if (double_in[i] != int_out[i]) ERR;
00189    if (nc_get_att_double(ncid, NC_GLOBAL, ATT_FLOAT_NAME, double_in)) ERR;      
00190    for (i = 0; i < ATT_LEN; i++)
00191       if (double_in[i] != float_out[i]) ERR;
00192    /* Read all atts (except text) as float. */
00193    if (nc_get_att_float(ncid, NC_GLOBAL, ATT_SCHAR_NAME, float_in)) ERR;      
00194    for (i = 0; i < ATT_LEN; i++)
00195       if (float_in[i] != schar_out[i]) ERR;
00196    if (nc_get_att_float(ncid, NC_GLOBAL, ATT_SHORT_NAME, float_in)) ERR;      
00197    for (i = 0; i < ATT_LEN; i++)
00198       if (float_in[i] != short_out[i]) ERR;
00199    if (nc_get_att_float(ncid, NC_GLOBAL, ATT_INT_NAME, float_in)) ERR;      
00200    for (i = 0; i < ATT_LEN; i++)
00201       if (float_in[i] != (float)int_out[i]) ERR;
00202    if (nc_get_att_float(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, float_in)) ERR;      
00203    for (i = 0; i < ATT_LEN; i++)
00204       if (float_in[i] != (float)double_out[i]) ERR;
00205    /* Read all atts (except text) as int. */
00206    if (nc_get_att_int(ncid, NC_GLOBAL, ATT_SCHAR_NAME, int_in)) ERR;      
00207    for (i = 0; i < ATT_LEN; i++)
00208       if (int_in[i] != schar_out[i]) ERR;
00209    if (nc_get_att_int(ncid, NC_GLOBAL, ATT_SHORT_NAME, int_in)) ERR;      
00210    for (i = 0; i < ATT_LEN; i++)
00211       if (int_in[i] != short_out[i]) ERR;
00212    if (nc_get_att_int(ncid, NC_GLOBAL, ATT_FLOAT_NAME, int_in)) ERR;      
00213    for (i = 0; i < ATT_LEN; i++)
00214       if (int_in[i] != (int)float_out[i]) ERR;
00215    if (nc_get_att_int(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, int_in)) ERR;      
00216    for (i = 0; i < ATT_LEN; i++)
00217       if (int_in[i] != (int)double_out[i]) ERR;
00218    /* Read all atts (except text) as short. */
00219    if (nc_get_att_short(ncid, NC_GLOBAL, ATT_SCHAR_NAME, short_in)) ERR;      
00220    for (i = 0; i < ATT_LEN; i++)
00221       if (short_in[i] != schar_out[i]) ERR;
00222    if (nc_get_att_short(ncid, NC_GLOBAL, ATT_INT_NAME, short_in) != NC_ERANGE) ERR;      
00223    for (i = 0; i < ATT_LEN; i++)
00224       if (short_in[i] != (short)int_out[i]) ERR;
00225    if (nc_get_att_short(ncid, NC_GLOBAL, ATT_FLOAT_NAME, short_in)) ERR;      
00226    for (i = 0; i < ATT_LEN; i++)
00227       if (short_in[i] != (short)float_out[i]) ERR;
00228    if (nc_get_att_short(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, short_in)) ERR;      
00229    for (i = 0; i < ATT_LEN; i++)
00230       if (short_in[i] != (short)double_out[i]) ERR;
00231    /* Read all atts (except text) as schar. Some range errors will
00232     * result converting to schar. */
00233    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_SHORT_NAME, schar_in) != NC_ERANGE) ERR;      
00234    for (i = 0; i < ATT_LEN; i++)
00235       if (schar_in[i] != (signed char)short_out[i]) ERR;
00236    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_INT_NAME, schar_in) != NC_ERANGE) ERR;      
00237    for (i = 0; i < ATT_LEN; i++)
00238       if (schar_in[i] != (signed char)int_out[i]) ERR;
00239    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_FLOAT_NAME, schar_in) != NC_ERANGE) ERR;      
00240    for (i = 0; i < ATT_LEN; i++)
00241       if (schar_in[i] != (signed char)float_out[i]) ERR;
00242    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, schar_in) != NC_ERANGE) ERR;      
00243    for (i = 0; i < ATT_LEN; i++)
00244       if (schar_in[i] != (signed char)double_out[i]) ERR;
00245    if (nc_close(ncid)) ERR;
00246 
00247    SUMMARIZE_ERR;
00248    printf("*** testing simple variable atts...");
00249 
00250    /* Create a file with two vars, attaching to each an attribute of
00251     * each type. */
00252    if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00253    if (nc_def_dim(ncid, DIM1_NAME, DIM1_LEN, &dimids[0])) ERR;
00254    if (nc_def_dim(ncid, DIM2_NAME, DIM2_LEN, &dimids[1])) ERR;
00255    if (nc_def_var(ncid, VAR1_NAME, NC_INT, 2, dimids, &varid)) ERR;
00256    if (nc_put_att_text(ncid, varid, ATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;      
00257    if (nc_put_att_schar(ncid, varid, ATT_SCHAR_NAME, NC_BYTE, ATT_LEN, schar_out)) ERR;      
00258    if (nc_put_att_short(ncid, varid, ATT_SHORT_NAME, NC_SHORT, 3, short_out)) ERR;      
00259    if (nc_put_att_int(ncid, varid, ATT_INT_NAME, NC_INT, 3, int_out)) ERR;      
00260    if (nc_put_att_float(ncid, varid, ATT_FLOAT_NAME, NC_FLOAT, 3, float_out)) ERR;      
00261    if (nc_put_att_double(ncid, varid, ATT_DOUBLE_NAME, NC_DOUBLE, 3, double_out)) ERR;      
00262    if (nc_def_var(ncid, VAR2_NAME, NC_UINT, 2, dimids, &varid)) ERR;
00263    if (nc_put_att_text(ncid, varid, ATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;      
00264    if (nc_put_att_schar(ncid, varid, ATT_SCHAR_NAME, NC_BYTE, ATT_LEN, schar_out)) ERR; 
00265    if (nc_put_att_short(ncid, varid, ATT_SHORT_NAME, NC_SHORT, 3, short_out)) ERR;           
00266    if (nc_put_att_int(ncid, varid, ATT_INT_NAME, NC_INT, 3, int_out)) ERR;      
00267    if (nc_put_att_float(ncid, varid, ATT_FLOAT_NAME, NC_FLOAT, 3, float_out)) ERR;      
00268    if (nc_put_att_double(ncid, varid, ATT_DOUBLE_NAME, NC_DOUBLE, 3, double_out)) ERR;      
00269    if (nc_close(ncid)) ERR;
00270 
00271    /* Open the file and check attributes. */
00272    if (nc_open(FILE_NAME, 0, &ncid)) ERR;
00273    for (v=0; v<2; v++)
00274    {
00275       if (nc_inq_att(ncid, v, ATT_TEXT_NAME, &att_type, &att_len)) ERR;
00276       if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
00277       if (!(speech_in = malloc(att_len + 1))) ERR;
00278       if (nc_get_att_text(ncid, v, ATT_TEXT_NAME, speech_in)) ERR;      
00279       if (strcmp(speech, speech_in)) ERR;
00280       free(speech_in);
00281       if (nc_get_att_schar(ncid, v, ATT_SCHAR_NAME, schar_in)) ERR;      
00282       for (i = 0; i < ATT_LEN; i++)
00283          if (schar_in[i] != schar_out[i]) ERR;
00284       if (nc_get_att_short(ncid, v, ATT_SHORT_NAME, short_in)) ERR;      
00285       for (i = 0; i < ATT_LEN; i++)
00286          if (short_in[i] != short_out[i]) ERR;
00287       if (nc_get_att_int(ncid, v, ATT_INT_NAME, int_in)) ERR;      
00288       for (i = 0; i < ATT_LEN; i++)
00289          if (int_in[i] != int_out[i]) ERR;
00290       if (nc_get_att_float(ncid, v, ATT_FLOAT_NAME, float_in)) ERR;      
00291       for (i = 0; i < ATT_LEN; i++)
00292          if (float_in[i] != float_out[i]) ERR;
00293       if (nc_get_att_double(ncid, v, ATT_DOUBLE_NAME, double_in)) ERR;      
00294       for (i = 0; i < ATT_LEN; i++)
00295          if (double_in[i] != double_out[i]) ERR;
00296    }
00297    if (nc_close(ncid)) ERR;
00298 
00299    SUMMARIZE_ERR;
00300    printf("*** testing zero-length attributes...");
00301 
00302    /* Create a file with a global attribute of each type of zero length. */
00303    if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00304    if (nc_put_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, 0, NULL)) ERR;      
00305    if (nc_put_att_schar(ncid, NC_GLOBAL, ATT_SCHAR_NAME, NC_BYTE, 0, NULL)) ERR;      
00306 /*   if (nc_put_att_uchar(ncid, NC_GLOBAL, ATT_UCHAR_NAME, NC_UCHAR, ATT_LEN, uchar_out)) ERR;*/
00307    if (nc_put_att_short(ncid, NC_GLOBAL, ATT_SHORT_NAME, NC_SHORT, 0, NULL)) ERR;      
00308    if (nc_put_att_int(ncid, NC_GLOBAL, ATT_INT_NAME, NC_INT, 0, NULL)) ERR;      
00309    if (nc_put_att_float(ncid, NC_GLOBAL, ATT_FLOAT_NAME, NC_FLOAT, 0, NULL)) ERR;      
00310    if (nc_put_att_double(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, NC_DOUBLE, 0, NULL)) ERR;      
00311    if (nc_close(ncid)) ERR;
00312 
00313    /* Make sure we can read all these zero-length atts. */
00314    {
00315       size_t len;
00316       nc_type xtype;
00317 
00318       if (nc_open(FILE_NAME, 0, &ncid)) ERR;
00319       if (nc_get_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, NULL)) ERR;      
00320       if (nc_inq_att(ncid, NC_GLOBAL, ATT_TEXT_NAME, &xtype, &len)) ERR;
00321       if (len || xtype != NC_CHAR) ERR;
00322       if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_SCHAR_NAME, schar_in)) ERR;
00323       if (nc_inq_att(ncid, NC_GLOBAL, ATT_SCHAR_NAME, &xtype, &len)) ERR;
00324       if (len || xtype != NC_BYTE) ERR;
00325       if (nc_get_att_short(ncid, NC_GLOBAL, ATT_SHORT_NAME, short_in)) ERR;
00326       if (nc_inq_att(ncid, NC_GLOBAL, ATT_SHORT_NAME, &xtype, &len)) ERR;
00327       if (len || xtype != NC_SHORT) ERR;
00328       if (nc_get_att_int(ncid, NC_GLOBAL, ATT_INT_NAME, int_in)) ERR;      
00329       if (nc_inq_att(ncid, NC_GLOBAL, ATT_INT_NAME, &xtype, &len)) ERR;
00330       if (len || xtype != NC_INT) ERR;
00331       if (nc_get_att_float(ncid, NC_GLOBAL, ATT_FLOAT_NAME, float_in)) ERR;      
00332       if (nc_inq_att(ncid, NC_GLOBAL, ATT_FLOAT_NAME, &xtype, &len)) ERR;
00333       if (len || xtype != NC_FLOAT) ERR;
00334       if (nc_get_att_double(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, double_in)) ERR;      
00335       if (nc_inq_att(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, &xtype, &len)) ERR;
00336       if (len || xtype != NC_DOUBLE) ERR;
00337       /* Conversions no longer result in range errors, since there's no data. */
00338       if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, schar_in)) ERR;
00339       if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_FLOAT_NAME, schar_in)) ERR;
00340       if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_INT_NAME, schar_in)) ERR;
00341       if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_SHORT_NAME, schar_in)) ERR;
00342       if (nc_close(ncid)) ERR;
00343    }
00344 
00345    SUMMARIZE_ERR;
00346    printf("*** testing zero-length attributes and redef...");
00347 
00348    /* Create a file with a global attribute of each type of zero length. */
00349    if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00350    if (nc_enddef(ncid)) ERR;
00351    if (nc_redef(ncid)) ERR;
00352    if (nc_put_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, 0, NULL)) ERR;      
00353    if (nc_put_att_schar(ncid, NC_GLOBAL, ATT_SCHAR_NAME, NC_BYTE, 0, NULL)) ERR;      
00354 /*   if (nc_put_att_uchar(ncid, NC_GLOBAL, ATT_UCHAR_NAME, NC_UCHAR, ATT_LEN, uchar_out)) ERR;*/
00355    if (nc_put_att_short(ncid, NC_GLOBAL, ATT_SHORT_NAME, NC_SHORT, 0, NULL)) ERR;      
00356    if (nc_put_att_int(ncid, NC_GLOBAL, ATT_INT_NAME, NC_INT, 0, NULL)) ERR;      
00357    if (nc_put_att_float(ncid, NC_GLOBAL, ATT_FLOAT_NAME, NC_FLOAT, 0, NULL)) ERR;      
00358    if (nc_put_att_double(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, NC_DOUBLE, 0, NULL)) ERR;      
00359    if (nc_close(ncid)) ERR;
00360 
00361    /* Make sure we can read all these zero-length atts added during a
00362     * redef. */
00363    if (nc_open(FILE_NAME, 0, &ncid)) ERR;
00364    if (nc_get_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, NULL)) ERR;      
00365    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_SCHAR_NAME, schar_in)) ERR;
00366    if (nc_get_att_short(ncid, NC_GLOBAL, ATT_SHORT_NAME, short_in)) ERR;
00367    if (nc_get_att_int(ncid, NC_GLOBAL, ATT_INT_NAME, int_in)) ERR;      
00368    if (nc_get_att_float(ncid, NC_GLOBAL, ATT_FLOAT_NAME, float_in)) ERR;      
00369    if (nc_get_att_double(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, double_in)) ERR;      
00370    /* Conversions no longer result in range errors, since there's no data. */
00371    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_DOUBLE_NAME, schar_in)) ERR;
00372    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_FLOAT_NAME, schar_in)) ERR;
00373    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_INT_NAME, schar_in)) ERR;
00374    if (nc_get_att_schar(ncid, NC_GLOBAL, ATT_SHORT_NAME, schar_in)) ERR;
00375    if (nc_close(ncid)) ERR;
00376 
00377    SUMMARIZE_ERR;
00378 
00379    printf("*** testing attribute deletes and renames...");
00380 
00381    {
00382       char name_in[NC_MAX_NAME + 1];
00383       int attid_in, natts_in;
00384 
00385       /* Create a file with a global attribute. */
00386       if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00387       if (nc_put_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, strlen(speech)+1, 
00388                           speech)) ERR;      
00389       if (nc_close(ncid)) ERR;
00390       
00391       /* Rename it. */
00392       if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
00393       if (nc_inq_attid(ncid, NC_GLOBAL, ATT_TEXT_NAME, &attid_in)) ERR;
00394       if (attid_in != 0) ERR;
00395       if (nc_inq_attname(ncid, NC_GLOBAL, attid_in, name_in)) ERR;
00396       if (strcmp(name_in, ATT_TEXT_NAME)) ERR;
00397       if (nc_rename_att(ncid, NC_GLOBAL, ATT_TEXT_NAME, ATT_TEXT_NAME2)) ERR;      
00398       if (nc_inq_attname(ncid, NC_GLOBAL, attid_in, name_in)) ERR;
00399       if (strcmp(name_in, ATT_TEXT_NAME2)) ERR;
00400       if (nc_close(ncid)) ERR;
00401 
00402       if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
00403       if (nc_inq_att(ncid, NC_GLOBAL, ATT_TEXT_NAME2, &att_type, &att_len)) ERR;
00404       if (att_type != NC_CHAR || att_len != strlen(speech) + 1) ERR;
00405       if (!(speech_in = malloc(att_len + 1))) ERR;
00406       if (nc_get_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME2, speech_in)) ERR;      
00407       if (strcmp(speech, speech_in)) ERR;
00408       free(speech_in);
00409       if (nc_get_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, speech_in) != NC_ENOTATT) ERR;      
00410       if (nc_close(ncid)) ERR;
00411 
00412       /* Now delete the att. */
00413       if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
00414       if (nc_del_att(ncid, NC_GLOBAL, ATT_TEXT_NAME2)) ERR;
00415       if (nc_close(ncid)) ERR;
00416 
00417       /* Now create a file with a variable, which has an att. */
00418       if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00419       if (nc_put_att_text(ncid, NC_GLOBAL, ATT_TEXT_NAME, strlen(speech)+1, speech)) ERR;      
00420       if (nc_def_dim(ncid, DIM1_NAME, DIM1_LEN, &dimids[0])) ERR;
00421       if (nc_def_dim(ncid, DIM2_NAME, DIM2_LEN, &dimids[1])) ERR;
00422       if (nc_def_var(ncid, VAR1_NAME, NC_INT, 2, dimids, &varid)) ERR;
00423       if (nc_put_att_int(ncid, varid, ATT_INT_NAME, NC_INT, 3, int_out)) ERR;      
00424       if (nc_close(ncid)) ERR;
00425       
00426       /* Reopen the file and delete it. Make sure it's gone. */
00427       if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
00428       if (nc_del_att(ncid, 0, ATT_INT_NAME)) ERR;
00429       if (nc_close(ncid)) ERR;
00430 
00431       /* Reopen the file and readd the attribute. Enddef and redef,
00432        * and delete it, then check to make sure it's gone. */
00433       if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
00434       if (nc_put_att_int(ncid, varid, ATT_INT_NAME, NC_INT, 3, int_out)) ERR;      
00435       if (nc_enddef(ncid)) ERR;
00436       if (nc_redef(ncid)) ERR;
00437       if (nc_del_att(ncid, 0, ATT_INT_NAME)) ERR;
00438       if (nc_inq_varnatts(ncid, 0, &natts_in)) ERR;
00439       if (natts_in != 0) ERR;
00440       if (nc_close(ncid)) ERR;
00441    }
00442 
00443    SUMMARIZE_ERR;
00444    printf("*** testing attribute create order...");
00445 
00446 #define ATT0 "Maturin"
00447 #define ATT1 "Aubery"
00448    {
00449       int attid_in;
00450       const int number = 42;
00451 
00452       /* Create a file with several global attributes. */
00453       if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00454       if (nc_put_att_int(ncid, NC_GLOBAL, ATT0, NC_INT, 1, &number)) ERR;
00455       if (nc_put_att_int(ncid, NC_GLOBAL, ATT1, NC_INT, 1, &number)) ERR;
00456       if (nc_close(ncid)) ERR;
00457       
00458       /* Open it and check the order. */
00459       if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
00460       if (nc_inq_attid(ncid, NC_GLOBAL, ATT0, &attid_in)) ERR;
00461       if (attid_in != 0) ERR;
00462       if (nc_inq_attid(ncid, NC_GLOBAL, ATT1, &attid_in)) ERR;
00463       if (attid_in != 1) ERR;
00464       if (nc_close(ncid)) ERR;
00465 
00466       /* Now create a file with a variable, which has two atts. */
00467       if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00468       if (nc_def_dim(ncid, DIM1_NAME, DIM1_LEN, &dimids[0])) ERR;
00469       if (nc_def_dim(ncid, DIM2_NAME, DIM2_LEN, &dimids[1])) ERR;
00470       if (nc_def_var(ncid, VAR1_NAME, NC_INT, 2, dimids, &varid)) ERR;
00471       if (nc_put_att_int(ncid, varid, ATT0, NC_INT, 1, &number)) ERR;
00472       if (nc_put_att_int(ncid, varid, ATT1, NC_INT, 1, &number)) ERR;
00473       if (nc_close(ncid)) ERR;
00474       
00475       /* Reopen the file and check the order of the attributes on the var. */
00476       if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
00477       if (nc_inq_attid(ncid, 0, ATT0, &attid_in)) ERR;
00478       if (attid_in != 0) ERR;
00479       if (nc_inq_attid(ncid, 0, ATT1, &attid_in)) ERR;
00480       if (attid_in != 1) ERR;
00481       if (nc_close(ncid)) ERR;
00482    }
00483 
00484    SUMMARIZE_ERR;
00485    printf("*** testing attribute ordering some more...");
00486 
00487 #define VAR_NAME "i"
00488 #define A1_NAME "i"      
00489 #define A2_NAME "f"      
00490 #define A3_NAME "d"      
00491 #define A1_LEN 3
00492 #define A2_LEN 4
00493 #define A3_LEN 5
00494    {
00495       int varid, natts, nvars;
00496       double dvalue[] = {999.99, 999.99, 999.99, 999.99, 999.99};
00497       int varids[1];
00498       char name_in[NC_MAX_NAME + 1];
00499 
00500       /* Create a file with one var, and attach three atts to it. */
00501       if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
00502       if (nc_def_var(ncid, VAR_NAME, NC_INT, 0, NULL, &varid)) ERR;
00503       if (nc_put_att_double(ncid, varid, A1_NAME, NC_INT, A1_LEN, dvalue)) ERR;      
00504       if (nc_put_att_double(ncid, varid, A2_NAME, NC_INT, A2_LEN, dvalue)) ERR;      
00505       if (nc_put_att_double(ncid, varid, A3_NAME, NC_INT, A3_LEN, dvalue)) ERR;      
00506       if (nc_close(ncid)) ERR;
00507       
00508       /* Reopen the file and check. */
00509       if (nc_open(FILE_NAME, 0, &ncid)) ERR;
00510       if (nc_inq_varids(ncid, &nvars, varids)) ERR;
00511       if (nvars != 1 || varids[0] != 0) ERR;
00512       if (nc_inq_varnatts(ncid, 0, &natts)) ERR;
00513       if (natts != 3) ERR;
00514       if (nc_inq_attname(ncid, 0, 0, name_in)) ERR;
00515       if (strcmp(name_in, A1_NAME)) ERR;
00516       if (nc_inq_attname(ncid, 0, 1, name_in)) ERR;
00517       if (strcmp(name_in, A2_NAME)) ERR;
00518       if (nc_inq_attname(ncid, 0, 2, name_in)) ERR;
00519       if (strcmp(name_in, A3_NAME)) ERR;
00520 
00521       /* Close up shop. */
00522       if (nc_close(ncid)) ERR;
00523    }
00524 
00525    SUMMARIZE_ERR;
00526 
00527    FINAL_RESULTS;
00528 }
00529 
00530 

Generated on Thu Mar 16 18:10:11 2006 for nco by  doxygen 1.4.4