174 lines
3.8 KiB
C
174 lines
3.8 KiB
C
/* calcTest.c */
|
||
/* share/src/util $Id$ */
|
||
|
||
/* calcTest.c - calcPerform Test Program
|
||
*
|
||
* Author: Janet Anderson
|
||
* Date: 02-05-92
|
||
*
|
||
* Experimental Physics and Industrial Control System (EPICS)
|
||
*
|
||
* Copyright 1991, the Regents of the University of California,
|
||
* and the University of Chicago Board of Governors.
|
||
*
|
||
* This software was produced under U.S. Government contracts:
|
||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||
*
|
||
* Initial development by:
|
||
* The Controls and Automation Group (AT-8)
|
||
* Ground Test Accelerator
|
||
* Accelerator Technology Division
|
||
* Los Alamos National Laboratory
|
||
*
|
||
* Co-developed with
|
||
* The Controls and Computing Group
|
||
* Accelerator Systems Division
|
||
* Advanced Photon Source
|
||
* Argonne National Laboratory
|
||
*
|
||
* Modification Log:
|
||
* -----------------
|
||
* .01 02-10-92 jba initial version
|
||
* .02 06-16-92 jba Increased dim of rpbuf to hold double constants in expression
|
||
*
|
||
*/
|
||
|
||
#ifdef vxWorks
|
||
#include <vxWorks.h>
|
||
#include <stdioLib.h>
|
||
#include <strLib.h>
|
||
#else
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#endif
|
||
|
||
#ifndef ERROR
|
||
#define ERROR -1
|
||
#endif
|
||
#ifndef OK
|
||
#define OK 0
|
||
#endif
|
||
|
||
#define PUT 0
|
||
#define GET 1
|
||
#define MAXLINE 150
|
||
|
||
char errmsg[MAXLINE];
|
||
|
||
long calcPerform();
|
||
long postfix();
|
||
void calcTest();
|
||
long doTestLine();
|
||
|
||
#ifndef vxWorks
|
||
main()
|
||
{
|
||
|
||
calcTest();
|
||
|
||
}
|
||
#endif
|
||
|
||
void calcTest()
|
||
{
|
||
char str[MAXLINE];
|
||
|
||
char expression[MAXLINE];
|
||
char parmList[MAXLINE];
|
||
char value[MAXLINE];
|
||
int fieldCount;
|
||
long status;
|
||
double parm[12];
|
||
short i;
|
||
|
||
/* get test line */
|
||
while ( gets(str)) {
|
||
/* print and skip null lines and comment lines */
|
||
if ( str[0]==NULL || str[0] == '!' ) {
|
||
printf("%s\n",str);
|
||
continue;
|
||
}
|
||
|
||
/* parse input line for fields */
|
||
fieldCount=sscanf(str," \"%[^\"]\" \"%[^\"]\" %s ",
|
||
expression,parmList,value);
|
||
|
||
/* check field count */
|
||
if ( fieldCount < 2 || fieldCount > 3 ) {
|
||
printf("\n%s\n",str);
|
||
printf ("***** ERROR ***** input field count %d incorrect\n",fieldCount);
|
||
continue;
|
||
}
|
||
|
||
/* parse parmList for parameters */
|
||
status=sscanf(parmList,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
|
||
&parm[0],&parm[1],&parm[2],&parm[3],&parm[4],&parm[5],
|
||
&parm[6],&parm[7],&parm[8],&parm[9],&parm[10],&parm[11]);
|
||
if( status == EOF ){
|
||
printf("\n%s\n",str);
|
||
printf ("***** ERROR ***** Error in parameter list %s \n",parmList);
|
||
continue;
|
||
}
|
||
|
||
/* zero out rest of parameters */
|
||
for (i=status; i<12; i++) parm[i]=0.;
|
||
|
||
|
||
/* execute test line */
|
||
status=doTestLine(expression,parm,value,fieldCount);
|
||
if ( status ){
|
||
printf("\n%s\n",str);
|
||
printf ("***** ERROR ***** status=%d %s\n",status,errmsg);
|
||
}
|
||
|
||
}
|
||
printf ("\ncalcTest ALL DONE\n\n\n");
|
||
}
|
||
|
||
long doTestLine(expression,parm,value,fieldCount)
|
||
char expression[];
|
||
double parm[12];
|
||
char value[];
|
||
int fieldCount;
|
||
{
|
||
long status=0;
|
||
short error_number=0;
|
||
/* rpbuf dimension must be >= 10*(dimension_of_CALC_field/2) */
|
||
/* since each constant in the expression now takes 9 bytes (chars): 1(code)+8(double) */
|
||
char rpbuf[184];
|
||
char valString[80];
|
||
double val;
|
||
|
||
/* convert an algebraic expression to symbolic postfix */
|
||
status=postfix(expression,rpbuf,&error_number);
|
||
if(status || error_number) {
|
||
sprintf(errmsg,"postfix error: status=%ld error_number=%d \n",status,error_number);
|
||
return ERROR;
|
||
}
|
||
|
||
/* perform calculation */
|
||
status=calcPerform(parm,&val,rpbuf);
|
||
if(status) {
|
||
sprintf(errmsg,"calcPerform error: status=%ld \n",status);
|
||
return ERROR;
|
||
}
|
||
|
||
/* convert calcPerform result to string */
|
||
sprintf(valString,"%-g",val);
|
||
|
||
/* verify calcPerform result*/
|
||
if ( fieldCount == 3 ){
|
||
|
||
status=strcmp(value,valString);
|
||
if (status) {
|
||
sprintf(errmsg,"verify failed: calcPerform result: val=%s",valString);
|
||
return ERROR;
|
||
}
|
||
}
|
||
else printf("calcPerform result: %s\n",valString);
|
||
|
||
return OK;
|
||
}
|
||
|