kc@rna.UUCP (07/16/86)
Questionable feature for af. Of interest to gps users on various Unix flavors. Backgrounder: The af (arithmetic filter) manual page advises that af command line numeric parameters cannot contain ``E notation.'' (They mean Scientific notation, e.g. 1.23e04). That is a severe limitation, because we have several scripts that make their own af command line parameters using af. Guess what, af gladly outputs E notation, but such a result can't be used as a parameter. Here's how af might produce a number containing E notation. $ af '1000000+100000' 1.1e+06 $ script done on Tue Jul 15 18:28:21 1986 Repeat by: Try the following af command: $ af '1e01+2e02' af assumes that the funny name ``e01'' refers to the stdin, and then complains that the file ``e02'' can't be opened. Anyway, we had working scripts that broke when the numbers got too small and so it seemed a fix was in order, even though this is a FEATURE according to the manual page. The fix is very simple (although recompiling af may not be). The only file that needs to be changed is `aeparse.c' in the /wherever_gps_src_is_stored/graf/stat.d directory. *** aeparse.c.orig Tue Jul 15 17:29:33 1986 --- aeparse.c Tue Jul 15 17:35:57 1986 *************** *** 1,5 static char SCCSID[]="@(#)aeparse.c 1.2"; /* <: t-5 d :> */ #include "s.h" #include "stdio.h" --- 1,6 ----- static char SCCSID[]="@(#)aeparse.c 1.2"; /* <: t-5 d :> */ + /* kc 7/86 command line exponential notation allowed */ #include "s.h" #include "stdio.h" *************** *** 172,177 case IDENT: while( ISID(**p) || **p=='/' ) *buf++ = *(*p)++; break; case CONST: while( ISNUM(**p) ) *buf++ = *(*p)++; break; default: if(!silent) ERRPR1(? %c,*(*p)++); break; } --- 173,184 ----- case IDENT: while( ISID(**p) || **p=='/' ) *buf++ = *(*p)++; break; case CONST: while( ISNUM(**p) ) *buf++ = *(*p)++; + /* following four lines added by kc 7/86 to allow + exponents on the command line */ + if( (**p == 'e') || (**p == 'E') ) /* exponent */ + *buf++ = *(*p)++; + while( ISNUM(**p) ) + *buf++ = *(*p)++; break; default: if(!silent) ERRPR1(? %c,*(*p)++); break; } Kaare Christian cmcl2!rna!kc
kc@rna.UUCP (07/16/86)
In my previous posting about the af command line parameter problem my solution neglected the possibility of negative exponents. Sorry. What follows is the correct (I hope) code to improve af so that it allows scientific notation in its command line parameters. This fix supersedes the previous. *** aeparse.c.orig Tue Jul 15 17:29:33 1986 --- aeparse.c Tue Jul 15 21:55:58 1986 *************** *** 1,5 static char SCCSID[]="@(#)aeparse.c 1.2"; /* <: t-5 d :> */ #include "s.h" #include "stdio.h" --- 1,6 ----- static char SCCSID[]="@(#)aeparse.c 1.2"; /* <: t-5 d :> */ + /* kc 7/86 command line exponential notation allowed */ #include "s.h" #include "stdio.h" *************** *** 172,177 case IDENT: while( ISID(**p) || **p=='/' ) *buf++ = *(*p)++; break; case CONST: while( ISNUM(**p) ) *buf++ = *(*p)++; break; default: if(!silent) ERRPR1(? %c,*(*p)++); break; } --- 173,186 ----- case IDENT: while( ISID(**p) || **p=='/' ) *buf++ = *(*p)++; break; case CONST: while( ISNUM(**p) ) *buf++ = *(*p)++; + /* following four lines added by kc 7/86 to allow + exponents on the command line */ + if( (**p == 'e') || (**p == 'E') ) /* exponent */ + *buf++ = *(*p)++; + if( **p == '-' ) /* sign */ + *buf++ = *(*p)++; + while( ISNUM(**p) ) + *buf++ = *(*p)++; break; default: if(!silent) ERRPR1(? %c,*(*p)++); break; } Once again, sorry for the inconvenience of two messages when one should have been enough. Kaare Christian cmcl2!rna!kc