Commit 7419f94b authored by Thomas Jahns's avatar Thomas Jahns 🤸
Browse files

Add tests for writing/reading files.

parent 0ab3f739
......@@ -297,6 +297,17 @@ tables/template.3.101.def -text
tables/wmo_001 -text
tests/Makefile.am -text
tests/Makefile.in -text
tests/cksum.c -text
tests/cksum.h -text
tests/cksum_read.c -text
tests/cksum_write.c -text
tests/test_cksum_extra.in -text
tests/test_cksum_grib.in -text
tests/test_cksum_ieg.in -text
tests/test_cksum_nc.in -text
tests/test_cksum_nc2.in -text
tests/test_cksum_nc4.in -text
tests/test_cksum_service.in -text
tests/test_grib.c -text
tests/test_grib.sh -text
util/sunf95preproc-wrapper -text
......
......@@ -26638,6 +26638,9 @@ fi
 
 
 
ac_config_files="$ac_config_files tests/test_cksum_grib tests/test_cksum_nc tests/test_cksum_nc2 tests/test_cksum_nc4 tests/test_cksum_extra tests/test_cksum_service tests/test_cksum_ieg"
ac_config_files="$ac_config_files Makefile src/Makefile interfaces/Makefile app/Makefile tests/Makefile examples/Makefile cdi.settings pioExamples/Makefile src/pkgconfig/cdi.pc"
 
cat >confcache <<\_ACEOF
......@@ -27969,6 +27972,13 @@ do
"src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
"libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
"tests/test_cksum_grib") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_grib" ;;
"tests/test_cksum_nc") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc" ;;
"tests/test_cksum_nc2") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc2" ;;
"tests/test_cksum_nc4") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc4" ;;
"tests/test_cksum_extra") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_extra" ;;
"tests/test_cksum_service") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_service" ;;
"tests/test_cksum_ieg") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_ieg" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
"interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
......@@ -29784,6 +29794,13 @@ compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
_LT_EOF
 
;;
"tests/test_cksum_grib":F) chmod a+x "$ac_file" ;;
"tests/test_cksum_nc":F) chmod a+x "$ac_file" ;;
"tests/test_cksum_nc2":F) chmod a+x "$ac_file" ;;
"tests/test_cksum_nc4":F) chmod a+x "$ac_file" ;;
"tests/test_cksum_extra":F) chmod a+x "$ac_file" ;;
"tests/test_cksum_service":F) chmod a+x "$ac_file" ;;
"tests/test_cksum_ieg":F) chmod a+x "$ac_file" ;;
 
esac
done # for ac_tag
......
......@@ -197,6 +197,14 @@ ACX_CHECK_CFINT([$srcdir/src/cfortran.h])
AC_SUBST([CPPFLAGS])
AC_CONFIG_FILES([tests/test_cksum_grib \
tests/test_cksum_nc \
tests/test_cksum_nc2 \
tests/test_cksum_nc4 \
tests/test_cksum_extra \
tests/test_cksum_service \
tests/test_cksum_ieg],[chmod a+x "$ac_file"])
AC_OUTPUT([Makefile src/Makefile interfaces/Makefile app/Makefile \
tests/Makefile examples/Makefile cdi.settings \
pioExamples/Makefile src/pkgconfig/cdi.pc])
......
## Process this file with automake to produce Makefile.in
#
TESTS = test_grib.sh
check_PROGRAMS = test_grib
TESTS = test_grib.sh test_cksum_grib test_cksum_nc test_cksum_extra \
test_cksum_service test_cksum_nc2 test_cksum_nc4 test_cksum_ieg
check_PROGRAMS = test_grib cksum_write cksum_read
#
test_grib_SOURCES = test_grib.c
cksum_write_SOURCES = cksum_write.c cksum.c cksum.h
cksum_read_SOURCES = cksum_read.c cksum.c cksum.h
#
LDADD = -L../src -lcdi -lm
AM_LDFLAGS = -L$(top_srcdir)/src
......
......@@ -33,9 +33,14 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
check_PROGRAMS = test_grib$(EXEEXT)
check_PROGRAMS = test_grib$(EXEEXT) cksum_write$(EXEEXT) \
cksum_read$(EXEEXT)
subdir = tests
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/test_cksum_extra.in $(srcdir)/test_cksum_grib.in \
$(srcdir)/test_cksum_ieg.in $(srcdir)/test_cksum_nc.in \
$(srcdir)/test_cksum_nc2.in $(srcdir)/test_cksum_nc4.in \
$(srcdir)/test_cksum_service.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = \
$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
......@@ -53,8 +58,18 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/src/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_FILES = test_cksum_grib test_cksum_nc test_cksum_nc2 \
test_cksum_nc4 test_cksum_extra test_cksum_service \
test_cksum_ieg
CONFIG_CLEAN_VPATH_FILES =
am_cksum_read_OBJECTS = cksum_read.$(OBJEXT) cksum.$(OBJEXT)
cksum_read_OBJECTS = $(am_cksum_read_OBJECTS)
cksum_read_LDADD = $(LDADD)
cksum_read_DEPENDENCIES =
am_cksum_write_OBJECTS = cksum_write.$(OBJEXT) cksum.$(OBJEXT)
cksum_write_OBJECTS = $(am_cksum_write_OBJECTS)
cksum_write_LDADD = $(LDADD)
cksum_write_DEPENDENCIES =
am_test_grib_OBJECTS = test_grib.$(OBJEXT)
test_grib_OBJECTS = $(am_test_grib_OBJECTS)
test_grib_LDADD = $(LDADD)
......@@ -72,8 +87,10 @@ CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(test_grib_SOURCES)
DIST_SOURCES = $(test_grib_SOURCES)
SOURCES = $(cksum_read_SOURCES) $(cksum_write_SOURCES) \
$(test_grib_SOURCES)
DIST_SOURCES = $(cksum_read_SOURCES) $(cksum_write_SOURCES) \
$(test_grib_SOURCES)
ETAGS = etags
CTAGS = ctags
am__tty_colors = \
......@@ -254,9 +271,13 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
#
TESTS = test_grib.sh
TESTS = test_grib.sh test_cksum_grib test_cksum_nc test_cksum_extra \
test_cksum_service test_cksum_nc2 test_cksum_nc4 test_cksum_ieg
#
test_grib_SOURCES = test_grib.c
cksum_write_SOURCES = cksum_write.c cksum.c cksum.h
cksum_read_SOURCES = cksum_read.c cksum.c cksum.h
#
LDADD = -L../src -lcdi -lm
AM_LDFLAGS = -L$(top_srcdir)/src
......@@ -299,6 +320,20 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
test_cksum_grib: $(top_builddir)/config.status $(srcdir)/test_cksum_grib.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
test_cksum_nc: $(top_builddir)/config.status $(srcdir)/test_cksum_nc.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
test_cksum_nc2: $(top_builddir)/config.status $(srcdir)/test_cksum_nc2.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
test_cksum_nc4: $(top_builddir)/config.status $(srcdir)/test_cksum_nc4.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
test_cksum_extra: $(top_builddir)/config.status $(srcdir)/test_cksum_extra.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
test_cksum_service: $(top_builddir)/config.status $(srcdir)/test_cksum_service.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
test_cksum_ieg: $(top_builddir)/config.status $(srcdir)/test_cksum_ieg.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
clean-checkPROGRAMS:
@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
......@@ -308,6 +343,12 @@ clean-checkPROGRAMS:
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
cksum_read$(EXEEXT): $(cksum_read_OBJECTS) $(cksum_read_DEPENDENCIES)
@rm -f cksum_read$(EXEEXT)
$(LINK) $(cksum_read_OBJECTS) $(cksum_read_LDADD) $(LIBS)
cksum_write$(EXEEXT): $(cksum_write_OBJECTS) $(cksum_write_DEPENDENCIES)
@rm -f cksum_write$(EXEEXT)
$(LINK) $(cksum_write_OBJECTS) $(cksum_write_LDADD) $(LIBS)
test_grib$(EXEEXT): $(test_grib_OBJECTS) $(test_grib_DEPENDENCIES)
@rm -f test_grib$(EXEEXT)
$(LINK) $(test_grib_OBJECTS) $(test_grib_LDADD) $(LIBS)
......@@ -318,6 +359,9 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_read.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_write.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_grib.Po@am__quote@
.c.o:
......
#include <inttypes.h>
#include <stdlib.h>
#include <sys/types.h>
static const uint32_t crctab[] = {
0x00000000,
0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
};
uint32_t
memcrc(const unsigned char *b, size_t n)
{
/* Input arguments:
* const char* b == byte sequence to checksum
* size_t n == length of sequence
*/
register uint32_t i, c, s = 0;
for (i = n; i > 0; --i) {
c = (uint32_t)(*b++);
s = (s << 8) ^ crctab[(s >> 24) ^ c];
}
/* Extend with the length of the string. */
while (n != 0) {
c = n & 0377;
n >>= 8;
s = (s << 8) ^ crctab[(s >> 24) ^ c];
}
return ~s;
}
void
memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len)
{
/* Input arguments:
* const char* b == byte sequence to checksum
* size_t n == length of sequence
*/
register uint32_t i, c, s = *state;
register size_t n = block_len;
register const unsigned char *b = block;
for (i = n; i > 0; --i) {
c = (uint32_t)(*b++);
s = (s << 8) ^ crctab[(s >> 24) ^ c];
}
*state = s;
}
unsigned long
memcrc_finish(uint32_t *state, off_t total_size)
{
register uint32_t c, s = *state;
register off_t n = total_size;
/* Extend with the length of the string. */
while (n != 0) {
c = n & 0377;
n >>= 8;
s = (s << 8) ^ crctab[(s >> 24) ^ c];
}
return ~s;
}
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <inttypes.h>
void
memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len);
unsigned long
memcrc_finish(uint32_t *state, off_t total_size);
uint32_t
memcrc(const unsigned char *b, size_t n);
#include <assert.h>
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include "cdi.h"
#include "cksum.h"
int main(int argc, char *argv[])
{
int taxisID, vlistID, streamID, tsID;
int vdate, vtime, nvars, ngrids, nzaxis;
int i;
uint32_t *checksum_state;
struct {
int x, y, z;
size_t chars;
} *varSize;
double **var;
char *fname = "example.grb";
if (argc > 1)
fname = argv[1];
// Open the dataset
streamID = streamOpenRead(fname);
if ( streamID < 0 )
{
fprintf(stderr, "Cannot open data input file %s: %s\n",
fname, cdiStringError(streamID));
return(1);
}
// Get the variable list of the dataset
vlistID = streamInqVlist(streamID);
nvars = vlistNvars(vlistID);
var = malloc(nvars * sizeof (var[0]));
checksum_state = calloc(nvars, sizeof (checksum_state[0]));
ngrids = vlistNgrids(vlistID);
nzaxis = vlistNzaxis(vlistID);
if (nzaxis < 0 || ngrids < 0)
{
fprintf(stderr, "Error in grid/zaxis count query %d:%d\n",
ngrids, nzaxis);
}
varSize = malloc(nvars * sizeof (varSize[0]));
for (i = 0; i < nvars; ++i)
{
int grid = vlistInqVarGrid(vlistID, i), gridType;
int zaxis = vlistInqVarZaxis(vlistID, i);
if (grid == CDI_UNDEFID || zaxis == CDI_UNDEFID)
{
fputs("error in axis/grid inquiry\n", stderr);
exit(EXIT_FAILURE);
}
if ((varSize[i].z = zaxisInqSize(zaxis)) <= 0)
{
fputs("invalid Z-axis found\n", stderr);
exit(EXIT_FAILURE);
}
if ((gridType = gridInqType(grid)) != GRID_LONLAT
&& gridType != GRID_GENERIC)
{
fprintf(stderr, "unexpected non-lonlat grid found: %d\n",
gridType);
exit(EXIT_FAILURE);
}
if ((varSize[i].x = gridInqXsize(grid)) < 0)
{
fprintf(stderr, "invalid X-size found: %d\n", varSize[i].x);
exit(EXIT_FAILURE);
}
if (varSize[i].x == 0) varSize[i].x = 1;
if ((varSize[i].y = gridInqYsize(grid)) < 0)
{
fprintf(stderr, "invalid Y-size found: %d\n", varSize[i].y);
exit(EXIT_FAILURE);
}
if (varSize[i].y == 0) varSize[i].y = 1;
varSize[i].chars = (size_t)varSize[i].x * varSize[i].y * varSize[i].z
* sizeof (var[0][0]);
var[i] = malloc(varSize[i].chars);
}
// Get the Time axis from the variable list
taxisID = vlistInqTaxis(vlistID);
tsID = 0;
// Inquire the time step
while (streamInqTimestep(streamID, tsID))
{
// Get the verification date and time
vdate = taxisInqVdate(taxisID);
vtime = taxisInqVtime(taxisID);
// Read var1 and var2
for (i = 0; i < nvars; ++i)
{
int nmiss;
streamReadVar(streamID, i, var[i], &nmiss);
memcrc_r(checksum_state + i, (const unsigned char *)var[i],
varSize[i].chars);
}
++tsID;
}
// check checksums from table file
{
uint32_t cksum[nvars];
unsigned long cksum_temp;
int code, varCodes[nvars], checked[nvars];
FILE *tablefp;
for (i = 0; i < nvars; ++i)
{
cksum[i] = memcrc_finish(checksum_state + i,
(off_t)varSize[i].chars * tsID);
varCodes[i] = vlistInqVarCode(vlistID, i);
checked[i] = 0;
}
if (!(tablefp = fopen("example.cksum", "r")))
{
fputs("bla\n", stderr);
perror("failed to open table file");
exit(EXIT_FAILURE);
}
while (fscanf(tablefp, "%08lx %d\n", &cksum_temp, &code) == 2)
{
for (i = 0; i < nvars; ++i)
if (varCodes[i] == code)
{
if (cksum[i] != cksum_temp)
{
fprintf(stderr, "checksum error for varID %d, code %d!\n"
"%08lx != %08lx\n", i, code,
(unsigned long)cksum[i], cksum_temp);
exit(EXIT_FAILURE);
}
checked[i] = 1;
break;
}
}
fclose(tablefp);
for (i = 0; i < nvars; ++i)
if (!checked[i])
{
fprintf(stderr, "variable %d, code %d in file not checked!\n",
i, varCodes[i]);
exit(EXIT_FAILURE);
}
}
// Close the input stream
streamClose(streamID);
return 0;
}
/*
* Local Variables:
* c-file-style: "Java"
* c-basic-offset: 2
* indent-tabs-mode: nil
* show-trailing-whitespace: t
* require-trailing-newline: t
* End:
*/
#include <errno.h>
#include <inttypes.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "cdi.h"
#include "cksum.h"
static int
parse_intarg(const char msg[])
{
char *end;
long temp = strtol(optarg, &end, 0);
if ((errno == ERANGE && (temp == LONG_MAX || temp == LONG_MIN))
|| (errno != 0 && temp == 0)) {
perror(msg);
exit(EXIT_FAILURE);
}
if (temp > INT_MAX || temp < INT_MIN)
{
fprintf(stderr, "range error: %ld\n", temp);
exit(EXIT_FAILURE);
}
return (int)temp;
}
static inline double
sign_flat(double v)
{
if (v == 0.0)
return 0.0;
return v;
}
static char *
fname_create(const char *prefix, const char *suffix)
{
size_t prefix_len, suffix_len;
char *fname;
if (!(fname =malloc((prefix_len = strlen(prefix)) + 1
+ (suffix_len = strlen(suffix)) + 1)))
{
perror("cannot create string");
exit(EXIT_FAILURE);
}
strcpy(fname, prefix);
fname[prefix_len] = '.';
strcpy(fname + prefix_len + 1, suffix);
return fname;
}
static const struct {
char suffix[4];
int type, defaultDT, defaultGrid;
} suffix2type[] = {
{ "nc", FILETYPE_NC, DATATYPE_FLT64, GRID_LONLAT },
{ "grb", FILETYPE_GRB, DATATYPE_PACK24, GRID_LONLAT },
{ "nc2", FILETYPE_NC2, DATATYPE_FLT64, GRID_LONLAT },
{ "nc4", FILETYPE_NC4, DATATYPE_FLT64, GRID_LONLAT },
{ "ext", FILETYPE_EXT, DATATYPE_FLT64, GRID_GENERIC, },
{ "svc", FILETYPE_SRV, DATATYPE_FLT64, GRID_GENERIC, },
{ "ieg", FILETYPE_IEG, DATATYPE_FLT64, GRID_LONLAT },
};
enum {
nvars = 2,
};
static const int varCodes[nvars] = { 42, 55 };
int
main(int argc, char *argv[])
{
int gridID, zaxisID[nvars], taxisID;
int vlistID, varID[nvars], streamID, tsID;
int nlon = 12, //!< Number of longitudes
nlat = 6, //!< Number of latitudes
nlev = 5, //!< Number of levels
nts = 3; //!< Number of time steps
int i, j, k, nmiss = 0;
double *lons, *lats, *var[nvars], *levs, mscale, mrscale;
size_t varSize[nvars];
char *varName[nvars] = { "varname1", "varname2" };
const char *suffix = "grb", *prefix = "example";
int grid = GRID_LONLAT;
int filetype = FILETYPE_GRB, datatype = DATATYPE_PACK24;
{
int opt;
while ((opt = getopt(argc, argv, "f:m:n:o:t:")) != -1)
switch (opt) {
case 'f':
{
int found = 0;
for (i = 0;
i < sizeof (suffix2type) / sizeof (suffix2type[0]);
++i)
if (!strcmp(optarg, suffix2type[i].suffix))
{
found = 1;
filetype = suffix2type[i].type;
suffix = suffix2type[i].suffix;
datatype = suffix2type[i].defaultDT;
break;
}
if (!found)
{
fprintf(stderr, "Unsupported format requested: %s\n", optarg);
exit(EXIT_FAILURE);
}
}