/***********************************************************************
B P A M E R I C A
PROPRIETARY - TO BE MAINTAINED IN CONFIDENCE
COPYRIGHTED 2006
***********************************************************************
TEMPLATE 2
FORTRAN TEMPLATE DEMONSTRATING THE USE OF DDS CONVENIENCE
ROUTINES FOR A SIMPLE TRACE-TO-TRACE PROCESSING SCHEME
WITHOUT USING OR PASSING ANY TRACE HEADERS.
Use a file extension of ".F" instead of ".f" to pull in the
compiler preprocessor.
Written by Jerry Ehlers November 2006
**********************************************************************/
#define _POSIX_SOURCE 1 /* Check POSIX Standard */
#define ANSI /* Turn on prototyping from cdds.h */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <math.h>
#include <cdds.h> /* "C" dds include */
#define RCSID "$Id: c_template2.html 1 2009-01-06 00:31:13Z ehlersjw $"
#define TITLE "template2: C template using DDS convenience routines"
void doit(int, int, int, float, float*);
/***********************************************************************
*
* main
*
**********************************************************************/
int main(int argc, char **argv)
{
BIN_TAG in_bin=-1, out_bin=-1;
int ier, ns;
float scale, *buf;
char *prog;
/***********************************************************************
* initialize
**********************************************************************/
/*
* get the program name
*/
prog = strrchr(argv[0], '/');
if (prog) prog++;
else prog = argv[0];
/*
* pass the command line arguments on to DDS
*/
setargcv(argc, argv);
ier = cdds_openpr(prog, RCSID);
if (ier > 0) help();
/***********************************************************************
* open input data file
**********************************************************************/
in_bin = cddx_in("in", "stdin:", TITLE);
if (in_bin < 0) {
cdds_prterr("Unable to open input data\n");
}
/*
* Get input data parameters
*/
cdds_scanf("size.axis(1)", "%d", &ns);
/***********************************************************************
* read parameters
**********************************************************************/
cdds_dict("par:", "scan");
/*
* get scale parameter (default 1.0)
*/
scale = 1.0;
cdds_scanf("scale", "%f", &scale);
/***********************************************************************
* print user parameters
**********************************************************************/
cdds_prtmsg("\n*** USER PARAMETERS ***\n\n");
cdds_prtmsg("\tscale = %g\n", scale);
cdds_prtmsg("\n");
/*
* Check parameters
*/
if (scale < 0.0) {
cdds_prtcon("WARNING: \"scale\" is negative!\n");
}
/***********************************************************************
* allocate dynamic arrays
**********************************************************************/
if (cdds_errors()) goto finish;
/*
* Allocate memory for a single trace
*/
buf = cdds_malloc(ns * sizeof(float));
/***********************************************************************
* open output dataset
**********************************************************************/
if (cdds_errors()) goto finish;
out_bin = cddx_out("out", "stdout:", TITLE, in_bin);
ier = cdds_lseek(out_bin, 0, 0, SEEK_SET);
if (ier < 0) {
cdds_prterr("Unable to open output dataset!\n");
}
/***********************************************************************
* process the data
**********************************************************************/
if (cdds_errors()) goto finish;
doit(in_bin, out_bin, ns, scale, buf);
/***********************************************************************
* close files, clean-up, & exit
**********************************************************************/
finish:
cdds_close(in_bin);
cdds_close(out_bin);
cdds_closepr();
}
/***********************************************************************
*
* doit
*
**********************************************************************/
void doit(int in_bin, int out_bin, int ns, float scale, float* buf)
{
int ier, i;
/*
* loop over each trace
*/
ier = cddx_read(in_bin, buf, 1);
while(ier == 1) {
/*
* process the trace
*/
for(i=0;i<ns;i++) buf[i] = scale * buf[i];
/*
* write the trace
*/
ier = cddx_write(out_bin, buf, 1);
if (ier != 1) {
cdds_prterr("writing output\n");
return;
}
/*
* read the next trace
*/
ier = cddx_read(in_bin, buf, 1);
}
return;
}
/***********************************************************************
*
* help
*
**********************************************************************/
void help()
{
fprintf(stderr, "Template program demonstrating the simple use of DDS\n");
fprintf(stderr, "convenience routines for a simple trace-to-trace processing\n");
fprintf(stderr, "scheme without using or passing any trace headers.\n");
fprintf(stderr, "\n");
fprintf(stderr, "usage:\n");
fprintf(stderr, " c_template2 [in=dat] [in_data=bin] [in_format=fmt] \\\n");
fprintf(stderr, " [out=dat] [out_data=bin] [out_format=fmt] \\\n");
fprintf(stderr, " [scale=f]\n");
fprintf(stderr, " \n");
fprintf(stderr, "where:\n");
fprintf(stderr, " in= input dataset\n");
fprintf(stderr, " in_data= input binary\n");
fprintf(stderr, " in_format= input format\n");
fprintf(stderr, " out= output dictionary\n");
fprintf(stderr, " out_data= output binary\n");
fprintf(stderr, " out_format=output format\n");
fprintf(stderr, " scale= scale factor (dflt=1.0)\n");
fprintf(stderr, "\n");
exit(0);
}