1/*********************************************************************
2 *   Copyright 1993, UCAR/Unidata
3 *   See netcdf/COPYRIGHT file for copying and redistribution conditions.
4 *   $Header: /upc/share/CVS/netcdf-3/ncgen3/main.c,v 1.20 2010/03/31 18:18:40 dmh Exp $
5 *********************************************************************/
6
7#include "config.h"
8#include <stdio.h>
9#include <stdlib.h>
10#ifdef HAVE_UNISTD_H
11#include <unistd.h>
12#endif
13#include <string.h>
14#ifdef HAVE_GETOPT_H
15#include <getopt.h>
16#endif
17
18#ifdef _MSC_VER
19#include "XGetopt.h"
20#define snprintf _snprintf
21int opterr;
22int optind;
23#endif
24
25#ifdef __hpux
26#include <locale.h>
27#endif
28
29#include <netcdf.h>
30
31#include "generic.h"
32#include "ncgen.h"
33#include "genlib.h"
34
35extern int ncgparse(void);
36
37const char *progname; /* for error messages */
38const char *cdlname;
39
40int c_flag;
41int fortran_flag;
42int netcdf_flag;
43int cmode_modifier;
44int nofill_flag;
45char *netcdf_name = NULL; /* name of output netCDF file to write */
46
47extern FILE *ncgin;
48extern int derror_count;
49
50static const char* ubasename ( const char* av0 );
51static void usage ( void );
52int main ( int argc, char** argv );
53
54
55/* strip off leading path */
56static const char *
57ubasename(
58 const char *av0)
59{
60 const char *logident ;
61#ifdef VMS
62#define SEP ']'
63#endif
64#ifdef MSDOS
65#define SEP '\\'
66#endif
67#ifndef SEP
68#define SEP '/'
69#endif
70 if ((logident = strrchr(av0SEP)) == NULL)
71 logident = av0 ;
72 else
73     logident++ ;
74 return logident ;
75}
76
77
78static void usage(void)
79{
80    derror("Usage: %s [ -b ] [ -c ] [ -f ] [ -k kind ] [ -x ] [ -o outfile]  [ file ... ]",
81    progname);
82    derror("netcdf library version %s", nc_inq_libvers());
83}
84
85
86int
87main(
88 int argc,
89 char *argv[])
90{
91/*    MSC_EXTRA extern int optind;
92    MSC_EXTRA extern int opterr;
93    MSC_EXTRA extern char *optarg;*/
94    int any_error;
95    int c;
96    FILE *fp;
97
98#ifdef __hpux
99    setlocale(LC_CTYPE,"");
100#endif
101
102#ifdef MDEBUG
103 malloc_debug(2) ; /* helps find malloc/free errors on Sun */
104#endif /* MDEBUG */
105
106    opterr = 1; /* print error message if bad option */
107    progname = ubasename(argv[0]);
108    cdlname = "-";
109
110    c_flag = 0;
111    fortran_flag = 0;
112    netcdf_flag = 0;
113    cmode_modifier = 0;
114    nofill_flag = 0;
115
116#if _CRAYMPP && 0
117    /* initialize CRAY MPP parallel-I/O library */
118    (void) par_io_init(32, 32);
119#endif
120
121    while ((c = getopt(argcargv, "bcfk:l:no:v:x")) != EOF)
122      switch(c) {
123 case 'c': /* for c output, old version of "-lc" */
124   c_flag = 1;
125   break;
126 case 'f': /* for fortran output, old version of "-lf" */
127   fortran_flag = 1;
128   break;
129 case 'b': /* for binary netcdf output, ".nc" extension */
130   netcdf_flag = 1;
131   break;
132        case 'l': /* specify language, instead of using -c or -f */
133     {
134 char *lang_name = (char *) emalloc(strlen(optarg)+1);
135 if (! lang_name) {
136     derror ("%s: out of memory", progname);
137     return(1);
138 }
139 (void)strcpy(lang_nameoptarg);
140 if (strcmp(lang_name, "c") == 0 || strcmp(lang_name, "C") == 0) {
141     c_flag = 1;
142 }
143 else if (strcmp(lang_name, "f77") == 0 ||
144  strcmp(lang_name, "fortran77") == 0 ||
145  strcmp(lang_name, "Fortran77") == 0) {
146     fortran_flag = 1;
147 } else { /* Fortran90, Java, C++, Perl, Python, Ruby, ... */
148     derror("%s: output language %s not implemented",
149    prognamelang_name);
150     return(1);
151 }
152     }
153   break;
154 case 'n': /* old version of -b, uses ".cdf" extension */
155   netcdf_flag = -1;
156   break;
157 case 'o': /* to explicitly specify output name */
158   netcdf_flag = 1;
159   netcdf_name = (char *) emalloc(strlen(optarg)+1);
160   if (! netcdf_name) {
161       derror ("%s: out of memory", progname);
162       return(1);
163   }
164   (void)strcpy(netcdf_name,optarg);
165   break;
166 case 'x': /* set nofill mode to speed up creation of large files */
167   nofill_flag = 1;
168   break;
169        case 'v': /* a deprecated alias for "kind" option */
170     /*FALLTHRU*/
171        case 'k': /* for specifying variant of netCDF format to be generated */
172     {
173 char *kind_name = (char *) emalloc(strlen(optarg)+1);
174 if (! kind_name) {
175     derror ("%s: out of memory", progname);
176     return(1);
177 }
178 (void)strcpy(kind_nameoptarg);
179 /* The default kind is kind 1 (classic), with 32-bit offsets */
180 if (strcmp(kind_name, "1") == 0 ||
181     strcmp(kind_name, "classic") == 0) {
182     cmode_modifier |= NC_CLASSIC_MODEL;
183 }
184 /* The 64-bit offset kind (2)  should only be used if actually needed */
185 else if (strcmp(kind_name, "2") == 0 ||
186  strcmp(kind_name, "64-bit-offset") == 0 ||
187  strcmp(kind_name, "64-bit offset") == 0) {
188     cmode_modifier |= NC_64BIT_OFFSET;
189 }
190#ifdef USE_NETCDF4
191 /* NetCDF-4 HDF5 format*/
192 else if (strcmp(kind_name, "3") == 0 ||
193  strcmp(kind_name, "hdf5") == 0 ||
194  strcmp(kind_name, "netCDF-4") == 0) {
195     cmode_modifier |= NC_NETCDF4;
196 }
197 /* NetCDF-4 HDF5 format, but using only nc3 data model */
198 else if (strcmp(kind_name, "4") == 0 ||
199     strcmp(kind_name, "hdf5-nc3") == 0 ||
200     strcmp(kind_name, "netCDF-4 classic model") == 0) {
201     cmode_modifier |= NC_NETCDF4 | NC_CLASSIC_MODEL;
202 }
203#endif
204 else
205 {
206    derror("Invalid format, try classic, 64-bit offset, netCDF-4, or netCDF-4 classic model");
207    return 2;
208 }
209 free(kind_name);
210     }
211   break;
212 case '?':
213   usage();
214   return(8);
215      }
216
217    if (fortran_flag && c_flag) {
218 derror("Only one of -c or -f may be specified");
219 return(8);
220      }
221
222    argc -= optind;
223    argv += optind;
224
225    if (argc > 1) {
226 derror ("%s: only one input file argument permitted",progname);
227 return(6);
228    }
229
230    fp = stdin;
231    if (argc > 0 && strcmp(argv[0], "-") != 0) {
232 if ((fp = fopen(argv[0], "r")) == NULL) {
233     derror ("can't open file %s for reading: ", argv[0]);
234     perror("");
235     return(7);
236 }
237 cdlname = argv[0];
238    }
239    ncgin = fp;
240    any_error = ncgparse();
241    if (any_error || derror_count > 0)
242 return 1;
243    return 0;
244}
245END_OF_MAIN()


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