NCEPLIBS-bufr  11.6.0
 All Data Structures Files Functions Variables Pages
debufr.c
Go to the documentation of this file.
1 
5 #include <ctype.h>
6 #include <string.h>
7 #include <stdio.h>
8 #include <libgen.h>
9 #include <unistd.h>
10 
11 #include "bufrlib.h"
12 #include "cobfl.h"
13 
14 #ifdef UNDERSCORE
15 #define fdebufr fdebufr_
16 #define prtusage prtusage_
17 #endif
18 
19 void fdebufr( char *, char *, f77int *, char *, char *, char *, char *, char *,
20  size_t, size_t, size_t, size_t, size_t, size_t, size_t );
21 void prtusage( char * );
22 
23 #define MXFLEN 125
24 
39 void prtusage( char *prgnam ) {
40  printf( "\nUSAGE:\n" );
41  printf( " %s [-v] [-h] [-b] [-c] [-m] [-o outfile] [-t tabledir] [-f tablefil] [-p prmstg] bufrfile\n\n", prgnam );
42  printf( "\nWHERE:\n" );
43  printf( " -v prints program version information and exits\n\n" );
44  printf( " -h prints program help and usage information and exits\n\n" );
45  printf( " -b specifies the \"basic\" option, meaning that only the\n" );
46  printf( " information in Sections 0-3 will be decoded from each\n" );
47  printf( " BUFR message in the bufrfile, and no attempt will be\n" );
48  printf( " made to decode the data in Section 4\n\n" );
49  printf( " -c specifies that code and flag table meanings should not\n" );
50  printf( " be read from master BUFR tables and included in the output;\n" );
51  printf( " otherwise this feature is enabled by default\n\n" );
52  printf( " -m specifies that master BUFR tables will be used to\n" );
53  printf( " decode the data messages in the file, regardless of\n" );
54  printf( " whether it contains any embedded DX BUFR table messages.\n" );
55  printf( " This option can be used to view the actual contents of\n" );
56  printf( " DX BUFR table messages, which otherwise would not be\n" );
57  printf( " printed in the output listing.\n\n" );
58  printf( " outfile [path/]name of file to contain verbose output listing.\n" );
59  printf( " The default is \"bufrfilename.debufr.out\" in the current\n" );
60  printf( " working directory, where bufrfilename is the basename of\n" );
61  printf( " the bufrfile (i.e. bufrfile with any preceding [path/]\n" );
62  printf( " removed).\n\n" );
63  printf( " tabledir [path/]name of directory containing tables to be used\n" );
64  printf( " for decoding. This directory contains the DX BUFR tables\n" );
65  printf( " file to be used (if one was specified via the -f option),\n" );
66  printf( " or it may contain all of the master BUFR tables when these\n" );
67  printf( " are being used to decode a file. If unspecified, the\n" );
68  printf( " default directory location is\n" );
69  printf( " \"/gpfs/dell2/emc/obsproc/noscrub/Jeff.Ator/NCEPLIBS-bufr-GitHub/build/install/tables\"\n\n" );
70  printf( " tablefil file within tabledir containing DX BUFR tables to be used\n" );
71  printf( " for decoding.\n\n" );
72  printf( " prmstg string of comma-separated PARAMETER=VALUE pairs, up to a\n" );
73  printf( " maximum of 20. For each pair, the dynamic allocation\n" );
74  printf( " PARAMETER will be set to VALUE within the underlying\n" );
75  printf( " BUFRLIB software, overriding the default value that would\n" );
76  printf( " otherwise be used. A complete list of parameters that can\n" );
77  printf( " be dynamically sized is included within the documentation\n" );
78  printf( " for BUFRLIB function isetprm.\n\n" );
79  printf( " bufrfile [path/]name of BUFR file to be decoded\n\n" );
80 }
81 
172 int main( int argc, char *argv[ ] ) {
173 
174  int ch;
175 
176  char basic = 'N';
177  char forcemt = 'N';
178  char cfms = 'Y';
179  char io = 'r';
180  char tbldir[MXFLEN] = "/gpfs/dell2/emc/obsproc/noscrub/Jeff.Ator/NCEPLIBS-bufr-GitHub/build/install/tables";
181  char outfile[MXFLEN];
182  char wkstr[MXFLEN];
183  char wkstr2[MXFLEN];
184  char tblfil[(MXFLEN*2)+5];
185  char prmstg[300] = "NULLPSTG";
186  char bvstr[9] = " ";
187 
188  unsigned short ii;
189 
190  f77int lentd;
191 
192  /*
193  ** Get and process the valid options from the command line:
194  */
195  wkstr[0] = '\0'; /* initialize to empty string */
196  outfile[0] = '\0'; /* initialize to empty string */
197  while ( ( ch = getopt ( argc, argv, "vhbcmo:t:f:p:" ) ) != EOF ) {
198  switch ( ch ) {
199  case 'v':
200  bvers ( bvstr, sizeof(bvstr) );
201  /* append a trailing NULL to bvstr for printf */
202  for ( ii = 0; ii < sizeof(bvstr); ii++ ) {
203  if ( ( bvstr[ii] != '.' ) && ( !isdigit(bvstr[ii]) ) ) {
204  bvstr[ii] = '\0';
205  break;
206  }
207  }
208  printf( "This is debufr v3.1.0, built with BUFRLIB v%s\n",
209  bvstr );
210  return 0;
211  case 'h':
212  printf( "\nPROGRAM %s\n", argv[0] );
213  printf( "\nABSTRACT: This program decodes a BUFR file and generates a verbose\n" );
214  printf( " listing of the contents. If a DX BUFR tables file is specified\n" );
215  printf( " (using the -f option) or if the specified BUFR file contains an\n" );
216  printf( " embedded DX BUFR tables message as the first message in the file,\n" );
217  printf( " then this DX BUFR tables information is used to decode the data\n" );
218  printf( " messages in the file. Otherwise, or whenever the -m option is\n" );
219  printf( " specified, master BUFR tables are read and used to decode the\n" );
220  printf( " data messages in the file.\n" );
221  prtusage( argv[0] );
222  return 0;
223  break;
224  case 'b':
225  basic = 'Y';
226  break;
227  case 'm':
228  forcemt = 'Y';
229  break;
230  case 'c':
231  cfms = 'N';
232  break;
233  case 'o':
234  strcpy ( outfile, optarg );
235  break;
236  case 't':
237  strcpy ( tbldir, optarg );
238  break;
239  case 'f':
240  strcpy ( wkstr, optarg );
241  break;
242  case 'p':
243  strcpy ( prmstg, optarg );
244  break;
245  }
246  }
247 
248  /*
249  ** There should be one remaining command line argument specifying the
250  ** input BUFR file.
251  */
252  if ( (optind+1) != argc ) {
253  printf( "\nERROR: You must specify an input BUFR file to be decoded!\n" );
254  prtusage( argv[0] );
255  return -1;
256  }
257 
258  /*
259  ** Open the input BUFR file.
260  */
261  cobfl( argv[optind], &io );
262 
263  /*
264  ** Check whether a DX tables file was specified.
265  */
266  if ( strlen( wkstr ) > 0 ) {
267  sprintf( tblfil, "%s%c%s", tbldir, '/', wkstr );
268  }
269  else {
270  strcpy( tblfil, "NULLFILE" );
271  }
272 
273  /*
274  ** Check whether an output file was specified. If not, make a default
275  ** filename in the current working directory using the basename of the
276  ** input BUFR file.
277  */
278  if ( strlen( outfile ) == 0 ) {
279  strcpy( wkstr2, argv[optind] );
280  strcpy( outfile, basename( wkstr2 ) );
281  strcat( outfile, ".debufr.out" );
282  }
283 
284  /*
285  ** Confirm that the output directory is writeable.
286  */
287  strcpy( wkstr2, outfile );
288  strcpy( wkstr, dirname( wkstr2 ) );
289  if ( access( wkstr, W_OK ) != 0 ) {
290  printf( "\nERROR: Cannot write output file to directory %s\n",
291  ( strcmp( wkstr, "." ) == 0 ? getcwd( wkstr2, MXFLEN ) : wkstr ) );
292  prtusage( argv[0] );
293  return -1;
294  }
295 
296  /*
297  ** Read and decode each message from the input BUFR file.
298  */
299  lentd = (f77int) strlen(tbldir);
300  fdebufr( outfile, tbldir, &lentd, tblfil, prmstg, &basic, &forcemt, &cfms,
301  strlen(outfile), strlen(tbldir), strlen(tblfil), strlen(prmstg), 1, 1, 1 );
302 
303  /*
304  ** Close the input BUFR file.
305  */
306  ccbfl( );
307 
308  return 0;
309 }
Define signatures to enable a number of BUFRLIB subprograms to be called directly from C application ...
void ccbfl(void)
This subroutine closes all system files that were opened via previous calls to subroutine cobfl()...
Definition: ccbfl.c:20
subroutine fdebufr(ofile, tbldir, lentd, tblfil, prmstg, basic, forcemt, cfms)
This subroutine reads, decodes, and generates a verbose output listing of the contents of every BUFR ...
Definition: debufr.f:86
subroutine bvers(CVERSTR)
This subroutine returns a character string containing the version number of the BUFRLIB software...
Definition: bvers.f:33
Define signatures and declare variables for reading or writing BUFR messages via a C language interfa...
void prtusage(char *)
This function prints program usage information to standard output.
Definition: xbfmg.c:35
void cobfl(char *bfl, char *io)
This subroutine opens a new file for reading or writing BUFR messages via a C language interface...
Definition: cobfl.c:82
int main(int argc, char *argv[])
This program splits a single file containing one or more BUFR messages into one or more BUFR files ea...
Definition: xbfmg.c:110