lfi2cdf: new option: "-s or --split" to split the variables in different files
[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*);
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 l2c_flag;
32   int hdf5_flag;
33   int merge_flag, nb_levels;
34   int reduceprecision_flag;
35   int outname_flag;
36   int compress_flag, compress_level;
37   int split_flag;
38   char *cmd, *infile;
39   int c;
40   char buff[BUFSIZE];
41   int varlistlen;
42   char *varlist;
43   char *p;
44   int lenopt;
45   char *outfile=NULL;
46   int olen=0;
47
48   cmd = strrchr(argv[0], '/');
49   if (cmd == NULL)
50     cmd = argv[0];
51   else
52     cmd++;
53   l2c_flag = strcmp(cmd, "lfi2cdf") == 0 ? 1 : 0;
54
55   list_flag = 0;
56   hdf5_flag = 0;
57   reduceprecision_flag = 0;
58   compress_flag = 0;
59   p = buff;
60   *p = '\0';
61
62   /* Default values for merging of LFI splitted files */
63   merge_flag = 0;
64   nb_levels = 1;
65
66   while (1) {
67     int option_index = 0;
68
69     static struct option long_options[] = {
70       {"cdf4",             no_argument,       0, '4' },
71       {"compress",         required_argument, 0, 'c' },
72       {"list",             no_argument,       0, 'l' },
73       {"merge",            required_argument, 0, 'm' },
74       {"output",           required_argument, 0, 'o' },
75       {"reduce-precision", no_argument,       0, 'r' },
76       {"split",            no_argument,       0, 's' },
77       {"var",              required_argument, 0, 'v' },
78       {0,                  0,                 0,  0  }
79     };
80
81     c = getopt_long(argc, argv, "4c:lm:o:rsv:",
82                     long_options, &option_index);
83     if (c == -1)
84       break;
85
86     switch (c) {
87     case 0:
88       printf("option %s", long_options[option_index].name);
89       if (optarg)
90         printf(" with arg %s", optarg);
91       printf("\n");
92       break;
93     case 'c':
94       compress_flag = 1;
95       compress_level = atoi(optarg);
96       if(compress_level<1 || compress_level>9) {
97         printf("Error: compression level should in the 1 to 9 interval\n");
98         exit(EXIT_FAILURE);
99       }
100       break;
101     case '4':
102       hdf5_flag = 1;
103       break;
104     case 'l':
105       list_flag = 1;
106       break;
107     case 'm':
108       merge_flag = 1;
109       nb_levels = atoi(optarg);
110       break;
111     case 'o':
112       outname_flag = 1;
113       outfile = optarg;
114       olen = strlen(outfile);
115       break;
116     case 'r':
117       reduceprecision_flag = 1;
118       break;
119     case 's':
120       split_flag = 1;
121       break;
122     case 'v':
123       if (l2c_flag) {
124         lenopt = strlen(optarg);
125         //      printf("option v with value '%s'\n", optarg);
126         if (p+lenopt > buff+BUFSIZE)
127           printf("%s ignored in list\n", optarg);
128         else {
129           *p++ = ',';
130           strcpy(p, optarg);
131           p += lenopt;
132         }
133       } else 
134         printf("option -v is ignored\n"); 
135       break;
136
137     default:
138       printf("?? getopt returned character code 0%o ??\n", c);
139     }
140   }
141
142   if (optind == argc) {
143     printf("usage : lfi2cdf [--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");
144     printf("        cdf2lfi [-o --output output-file.lfi] input-file.nc\n");
145     exit(EXIT_FAILURE);
146   } 
147
148   ilen = strlen(argv[optind]);
149   infile = argv[optind];
150
151   varlist = cleancomma(buff);
152   varlistlen = strlen(buff);
153   
154   if (outfile == NULL) {
155     /* determine outfile name from infile name */
156     char *cp, *sp;
157     cp = strrchr(infile, '/');
158     if (cp == 0)                /* no delimiter */
159       cp = infile;
160     else                        /* skip delimeter */
161       cp++;
162     outfile = (char*) malloc((unsigned)(strlen(cp)+5));
163     (void) strncpy(outfile, cp, strlen(cp) + 1);
164     if ((sp = strrchr(outfile, '.')) != NULL)
165       *sp = '\0';
166     if (l2c_flag){
167       char *ncext;
168       ncext = hdf5_flag ? ".nc4" : ".nc"; 
169       strcat(outfile,ncext);
170     } else
171       strcat(outfile,".lfi");
172     olen = strlen(outfile);
173   }
174
175   /* Compression flag only supported if using netCDF4 */
176   if (hdf5_flag==0 && compress_flag==1) {
177           compress_flag = 0;
178           printf("Warning: compression is forced to disable (only supported from netCDF4).\n");
179   }
180
181   /*
182   printf("cmd=%s; inputfile=%s(%d); outputfile=%s(%d); varlistclean=%s with size : %d\n", cmd, 
183          infile, ilen, outfile, olen, varlist, varlistlen);
184   */
185
186   /* Split flag only supported if -v is set */
187   if (varlistlen==0) {
188           split_flag = 0;
189           printf("Warning: split option is forced to disable.\n");
190   }
191
192
193   lfi2cdfmain_(infile, &ilen, &outname_flag, outfile, &olen, varlist, &varlistlen, &l2c_flag, &list_flag, &hdf5_flag, &merge_flag,
194                        &nb_levels, &reduceprecision_flag, &split_flag, &compress_flag, &compress_level);
195
196   exit(EXIT_SUCCESS);
197 }