1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
/*********************************************************************
* Copyright 2016, UCAR/Unidata
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
*********************************************************************/
/**
Test the netcdf-4 data building process.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "netcdf.h"
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#else
#if defined(_WIN32) && !defined(__MINGW32__)
#include "XGetopt.h"
#endif
#endif
#undef DEBUG
static struct Options {
char* file;
char* substratename;
int debug;
int checksum;
int logging;
} options = {NULL,NULL,0,0,0};
static char testname[4096];
/* Forward */
static int test(const char*);
static void
usage(void)
{
fprintf(stderr,"usage: %s.c [-d] [-v] [-c] [-s <substratename>] <file>\n",testname);
exit(1);
}
static void
breakpoint(int code, int line)
{
if(code != NC_NOERR) {
fprintf(stderr,"***Fail: line: %d err: (%d) %s\n",line,code,nc_strerror(code));
fflush(stderr);
}
}
#define CHECK(err) if((ret = (err))) {breakpoint(err,__LINE__); goto done;} else {}
static void
parse(int argc, char** argv)
{
int c = 0;
while ((c = getopt(argc, argv, "cds:v")) != EOF) {
switch(c) {
case 'c':
options.checksum = 1;
break;
case 'd':
options.debug = 1;
break;
case 's':
options.substratename = strdup(optarg);
break;
case 'v':
usage();
goto done;
case '?':
case ':':
fprintf(stderr,"unknown option: %d\n",c);
usage();
goto done;
}
}
/* get url argument */
argc -= optind;
argv += optind;
if (argc > 1) {
fprintf(stderr, "only one input url argument permitted\n");
usage();
}
if (argc == 0) {
fprintf(stderr, "no input url specified\n");
usage();
}
options.file = strdup(argv[0]);
/* defaults */
#ifdef DEBUG
options.logging = 1;
#endif
done:
return;
}
static void
gettestname(const char* argv0)
{
const char* prefix;
char* suffix;
if((prefix = strrchr(argv0,'/'))==NULL)
prefix = strrchr(argv0,'\\');
if(prefix) prefix++; else prefix = argv0;
testname[0] = '\0';
strlcat(testname,prefix,sizeof(testname));
suffix = strrchr(testname,'.');
if(suffix != NULL) *suffix = '\0';
}
int
main(int argc, char** argv)
{
int ret = NC_NOERR;
char url[4096];
gettestname(argv[0]);
parse(argc,argv);
/* build the url */
snprintf(url,sizeof(url),"file://%s?%s#dap4&debug=copy%s%s%s",
options.file,
(options.checksum?"dap4.checksum=true":"dap4.checksum=false"),
(options.substratename?"&substratename=" : ""),
(options.substratename?options.substratename: ""),
(options.logging?"&log": ""));
#ifdef DEBUG
fprintf(stderr,"%s: url=%s\n",testname,url);
#endif
ret = test(url);
#ifdef DEBUG
fprintf(stderr,"code=%d %s\n",ret,nc_strerror(ret));
#endif
return (ret ? 1 : 0);
}
static int
test(const char* url)
{
int ret = NC_NOERR;
int ncid;
/* Use the open/close mechanism */
CHECK(nc_open(url,NC_NETCDF4,&ncid));
CHECK(nc_close(ncid));
done:
return ret;
}
|