home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / prog1 / 4th_86.lzh / EVAL.4TH < prev    next >
Text File  |  1988-02-12  |  1KB  |  43 lines

  1. ( file: EVAL)
  2. (
  3.  Word to convert a string to a number. To test:
  4.        " 123"  EVAL  .     " -15"  EVAL  .
  5.   Leading blanks and sign (+ or -) are allowed.
  6.   Stops conversion at end of string or on first invalid
  7.   digit.
  8. )
  9.   
  10. : NXTDIG ( count adr -- count-1 adr+1 )
  11.   SWAP 1- ( dec count) SWAP 1+ ( inc adr) ;
  12.  
  13. : EVAL  ( stringadr -- number )
  14.   0 SWAP 0 SWAP DUPB@ SWAP ( stk: sum, signflag, count, adr)
  15.   ( skip leading blanks)
  16.   REPEAT 
  17.     OVER 0> OVER 1+ B@ 20H = AND
  18.   WHILE ( blank and still some string left)
  19.     NXTDIG ( point to next byte and decrement count)
  20.   ENDWHILE
  21.   1+ ( bump string pointer)
  22.   ( check for + or - digit)
  23.   OVER IF ( count not zero)
  24.     DUPB@ IF[ "+" "-" ]  ( it is a plus or minus)
  25.       DUPB@ "-" = IF ( it is minus)
  26.         1 3 POKE ( set sign flag)
  27.       THEN
  28.       NXTDIG ( skip sign character)
  29.     THEN
  30.   THEN
  31.   ( now evaluate digits)
  32.   REPEAT
  33.     OVER 0> OVER B@ DUP "0" >= SWAP 3AH < AND AND
  34.   WHILE ( count <> 0 and valid digit)
  35.     DUPB@ "0" - ( get digit again)
  36.     5 PICK ( get sum) 10 * + ( digit added in)
  37.     4 POKE ( store new sum)
  38.     NXTDIG ( dec count and bump adr)
  39.   ENDWHILE
  40.   DROP ( adr) DROP ( count) IF ( sign flag is set)
  41.     -1* ( negate sum)
  42.   THEN ; ( return with result on stack)
  43.