SmallInteger.st
branchjv
changeset 18705 843770030c5f
parent 18680 79953362f1ca
parent 18699 24b9c15dc6aa
child 18765 c4a2ea753acc
equal deleted inserted replaced
18698:17c1b3a8e36f 18705:843770030c5f
  2644     "return true, if the argument represents the same numeric value
  2644     "return true, if the argument represents the same numeric value
  2645      as the receiver, false otherwise"
  2645      as the receiver, false otherwise"
  2646 
  2646 
  2647 %{  /* NOCONTEXT */
  2647 %{  /* NOCONTEXT */
  2648 #ifdef __SCHTEAM__
  2648 #ifdef __SCHTEAM__
  2649     return context._RETURN( self.eqvP( aNumber ));
  2649     if (aNumber.isNumber()) {
       
  2650 	return context._RETURN( self.eqvP( aNumber ));
       
  2651     }
  2650 #else
  2652 #else
  2651 
  2653 
  2652     if (aNumber == self) {
  2654     if (aNumber == self) {
  2653 	RETURN ( true );
  2655 	RETURN ( true );
  2654     }
  2656     }
  2821 ~= aNumber
  2823 ~= aNumber
  2822     "return true, if the arguments value is not equal to mine"
  2824     "return true, if the arguments value is not equal to mine"
  2823 
  2825 
  2824 %{  /* NOCONTEXT */
  2826 %{  /* NOCONTEXT */
  2825 #ifdef __SCHTEAM__
  2827 #ifdef __SCHTEAM__
  2826     return context._RETURN( (self.eqvP( aNumber ) == STObject.True) ? STObject.False : STObject.True);
  2828     if (aNumber.isNumber()) {
  2827     /* NOTREACHED */
  2829 	return context._RETURN( (self.eqvP( aNumber ) == STObject.True) ? STObject.False : STObject.True);
       
  2830 	/* NOTREACHED */
       
  2831     }
  2828 #else
  2832 #else
  2829 
  2833 
  2830     if (aNumber == self) {
  2834     if (aNumber == self) {
  2831 	RETURN ( false );
  2835 	RETURN ( false );
  2832     }
  2836     }
  3926     OBJ newString = nil;
  3930     OBJ newString = nil;
  3927     INT myValue;
  3931     INT myValue;
  3928     int negative = 0;
  3932     int negative = 0;
  3929 
  3933 
  3930     if (self == __MKSMALLINT(0)) {
  3934     if (self == __MKSMALLINT(0)) {
  3931         RETURN (@global(ZeroString));
  3935 	RETURN (@global(ZeroString));
  3932 //        RETURN (__MKSTRING_L("0", 1));
  3936 //        RETURN (__MKSTRING_L("0", 1));
  3933     }
  3937     }
  3934     myValue = __intVal(self);
  3938     myValue = __intVal(self);
  3935     if (myValue < 0) {
  3939     if (myValue < 0) {
  3936         negative = 1;
  3940 	negative = 1;
  3937         myValue = -myValue;
  3941 	myValue = -myValue;
  3938     }
  3942     }
  3939     cp = buffer + sizeof(buffer) - 1;
  3943     cp = buffer + sizeof(buffer) - 1;
  3940     *cp-- = '\0';
  3944     *cp-- = '\0';
  3941     for ( ; myValue != 0; cp--) {
  3945     for ( ; myValue != 0; cp--) {
  3942         *cp = '0' + (myValue % 10);
  3946 	*cp = '0' + (myValue % 10);
  3943         myValue /= 10;
  3947 	myValue /= 10;
  3944     }
  3948     }
  3945     if (negative) {
  3949     if (negative) {
  3946         *cp-- = '-';
  3950 	*cp-- = '-';
  3947     }
  3951     }
  3948     newString = __MKSTRING_L(cp+1, (buffer + sizeof(buffer) - 2 - cp));
  3952     newString = __MKSTRING_L(cp+1, (buffer + sizeof(buffer) - 2 - cp));
  3949     if (newString != nil) {
  3953     if (newString != nil) {
  3950         RETURN (newString);
  3954 	RETURN (newString);
  3951     }
  3955     }
  3952 #endif /* not __SCHTEAM__ */
  3956 #endif /* not __SCHTEAM__ */
  3953 %}.
  3957 %}.
  3954     "/ only arrive here,
  3958     "/ only arrive here,
  3955     "/  when having memory problems (i.e. no space for string) ...
  3959     "/  when having memory problems (i.e. no space for string) ...
  3979     int __base = base.intValue();
  3983     int __base = base.intValue();
  3980     long myValue = self.longValue();
  3984     long myValue = self.longValue();
  3981     java.lang.String __s;
  3985     java.lang.String __s;
  3982 
  3986 
  3983     switch (__base) {
  3987     switch (__base) {
  3984         case 2:
  3988 	case 2:
  3985             __s = java.lang.Long.toBinaryString(myValue);
  3989 	    __s = java.lang.Long.toBinaryString(myValue);
  3986             break;
  3990 	    break;
  3987 
  3991 
  3988         case 8:
  3992 	case 8:
  3989             __s = java.lang.Long.toOctalString(myValue);
  3993 	    __s = java.lang.Long.toOctalString(myValue);
  3990             break;
  3994 	    break;
  3991 
  3995 
  3992         case 10:
  3996 	case 10:
  3993             __s = java.lang.Long.toString(myValue);
  3997 	    __s = java.lang.Long.toString(myValue);
  3994             break;
  3998 	    break;
  3995 
  3999 
  3996         case 16:
  4000 	case 16:
  3997             __s = java.lang.Long.toHexString(myValue);
  4001 	    __s = java.lang.Long.toHexString(myValue);
  3998             break;
  4002 	    break;
  3999 
  4003 
  4000         default:
  4004 	default:
  4001         {
  4005 	{
  4002             boolean negative = false;
  4006 	    boolean negative = false;
  4003             __s = "";
  4007 	    __s = "";
  4004 
  4008 
  4005             if ((__base > 36) || (__base < 2)) {
  4009 	    if ((__base > 36) || (__base < 2)) {
  4006                 throw new SmalltalkError("invalid base: ", base);
  4010 		throw new SmalltalkError("invalid base: ", base);
  4007             }
  4011 	    }
  4008             if (myValue < 0) {
  4012 	    if (myValue < 0) {
  4009                 negative = true;
  4013 		negative = true;
  4010                 myValue = -myValue;
  4014 		myValue = -myValue;
  4011             }
  4015 	    }
  4012             while (myValue != 0) {
  4016 	    while (myValue != 0) {
  4013                 int digit;
  4017 		int digit;
  4014                 char ch;
  4018 		char ch;
  4015 
  4019 
  4016                 digit = (int)(myValue % __base);
  4020 		digit = (int)(myValue % __base);
  4017                 if (digit <= 9) {
  4021 		if (digit <= 9) {
  4018                     ch = (char)('0' + digit);
  4022 		    ch = (char)('0' + digit);
  4019                 } else {
  4023 		} else {
  4020                     ch = (char)('A' + digit - 10);
  4024 		    ch = (char)('A' + digit - 10);
  4021                 }
  4025 		}
  4022                 __s = ch + __s;
  4026 		__s = ch + __s;
  4023                 myValue = myValue / __base;
  4027 		myValue = myValue / __base;
  4024             }
  4028 	    }
  4025             if (negative) {
  4029 	    if (negative) {
  4026                 __s = "-" + __s;
  4030 		__s = "-" + __s;
  4027             }
  4031 	    }
  4028             break;
  4032 	    break;
  4029         }
  4033 	}
  4030     }
  4034     }
  4031     return context._RETURN( new STString( __s ));
  4035     return context._RETURN( new STString( __s ));
  4032 #else
  4036 #else
  4033     static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  4037     static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  4034     INT __base;
  4038     INT __base;
  4035 
  4039 
  4036     if (__isSmallInteger(base)) {
  4040     if (__isSmallInteger(base)) {
  4037         if (self == __MKSMALLINT(0)) {
  4041 	if (self == __MKSMALLINT(0)) {
  4038             RETURN (@global(ZeroString));
  4042 	    RETURN (@global(ZeroString));
  4039     //        RETURN (__MKSTRING_L("0", 1));
  4043     //        RETURN (__MKSTRING_L("0", 1));
  4040         }
  4044 	}
  4041         __base = __intVal(base);
  4045 	__base = __intVal(base);
  4042 
  4046 
  4043         if ((__base < sizeof(digits)) && (__base > 1)) {
  4047 	if ((__base < sizeof(digits)) && (__base > 1)) {
  4044             char buffer[64+3];  /* for 64bit machines, base 2, plus sign, plus 0-byte */
  4048 	    char buffer[64+3];  /* for 64bit machines, base 2, plus sign, plus 0-byte */
  4045             char *cp;
  4049 	    char *cp;
  4046             OBJ newString;
  4050 	    OBJ newString;
  4047             int negative = 0;
  4051 	    int negative = 0;
  4048             INT myValue = __intVal(self);
  4052 	    INT myValue = __intVal(self);
  4049 
  4053 
  4050             if (myValue < 0) {
  4054 	    if (myValue < 0) {
  4051                 negative = 1;
  4055 		negative = 1;
  4052                 myValue = -myValue;
  4056 		myValue = -myValue;
  4053             }
  4057 	    }
  4054             cp = buffer + sizeof(buffer) - 1;
  4058 	    cp = buffer + sizeof(buffer) - 1;
  4055             *cp-- = '\0';
  4059 	    *cp-- = '\0';
  4056             for (; myValue != 0; cp--) {
  4060 	    for (; myValue != 0; cp--) {
  4057                 *cp = digits[myValue % __base];
  4061 		*cp = digits[myValue % __base];
  4058                 myValue /= __base;
  4062 		myValue /= __base;
  4059             }
  4063 	    }
  4060             if (negative) {
  4064 	    if (negative) {
  4061                 *cp-- = '-';
  4065 		*cp-- = '-';
  4062             }
  4066 	    }
  4063             newString = __MKSTRING_L(cp+1, (buffer + sizeof(buffer) - 2 - cp));
  4067 	    newString = __MKSTRING_L(cp+1, (buffer + sizeof(buffer) - 2 - cp));
  4064             if (newString != nil) {
  4068 	    if (newString != nil) {
  4065                 RETURN (newString);
  4069 		RETURN (newString);
  4066             }
  4070 	    }
  4067         }
  4071 	}
  4068     }
  4072     }
  4069 #endif /* not __SCHTEAM__ */
  4073 #endif /* not __SCHTEAM__ */
  4070 %}.
  4074 %}.
  4071     "/ arrive here, for bad base,
  4075     "/ arrive here, for bad base,
  4072     "/ or when having memory problems (i.e. no space for string) ...
  4076     "/ or when having memory problems (i.e. no space for string) ...