Diff for /capa/capa51/pProj/capaUnit.c between versions 1.4 and 1.13

version 1.4, 2000/03/22 21:08:03 version 1.13, 2005/02/15 22:15:05
Line 1 Line 1
   /* functions to handle the unit parser/comparison engine
      Copyright (C) 1992-2000 Michigan State University
   
      The CAPA system is free software; you can redistribute it and/or
      modify it under the terms of the GNU General Public License as
      published by the Free Software Foundation; either version 2 of the
      License, or (at your option) any later version.
   
      The CAPA system is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      General Public License for more details.
   
      You should have received a copy of the GNU General Public
      License along with the CAPA system; see the file COPYING.  If not,
      write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      Boston, MA 02111-1307, USA.
   
      As a special exception, you have permission to link this program
      with the TtH/TtM library and distribute executables, as long as you
      follow the requirements of the GNU GPL in regard to all of the
      software in the executable aside from TtH/TtM.
   */
   
 /* =||>|===================== capaUnit.c   =====================|<||= */  /* =||>|===================== capaUnit.c   =====================|<||= */
 /*   created by Isaac Tsai   1997                                    */  /*   created by Isaac Tsai   1997                                    */
 /*   copyrighted by Isaac Tsai 1997, 1998, 1999                      */  /*   by Isaac Tsai 1997, 1998, 1999                      */
 /* =||>|========================================================|<||= */  /* =||>|========================================================|<||= */
 #include <stdio.h>        /* fopen()  */  #include <stdio.h>        /* fopen()  */
 #include <stdlib.h>  #include <stdlib.h>
 #include <ctype.h>        /* isalnum()   */  #include <ctype.h>        /* isalnum()   */
 #include <string.h>  #include <string.h>
 #include <math.h>  #include <math.h>
   #include <float.h>
   
 #include "capaParser.h"  #include "capaParser.h"
   
Line 703  process_op(int op) Line 727  process_op(int op)
   }    }
 }  }
   
 void  Unit_t*
 process_utree(Unit_t *t)  process_utree(Unit_t *t)
 {  {
   Ptopidx=0;    Ptopidx=0;
   postwalk_utree(t);    postwalk_utree(t);
   if( Ptopidx == 1 ) {    if( Ptopidx == 1 ) {
     /* printf("Correctly parsed!\n"); */      //fprintf(stderr,"Correctly parsed!\n");
     printf("Unit:%s\n",Sbuf);      //fprintf(stderr,"Unit:%s\n",Sbuf);
     simplify_unit(Pstack[Ptopidx]);      simplify_unit(Pstack[Ptopidx]);
     Pstack[Ptopidx]->u_symbol[0]='\0';      //Pstack[Ptopidx]->u_symbol[0]='\0';
     /*sprintf(Pstack[Ptopidx]->u_symbol,"");*/      //fprintf(stderr,Pstack[Ptopidx]->u_symbol,"");
     print_unit_t(Pstack[Ptopidx]);      print_unit_t(Pstack[Ptopidx]);
     u_find_name(Pstack[Ptopidx]);      //u_find_name(Pstack[Ptopidx]);
     print_matches(Pstack[Ptopidx]);      //print_matches(Pstack[Ptopidx]);
     free_utree(t);      return(Pstack[Ptopidx]);
       //free_utree(t);
   }    }
     return(t);
 }  }
   
 /* ============================================================== */  /* ============================================================== */
Line 757  int  check_correct_unit(char *u_symb,Uni Line 783  int  check_correct_unit(char *u_symb,Uni
   (Pstack[Ptopidx]->u_count == t->u_count) ) { /* has unit */    (Pstack[Ptopidx]->u_count == t->u_count) ) { /* has unit */
  *scale = units_ratio(Pstack[Ptopidx], t);   *scale = units_ratio(Pstack[Ptopidx], t);
  if( *scale == 0.0 ) {   if( *scale == 0.0 ) {
   result = UNIT_FAIL;    result = UNIT_IRRECONCIBLE;
  }   }
  free_utree(ap);   free_utree(ap);
       } else {        } else {
  result = UNIT_FAIL;   result = UNIT_INVALID_STUDENT3;
       }        }
     } else { /* invalid unit representation */      } else { /* invalid unit representation */
       result = UNIT_FAIL;        result = UNIT_INVALID_STUDENT2;
     }      }
   } else {    } else {
     result = UNIT_FAIL;      result = UNIT_INVALID_STUDENT1;
   }    }
 #ifdef UNIT_DBUG  #ifdef UNIT_DBUG
   fclose(ufp);    fclose(ufp);
Line 888  u_copy_unit(Unit_t *a_p, Unit_t *b_p, do Line 914  u_copy_unit(Unit_t *a_p, Unit_t *b_p, do
       a_p->u_count++;        a_p->u_count++;
     } else if( b_p->u_type == U_DERIVED) {      } else if( b_p->u_type == U_DERIVED) {
       /* derived units but without any units elements (scalar) */        /* derived units but without any units elements (scalar) */
       /* do nothing, ignore this units  WE REALLY MEAN THIS DON'T DO THE NEXT LINE!*/  
       /*a_p->u_count++;*/        /*a_p->u_count++;*/
         scale = pow(b_p->u_scale, exp_scale);
         a_p->u_scale = a_p->u_scale * scale;
     } else if( b_p->u_type == U_CONSTANT ) {      } else if( b_p->u_type == U_CONSTANT ) {
       scale = pow(b_p->u_scale, exp_scale);        scale = pow(b_p->u_scale, exp_scale);
       a_p->u_scale = a_p->u_scale * scale;        a_p->u_scale = a_p->u_scale * scale;
Line 1383  u_insert_derived(n_p,s_p,c_p,u_p)char  * Line 1410  u_insert_derived(n_p,s_p,c_p,u_p)char  *
   strcpy(new_p->u_comment,c_p);    strcpy(new_p->u_comment,c_p);
       
   simplify_unit(new_p);    simplify_unit(new_p);
   /*  #ifdef UNIT_DBUG
   printf("Derived Unit:%s\n",new_p->u_name);    printf("Derived Unit:%s\n",new_p->u_name);
   print_unit_t(new_p);     print_unit_t(new_p); 
   */  #endif
   if (c_result < 0 ) {    if (c_result < 0 ) {
     new_p->u_left = t->u_left; new_p->u_right = t;      new_p->u_left = t->u_left; new_p->u_right = t;
     t->u_left = NULL;      t->u_left = NULL;
Line 1719  p_new_unit(Unit_t *left_p, Unit_t *right Line 1746  p_new_unit(Unit_t *left_p, Unit_t *right
             err_code = 3;              err_code = 3;
     cu_p->u_type   = U_UNKNOWN;      cu_p->u_type   = U_UNKNOWN;
           }            }
         } else {          } else { /* symb_str is not in <prefix><units> form */
           /* printf("<<%s>>", symb_str); */            /* printf("<<%s>>", symb_str); */
           err_code = 2;            err_code = 2;
   cu_p->u_type   = U_UNKNOWN;    cu_p->u_type   = U_UNKNOWN;
         }          }
       } else {/* len == 1 */        } else {/* len == 1 */
         /* printf(" not found\n"); */          /* printf(" not found in symbol tree \n"); */
         err_code = 1;          err_code = 1;
  cu_p->u_type   = U_UNKNOWN;   cu_p->u_type   = U_UNKNOWN;
       }        }
     }      }
   } else {    } else { /* why would we have a length less than zero symb_str ? */
     err_code = 4;      err_code = 4;
   }    }
       

Removed from v.1.4  
changed lines
  Added in v.1.13


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>