Changeset 251


Ignore:
Timestamp:
Nov 26, 2002, 2:53:38 PM (18 years ago)
Author:
luba
Message:

* empty log message *

File:
1 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/runtime/rf_int.hh

    r250 r251  
    55
    66#include <ctype.h>
     7#include <math.h>
    78#include "rf_core.hh"
    89#include "rf_char.hh"
     
    2829inline rf_int::rf_int(const Expr& expr, bool is_positive, intptr_t i) {
    2930
    30   Term* q = expr.get_first() + i; 
     31  Term* q = expr.get_first() + i;
    3132
    3233  rf_char a = rf_char("0");
    3334
    34   for (; q < expr.get_last(); q++) // устанавливаем q в первый ненулевой эл-т
     35  for (; q < expr.get_last(); q++)
    3536    if (a != *(rf_char*)q)
    3637      break;
    3738
    38   if (expr.get_last() - q > 10)  //если длина числа больше 10 - error
     39  if (expr.get_last() - q > 10)
    3940    error ( Word2Expr(RF-INT) + "Size limit exceeded");
    4041
     
    4344  intptr_t k = 1; n = 0;
    4445
    45   if (expr.get_last() - q < 10){ //если длина числа < 10 - строим все число до конца
     46  if (expr.get_last() - q < 10){
    4647    for (; p >= q; p--) {
    4748      n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
     
    5051    };
    5152  };
    52   else { //длина числа == 10
    53     intptr_t b = INTPTR_MAX / 1000000000;
    54     if (*(rf_char*)q <= rf_char(b)) //первая цифра числа <= первой цифре max
    55       for (; p > q ; p--) {         // тогда строим все число, кроме 1-ой цифры
    56         n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
    57         k *= 10;
    58       };
    59     else
     53  else {
     54    rf_char b = rf_char(INTPTR_MAX / 1000000000);
     55    if (*(rf_char*)q > b)
    6056      error ( Word2Expr(RF-INT) + "Size limit exceeded");
    6157     
    62     if ((*(rf_char*)q == rf_char(b) && //первая цифра == 1-ой цифре max
    63         ( n <= INTPTR_MAX - INTPTR_MAX / 1000000000 * 1000000000 )) ||
    64          (*(rf_char*)q < rf_char(b))) //и укладываемся в max или первая цифра < первой цифры max
    65       n += (((rf_char*)p)->to_byte().n - ord('0'))*k; //добавляем первую цифру
    66     else
    67       error ( Word2Expr(RF-INT) + "Size limit exceeded");
     58    for (; p > q ; p--) {
     59      n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
     60      k *= 10;
     61       
     62    };
     63   
     64    if (*(rf_char*)q == b)
     65   
     66      if ( n > INTPTR_MAX - INTPTR_MAX / 1000000000 * 1000000000 )
     67        error ( Word2Expr(RF-INT) + "Size limit exceeded");
     68
     69    n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
    6870  };
    6971
    7072  if (!is_positive)
    7173     n = -n;
     74
    7275};
    7376
     
    8689
    8790inline Term* rf_int::to_rf_chars(Term* t) const {
     91  uintptr_t len = this->get_char_len();
     92  intptr_t k = len - 1;
     93  intptr_t m;
     94  rf_char temp;
     95  while ( k != -1 ) {
     96    m = (n / pow (10, k)) % 10;
     97    temp = rf_char(m);
     98    temp.to_rf_chars(t);
     99    t++;
     100    k--;
     101  };
     102  return t++;
    88103};
    89104
Note: See TracChangeset for help on using the changeset viewer.