Changeset 250
- Timestamp:
- Nov 26, 2002, 11:48:11 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
to-imperative/trunk/runtime/rf_int.hh
r249 r250 27 27 28 28 inline 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 30 39 error ( Word2Expr(RF-INT) + "Size limit exceeded"); 31 40 32 41 Term* p = expr.get_last(); 33 42 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 40 43 intptr_t k = 1; n = 0; 41 44 42 if (expr.get_l en() - i < 10){43 for (; p > q; p--) {45 if (expr.get_last() - q < 10){ //если длина числа < 10 - строим все число до конца 46 for (; p >= q; p--) { 44 47 n += (((rf_char*)p)->to_byte().n - ord('0'))*k; 45 48 k *= 10; … … 47 50 }; 48 51 }; 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-ой цифры 54 56 n += (((rf_char*)p)->to_byte().n - ord('0'))*k; 55 57 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 }; 66 59 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"); 68 68 }; 69 69 70 70 if (!is_positive) 71 71 n = -n; 72 73 72 }; 74 73 … … 87 86 88 87 inline Term* rf_int::to_rf_chars(Term* t) const { 89 *t = rf_char(*this);90 return t + 1;91 88 }; 92 89
Note: See TracChangeset
for help on using the changeset viewer.