Changeset 250


Ignore:
Timestamp:
Nov 26, 2002, 11:48:11 AM (18 years ago)
Author:
luba
Message:

* empty log message *

File:
1 edited

Legend:

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

    r249 r250  
    2727
    2828inline rf_int::rf_int(const Expr& expr, bool is_positive, intptr_t i) {
    29   if (expr.get_len() - i > 10)
     29
     30  Term* q = expr.get_first() + i;
     31
     32  rf_char a = rf_char("0");
     33
     34  for (; q < expr.get_last(); q++) // устанавливаем q в первый ненулевой эл-т
     35    if (a != *(rf_char*)q)
     36      break;
     37
     38  if (expr.get_last() - q > 10)  //если длина числа больше 10 - error
    3039    error ( Word2Expr(RF-INT) + "Size limit exceeded");
    3140
    3241  Term* p = expr.get_last();
    3342 
    34   Term* q = expr.get_first() + i;
    35 
    36   for (; q < expr.get_last(); q++)
    37     if (rf_char("0") != *(rf_char*)q)
    38       break;
    39 
    4043  intptr_t k = 1; n = 0;
    4144
    42   if (expr.get_len() - i < 10){
    43     for (; p > q; p--) {
     45  if (expr.get_last() - q < 10){ //если длина числа < 10 - строим все число до конца
     46    for (; p >= q; p--) {
    4447      n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
    4548      k *= 10;
     
    4750    };
    4851  };
    49   else {
    50     if (*(rf_char*)q >= rf_char("3"))
    51       error ( Word2Expr(RF-INT) + "Size limit exceeded");
    52     else
    53       for (; p > q ; p--) {
     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-ой цифры
    5456        n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
    5557        k *= 10;
    56        
    57     };
    58    
    59     if (*(rf_char*)q == rf_char("2")) {
    60    
    61       if ( n > INTPTR_MAX - INTPTR_MAX / 1000000000 * 1000000000 )
    62         error ( Word2Expr(RF-INT) + "Size limit exceeded");
    63       else
    64         n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
    65     };
     58      };
    6659    else
    67       n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
     60      error ( Word2Expr(RF-INT) + "Size limit exceeded");
     61     
     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");
    6868  };
    6969
    7070  if (!is_positive)
    7171     n = -n;
    72 
    7372};
    7473
     
    8786
    8887inline Term* rf_int::to_rf_chars(Term* t) const {
    89   *t = rf_char(*this);
    90   return t + 1;
    9188};
    9289
Note: See TracChangeset for help on using the changeset viewer.