lfi2cdf: *added cdf2cdf
[MNH-git_open_source-lfs.git] / tools / lfi2cdf / src / newmain.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <getopt.h>
5
6 #define BUFSIZE 4096
7
8 extern lfi2cdfmain_(char*, int*, int *, char*, int*, char*, int*, int*, int*, int*, int*, int*, int*, int*, int*, int*, int*);
9
10 char *cleancomma(char *varlist)
11 {
12   char *ip, *op;
13
14   op = varlist;
15   
16   for (ip=varlist; *ip; ip++) {
17     if (*ip != ',' || *ip == ',' && *op != ',') 
18       *(++op) = *ip;
19   }
20   if (*op != ',') 
21     *(++op) = ',';
22
23   *(op+1) = '\0';
24   return varlist+1;
25 }
26
27 int main(int argc, char **argv)
28 {
29   int ilen;
30   int list_flag;
31   int c2c_flag;
32   int l2c_flag;
33   int hdf5_flag;
34   int merge_flag, nb_levels;
35   int reduceprecision_flag;
36   int outname_flag;
37   int compress_flag, compress_level;
38   int split_flag;
39   int help_flag;
40   char *cmd, *infile;
41   int c;
42   char buff[BUFSIZE];
43   int varlistlen;
44   char *varlist;
45   char *p;
46   int lenopt;
47   char *outfile=NULL;
48   int olen=0;
49
50   cmd = strrchr(argv[0], '/');
51   if (cmd == NULL)
52     cmd = argv[0];
53   else
54     cmd++;
55   l2c_flag = strcmp(cmd, "lfi2cdf") == 0 ? 1 : 0;
56   c2c_flag = strcmp(cmd, "cdf2cdf") == 0 ? 1 : 0;
57
58   compress_flag = 0;
59   list_flag = 0;
60   hdf5_flag = 1;
61   help_flag = 0;
62   outname_flag = 0;
63   reduceprecision_flag = 0;
64   split_flag = 0;
65   p = buff;
66   *p = '\0';
67
68   /* Default values for merging of LFI splitted files */
69   merge_flag = 0;
70   nb_levels = 1;
71
72   while (1) {
73     int option_index = 0;
74
75     static struct option long_options[] = {
76       {"cdf3",             no_argument,       0, '3' },
77       {"cdf4",             no_argument,       0, '4' },
78       {"compress",         required_argument, 0, 'c' },
79       {"help",             no_argument,       0, 'h' },
80       {"list",             no_argument,       0, 'l' },
81       {"merge",            required_argument, 0, 'm' },
82       {"output",           required_argument, 0, 'o' },
83       {"reduce-precision", no_argument,       0, 'r' },
84       {"split",            no_argument,       0, 's' },
85       {"var",              required_argument, 0, 'v' },
86       {0,                  0,                 0,  0  }
87     };
88
89     c = getopt_long(argc, argv, "34c:hlm:o:rsv:",
90                     long_options, &option_index);
91     if (c == -1)
92       break;
93
94     switch (c) {
95     case 0:
96       printf("option %s", long_options[option_index].name);
97       if (optarg)
98         printf(" with arg %s", optarg);
99       printf("\n");
100       break;
101     case 'c':
102       compress_flag = 1;
103       compress_level = atoi(optarg);
104       if(compress_level<1 || compress_level>9) {
105         printf("Error: compression level should in the 1 to 9 interval\n");
106         exit(EXIT_FAILURE);
107       }
108       break;
109     case '3':
110       hdf5_flag = 0;
111       break;
112     case '4':
113       hdf5_flag = 1;
114       break;
115     case 'h':
116       help_flag = 1;
117       break;
118     case 'l':
119       list_flag = 1;
120       break;
121     case 'm':
122       merge_flag = 1;
123       nb_levels = atoi(optarg);
124       break;
125     case 'o':
126       outname_flag = 1;
127       outfile = optarg;
128       olen = strlen(outfile);
129       break;
130     case 'r':
131       reduceprecision_flag = 1;
132       break;
133     case 's':
134       split_flag = 1;
135       break;
136     case 'v':
137       if (l2c_flag || c2c_flag) {
138         lenopt = strlen(optarg);
139         //      printf("option v with value '%s'\n", optarg);
140         if (p+lenopt > buff+BUFSIZE)
141           printf("%s ignored in list\n", optarg);
142         else {
143           *p++ = ',';
144           strcpy(p, optarg);
145           p += lenopt;
146         }
147       } else 
148         printf("option -v is ignored\n"); 
149       break;
150
151     default:
152       printf("?? getopt returned character code 0%o ??\n", c);
153     }
154   }
155
156   if (optind == argc || help_flag) {
157 //TODO: -l option for cdf2cdf and cdf2lfi
158     printf("usage : lfi2cdf [-h --help] [--cdf4 -4] [-l] [-v --var var1[,...]] [-r --reduce-precision] [-m --merge number_of_z_levels] [-s --split] [-o --output output-file.nc] [-c --compress compression_level] input-file.lfi\n");
159     printf("        cdf2cdf [-h --help] [--cdf4 -4] [-v --var var1[,...]] [-r --reduce-precision] [-m --merge number_of_z_levels] [-s --split] [-o --output output-file.nc] [-c --compress compression_level] input-file.nc\n");
160     printf("        cdf2lfi [-o --output output-file.lfi] input-file.nc\n");
161     printf("\nOptions:\n");
162     printf("  --cdf3, -3\n");
163     printf("     Write netCDF file in netCDF-3 format (cdf2cdf and lfi2cdf only)\n");
164     printf("  --cdf4, -4 (by default)\n");
165     printf("     Write netCDF file in netCDF-4 format (HDF5 compatible) (cdf2cdf and lfi2cdf only)\n");
166     printf("  --compress, -c compression_level\n");
167     printf("     Compress data. The compression level should be in the 1 to 9 interval.\n");
168     printf("     Only supported with the netCDF-4 format (cdf2cdf and lfi2cdf only)\n");
169     printf("  --help, -h\n");
170     printf("     Print this text\n");
171     printf("  --list, -l\n");
172     printf("     List all the fields of the LFI file and returns (lfi2cdf only)\n");
173     printf("  --merge, -m number_of_z_levels\n");
174     printf("     Merge LFI files which are split by vertical level (cdf2cdf and lfi2cdf only)\n");
175     printf("  --output, -o\n");
176     printf("     Name of file for the output\n");
177     printf("  --reduce-precision, -r\n");
178     printf("     Reduce the precision of the floating point variables to single precision (cdf2cdf and lfi2cdf only)\n");
179     printf("  --split, -s\n");
180     printf("     Split variables specified with the -v option (one per file) (cdf2cdf and lfi2cdf only)\n");
181     printf("  --var, -v var1[,...]\n");
182     printf("     List of the variable to write in the output file. Variables names have to be separated by commas (,).\n");
183     printf("     A variable can be computed from the sum of existing variables (format: new_var=var1+var2[+...])\n");
184     printf("     (cdf2cdf and lfi2cdf only)\n");
185     printf("\n");
186     exit(EXIT_FAILURE);
187   } 
188
189   ilen = strlen(argv[optind]);
190   infile = argv[optind];
191
192   varlist = cleancomma(buff);
193   varlistlen = strlen(buff);
194   
195   if (outfile == NULL) {
196     /* determine outfile name from infile name */
197     char *cp, *sp;
198     cp = strrchr(infile, '/');
199     if (cp == 0)                /* no delimiter */
200       cp = infile;
201     else                        /* skip delimeter */
202       cp++;
203     outfile = (char*) malloc((unsigned)(strlen(cp)+5));
204     (void) strncpy(outfile, cp, strlen(cp) + 1);
205     if ((sp = strrchr(outfile, '.')) != NULL)
206       *sp = '\0';
207     if (l2c_flag || c2c_flag){
208       char *ncext;
209       ncext = hdf5_flag ? ".nc4" : ".nc"; 
210       strcat(outfile,ncext);
211     } else
212       strcat(outfile,".lfi");
213     olen = strlen(outfile);
214   }
215
216   /* Compression flag only supported if using netCDF4 */
217   if (hdf5_flag==0 && compress_flag==1) {
218           compress_flag = 0;
219           printf("Warning: compression is forced to disable (only supported from netCDF4).\n");
220   }
221
222   /*
223   printf("cmd=%s; inputfile=%s(%d); outputfile=%s(%d); varlistclean=%s with size : %d\n", cmd, 
224          infile, ilen, outfile, olen, varlist, varlistlen);
225   */
226
227   /* Split flag only supported if -v is set */
228   if (varlistlen==0 && split_flag!=0) {
229           split_flag = 0;
230           printf("Warning: split option is forced to disable.\n");
231   }
232
233
234   lfi2cdfmain_(infile, &ilen, &outname_flag, outfile, &olen, varlist, &varlistlen, &c2c_flag, &l2c_flag, &list_flag, &hdf5_flag, &merge_flag,
235                        &nb_levels, &reduceprecision_flag, &split_flag, &compress_flag, &compress_level);
236
237   exit(EXIT_SUCCESS);
238 }