From: Ton v. O. <tvo...@us...> - 2007-08-22 19:24:11
|
Update of /cvsroot/easycalc/easycalc/mlib In directory sc8-pr-cvs17:/tmp/cvs-serv26690/mlib Modified Files: display.c mathem.c stack.c Log Message: Make integer arithmetic signed. Previously all integer arithmetic was done with unsigned integers. With the 'Force integer nums' preference selected -5/2 now results in -2 instead of 2,147,483,645. When 'Force integer nums' is selected integers are displayed signed in decimal and unsigned in hex/octal/binary. With 'Force integer nums' not selected the int() function now works. int(-5.9) = -5 and int(5.9) = 5. Previously these examples resulted in syntax errror. Index: display.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/display.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** display.c 12 Sep 2006 19:40:56 -0000 1.11 --- display.c 22 Aug 2007 19:24:03 -0000 1.12 *************** *** 96,108 **** } ! char * ! display_integer(UInt32 number,Tbase mode) { Int16 base; ! Int16 i,j; ! char *result,tmp; ! ! result = MemPtrNew(33); /* 32 bits + '\0' */ ! switch (mode) { case disp_binary: --- 96,110 ---- } ! Char * ! display_integer(UInt32 number, Tbase mode) { Int16 base; ! Int16 i, j; ! Int32 signednum; ! Char *result, *result1, tmp; ! ! result = MemPtrNew(33); /* 32 bits + '\0' */ ! result1 = result; /* result1 points to digits after possible '-' sign */ ! switch (mode) { case disp_binary: *************** *** 117,140 **** case disp_decimal: default: base=10; break; } ! for (i=0;number;i++,number/=base) ! if ((number % base)<10) ! result[i]='0'+(number % base); ! else ! result[i]='A'+(number % base) - 10; ! ! result[i]='\0'; ! /* Revert the string */ ! for (j=0,i--;j<i;j++,i--) { ! tmp=result[i]; ! result[i]=result[j]; ! result[j]=tmp; } ! ! if (StrLen(result)==0) ! StrCopy(result,"0"); ! return result; } --- 119,149 ---- case disp_decimal: default: + /* for decimal display signed number */ + if ((signednum = number) < 0) { + number = -number; + *result = '-'; + result1 = result + 1; + } base=10; break; } ! ! for (i=0; number; i++, number /= base) ! if ((number % base) < 10) ! result1[i]='0'+(number % base); ! else ! result1[i]='A'+(number % base) - 10; ! ! result1[i]='\0'; ! /* Reverse the string */ ! for (j = 0, i--; j < i; j++, i--) { ! tmp = result1[i]; ! result1[i] = result1[j]; ! result1[j] = tmp; } ! ! if (StrLen(result) == 0) ! StrCopy(result,"0"); ! return result; } Index: mathem.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/mathem.c,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** mathem.c 27 May 2007 01:34:09 -0000 1.36 --- mathem.c 22 Aug 2007 19:24:03 -0000 1.37 *************** *** 253,300 **** int_oper(Functype *func,CodeStack *stack) { ! UInt32 arg1,arg2; ! UInt32 tmp; ! UInt32 result; CError err; ! if ((err=stack_get_val2(stack,&arg1,&arg2,integer))) ! return err; switch (func->num) { case FUNC_PLUS: ! result=arg1+arg2; break; case FUNC_MINUS: ! result=arg1-arg2; break; case FUNC_DIVIDE: if (!arg2) ! return c_divbyzero; ! result=arg1/arg2; break; case FUNC_MOD: if (!arg2) ! return c_divbyzero; result = arg1 % arg2; break; case FUNC_MULTIPLY: ! result=arg1*arg2; break; case FUNC_POWER: ! if (arg2==0) { ! result=1; break; } ! if (arg2>300) /* The user might have entered a negative number */ ! return c_badarg; ! ! tmp=arg1; while (--arg2) ! tmp*=arg1; ! result=tmp; break; default: return c_badfunc; } ! return stack_add_val(stack,&result,integer); } --- 253,299 ---- int_oper(Functype *func,CodeStack *stack) { ! Int32 arg1, arg2; ! Int32 tmp; ! Int32 result; CError err; ! if ((err = stack_get_val2(stack, &arg1, &arg2, integer))) ! return err; switch (func->num) { case FUNC_PLUS: ! result = arg1 + arg2; break; case FUNC_MINUS: ! result = arg1 - arg2; break; case FUNC_DIVIDE: if (!arg2) ! return c_divbyzero; ! result = arg1 / arg2; break; case FUNC_MOD: if (!arg2) ! return c_divbyzero; result = arg1 % arg2; break; case FUNC_MULTIPLY: ! result = arg1 * arg2; break; case FUNC_POWER: ! if (arg2 == 0) { ! result = 1; break; } ! if (arg2 < 0) ! return c_badarg; ! tmp = arg1; while (--arg2) ! tmp *= arg1; ! result = tmp; break; default: return c_badfunc; } ! return stack_add_val(stack, &result, integer); } Index: stack.c =================================================================== RCS file: /cvsroot/easycalc/easycalc/mlib/stack.c,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** stack.c 25 Jul 2007 01:19:41 -0000 1.38 --- stack.c 22 Aug 2007 19:24:03 -0000 1.39 *************** *** 231,235 **** stack_get_val(CodeStack *stack,void *arg1,rpntype reqtype) { - UInt32 intarg; double realarg = 0.0; Complex *cplxarg; --- 231,234 ---- *************** *** 284,288 **** return c_noerror; } ! if (reqtype == list) { if (tmpitem.type != list) { --- 283,287 ---- return c_noerror; } ! if (reqtype == list) { if (tmpitem.type != list) { *************** *** 315,319 **** if (reqtype==string) { char *tmp; ! if (tmpitem.type!=string) { rpn_delete(tmpitem); --- 314,318 ---- if (reqtype==string) { char *tmp; ! if (tmpitem.type!=string) { rpn_delete(tmpitem); *************** *** 329,340 **** /* Now follows numeric types */ ! if (tmpitem.type!=integer && ! tmpitem.type!=real && ! tmpitem.type!=complex) { rpn_delete(tmpitem); return c_badarg; } ! ! if (reqtype==complex) { cplxarg = (Complex *) arg1; cplxarg->imag = 0.0; --- 328,340 ---- /* Now follows numeric types */ ! ! if (tmpitem.type != integer && ! tmpitem.type != real && ! tmpitem.type != complex) { rpn_delete(tmpitem); return c_badarg; } ! ! if (reqtype == complex) { cplxarg = (Complex *) arg1; cplxarg->imag = 0.0; *************** *** 347,351 **** else err = c_badarg; ! } else if (reqtype==real) { if (tmpitem.type==real) *((double *)arg1)=tmpitem.u.realval; --- 347,351 ---- else err = c_badarg; ! } else if (reqtype == real) { if (tmpitem.type==real) *((double *)arg1)=tmpitem.u.realval; *************** *** 359,370 **** } else err = c_badarg; ! } else if (reqtype==integer) { switch (tmpitem.type) { case integer: ! *((UInt32 *)arg1)=tmpitem.u.intval; break; case complex: if (IS_ZERO(tmpitem.u.cplxval->imag)) ! realarg = tmpitem.u.cplxval->real; else { err = c_badarg; --- 359,370 ---- } else err = c_badarg; ! } else if (reqtype == integer) { switch (tmpitem.type) { case integer: ! *((UInt32 *)arg1) = tmpitem.u.intval; break; case complex: if (IS_ZERO(tmpitem.u.cplxval->imag)) ! realarg = tmpitem.u.cplxval->real; else { err = c_badarg; *************** *** 373,386 **** /* PASS THROUGH, generates warning*/ case real: ! if (tmpitem.type==real) ! realarg = tmpitem.u.realval; ! if (realarg<=4294967296.0 && ! realarg>=0.0 ) { ! if (IS_ZERO(round(realarg)-realarg)) { ! intarg=(double)tmpitem.u.realval; ! *((UInt32 *)arg1)=intarg; ! } ! else ! err = c_badarg; } else --- 373,380 ---- /* PASS THROUGH, generates warning*/ case real: ! if (tmpitem.type == real) ! realarg = tmpitem.u.realval; ! if (-2147483648.0 <= realarg && realarg <= 2147483647.0) { ! *((Int32 *)arg1)= tmpitem.u.realval; } else *************** *** 393,397 **** else err=c_badarg; ! rpn_delete(tmpitem); return err; --- 387,391 ---- else err=c_badarg; ! rpn_delete(tmpitem); return err; |