Changeset 248


Ignore:
Timestamp:
Nov 25, 2002, 6:32:02 PM (18 years ago)
Author:
luba
Message:

* empty log message *

File:
1 edited

Legend:

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

    r247 r248  
    2626};
    2727
    28 inline rf_int::rf_int(const Expr& expr, bool is_positive, int i) {
     28inline rf_int::rf_int(const Expr& expr, bool is_positive, intptr_t i) {
    2929  if (expr.get_len() - i > 10)
    30     goto Error;
     30    error ( Word2Expr(RF-INT) + "Size limit exceeded");
     31
    3132  Term* p = expr.get_last();
     33 
    3234  Term* q = expr.get_first() + i;
    33   k = 1; n = 0;
     35
     36  for (; q < expr.get_last(); q++)
     37    if (rf_char("0") != *(rf_char*)q)
     38      break;
     39
     40  intptr_t k = 1; n = 0;
    3441
    3542  if (expr.get_len() - i < 10){
    36     for (; p >= q; p--) {
     43    for (; p > q; p--) {
    3744      n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
    3845      k *= 10;
     
    4047    };
    4148  };
    42   if (expr.get_len() - i == 10) {
    43     for (; p > p - 9 ; p--) {
    44       n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
    45       k *= 10;
     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--) {
     54        n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
     55        k *= 10;
    4656       
    4757    };
    48     p++;
    49     if (n += (((rf_char*)p)->to_byte().n - ord('0'))*k > INTPTR_MAX)
    50       goto Error;
     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    };
    5166    else
    5267      n += (((rf_char*)p)->to_byte().n - ord('0'))*k;
    53 
    5468  };
    5569
     
    5771     n = -n;
    5872
    59 Error: error ( Word2Expr(RF-INT) + "Size limit exceeded");
    60 
    6173};
    6274
    6375inline uintptr_t rf_int::get_char_len() const {
    64   intptr_t k = 0;
    65   while (n) {
    66     n /= 10;
    67     k++;
     76  uintptr_t k = 0;
     77  if (!n) k = 1;
     78  else {
     79    if (n < 0) k++;
     80    while (n) {
     81      n /= 10;
     82      k++;
     83    };
    6884  };
    6985  return k;
     
    7187
    7288inline Term* rf_int::to_rf_chars(Term* t) const {
    73   *t = *this;
    74   return t + 1;
     89
    7590};
    7691
Note: See TracChangeset for help on using the changeset viewer.