2010-06-03 21:24:43 +08:00
|
|
|
/*********************************************************************
|
2018-12-07 06:40:43 +08:00
|
|
|
* Copyright 2018, UCAR/Unidata
|
2010-06-03 21:24:43 +08:00
|
|
|
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
|
|
|
|
* $Header: /upc/share/CVS/netcdf-3/ncgen/genlib.c,v 1.57 2010/04/04 19:39:47 dmh Exp $
|
|
|
|
*********************************************************************/
|
|
|
|
|
|
|
|
#include "includes.h"
|
|
|
|
|
|
|
|
/* invoke netcdf calls (or generate C or Fortran code) to create netcdf
|
|
|
|
* from in-memory structure.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
define_netcdf(void)
|
|
|
|
{
|
2017-11-14 03:33:19 +08:00
|
|
|
|
2010-06-03 21:24:43 +08:00
|
|
|
/* Execute exactly one of these */
|
|
|
|
#ifdef ENABLE_C
|
2018-11-16 01:00:38 +08:00
|
|
|
if (l_flag == L_C) genc_netcdf(); else /* create C code to create netcdf */
|
2010-06-03 21:24:43 +08:00
|
|
|
#endif
|
|
|
|
#ifdef ENABLE_F77
|
2018-11-16 01:00:38 +08:00
|
|
|
if (l_flag == L_F77) genf77_netcdf(); else /* create Fortran code */
|
2010-06-03 21:24:43 +08:00
|
|
|
#endif
|
|
|
|
#ifdef ENABLE_JAVA
|
2018-11-16 01:00:38 +08:00
|
|
|
if(l_flag == L_JAVA) genjava_netcdf(); else
|
2010-06-03 21:24:43 +08:00
|
|
|
#endif
|
|
|
|
/* Binary is the default */
|
|
|
|
#ifdef ENABLE_BINARY
|
2018-11-16 01:00:38 +08:00
|
|
|
genbin_netcdf(); /* create netcdf */
|
2010-06-03 21:24:43 +08:00
|
|
|
#else
|
|
|
|
derror("No language specified");
|
|
|
|
#endif
|
|
|
|
close_netcdf();
|
|
|
|
cleanup();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
close_netcdf(void)
|
|
|
|
{
|
|
|
|
#ifdef ENABLE_C
|
2018-11-16 01:00:38 +08:00
|
|
|
if (l_flag == L_C) genc_close(); else /* create C code to close netcdf */
|
2010-06-03 21:24:43 +08:00
|
|
|
#endif
|
|
|
|
#ifdef ENABLE_F77
|
2018-11-16 01:00:38 +08:00
|
|
|
if (l_flag == L_F77) genf77_close(); else
|
2010-06-03 21:24:43 +08:00
|
|
|
#endif
|
|
|
|
#ifdef ENABLE_JAVA
|
2018-11-16 01:00:38 +08:00
|
|
|
if (l_flag == L_JAVA) genjava_close(); else
|
2010-06-03 21:24:43 +08:00
|
|
|
#endif
|
|
|
|
#ifdef ENABLE_BINARY
|
2018-11-16 01:00:38 +08:00
|
|
|
if (l_flag == L_BINARY) genbin_close();
|
2010-06-03 21:24:43 +08:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2013-09-21 10:31:21 +08:00
|
|
|
/**
|
|
|
|
Return a string representing
|
|
|
|
the fully qualified name of the symbol.
|
|
|
|
Symbol must be top level
|
|
|
|
Caller must free.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
topfqn(Symbol* sym)
|
|
|
|
{
|
2018-02-09 10:53:40 +08:00
|
|
|
#ifdef USE_NETCDF4
|
2013-09-21 10:31:21 +08:00
|
|
|
char* fqn;
|
|
|
|
char* fqnname;
|
|
|
|
char* parentfqn;
|
|
|
|
Symbol* parent;
|
2018-02-09 10:53:40 +08:00
|
|
|
#endif
|
2018-02-28 06:00:49 +08:00
|
|
|
|
2013-09-21 10:31:21 +08:00
|
|
|
if(sym->fqn != NULL)
|
|
|
|
return; /* already defined */
|
|
|
|
|
2013-09-22 06:19:06 +08:00
|
|
|
#ifdef USE_NETCDF4
|
|
|
|
if(!usingclassic) {
|
|
|
|
parent = sym->container;
|
|
|
|
/* Recursively compute parent fqn */
|
|
|
|
if(parent == NULL) { /* implies this is the rootgroup */
|
|
|
|
assert(sym->grp.is_root);
|
2018-11-16 01:00:38 +08:00
|
|
|
sym->fqn = estrdup("");
|
2013-09-22 06:19:06 +08:00
|
|
|
return;
|
|
|
|
} else if(parent->fqn == NULL) {
|
|
|
|
topfqn(parent);
|
|
|
|
}
|
|
|
|
parentfqn = parent->fqn;
|
2018-02-28 06:00:49 +08:00
|
|
|
|
2013-09-22 06:19:06 +08:00
|
|
|
fqnname = fqnescape(sym->name);
|
2018-04-21 03:06:26 +08:00
|
|
|
fqn = (char*)ecalloc(strlen(fqnname) + strlen(parentfqn) + 1 + 1);
|
2013-09-22 06:19:06 +08:00
|
|
|
strcpy(fqn,parentfqn);
|
|
|
|
strcat(fqn,"/");
|
|
|
|
strcat(fqn,fqnname);
|
|
|
|
sym->fqn = fqn;
|
|
|
|
} else
|
|
|
|
#endif /*USE_NETCDF4*/
|
|
|
|
{
|
|
|
|
sym->fqn = strdup(sym->name);
|
2010-06-03 21:24:43 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-21 10:31:21 +08:00
|
|
|
/**
|
|
|
|
Return a string representing
|
|
|
|
the fully qualified name of a nested symbol
|
|
|
|
(i.e. field or econst).
|
|
|
|
Caller must free.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
nestedfqn(Symbol* sym)
|
|
|
|
{
|
|
|
|
char* fqn;
|
|
|
|
char* fqnname;
|
|
|
|
Symbol* parent;
|
2018-02-28 06:00:49 +08:00
|
|
|
|
2013-09-21 10:31:21 +08:00
|
|
|
if(sym->fqn != NULL)
|
|
|
|
return; /* already defined */
|
|
|
|
|
|
|
|
/* Parent must be a type */
|
|
|
|
parent = sym->container;
|
|
|
|
assert (parent->objectclass == NC_TYPE);
|
|
|
|
|
|
|
|
assert(parent->fqn != NULL);
|
|
|
|
|
|
|
|
fqnname = fqnescape(sym->name);
|
2018-04-21 03:06:26 +08:00
|
|
|
fqn = (char*)ecalloc(strlen(fqnname) + strlen(parent->fqn) + 1 + 1);
|
2013-09-21 10:31:21 +08:00
|
|
|
strcpy(fqn,parent->fqn);
|
|
|
|
strcat(fqn,".");
|
|
|
|
strcat(fqn,fqnname);
|
|
|
|
sym->fqn = fqn;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Return a string representing
|
|
|
|
the fully qualified name of an attribute.
|
|
|
|
Caller must free.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
attfqn(Symbol* sym)
|
|
|
|
{
|
|
|
|
char* fqn;
|
|
|
|
char* fqnname;
|
|
|
|
char* parentfqn;
|
|
|
|
Symbol* parent;
|
2018-02-28 06:00:49 +08:00
|
|
|
|
2013-09-21 10:31:21 +08:00
|
|
|
if(sym->fqn != NULL)
|
|
|
|
return; /* already defined */
|
|
|
|
|
|
|
|
assert (sym->objectclass == NC_ATT);
|
|
|
|
|
|
|
|
parent = sym->container;
|
|
|
|
if(parent == NULL)
|
|
|
|
parentfqn = "";
|
|
|
|
else
|
|
|
|
parentfqn = parent->fqn;
|
|
|
|
|
|
|
|
fqnname = fqnescape(sym->name);
|
2018-04-21 03:06:26 +08:00
|
|
|
fqn = (char*)ecalloc(strlen(fqnname) + strlen(parentfqn) + 1 + 1);
|
2013-09-21 10:31:21 +08:00
|
|
|
strcpy(fqn,parentfqn);
|
|
|
|
strcat(fqn,"_");
|
|
|
|
strcat(fqn,fqnname);
|
|
|
|
sym->fqn = fqn;
|
|
|
|
}
|