Ticket #205: number-to-string.diff

File number-to-string.diff, 2.2 KB (added by Christian Kellermann, 14 years ago)
  • runtime.c

    diff --git a/runtime.c b/runtime.c
    index 6959a83..329c213 100644
    a b C_regparm C_word C_fcall convert_string_to_number(C_char *str, int radix, C_word 
    72157215  }
    72167216}
    72177217
    7218 
    7219 static char *to_binary(C_uword num)
     7218static char *to_n_nary(C_uword num, C_uword base)
    72207219{
    72217220  char *p;
    7222 
    7223   buffer[ 66 ] = '\0';
     7221  char digits[] ={ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
     7222  buffer [ 66 ] = '\0';
    72247223  p = buffer + 66;
    7225  
     7224
    72267225  do {
    7227     *(--p) = (num & 1) ? '1' : '0';
    7228     num /= 2;
    7229   } while(num);
     7226    *(--p) = digits [ num % base ];
     7227    num /= base;
     7228  } while (num);
    72307229
    72317230  return p;
    72327231}
    void C_ccall C_number_to_string(C_word c, C_word closure, C_word k, C_word num, 
    72597258      num = -num;
    72607259    }
    72617260
     7261    if((radix < 2) || (radix > 16)){
     7262      barf(C_BAD_ARGUMENT_TYPE_ERROR, "number->string", C_fix(radix));
     7263    }
     7264
    72627265    switch(radix) {
    7263     case 2:
    7264       p = to_binary(num);
    7265       break;
    7266      
    72677266#ifdef C_SIXTY_FOUR
    72687267    case 8: C_sprintf(p = buffer + 1, C_text("%lo"), num); break;
    72697268    case 10: C_sprintf(p = buffer + 1, C_text("%ld"), num); break;
    void C_ccall C_number_to_string(C_word c, C_word closure, C_word k, C_word num, 
    72737272    case 10: C_sprintf(p = buffer + 1, C_text("%d"), num); break;
    72747273    case 16: C_sprintf(p = buffer + 1, C_text("%x"), num); break;
    72757274#endif
    7276 
    7277     default: barf(C_BAD_ARGUMENT_TYPE_ERROR, "number->string", C_fix(radix));
     7275    default:
     7276      p = to_n_nary(num, radix);
    72787277    }
    72797278  }
    72807279  else if(!C_immediatep(num) && C_block_header(num) == C_FLONUM_TAG) {
    void C_ccall C_number_to_string(C_word c, C_word closure, C_word k, C_word num, 
    72867285        f = -f;
    72877286      }
    72887287
    7289       switch(radix) {
    7290       case 2:
    7291         p = to_binary((unsigned int)f);
    7292         goto fini;
     7288      if((radix < 2) || (radix > 16)){
     7289        barf(C_BAD_ARGUMENT_TYPE_ERROR, "number->string", C_fix(radix));
     7290      }
    72937291
     7292      switch(radix) {
    72947293      case 8:
    72957294        C_sprintf(p = buffer, "%o", (unsigned int)f);
    72967295        goto fini;
    void C_ccall C_number_to_string(C_word c, C_word closure, C_word k, C_word num, 
    72987297      case 16:
    72997298        C_sprintf(p = buffer, "%x", (unsigned int)f);
    73007299        goto fini;
     7300
     7301      default:
     7302        p = to_n_nary((unsigned int)f, radix);
     7303        goto fini;
     7304
    73017305      }
    73027306    }
    73037307