From: young@chama.eece.unm.edu (Mark Young)
Newsgroups: comp.soft-sys.khoros
Subject: cantata expression bug (fix) on Omron/NeXT(MACH)...
Date: 21 Nov 92 18:04:38 GMT
Article-I.D.: pprg.41777


Hi,

  This next bug is also complements of Jon Hale of Omron Corporation.
The bug is that cantata's expression parser does not work on certain
machines.  It gives bogus results and thus executes processes with
incorrect command line arguments.  The problem will show up on Omron
and NeXT machines, but probably all machines running mach.  It has to
do with mach's interpetation of scanf().  In traditional UNIX scanf()
routines, when the first token of the input command is not matched the
operation is aborted, but in mach the scanf() routine continues match-
ing it's arguments.  Therefore when we were checking the text line with
the string scan routine for the input i*25:

	 sscanf(string,"%f%s",&floatval,leftover)

mach's sscanf() will return 1 matched token, storing "i*25" in the
leftover string array, thus skipping the initial "%f" input command
token.  Following is th fix that should be applied at the toplevel
of $KHOROS_HOME using patch -c < patchfile.  Then the xvforms library
and cantata will need to be recompiled and installed.

			Mark

-----------------------------------------------------------------------------
Mark Young                         young@chama.eece.unm.edu
 
Khoros Group                       (505) 277-6563  (work)
University of New Mexico           Albuquerque,    NM 87131
-----------------------------------------------------------------------------
Humor is something that is plentyful if you are willing to laugh at yourself.

*** src/xvroutines/Lib/xvforms/form_util.c	Wed Jul 22 13:33:13 1992
--- src/xvroutines/Lib/xvforms/form_util.c	Wed Nov 18 09:48:23 1992
***************
*** 960,966 ****
  	    xvf_parse_int_line(db[sel->index],&line_info);
  	    if ((line_info.optional == true) && (line_info.opt_sel == false))
  	       break;
! 	    if (sscanf(line_info.literal,"%d%s", &ivalue, leftover) != 1)
  	    {
  	       if (!(xve_eval_int(id, line_info.literal, &ivalue, error)))
                 {
--- 951,959 ----
  	    xvf_parse_int_line(db[sel->index],&line_info);
  	    if ((line_info.optional == true) && (line_info.opt_sel == false))
  	       break;
! 	    leftover[0] = '\0';
! 	    if (sscanf(line_info.literal,"%d%s", &ivalue, leftover) != 1 ||
! 		leftover[0] != '\0')
  	    {
  	       if (!(xve_eval_int(id, line_info.literal, &ivalue, error)))
                 {
***************
*** 985,991 ****
  	    xvf_parse_float_line(db[sel->index],&line_info);
  	    if ((line_info.optional == true) && (line_info.opt_sel == false))
  	       break;
! 	    if (sscanf(line_info.literal,"%f%s", &fvalue, leftover) != 1)
  	    {
  	       if (!(xve_eval_float(id, line_info.literal, &fvalue, error)))
                 {
--- 978,986 ----
  	    xvf_parse_float_line(db[sel->index],&line_info);
  	    if ((line_info.optional == true) && (line_info.opt_sel == false))
  	       break;
! 	    leftover[0] = '\0';
! 	    if (sscanf(line_info.literal,"%f%s", &fvalue, leftover) != 1 ||
! 	        leftover[0] != '\0')
  	    {
  	       if (!(xve_eval_float(id, line_info.literal, &fvalue, error)))
                 {
*** src/xvroutines/Lib/xvforms/collect.c	Wed Mar 11 20:07:00 1992
--- src/xvroutines/Lib/xvforms/collect.c	Wed Nov 18 09:47:59 1992
***************
*** 197,203 ****
  	xvf_parse_int_line(database[current->index], &line_info);
  
  	/* see if it's not a regular integer (ie, an expression) */
! 	if (sscanf(current->buffer,"%d%s",&tmp_int,leftover) != 1)
  	{
  	    /* can't scan it normally - try to evaluate expression */
  	    id = (long) formptr; /* this is the id for this form */
--- 197,205 ----
  	xvf_parse_int_line(database[current->index], &line_info);
  
  	/* see if it's not a regular integer (ie, an expression) */
! 	leftover[0] = '\0';
! 	if (sscanf(current->buffer,"%d%s",&tmp_int,leftover) != 1 ||
! 	    leftover[0] != '\0')
  	{
  	    /* can't scan it normally - try to evaluate expression */
  	    id = (long) formptr; /* this is the id for this form */
***************
*** 340,346 ****
  	xvf_parse_float_line(database[current->index], &line_info);
  
  	/* see if it's not a regular float (ie, could be an expression) */
! 	if (sscanf(current->buffer,"%f%s",&tmp_float,leftover) != 1)
  	{
  	    /* can't scan it normally - try to evaluate expression */
  	    id = (long) formptr; /* this is the id for this form */
--- 342,350 ----
  	xvf_parse_float_line(database[current->index], &line_info);
  
  	/* see if it's not a regular float (ie, could be an expression) */
! 	leftover[0] = '\0';
! 	if (sscanf(current->buffer,"%f%s",&tmp_float,leftover) != 1 ||
! 	    leftover[0] != '\0')
  	{
  	    /* can't scan it normally - try to evaluate expression */
  	    id = (long) formptr; /* this is the id for this form */